BNX2X: fixes cont_page allocation
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 18 Mar 2015 16:06:32 +0000 (12:06 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 19 Mar 2015 18:45:19 +0000 (14:45 -0400)
Linux's alloc_pages returns a struct page*.  Our get_cont_pages returns
a KVA.  The mapping would be screwed up, since we were taking the
page2pa() of the KVA, not the page.

Of course, we weren't calling this, since TPA was disabled, and it
wasn't the problem triggering the MC Assert.  Well damn.

kern/drivers/net/bnx2x/bnx2x_cmn.c
kern/drivers/net/bnx2x/bnx2x_cmn.h
scripts/spatch/linux/memory.cocci

index 021b19a..442de35 100644 (file)
@@ -510,7 +510,8 @@ panic("Not implemented");
 static int bnx2x_alloc_rx_sge(struct bnx2x *bp, struct bnx2x_fastpath *fp,
                              uint16_t index, gfp_t gfp_mask)
 {
-       struct page *page = get_cont_pages(PAGES_PER_SGE_SHIFT, gfp_mask);
+       /* AKAROS_PORT: our get_cont_pages returns KVAs, not struct page * */
+       struct page *page = kva2page(get_cont_pages(PAGES_PER_SGE_SHIFT, gfp_mask));
        struct sw_rx_page *sw_buf = &fp->rx_page_ring[index];
        struct eth_rx_sge *sge = &fp->rx_sge_ring[index];
        dma_addr_t mapping;
@@ -523,7 +524,7 @@ static int bnx2x_alloc_rx_sge(struct bnx2x *bp, struct bnx2x_fastpath *fp,
        mapping = dma_map_page(&bp->pdev->dev, page, 0,
                               SGE_PAGES, DMA_FROM_DEVICE);
        if (unlikely(dma_mapping_error(&bp->pdev->dev, mapping))) {
-               free_cont_pages(page, PAGES_PER_SGE_SHIFT);
+               free_cont_pages(page2kva(page), PAGES_PER_SGE_SHIFT);
                BNX2X_ERR("Can't map sge\n");
                return -ENOMEM;
        }
index 6bb1051..4196227 100644 (file)
@@ -809,7 +809,7 @@ static inline void bnx2x_free_rx_sge(struct bnx2x *bp,
 
        dma_unmap_page(&bp->pdev->dev, dma_unmap_addr(sw_buf, mapping),
                       SGE_PAGES, DMA_FROM_DEVICE);
-       free_cont_pages(page, PAGES_PER_SGE_SHIFT);
+       free_cont_pages(page2kva(page), PAGES_PER_SGE_SHIFT);
 
        sw_buf->page = NULL;
        sge->addr_hi = 0;
index 3b65631..090e361 100644 (file)
@@ -33,19 +33,21 @@ expression FL;
 -kcalloc(CNT, SZ, FL)
 +kzmalloc((CNT) * (SZ), FL)
 
+# These are dangerous in Akaros.  If someone is using a page* for multiple
+# pages, it's probably okay, but we should look closely.
 @@
 expression ADDR;
 expression ORDER;
 @@
 -__free_pages(ADDR, ORDER)
-+free_cont_pages(ADDR, ORDER)
++free_cont_pages(page2kva(ADDR), ORDER)
 
 @@
 expression FLAGS;
 expression ORDER;
 @@
 -alloc_pages(FLAGS, ORDER)
-+get_cont_pages(ORDER, FLAGS)
++kva2page(get_cont_pages(ORDER, FLAGS))
 
 @@
 expression FLAGS;