sfc: Allocate DMA and event rings using GFP_KERNEL
authorBen Hutchings <bhutchings@solarflare.com>
Fri, 10 Sep 2010 06:41:26 +0000 (06:41 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 10 Sep 2010 19:27:31 +0000 (12:27 -0700)
Currently we allocate DMA descriptor rings and event rings using
pci_alloc_consistent() which selects non-blocking behaviour from the
page allocator (GFP_ATOMIC). This is unnecessary, and since we
currently allocate a single contiguous block for each ring (up to 32
pages!) these allocations are likely to fail if there is any
significant memory pressure.  Use dma_alloc_coherent() and GFP_KERNEL
instead.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/sfc/nic.c

index f595d92..8efe1ca 100644 (file)
@@ -263,8 +263,8 @@ static int efx_alloc_special_buffer(struct efx_nic *efx,
 {
        len = ALIGN(len, EFX_BUF_SIZE);
 
-       buffer->addr = pci_alloc_consistent(efx->pci_dev, len,
-                                           &buffer->dma_addr);
+       buffer->addr = dma_alloc_coherent(&efx->pci_dev->dev, len,
+                                         &buffer->dma_addr, GFP_KERNEL);
        if (!buffer->addr)
                return -ENOMEM;
        buffer->len = len;
@@ -301,8 +301,8 @@ efx_free_special_buffer(struct efx_nic *efx, struct efx_special_buffer *buffer)
                  (u64)buffer->dma_addr, buffer->len,
                  buffer->addr, (u64)virt_to_phys(buffer->addr));
 
-       pci_free_consistent(efx->pci_dev, buffer->len, buffer->addr,
-                           buffer->dma_addr);
+       dma_free_coherent(&efx->pci_dev->dev, buffer->len, buffer->addr,
+                         buffer->dma_addr);
        buffer->addr = NULL;
        buffer->entries = 0;
 }