diff --git a/drivers/staging/octeon/ethernet-mem.c b/drivers/staging/octeon/ethernet-mem.c index bf666b023190..964da860f4c4 100644 --- a/drivers/staging/octeon/ethernet-mem.c +++ b/drivers/staging/octeon/ethernet-mem.c @@ -46,9 +46,10 @@ static int cvm_oct_fill_hw_skbuff(int pool, int size, int elements) { int freed = elements; - while (freed) { + while (freed) { struct sk_buff *skb = dev_alloc_skb(size + 256); + if (unlikely(skb == NULL)) break; skb_reserve(skb, 256 - (((unsigned long)skb->data) & 0x7f)); @@ -81,10 +82,10 @@ static void cvm_oct_free_hw_skbuff(int pool, int size, int elements) if (elements < 0) pr_warn("Freeing of pool %u had too many skbuffs (%d)\n", - pool, elements); + pool, elements); else if (elements > 0) pr_warn("Freeing of pool %u is missing %d skbuffs\n", - pool, elements); + pool, elements); } /** @@ -115,7 +116,7 @@ static int cvm_oct_fill_hw_memory(int pool, int size, int elements) memory = kmalloc(size + 256, GFP_ATOMIC); if (unlikely(memory == NULL)) { pr_warn("Unable to allocate %u bytes for FPA pool %d\n", - elements * size, pool); + elements * size, pool); break; } fpa = (char *)(((unsigned long)memory + 256) & ~0x7fUL); @@ -136,6 +137,7 @@ static void cvm_oct_free_hw_memory(int pool, int size, int elements) { char *memory; char *fpa; + do { fpa = cvmx_fpa_alloc(pool); if (fpa) { @@ -157,6 +159,7 @@ static void cvm_oct_free_hw_memory(int pool, int size, int elements) int cvm_oct_mem_fill_fpa(int pool, int size, int elements) { int freed; + if (USE_SKBUFFS_IN_HW && pool == CVMX_FPA_PACKET_POOL) freed = cvm_oct_fill_hw_skbuff(pool, size, elements); else