• Christophe JAILLET's avatar
    enic: switch from 'pci_' to 'dma_' API · 02a20d4f
    Christophe JAILLET authored
    The wrappers in include/linux/pci-dma-compat.h should go away.
    
    The patch has been generated with the coccinelle script below and has been
    hand modified to replace GFP_ with a correct flag.
    It has been compile tested.
    
    When memory is allocated in 'vnic_dev_classifier()', 'vnic_dev_fw_info()',
    'vnic_dev_notify_set()' and 'vnic_dev_stats_dump()' (vnic_dev.c) GFP_ATOMIC
    must be used because its callers take a spinlock before calling these
    functions.
    
    When memory is allocated in '__enic_set_rsskey()' and 'enic_set_rsscpu()'
    GFP_ATOMIC must be used because they can be called with a spinlock.
    The call chain is:
      enic_reset                         <-- takes 'enic->enic_api_lock'
        --> enic_set_rss_nic_cfg
          --> enic_set_rsskey
            --> __enic_set_rsskey        <-- uses dma_alloc_coherent
          --> enic_set_rsscpu            <-- uses dma_alloc_coherent
    
    When memory is allocated in 'vnic_dev_init_prov2()' GFP_ATOMIC must be used
    because a spinlock is hidden in the ENIC_DEVCMD_PROXY_BY_INDEX macro, when
    this function is called in 'enic_set_port_profile()'.
    
    When memory is allocated in 'vnic_dev_alloc_desc_ring()' GFP_KERNEL can be
    used because it is only called from 5 functions ('vnic_dev_init_devcmd2()',
    'vnic_cq_alloc()', 'vnic_rq_alloc()', 'vnic_wq_alloc()' and
    'enic_wq_devcmd2_alloc()'.
    
      'vnic_dev_init_devcmd2()': already uses GFP_KERNEL and no lock is taken
         in the between.
      'enic_wq_devcmd2_alloc()': is called from ' vnic_dev_init_devcmd2()'
         which already uses GFP_KERNEL and no lock is taken in the between.
      'vnic_cq_alloc()', 'vnic_rq_alloc()', 'vnic_wq_alloc()': are called
         from 'enic_alloc_vnic_resources()'
    'enic_alloc_vnic_resources()' has only 2 call chains:
    
      1) enic_probe
          --> enic_dev_init
            --> enic_alloc_vnic_resources
    'enic_probe()' is a probe function and no lock is taken in the between
    
      2) enic_set_ringparam
          --> enic_alloc_vnic_resources
    'enic_set_ringparam()' is a .set_ringparam function (see struct
    ethtool_ops). It seems to only take a mutex and no spinlock.
    
    So all paths are safe to use GFP_KERNEL.
    
    @@
    @@
    -    PCI_DMA_BIDIRECTIONAL
    +    DMA_BIDIRECTIONAL
    
    @@
    @@
    -    PCI_DMA_TODEVICE
    +    DMA_TO_DEVICE
    
    @@
    @@
    -    PCI_DMA_FROMDEVICE
    +    DMA_FROM_DEVICE
    
    @@
    @@
    -    PCI_DMA_NONE
    +    DMA_NONE
    
    @@
    expression e1, e2, e3;
    @@
    -    pci_alloc_consistent(e1, e2, e3)
    +    dma_alloc_coherent(&e1->dev, e2, e3, GFP_)
    
    @@
    expression e1, e2, e3;
    @@
    -    pci_zalloc_consistent(e1, e2, e3)
    +    dma_alloc_coherent(&e1->dev, e2, e3, GFP_)
    
    @@
    expression e1, e2, e3, e4;
    @@
    -    pci_free_consistent(e1, e2, e3, e4)
    +    dma_free_coherent(&e1->dev, e2, e3, e4)
    
    @@
    expression e1, e2, e3, e4;
    @@
    -    pci_map_single(e1, e2, e3, e4)
    +    dma_map_single(&e1->dev, e2, e3, e4)
    
    @@
    expression e1, e2, e3, e4;
    @@
    -    pci_unmap_single(e1, e2, e3, e4)
    +    dma_unmap_single(&e1->dev, e2, e3, e4)
    
    @@
    expression e1, e2, e3, e4, e5;
    @@
    -    pci_map_page(e1, e2, e3, e4, e5)
    +    dma_map_page(&e1->dev, e2, e3, e4, e5)
    
    @@
    expression e1, e2, e3, e4;
    @@
    -    pci_unmap_page(e1, e2, e3, e4)
    +    dma_unmap_page(&e1->dev, e2, e3, e4)
    
    @@
    expression e1, e2, e3, e4;
    @@
    -    pci_map_sg(e1, e2, e3, e4)
    +    dma_map_sg(&e1->dev, e2, e3, e4)
    
    @@
    expression e1, e2, e3, e4;
    @@
    -    pci_unmap_sg(e1, e2, e3, e4)
    +    dma_unmap_sg(&e1->dev, e2, e3, e4)
    
    @@
    expression e1, e2, e3, e4;
    @@
    -    pci_dma_sync_single_for_cpu(e1, e2, e3, e4)
    +    dma_sync_single_for_cpu(&e1->dev, e2, e3, e4)
    
    @@
    expression e1, e2, e3, e4;
    @@
    -    pci_dma_sync_single_for_device(e1, e2, e3, e4)
    +    dma_sync_single_for_device(&e1->dev, e2, e3, e4)
    
    @@
    expression e1, e2, e3, e4;
    @@
    -    pci_dma_sync_sg_for_cpu(e1, e2, e3, e4)
    +    dma_sync_sg_for_cpu(&e1->dev, e2, e3, e4)
    
    @@
    expression e1, e2, e3, e4;
    @@
    -    pci_dma_sync_sg_for_device(e1, e2, e3, e4)
    +    dma_sync_sg_for_device(&e1->dev, e2, e3, e4)
    
    @@
    expression e1, e2;
    @@
    -    pci_dma_mapping_error(e1, e2)
    +    dma_mapping_error(&e1->dev, e2)
    
    @@
    expression e1, e2;
    @@
    -    pci_set_dma_mask(e1, e2)
    +    dma_set_mask(&e1->dev, e2)
    
    @@
    expression e1, e2;
    @@
    -    pci_set_consistent_dma_mask(e1, e2)
    +    dma_set_coherent_mask(&e1->dev, e2)
    Signed-off-by: default avatarChristophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    02a20d4f
vnic_dev.c 29.4 KB