Hi Gabriel,
Thanks for pointing out this shortcoming.
However, I don't think that the solution you suggested would work as is.
@@ -628,21 +644,30 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct
bnx2x_fastpath *fp,
bnx2x_fp_qstats(bp, fp)->rx_skb_alloc_failed++;
return err;
}
+ if (old_rx_pg.offset + old_rx_pg.len >= PAGE_SIZE) {
+ /* Unmap the page as we finished passing it to
+ * the stack
+ */
+ old_rx_pg.mapping = old_rx_pg.mapping -
+ old_rx_pg.offset;
+ dma_unmap_page(&bp->pdev->dev,
+ dma_unmap_addr(&old_rx_pg, mapping),
+ PAGE_SIZE, DMA_FROM_DEVICE);
+ }
This code assumes that pages are consumed by the device in order. This is not
true.
The pages are consumed according to packet arrival order, which can be from
different aggregations.
We'll come up with a compatible solution.
Thanks,
Ariel
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html