|
@@ -549,14 +549,7 @@ static int bnx2x_alloc_rx_sge(struct bnx2x *bp, struct bnx2x_fastpath *fp,
|
|
|
struct bnx2x_alloc_pool *pool = &fp->page_pool;
|
|
|
dma_addr_t mapping;
|
|
|
|
|
|
- if (!pool->page || (PAGE_SIZE - pool->offset) < SGE_PAGE_SIZE) {
|
|
|
-
|
|
|
- /* put page reference used by the memory pool, since we
|
|
|
- * won't be using this page as the mempool anymore.
|
|
|
- */
|
|
|
- if (pool->page)
|
|
|
- put_page(pool->page);
|
|
|
-
|
|
|
+ if (!pool->page) {
|
|
|
pool->page = alloc_pages(gfp_mask, PAGES_PER_SGE_SHIFT);
|
|
|
if (unlikely(!pool->page))
|
|
|
return -ENOMEM;
|
|
@@ -571,7 +564,6 @@ static int bnx2x_alloc_rx_sge(struct bnx2x *bp, struct bnx2x_fastpath *fp,
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
- get_page(pool->page);
|
|
|
sw_buf->page = pool->page;
|
|
|
sw_buf->offset = pool->offset;
|
|
|
|
|
@@ -581,7 +573,10 @@ static int bnx2x_alloc_rx_sge(struct bnx2x *bp, struct bnx2x_fastpath *fp,
|
|
|
sge->addr_lo = cpu_to_le32(U64_LO(mapping));
|
|
|
|
|
|
pool->offset += SGE_PAGE_SIZE;
|
|
|
-
|
|
|
+ if (PAGE_SIZE - pool->offset >= SGE_PAGE_SIZE)
|
|
|
+ get_page(pool->page);
|
|
|
+ else
|
|
|
+ pool->page = NULL;
|
|
|
return 0;
|
|
|
}
|
|
|
|