sfc: Allocate DMA and event rings using GFP_KERNEL
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>
This commit is contained in:
parent
e42de26249
commit
58758aa505
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue