netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH -next 0/2] bnx2: allow sleep during allocation
@ 2010-07-15 14:25 Stanislaw Gruszka
  2010-07-15 14:25 ` [PATCH 1/2] bnx2: allocate with GFP_KERNEL flag on RX path init Stanislaw Gruszka
  2010-07-15 14:25 ` [PATCH 2/2] bnx2: use device model DMA API Stanislaw Gruszka
  0 siblings, 2 replies; 14+ messages in thread
From: Stanislaw Gruszka @ 2010-07-15 14:25 UTC (permalink / raw)
  To: netdev; +Cc: Michael Chan

We have Fedora bug report about memory allocation failure in bnx2_open
(https://bugzilla.redhat.com/show_bug.cgi?id=612861). To prevent
failure we can allow allocator to sleep. Both patches add
GFP_KERNEL flag where possible, first patch in alloc API, second
in DMA API (after conversion from pci_dma_*).

Stanislaw

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 1/2] bnx2: allocate with GFP_KERNEL flag on RX path init
  2010-07-15 14:25 [PATCH -next 0/2] bnx2: allow sleep during allocation Stanislaw Gruszka
@ 2010-07-15 14:25 ` Stanislaw Gruszka
  2010-07-15 14:48   ` Michael Chan
  2010-07-15 18:57   ` [PATCH " Mitchell Erblich
  2010-07-15 14:25 ` [PATCH 2/2] bnx2: use device model DMA API Stanislaw Gruszka
  1 sibling, 2 replies; 14+ messages in thread
From: Stanislaw Gruszka @ 2010-07-15 14:25 UTC (permalink / raw)
  To: netdev; +Cc: Michael Chan

Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
---
 drivers/net/bnx2.c |   17 +++++++++--------
 1 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
index a203f39..6de4cb7 100644
--- a/drivers/net/bnx2.c
+++ b/drivers/net/bnx2.c
@@ -2664,13 +2664,13 @@ bnx2_set_mac_addr(struct bnx2 *bp, u8 *mac_addr, u32 pos)
 }
 
 static inline int
-bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
+bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gfp_t gfp)
 {
 	dma_addr_t mapping;
 	struct sw_pg *rx_pg = &rxr->rx_pg_ring[index];
 	struct rx_bd *rxbd =
 		&rxr->rx_pg_desc_ring[RX_RING(index)][RX_IDX(index)];
-	struct page *page = alloc_page(GFP_ATOMIC);
+	struct page *page = alloc_page(gfp);
 
 	if (!page)
 		return -ENOMEM;
@@ -2705,7 +2705,7 @@ bnx2_free_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
 }
 
 static inline int
-bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
+bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gfp_t gfp)
 {
 	struct sk_buff *skb;
 	struct sw_bd *rx_buf = &rxr->rx_buf_ring[index];
@@ -2713,7 +2713,7 @@ bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
 	struct rx_bd *rxbd = &rxr->rx_desc_ring[RX_RING(index)][RX_IDX(index)];
 	unsigned long align;
 
-	skb = netdev_alloc_skb(bp->dev, bp->rx_buf_size);
+	skb = __netdev_alloc_skb(bp->dev, bp->rx_buf_size, gfp);
 	if (skb == NULL) {
 		return -ENOMEM;
 	}
@@ -2974,7 +2974,7 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
 	int err;
 	u16 prod = ring_idx & 0xffff;
 
-	err = bnx2_alloc_rx_skb(bp, rxr, prod);
+	err = bnx2_alloc_rx_skb(bp, rxr, prod, GFP_KERNEL);
 	if (unlikely(err)) {
 		bnx2_reuse_rx_skb(bp, rxr, skb, (u16) (ring_idx >> 16), prod);
 		if (hdr_len) {
@@ -3039,7 +3039,8 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
 			rx_pg->page = NULL;
 
 			err = bnx2_alloc_rx_page(bp, rxr,
-						 RX_PG_RING_IDX(pg_prod));
+						 RX_PG_RING_IDX(pg_prod),
+						 GFP_ATOMIC);
 			if (unlikely(err)) {
 				rxr->rx_pg_cons = pg_cons;
 				rxr->rx_pg_prod = pg_prod;
@@ -5179,7 +5180,7 @@ bnx2_init_rx_ring(struct bnx2 *bp, int ring_num)
 
 	ring_prod = prod = rxr->rx_pg_prod;
 	for (i = 0; i < bp->rx_pg_ring_size; i++) {
-		if (bnx2_alloc_rx_page(bp, rxr, ring_prod) < 0) {
+		if (bnx2_alloc_rx_page(bp, rxr, ring_prod, GFP_KERNEL) < 0) {
 			netdev_warn(bp->dev, "init'ed rx page ring %d with %d/%d pages only\n",
 				    ring_num, i, bp->rx_pg_ring_size);
 			break;
@@ -5191,7 +5192,7 @@ bnx2_init_rx_ring(struct bnx2 *bp, int ring_num)
 
 	ring_prod = prod = rxr->rx_prod;
 	for (i = 0; i < bp->rx_ring_size; i++) {
-		if (bnx2_alloc_rx_skb(bp, rxr, ring_prod) < 0) {
+		if (bnx2_alloc_rx_skb(bp, rxr, ring_prod, GFP_KERNEL) < 0) {
 			netdev_warn(bp->dev, "init'ed rx ring %d with %d/%d skbs only\n",
 				    ring_num, i, bp->rx_ring_size);
 			break;
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 2/2] bnx2: use device model DMA API
  2010-07-15 14:25 [PATCH -next 0/2] bnx2: allow sleep during allocation Stanislaw Gruszka
  2010-07-15 14:25 ` [PATCH 1/2] bnx2: allocate with GFP_KERNEL flag on RX path init Stanislaw Gruszka
@ 2010-07-15 14:25 ` Stanislaw Gruszka
  2010-07-16 21:29   ` Michael Chan
  1 sibling, 1 reply; 14+ messages in thread
From: Stanislaw Gruszka @ 2010-07-15 14:25 UTC (permalink / raw)
  To: netdev; +Cc: Michael Chan

Use DMA API as PCI equivalents will be deprecated. This change also allow
to allocate with GFP_KERNEL in some places.

Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
---
 drivers/net/bnx2.c |  111 +++++++++++++++++++++++++++-------------------------
 1 files changed, 58 insertions(+), 53 deletions(-)

diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
index 6de4cb7..98aed05 100644
--- a/drivers/net/bnx2.c
+++ b/drivers/net/bnx2.c
@@ -692,9 +692,9 @@ bnx2_free_tx_mem(struct bnx2 *bp)
 		struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
 
 		if (txr->tx_desc_ring) {
-			pci_free_consistent(bp->pdev, TXBD_RING_SIZE,
-					    txr->tx_desc_ring,
-					    txr->tx_desc_mapping);
+			dma_free_coherent(&bp->pdev->dev, TXBD_RING_SIZE,
+					  txr->tx_desc_ring,
+					  txr->tx_desc_mapping);
 			txr->tx_desc_ring = NULL;
 		}
 		kfree(txr->tx_buf_ring);
@@ -714,9 +714,9 @@ bnx2_free_rx_mem(struct bnx2 *bp)
 
 		for (j = 0; j < bp->rx_max_ring; j++) {
 			if (rxr->rx_desc_ring[j])
-				pci_free_consistent(bp->pdev, RXBD_RING_SIZE,
-						    rxr->rx_desc_ring[j],
-						    rxr->rx_desc_mapping[j]);
+				dma_free_coherent(&bp->pdev->dev, RXBD_RING_SIZE,
+						  rxr->rx_desc_ring[j],
+						  rxr->rx_desc_mapping[j]);
 			rxr->rx_desc_ring[j] = NULL;
 		}
 		vfree(rxr->rx_buf_ring);
@@ -724,9 +724,9 @@ bnx2_free_rx_mem(struct bnx2 *bp)
 
 		for (j = 0; j < bp->rx_max_pg_ring; j++) {
 			if (rxr->rx_pg_desc_ring[j])
-				pci_free_consistent(bp->pdev, RXBD_RING_SIZE,
-						    rxr->rx_pg_desc_ring[j],
-						    rxr->rx_pg_desc_mapping[j]);
+				dma_free_coherent(&bp->pdev->dev, RXBD_RING_SIZE,
+						  rxr->rx_pg_desc_ring[j],
+						  rxr->rx_pg_desc_mapping[j]);
 			rxr->rx_pg_desc_ring[j] = NULL;
 		}
 		vfree(rxr->rx_pg_ring);
@@ -748,8 +748,8 @@ bnx2_alloc_tx_mem(struct bnx2 *bp)
 			return -ENOMEM;
 
 		txr->tx_desc_ring =
-			pci_alloc_consistent(bp->pdev, TXBD_RING_SIZE,
-					     &txr->tx_desc_mapping);
+			dma_alloc_coherent(&bp->pdev->dev, TXBD_RING_SIZE,
+					   &txr->tx_desc_mapping, GFP_KERNEL);
 		if (txr->tx_desc_ring == NULL)
 			return -ENOMEM;
 	}
@@ -776,8 +776,10 @@ bnx2_alloc_rx_mem(struct bnx2 *bp)
 
 		for (j = 0; j < bp->rx_max_ring; j++) {
 			rxr->rx_desc_ring[j] =
-				pci_alloc_consistent(bp->pdev, RXBD_RING_SIZE,
-						     &rxr->rx_desc_mapping[j]);
+				dma_alloc_coherent(&bp->pdev->dev,
+						   RXBD_RING_SIZE,
+						   &rxr->rx_desc_mapping[j],
+						   GFP_KERNEL);
 			if (rxr->rx_desc_ring[j] == NULL)
 				return -ENOMEM;
 
@@ -795,8 +797,10 @@ bnx2_alloc_rx_mem(struct bnx2 *bp)
 
 		for (j = 0; j < bp->rx_max_pg_ring; j++) {
 			rxr->rx_pg_desc_ring[j] =
-				pci_alloc_consistent(bp->pdev, RXBD_RING_SIZE,
-						&rxr->rx_pg_desc_mapping[j]);
+				dma_alloc_coherent(&bp->pdev->dev,
+						   RXBD_RING_SIZE,
+						   &rxr->rx_pg_desc_mapping[j],
+						   GFP_KERNEL);
 			if (rxr->rx_pg_desc_ring[j] == NULL)
 				return -ENOMEM;
 
@@ -816,16 +820,16 @@ bnx2_free_mem(struct bnx2 *bp)
 
 	for (i = 0; i < bp->ctx_pages; i++) {
 		if (bp->ctx_blk[i]) {
-			pci_free_consistent(bp->pdev, BCM_PAGE_SIZE,
-					    bp->ctx_blk[i],
-					    bp->ctx_blk_mapping[i]);
+			dma_free_coherent(&bp->pdev->dev, BCM_PAGE_SIZE,
+					  bp->ctx_blk[i],
+					  bp->ctx_blk_mapping[i]);
 			bp->ctx_blk[i] = NULL;
 		}
 	}
 	if (bnapi->status_blk.msi) {
-		pci_free_consistent(bp->pdev, bp->status_stats_size,
-				    bnapi->status_blk.msi,
-				    bp->status_blk_mapping);
+		dma_free_coherent(&bp->pdev->dev, bp->status_stats_size,
+				  bnapi->status_blk.msi,
+				  bp->status_blk_mapping);
 		bnapi->status_blk.msi = NULL;
 		bp->stats_blk = NULL;
 	}
@@ -846,8 +850,8 @@ bnx2_alloc_mem(struct bnx2 *bp)
 	bp->status_stats_size = status_blk_size +
 				sizeof(struct statistics_block);
 
-	status_blk = pci_alloc_consistent(bp->pdev, bp->status_stats_size,
-					  &bp->status_blk_mapping);
+	status_blk = dma_alloc_coherent(&bp->pdev->dev, bp->status_stats_size,
+					&bp->status_blk_mapping, GFP_KERNEL);
 	if (status_blk == NULL)
 		goto alloc_mem_err;
 
@@ -885,9 +889,10 @@ bnx2_alloc_mem(struct bnx2 *bp)
 		if (bp->ctx_pages == 0)
 			bp->ctx_pages = 1;
 		for (i = 0; i < bp->ctx_pages; i++) {
-			bp->ctx_blk[i] = pci_alloc_consistent(bp->pdev,
+			bp->ctx_blk[i] = dma_alloc_coherent(&bp->pdev->dev,
 						BCM_PAGE_SIZE,
-						&bp->ctx_blk_mapping[i]);
+						&bp->ctx_blk_mapping[i],
+						GFP_KERNEL);
 			if (bp->ctx_blk[i] == NULL)
 				goto alloc_mem_err;
 		}
@@ -2674,9 +2679,9 @@ bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gf
 
 	if (!page)
 		return -ENOMEM;
-	mapping = pci_map_page(bp->pdev, page, 0, PAGE_SIZE,
+	mapping = dma_map_page(&bp->pdev->dev, page, 0, PAGE_SIZE,
 			       PCI_DMA_FROMDEVICE);
-	if (pci_dma_mapping_error(bp->pdev, mapping)) {
+	if (dma_mapping_error(&bp->pdev->dev, mapping)) {
 		__free_page(page);
 		return -EIO;
 	}
@@ -2697,8 +2702,8 @@ bnx2_free_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
 	if (!page)
 		return;
 
-	pci_unmap_page(bp->pdev, dma_unmap_addr(rx_pg, mapping), PAGE_SIZE,
-		       PCI_DMA_FROMDEVICE);
+	dma_unmap_page(&bp->pdev->dev, dma_unmap_addr(rx_pg, mapping),
+		       PAGE_SIZE, PCI_DMA_FROMDEVICE);
 
 	__free_page(page);
 	rx_pg->page = NULL;
@@ -2721,9 +2726,9 @@ bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gfp
 	if (unlikely((align = (unsigned long) skb->data & (BNX2_RX_ALIGN - 1))))
 		skb_reserve(skb, BNX2_RX_ALIGN - align);
 
-	mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_use_size,
-		PCI_DMA_FROMDEVICE);
-	if (pci_dma_mapping_error(bp->pdev, mapping)) {
+	mapping = dma_map_single(&bp->pdev->dev, skb->data, bp->rx_buf_use_size,
+				 PCI_DMA_FROMDEVICE);
+	if (dma_mapping_error(&bp->pdev->dev, mapping)) {
 		dev_kfree_skb(skb);
 		return -EIO;
 	}
@@ -2829,7 +2834,7 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
 			}
 		}
 
-		pci_unmap_single(bp->pdev, dma_unmap_addr(tx_buf, mapping),
+		dma_unmap_single(&bp->pdev->dev, dma_unmap_addr(tx_buf, mapping),
 			skb_headlen(skb), PCI_DMA_TODEVICE);
 
 		tx_buf->skb = NULL;
@@ -2838,7 +2843,7 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
 		for (i = 0; i < last; i++) {
 			sw_cons = NEXT_TX_BD(sw_cons);
 
-			pci_unmap_page(bp->pdev,
+			dma_unmap_page(&bp->pdev->dev,
 				dma_unmap_addr(
 					&txr->tx_buf_ring[TX_RING_IDX(sw_cons)],
 					mapping),
@@ -2945,7 +2950,7 @@ bnx2_reuse_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,
 	cons_rx_buf = &rxr->rx_buf_ring[cons];
 	prod_rx_buf = &rxr->rx_buf_ring[prod];
 
-	pci_dma_sync_single_for_device(bp->pdev,
+	dma_sync_single_for_device(&bp->pdev->dev,
 		dma_unmap_addr(cons_rx_buf, mapping),
 		BNX2_RX_OFFSET + BNX2_RX_COPY_THRESH, PCI_DMA_FROMDEVICE);
 
@@ -2987,7 +2992,7 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
 	}
 
 	skb_reserve(skb, BNX2_RX_OFFSET);
-	pci_unmap_single(bp->pdev, dma_addr, bp->rx_buf_use_size,
+	dma_unmap_single(&bp->pdev->dev, dma_addr, bp->rx_buf_use_size,
 			 PCI_DMA_FROMDEVICE);
 
 	if (hdr_len == 0) {
@@ -3049,7 +3054,7 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
 				return err;
 			}
 
-			pci_unmap_page(bp->pdev, mapping_old,
+			dma_unmap_page(&bp->pdev->dev, mapping_old,
 				       PAGE_SIZE, PCI_DMA_FROMDEVICE);
 
 			frag_size -= frag_len;
@@ -3120,7 +3125,7 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
 
 		dma_addr = dma_unmap_addr(rx_buf, mapping);
 
-		pci_dma_sync_single_for_cpu(bp->pdev, dma_addr,
+		dma_sync_single_for_cpu(&bp->pdev->dev, dma_addr,
 			BNX2_RX_OFFSET + BNX2_RX_COPY_THRESH,
 			PCI_DMA_FROMDEVICE);
 
@@ -5338,7 +5343,7 @@ bnx2_free_tx_skbs(struct bnx2 *bp)
 				continue;
 			}
 
-			pci_unmap_single(bp->pdev,
+			dma_unmap_single(&bp->pdev->dev,
 					 dma_unmap_addr(tx_buf, mapping),
 					 skb_headlen(skb),
 					 PCI_DMA_TODEVICE);
@@ -5349,7 +5354,7 @@ bnx2_free_tx_skbs(struct bnx2 *bp)
 			j++;
 			for (k = 0; k < last; k++, j++) {
 				tx_buf = &txr->tx_buf_ring[TX_RING_IDX(j)];
-				pci_unmap_page(bp->pdev,
+				dma_unmap_page(&bp->pdev->dev,
 					dma_unmap_addr(tx_buf, mapping),
 					skb_shinfo(skb)->frags[k].size,
 					PCI_DMA_TODEVICE);
@@ -5379,7 +5384,7 @@ bnx2_free_rx_skbs(struct bnx2 *bp)
 			if (skb == NULL)
 				continue;
 
-			pci_unmap_single(bp->pdev,
+			dma_unmap_single(&bp->pdev->dev,
 					 dma_unmap_addr(rx_buf, mapping),
 					 bp->rx_buf_use_size,
 					 PCI_DMA_FROMDEVICE);
@@ -5732,9 +5737,9 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
 	for (i = 14; i < pkt_size; i++)
 		packet[i] = (unsigned char) (i & 0xff);
 
-	map = pci_map_single(bp->pdev, skb->data, pkt_size,
-		PCI_DMA_TODEVICE);
-	if (pci_dma_mapping_error(bp->pdev, map)) {
+	map = dma_map_single(&bp->pdev->dev, skb->data, pkt_size,
+			     PCI_DMA_TODEVICE);
+	if (dma_mapping_error(&bp->pdev->dev, map)) {
 		dev_kfree_skb(skb);
 		return -EIO;
 	}
@@ -5772,7 +5777,7 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
 
 	udelay(5);
 
-	pci_unmap_single(bp->pdev, map, pkt_size, PCI_DMA_TODEVICE);
+	dma_unmap_single(&bp->pdev->dev, map, pkt_size, PCI_DMA_TODEVICE);
 	dev_kfree_skb(skb);
 
 	if (bnx2_get_hw_tx_cons(tx_napi) != txr->tx_prod)
@@ -5789,7 +5794,7 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
 	rx_hdr = rx_buf->desc;
 	skb_reserve(rx_skb, BNX2_RX_OFFSET);
 
-	pci_dma_sync_single_for_cpu(bp->pdev,
+	dma_sync_single_for_cpu(&bp->pdev->dev,
 		dma_unmap_addr(rx_buf, mapping),
 		bp->rx_buf_size, PCI_DMA_FROMDEVICE);
 
@@ -6457,8 +6462,8 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
 	} else
 		mss = 0;
 
-	mapping = pci_map_single(bp->pdev, skb->data, len, PCI_DMA_TODEVICE);
-	if (pci_dma_mapping_error(bp->pdev, mapping)) {
+	mapping = dma_map_single(&bp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE);
+	if (dma_mapping_error(&bp->pdev->dev, mapping)) {
 		dev_kfree_skb(skb);
 		return NETDEV_TX_OK;
 	}
@@ -6486,9 +6491,9 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
 		txbd = &txr->tx_desc_ring[ring_prod];
 
 		len = frag->size;
-		mapping = pci_map_page(bp->pdev, frag->page, frag->page_offset,
-			len, PCI_DMA_TODEVICE);
-		if (pci_dma_mapping_error(bp->pdev, mapping))
+		mapping = dma_map_page(&bp->pdev->dev, frag->page, frag->page_offset,
+				       len, PCI_DMA_TODEVICE);
+		if (dma_mapping_error(&bp->pdev->dev, mapping))
 			goto dma_error;
 		dma_unmap_addr_set(&txr->tx_buf_ring[ring_prod], mapping,
 				   mapping);
@@ -6527,7 +6532,7 @@ dma_error:
 	ring_prod = TX_RING_IDX(prod);
 	tx_buf = &txr->tx_buf_ring[ring_prod];
 	tx_buf->skb = NULL;
-	pci_unmap_single(bp->pdev, dma_unmap_addr(tx_buf, mapping),
+	dma_unmap_single(&bp->pdev->dev, dma_unmap_addr(tx_buf, mapping),
 			 skb_headlen(skb), PCI_DMA_TODEVICE);
 
 	/* unmap remaining mapped pages */
@@ -6535,7 +6540,7 @@ dma_error:
 		prod = NEXT_TX_BD(prod);
 		ring_prod = TX_RING_IDX(prod);
 		tx_buf = &txr->tx_buf_ring[ring_prod];
-		pci_unmap_page(bp->pdev, dma_unmap_addr(tx_buf, mapping),
+		dma_unmap_page(&bp->pdev->dev, dma_unmap_addr(tx_buf, mapping),
 			       skb_shinfo(skb)->frags[i].size,
 			       PCI_DMA_TODEVICE);
 	}
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] bnx2: allocate with GFP_KERNEL flag on RX path init
  2010-07-15 14:25 ` [PATCH 1/2] bnx2: allocate with GFP_KERNEL flag on RX path init Stanislaw Gruszka
@ 2010-07-15 14:48   ` Michael Chan
  2010-07-16  3:25     ` David Miller
  2010-07-16  8:55     ` [PATCH v2 " Stanislaw Gruszka
  2010-07-15 18:57   ` [PATCH " Mitchell Erblich
  1 sibling, 2 replies; 14+ messages in thread
From: Michael Chan @ 2010-07-15 14:48 UTC (permalink / raw)
  To: 'Stanislaw Gruszka', netdev@vger.kernel.org

Stanislaw Gruszka wrote:

> Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
> ---
> @@ -2974,7 +2974,7 @@ bnx2_rx_skb(struct bnx2 *bp, struct
> bnx2_rx_ring_info *rxr, struct sk_buff *skb,
>       int err;
>       u16 prod = ring_idx & 0xffff;
>
> -     err = bnx2_alloc_rx_skb(bp, rxr, prod);
> +     err = bnx2_alloc_rx_skb(bp, rxr, prod, GFP_KERNEL);

This should be GFP_ATOMIC since it is called from NAPI softirq
context.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] bnx2: allocate with GFP_KERNEL flag on RX path init
  2010-07-15 14:25 ` [PATCH 1/2] bnx2: allocate with GFP_KERNEL flag on RX path init Stanislaw Gruszka
  2010-07-15 14:48   ` Michael Chan
@ 2010-07-15 18:57   ` Mitchell Erblich
  2010-07-16  7:30     ` Stanislaw Gruszka
  1 sibling, 1 reply; 14+ messages in thread
From: Mitchell Erblich @ 2010-07-15 18:57 UTC (permalink / raw)
  To: Stanislaw Gruszka; +Cc: netdev, Michael Chan


On Jul 15, 2010, at 7:25 AM, Stanislaw Gruszka wrote:

> Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
> ---
> drivers/net/bnx2.c |   17 +++++++++--------
> 1 files changed, 9 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
> index a203f39..6de4cb7 100644
> --- a/drivers/net/bnx2.c
> +++ b/drivers/net/bnx2.c
> @@ -2664,13 +2664,13 @@ bnx2_set_mac_addr(struct bnx2 *bp, u8 *mac_addr, u32 pos)
> }
> 
> static inline int
> -bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
> +bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gfp_t gfp)
> {
> 	dma_addr_t mapping;
> 	struct sw_pg *rx_pg = &rxr->rx_pg_ring[index];
> 	struct rx_bd *rxbd =
> 		&rxr->rx_pg_desc_ring[RX_RING(index)][RX_IDX(index)];
> -	struct page *page = alloc_page(GFP_ATOMIC);
> +	struct page *page = alloc_page(gfp);
> 
> 	if (!page)
> 		return -ENOMEM;
> @@ -2705,7 +2705,7 @@ bnx2_free_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
> }
> 
> static inline int
> -bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
> +bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gfp_t gfp)
> {
> 	struct sk_buff *skb;
> 	struct sw_bd *rx_buf = &rxr->rx_buf_ring[index];
> @@ -2713,7 +2713,7 @@ bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
> 	struct rx_bd *rxbd = &rxr->rx_desc_ring[RX_RING(index)][RX_IDX(index)];
> 	unsigned long align;
> 
> -	skb = netdev_alloc_skb(bp->dev, bp->rx_buf_size);
> +	skb = __netdev_alloc_skb(bp->dev, bp->rx_buf_size, gfp);
> 	if (skb == NULL) {
> 		return -ENOMEM;
> 	}
> @@ -2974,7 +2974,7 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
> 	int err;
> 	u16 prod = ring_idx & 0xffff;
> 
> -	err = bnx2_alloc_rx_skb(bp, rxr, prod);
> +	err = bnx2_alloc_rx_skb(bp, rxr, prod, GFP_KERNEL);
> 	if (unlikely(err)) {
> 		bnx2_reuse_rx_skb(bp, rxr, skb, (u16) (ring_idx >> 16), prod);
> 		if (hdr_len) {
> @@ -3039,7 +3039,8 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
> 			rx_pg->page = NULL;
> 
> 			err = bnx2_alloc_rx_page(bp, rxr,
> -						 RX_PG_RING_IDX(pg_prod));
> +						 RX_PG_RING_IDX(pg_prod),
> +	

> 					 GFP_ATOMIC);

Why not GFP_NOWAIT here?
This would then not use the last reserved pages of memory.
This still would remove the possibe sleep asociated with GFP_KERNEL.

Mitchell Erblich


> 			if (unlikely(err)) {
> 				rxr->rx_pg_cons = pg_cons;
> 				rxr->rx_pg_prod = pg_prod;
> @@ -5179,7 +5180,7 @@ bnx2_init_rx_ring(struct bnx2 *bp, int ring_num)
> 
> 	ring_prod = prod = rxr->rx_pg_prod;
> 	for (i = 0; i < bp->rx_pg_ring_size; i++) {
> -		if (bnx2_alloc_rx_page(bp, rxr, ring_prod) < 0) {
> +		if (bnx2_alloc_rx_page(bp, rxr, ring_prod, GFP_KERNEL) < 0) {
> 			netdev_warn(bp->dev, "init'ed rx page ring %d with %d/%d pages only\n",
> 				    ring_num, i, bp->rx_pg_ring_size);
> 			break;
> @@ -5191,7 +5192,7 @@ bnx2_init_rx_ring(struct bnx2 *bp, int ring_num)
> 
> 	ring_prod = prod = rxr->rx_prod;
> 	for (i = 0; i < bp->rx_ring_size; i++) {
> -		if (bnx2_alloc_rx_skb(bp, rxr, ring_prod) < 0) {
> +		if (bnx2_alloc_rx_skb(bp, rxr, ring_prod, GFP_KERNEL) < 0) {
> 			netdev_warn(bp->dev, "init'ed rx ring %d with %d/%d skbs only\n",
> 				    ring_num, i, bp->rx_ring_size);
> 			break;
> -- 
> 1.7.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] bnx2: allocate with GFP_KERNEL flag on RX path init
  2010-07-15 14:48   ` Michael Chan
@ 2010-07-16  3:25     ` David Miller
  2010-07-16  5:57       ` Mitchell Erblich
  2010-07-16  7:13       ` Stanislaw Gruszka
  2010-07-16  8:55     ` [PATCH v2 " Stanislaw Gruszka
  1 sibling, 2 replies; 14+ messages in thread
From: David Miller @ 2010-07-16  3:25 UTC (permalink / raw)
  To: mchan; +Cc: sgruszka, netdev

From: "Michael Chan" <mchan@broadcom.com>
Date: Thu, 15 Jul 2010 07:48:40 -0700

> Stanislaw Gruszka wrote:
> 
>> Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
>> ---
>> @@ -2974,7 +2974,7 @@ bnx2_rx_skb(struct bnx2 *bp, struct
>> bnx2_rx_ring_info *rxr, struct sk_buff *skb,
>>       int err;
>>       u16 prod = ring_idx & 0xffff;
>>
>> -     err = bnx2_alloc_rx_skb(bp, rxr, prod);
>> +     err = bnx2_alloc_rx_skb(bp, rxr, prod, GFP_KERNEL);
> 
> This should be GFP_ATOMIC since it is called from NAPI softirq
> context.

This fatal issue gives me doubts about whether this patch was even
tested at all.

Immediately the kernel memory allocator should have issued a warning
due to this GFP_KERNEL allocation in a non-sleep'able context.

Stanislaw, how did you test this patch?

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] bnx2: allocate with GFP_KERNEL flag on RX path init
  2010-07-16  3:25     ` David Miller
@ 2010-07-16  5:57       ` Mitchell Erblich
  2010-07-16  7:13       ` Stanislaw Gruszka
  1 sibling, 0 replies; 14+ messages in thread
From: Mitchell Erblich @ 2010-07-16  5:57 UTC (permalink / raw)
  To: David Miller; +Cc: mchan, sgruszka, netdev


On Jul 15, 2010, at 8:25 PM, David Miller wrote:

> From: "Michael Chan" <mchan@broadcom.com>
> Date: Thu, 15 Jul 2010 07:48:40 -0700
> 
>> Stanislaw Gruszka wrote:
>> 
>>> Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
>>> ---
>>> @@ -2974,7 +2974,7 @@ bnx2_rx_skb(struct bnx2 *bp, struct
>>> bnx2_rx_ring_info *rxr, struct sk_buff *skb,
>>>      int err;
>>>      u16 prod = ring_idx & 0xffff;
>>> 
>>> -     err = bnx2_alloc_rx_skb(bp, rxr, prod);
>>> +     err = bnx2_alloc_rx_skb(bp, rxr, prod, GFP_KERNEL);
>> 
>> This should be GFP_ATOMIC since it is called from NAPI softirq
>> context.
> 
> This fatal issue gives me doubts about whether this patch was even
> tested at all.
> 
> Immediately the kernel memory allocator should have issued a warning
> due to this GFP_KERNEL allocation in a non-sleep'able context.
> 
> Stanislaw, how did you test this patch?
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
Group,

		Why NOT GFP_NOWAIT. This won't use the last resource pages
		versus GFP_ATOMIC?

		GFP_ATOMIC IMO, SHOULD be used in the paths that cleans
		and frees pages.

Mitchell Erblich



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] bnx2: allocate with GFP_KERNEL flag on RX path init
  2010-07-16  3:25     ` David Miller
  2010-07-16  5:57       ` Mitchell Erblich
@ 2010-07-16  7:13       ` Stanislaw Gruszka
  1 sibling, 0 replies; 14+ messages in thread
From: Stanislaw Gruszka @ 2010-07-16  7:13 UTC (permalink / raw)
  To: David Miller; +Cc: mchan, netdev

On Thu, 15 Jul 2010 20:25:37 -0700 (PDT)
David Miller <davem@davemloft.net> wrote:

> > This should be GFP_ATOMIC since it is called from NAPI softirq
> > context.
> 
> This fatal issue gives me doubts about whether this patch was even
> tested at all.
> 
> Immediately the kernel memory allocator should have issued a warning
> due to this GFP_KERNEL allocation in a non-sleep'able context.
> 
> Stanislaw, how did you test this patch?

I run net-next-2.6 kernel with patches on machine with bnx2 device,
but I compiled kernel with CONFIG_DEBUG_KOBJECT and all dmesg was filled
by messages like:

kobject: 'block' (ffff8801663122c0): kobject_add_internal: parent: '2:2:1:0', set: '(null)'
kobject: 'sdc' (ffff8801642ca070): kobject_add_internal: parent: 'block', set: 'devices'
kobject: 'sdc' (ffff8801642ca070): kobject_uevent_env

so I missed the warning, grr...

Stanislaw

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] bnx2: allocate with GFP_KERNEL flag on RX path init
  2010-07-15 18:57   ` [PATCH " Mitchell Erblich
@ 2010-07-16  7:30     ` Stanislaw Gruszka
  0 siblings, 0 replies; 14+ messages in thread
From: Stanislaw Gruszka @ 2010-07-16  7:30 UTC (permalink / raw)
  To: Mitchell Erblich; +Cc: netdev, Michael Chan

On Thu, 15 Jul 2010 11:57:59 -0700
Mitchell Erblich <erblichs@earthlink.net> wrote:

> > @@ -3039,7 +3039,8 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
> > 			rx_pg->page = NULL;
> > 
> > 			err = bnx2_alloc_rx_page(bp, rxr,
> > -						 RX_PG_RING_IDX(pg_prod));
> > +						 RX_PG_RING_IDX(pg_prod),
> > +	
> 
> > 					 GFP_ATOMIC);
> 
> Why not GFP_NOWAIT here?
> This would then not use the last reserved pages of memory.
> This still would remove the possibe sleep asociated with GFP_KERNEL.

There is no GFP_NOWAIT usage in any network driver. I'm not sure if
this flag is intended to driver usage. Anyway I can not judge if
GFP_ATOMIC -> GFP_NOWAIT conversion is good or bad idea, I think you
should ask mm guys about that.

Stanislaw

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH v2 1/2] bnx2: allocate with GFP_KERNEL flag on RX path init
  2010-07-15 14:48   ` Michael Chan
  2010-07-16  3:25     ` David Miller
@ 2010-07-16  8:55     ` Stanislaw Gruszka
  2010-07-16 21:24       ` Michael Chan
  1 sibling, 1 reply; 14+ messages in thread
From: Stanislaw Gruszka @ 2010-07-16  8:55 UTC (permalink / raw)
  To: netdev; +Cc: Michael Chan

Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
---
v1->v2: use GFP_ATOMIC in bnx2_rx_skb

 drivers/net/bnx2.c |   17 +++++++++--------
 1 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
index a203f39..a7df539 100644
--- a/drivers/net/bnx2.c
+++ b/drivers/net/bnx2.c
@@ -2664,13 +2664,13 @@ bnx2_set_mac_addr(struct bnx2 *bp, u8 *mac_addr, u32 pos)
 }
 
 static inline int
-bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
+bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gfp_t gfp)
 {
 	dma_addr_t mapping;
 	struct sw_pg *rx_pg = &rxr->rx_pg_ring[index];
 	struct rx_bd *rxbd =
 		&rxr->rx_pg_desc_ring[RX_RING(index)][RX_IDX(index)];
-	struct page *page = alloc_page(GFP_ATOMIC);
+	struct page *page = alloc_page(gfp);
 
 	if (!page)
 		return -ENOMEM;
@@ -2705,7 +2705,7 @@ bnx2_free_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
 }
 
 static inline int
-bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
+bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gfp_t gfp)
 {
 	struct sk_buff *skb;
 	struct sw_bd *rx_buf = &rxr->rx_buf_ring[index];
@@ -2713,7 +2713,7 @@ bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
 	struct rx_bd *rxbd = &rxr->rx_desc_ring[RX_RING(index)][RX_IDX(index)];
 	unsigned long align;
 
-	skb = netdev_alloc_skb(bp->dev, bp->rx_buf_size);
+	skb = __netdev_alloc_skb(bp->dev, bp->rx_buf_size, gfp);
 	if (skb == NULL) {
 		return -ENOMEM;
 	}
@@ -2974,7 +2974,7 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
 	int err;
 	u16 prod = ring_idx & 0xffff;
 
-	err = bnx2_alloc_rx_skb(bp, rxr, prod);
+	err = bnx2_alloc_rx_skb(bp, rxr, prod, GFP_ATOMIC);
 	if (unlikely(err)) {
 		bnx2_reuse_rx_skb(bp, rxr, skb, (u16) (ring_idx >> 16), prod);
 		if (hdr_len) {
@@ -3039,7 +3039,8 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
 			rx_pg->page = NULL;
 
 			err = bnx2_alloc_rx_page(bp, rxr,
-						 RX_PG_RING_IDX(pg_prod));
+						 RX_PG_RING_IDX(pg_prod),
+						 GFP_ATOMIC);
 			if (unlikely(err)) {
 				rxr->rx_pg_cons = pg_cons;
 				rxr->rx_pg_prod = pg_prod;
@@ -5179,7 +5180,7 @@ bnx2_init_rx_ring(struct bnx2 *bp, int ring_num)
 
 	ring_prod = prod = rxr->rx_pg_prod;
 	for (i = 0; i < bp->rx_pg_ring_size; i++) {
-		if (bnx2_alloc_rx_page(bp, rxr, ring_prod) < 0) {
+		if (bnx2_alloc_rx_page(bp, rxr, ring_prod, GFP_KERNEL) < 0) {
 			netdev_warn(bp->dev, "init'ed rx page ring %d with %d/%d pages only\n",
 				    ring_num, i, bp->rx_pg_ring_size);
 			break;
@@ -5191,7 +5192,7 @@ bnx2_init_rx_ring(struct bnx2 *bp, int ring_num)
 
 	ring_prod = prod = rxr->rx_prod;
 	for (i = 0; i < bp->rx_ring_size; i++) {
-		if (bnx2_alloc_rx_skb(bp, rxr, ring_prod) < 0) {
+		if (bnx2_alloc_rx_skb(bp, rxr, ring_prod, GFP_KERNEL) < 0) {
 			netdev_warn(bp->dev, "init'ed rx ring %d with %d/%d skbs only\n",
 				    ring_num, i, bp->rx_ring_size);
 			break;
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 1/2] bnx2: allocate with GFP_KERNEL flag on RX path init
  2010-07-16  8:55     ` [PATCH v2 " Stanislaw Gruszka
@ 2010-07-16 21:24       ` Michael Chan
  2010-07-18 21:43         ` David Miller
  0 siblings, 1 reply; 14+ messages in thread
From: Michael Chan @ 2010-07-16 21:24 UTC (permalink / raw)
  To: Stanislaw Gruszka; +Cc: netdev@vger.kernel.org


On Fri, 2010-07-16 at 01:55 -0700, Stanislaw Gruszka wrote:
> Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>

Acked-by: Michael Chan <mchan@broadcom.com>

> ---
> v1->v2: use GFP_ATOMIC in bnx2_rx_skb
> 
>  drivers/net/bnx2.c |   17 +++++++++--------
>  1 files changed, 9 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
> index a203f39..a7df539 100644
> --- a/drivers/net/bnx2.c
> +++ b/drivers/net/bnx2.c
> @@ -2664,13 +2664,13 @@ bnx2_set_mac_addr(struct bnx2 *bp, u8 *mac_addr, u32 pos)
>  }
>  
>  static inline int
> -bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
> +bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gfp_t gfp)
>  {
>  	dma_addr_t mapping;
>  	struct sw_pg *rx_pg = &rxr->rx_pg_ring[index];
>  	struct rx_bd *rxbd =
>  		&rxr->rx_pg_desc_ring[RX_RING(index)][RX_IDX(index)];
> -	struct page *page = alloc_page(GFP_ATOMIC);
> +	struct page *page = alloc_page(gfp);
>  
>  	if (!page)
>  		return -ENOMEM;
> @@ -2705,7 +2705,7 @@ bnx2_free_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
>  }
>  
>  static inline int
> -bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
> +bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gfp_t gfp)
>  {
>  	struct sk_buff *skb;
>  	struct sw_bd *rx_buf = &rxr->rx_buf_ring[index];
> @@ -2713,7 +2713,7 @@ bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
>  	struct rx_bd *rxbd = &rxr->rx_desc_ring[RX_RING(index)][RX_IDX(index)];
>  	unsigned long align;
>  
> -	skb = netdev_alloc_skb(bp->dev, bp->rx_buf_size);
> +	skb = __netdev_alloc_skb(bp->dev, bp->rx_buf_size, gfp);
>  	if (skb == NULL) {
>  		return -ENOMEM;
>  	}
> @@ -2974,7 +2974,7 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
>  	int err;
>  	u16 prod = ring_idx & 0xffff;
>  
> -	err = bnx2_alloc_rx_skb(bp, rxr, prod);
> +	err = bnx2_alloc_rx_skb(bp, rxr, prod, GFP_ATOMIC);
>  	if (unlikely(err)) {
>  		bnx2_reuse_rx_skb(bp, rxr, skb, (u16) (ring_idx >> 16), prod);
>  		if (hdr_len) {
> @@ -3039,7 +3039,8 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
>  			rx_pg->page = NULL;
>  
>  			err = bnx2_alloc_rx_page(bp, rxr,
> -						 RX_PG_RING_IDX(pg_prod));
> +						 RX_PG_RING_IDX(pg_prod),
> +						 GFP_ATOMIC);
>  			if (unlikely(err)) {
>  				rxr->rx_pg_cons = pg_cons;
>  				rxr->rx_pg_prod = pg_prod;
> @@ -5179,7 +5180,7 @@ bnx2_init_rx_ring(struct bnx2 *bp, int ring_num)
>  
>  	ring_prod = prod = rxr->rx_pg_prod;
>  	for (i = 0; i < bp->rx_pg_ring_size; i++) {
> -		if (bnx2_alloc_rx_page(bp, rxr, ring_prod) < 0) {
> +		if (bnx2_alloc_rx_page(bp, rxr, ring_prod, GFP_KERNEL) < 0) {
>  			netdev_warn(bp->dev, "init'ed rx page ring %d with %d/%d pages only\n",
>  				    ring_num, i, bp->rx_pg_ring_size);
>  			break;
> @@ -5191,7 +5192,7 @@ bnx2_init_rx_ring(struct bnx2 *bp, int ring_num)
>  
>  	ring_prod = prod = rxr->rx_prod;
>  	for (i = 0; i < bp->rx_ring_size; i++) {
> -		if (bnx2_alloc_rx_skb(bp, rxr, ring_prod) < 0) {
> +		if (bnx2_alloc_rx_skb(bp, rxr, ring_prod, GFP_KERNEL) < 0) {
>  			netdev_warn(bp->dev, "init'ed rx ring %d with %d/%d skbs only\n",
>  				    ring_num, i, bp->rx_ring_size);
>  			break;



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] bnx2: use device model DMA API
  2010-07-15 14:25 ` [PATCH 2/2] bnx2: use device model DMA API Stanislaw Gruszka
@ 2010-07-16 21:29   ` Michael Chan
  2010-07-18 21:43     ` David Miller
  0 siblings, 1 reply; 14+ messages in thread
From: Michael Chan @ 2010-07-16 21:29 UTC (permalink / raw)
  To: Stanislaw Gruszka; +Cc: netdev@vger.kernel.org


On Thu, 2010-07-15 at 07:25 -0700, Stanislaw Gruszka wrote:
> Use DMA API as PCI equivalents will be deprecated. This change also allow
> to allocate with GFP_KERNEL in some places.
> 
> Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>

Acked-by: Michael Chan <mchan@broadcom.com>

> ---
>  drivers/net/bnx2.c |  111 +++++++++++++++++++++++++++-------------------------
>  1 files changed, 58 insertions(+), 53 deletions(-)
> 
> diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
> index 6de4cb7..98aed05 100644
> --- a/drivers/net/bnx2.c
> +++ b/drivers/net/bnx2.c
> @@ -692,9 +692,9 @@ bnx2_free_tx_mem(struct bnx2 *bp)
>  		struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
>  
>  		if (txr->tx_desc_ring) {
> -			pci_free_consistent(bp->pdev, TXBD_RING_SIZE,
> -					    txr->tx_desc_ring,
> -					    txr->tx_desc_mapping);
> +			dma_free_coherent(&bp->pdev->dev, TXBD_RING_SIZE,
> +					  txr->tx_desc_ring,
> +					  txr->tx_desc_mapping);
>  			txr->tx_desc_ring = NULL;
>  		}
>  		kfree(txr->tx_buf_ring);
> @@ -714,9 +714,9 @@ bnx2_free_rx_mem(struct bnx2 *bp)
>  
>  		for (j = 0; j < bp->rx_max_ring; j++) {
>  			if (rxr->rx_desc_ring[j])
> -				pci_free_consistent(bp->pdev, RXBD_RING_SIZE,
> -						    rxr->rx_desc_ring[j],
> -						    rxr->rx_desc_mapping[j]);
> +				dma_free_coherent(&bp->pdev->dev, RXBD_RING_SIZE,
> +						  rxr->rx_desc_ring[j],
> +						  rxr->rx_desc_mapping[j]);
>  			rxr->rx_desc_ring[j] = NULL;
>  		}
>  		vfree(rxr->rx_buf_ring);
> @@ -724,9 +724,9 @@ bnx2_free_rx_mem(struct bnx2 *bp)
>  
>  		for (j = 0; j < bp->rx_max_pg_ring; j++) {
>  			if (rxr->rx_pg_desc_ring[j])
> -				pci_free_consistent(bp->pdev, RXBD_RING_SIZE,
> -						    rxr->rx_pg_desc_ring[j],
> -						    rxr->rx_pg_desc_mapping[j]);
> +				dma_free_coherent(&bp->pdev->dev, RXBD_RING_SIZE,
> +						  rxr->rx_pg_desc_ring[j],
> +						  rxr->rx_pg_desc_mapping[j]);
>  			rxr->rx_pg_desc_ring[j] = NULL;
>  		}
>  		vfree(rxr->rx_pg_ring);
> @@ -748,8 +748,8 @@ bnx2_alloc_tx_mem(struct bnx2 *bp)
>  			return -ENOMEM;
>  
>  		txr->tx_desc_ring =
> -			pci_alloc_consistent(bp->pdev, TXBD_RING_SIZE,
> -					     &txr->tx_desc_mapping);
> +			dma_alloc_coherent(&bp->pdev->dev, TXBD_RING_SIZE,
> +					   &txr->tx_desc_mapping, GFP_KERNEL);
>  		if (txr->tx_desc_ring == NULL)
>  			return -ENOMEM;
>  	}
> @@ -776,8 +776,10 @@ bnx2_alloc_rx_mem(struct bnx2 *bp)
>  
>  		for (j = 0; j < bp->rx_max_ring; j++) {
>  			rxr->rx_desc_ring[j] =
> -				pci_alloc_consistent(bp->pdev, RXBD_RING_SIZE,
> -						     &rxr->rx_desc_mapping[j]);
> +				dma_alloc_coherent(&bp->pdev->dev,
> +						   RXBD_RING_SIZE,
> +						   &rxr->rx_desc_mapping[j],
> +						   GFP_KERNEL);
>  			if (rxr->rx_desc_ring[j] == NULL)
>  				return -ENOMEM;
>  
> @@ -795,8 +797,10 @@ bnx2_alloc_rx_mem(struct bnx2 *bp)
>  
>  		for (j = 0; j < bp->rx_max_pg_ring; j++) {
>  			rxr->rx_pg_desc_ring[j] =
> -				pci_alloc_consistent(bp->pdev, RXBD_RING_SIZE,
> -						&rxr->rx_pg_desc_mapping[j]);
> +				dma_alloc_coherent(&bp->pdev->dev,
> +						   RXBD_RING_SIZE,
> +						   &rxr->rx_pg_desc_mapping[j],
> +						   GFP_KERNEL);
>  			if (rxr->rx_pg_desc_ring[j] == NULL)
>  				return -ENOMEM;
>  
> @@ -816,16 +820,16 @@ bnx2_free_mem(struct bnx2 *bp)
>  
>  	for (i = 0; i < bp->ctx_pages; i++) {
>  		if (bp->ctx_blk[i]) {
> -			pci_free_consistent(bp->pdev, BCM_PAGE_SIZE,
> -					    bp->ctx_blk[i],
> -					    bp->ctx_blk_mapping[i]);
> +			dma_free_coherent(&bp->pdev->dev, BCM_PAGE_SIZE,
> +					  bp->ctx_blk[i],
> +					  bp->ctx_blk_mapping[i]);
>  			bp->ctx_blk[i] = NULL;
>  		}
>  	}
>  	if (bnapi->status_blk.msi) {
> -		pci_free_consistent(bp->pdev, bp->status_stats_size,
> -				    bnapi->status_blk.msi,
> -				    bp->status_blk_mapping);
> +		dma_free_coherent(&bp->pdev->dev, bp->status_stats_size,
> +				  bnapi->status_blk.msi,
> +				  bp->status_blk_mapping);
>  		bnapi->status_blk.msi = NULL;
>  		bp->stats_blk = NULL;
>  	}
> @@ -846,8 +850,8 @@ bnx2_alloc_mem(struct bnx2 *bp)
>  	bp->status_stats_size = status_blk_size +
>  				sizeof(struct statistics_block);
>  
> -	status_blk = pci_alloc_consistent(bp->pdev, bp->status_stats_size,
> -					  &bp->status_blk_mapping);
> +	status_blk = dma_alloc_coherent(&bp->pdev->dev, bp->status_stats_size,
> +					&bp->status_blk_mapping, GFP_KERNEL);
>  	if (status_blk == NULL)
>  		goto alloc_mem_err;
>  
> @@ -885,9 +889,10 @@ bnx2_alloc_mem(struct bnx2 *bp)
>  		if (bp->ctx_pages == 0)
>  			bp->ctx_pages = 1;
>  		for (i = 0; i < bp->ctx_pages; i++) {
> -			bp->ctx_blk[i] = pci_alloc_consistent(bp->pdev,
> +			bp->ctx_blk[i] = dma_alloc_coherent(&bp->pdev->dev,
>  						BCM_PAGE_SIZE,
> -						&bp->ctx_blk_mapping[i]);
> +						&bp->ctx_blk_mapping[i],
> +						GFP_KERNEL);
>  			if (bp->ctx_blk[i] == NULL)
>  				goto alloc_mem_err;
>  		}
> @@ -2674,9 +2679,9 @@ bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gf
>  
>  	if (!page)
>  		return -ENOMEM;
> -	mapping = pci_map_page(bp->pdev, page, 0, PAGE_SIZE,
> +	mapping = dma_map_page(&bp->pdev->dev, page, 0, PAGE_SIZE,
>  			       PCI_DMA_FROMDEVICE);
> -	if (pci_dma_mapping_error(bp->pdev, mapping)) {
> +	if (dma_mapping_error(&bp->pdev->dev, mapping)) {
>  		__free_page(page);
>  		return -EIO;
>  	}
> @@ -2697,8 +2702,8 @@ bnx2_free_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
>  	if (!page)
>  		return;
>  
> -	pci_unmap_page(bp->pdev, dma_unmap_addr(rx_pg, mapping), PAGE_SIZE,
> -		       PCI_DMA_FROMDEVICE);
> +	dma_unmap_page(&bp->pdev->dev, dma_unmap_addr(rx_pg, mapping),
> +		       PAGE_SIZE, PCI_DMA_FROMDEVICE);
>  
>  	__free_page(page);
>  	rx_pg->page = NULL;
> @@ -2721,9 +2726,9 @@ bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gfp
>  	if (unlikely((align = (unsigned long) skb->data & (BNX2_RX_ALIGN - 1))))
>  		skb_reserve(skb, BNX2_RX_ALIGN - align);
>  
> -	mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_use_size,
> -		PCI_DMA_FROMDEVICE);
> -	if (pci_dma_mapping_error(bp->pdev, mapping)) {
> +	mapping = dma_map_single(&bp->pdev->dev, skb->data, bp->rx_buf_use_size,
> +				 PCI_DMA_FROMDEVICE);
> +	if (dma_mapping_error(&bp->pdev->dev, mapping)) {
>  		dev_kfree_skb(skb);
>  		return -EIO;
>  	}
> @@ -2829,7 +2834,7 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
>  			}
>  		}
>  
> -		pci_unmap_single(bp->pdev, dma_unmap_addr(tx_buf, mapping),
> +		dma_unmap_single(&bp->pdev->dev, dma_unmap_addr(tx_buf, mapping),
>  			skb_headlen(skb), PCI_DMA_TODEVICE);
>  
>  		tx_buf->skb = NULL;
> @@ -2838,7 +2843,7 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
>  		for (i = 0; i < last; i++) {
>  			sw_cons = NEXT_TX_BD(sw_cons);
>  
> -			pci_unmap_page(bp->pdev,
> +			dma_unmap_page(&bp->pdev->dev,
>  				dma_unmap_addr(
>  					&txr->tx_buf_ring[TX_RING_IDX(sw_cons)],
>  					mapping),
> @@ -2945,7 +2950,7 @@ bnx2_reuse_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,
>  	cons_rx_buf = &rxr->rx_buf_ring[cons];
>  	prod_rx_buf = &rxr->rx_buf_ring[prod];
>  
> -	pci_dma_sync_single_for_device(bp->pdev,
> +	dma_sync_single_for_device(&bp->pdev->dev,
>  		dma_unmap_addr(cons_rx_buf, mapping),
>  		BNX2_RX_OFFSET + BNX2_RX_COPY_THRESH, PCI_DMA_FROMDEVICE);
>  
> @@ -2987,7 +2992,7 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
>  	}
>  
>  	skb_reserve(skb, BNX2_RX_OFFSET);
> -	pci_unmap_single(bp->pdev, dma_addr, bp->rx_buf_use_size,
> +	dma_unmap_single(&bp->pdev->dev, dma_addr, bp->rx_buf_use_size,
>  			 PCI_DMA_FROMDEVICE);
>  
>  	if (hdr_len == 0) {
> @@ -3049,7 +3054,7 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
>  				return err;
>  			}
>  
> -			pci_unmap_page(bp->pdev, mapping_old,
> +			dma_unmap_page(&bp->pdev->dev, mapping_old,
>  				       PAGE_SIZE, PCI_DMA_FROMDEVICE);
>  
>  			frag_size -= frag_len;
> @@ -3120,7 +3125,7 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
>  
>  		dma_addr = dma_unmap_addr(rx_buf, mapping);
>  
> -		pci_dma_sync_single_for_cpu(bp->pdev, dma_addr,
> +		dma_sync_single_for_cpu(&bp->pdev->dev, dma_addr,
>  			BNX2_RX_OFFSET + BNX2_RX_COPY_THRESH,
>  			PCI_DMA_FROMDEVICE);
>  
> @@ -5338,7 +5343,7 @@ bnx2_free_tx_skbs(struct bnx2 *bp)
>  				continue;
>  			}
>  
> -			pci_unmap_single(bp->pdev,
> +			dma_unmap_single(&bp->pdev->dev,
>  					 dma_unmap_addr(tx_buf, mapping),
>  					 skb_headlen(skb),
>  					 PCI_DMA_TODEVICE);
> @@ -5349,7 +5354,7 @@ bnx2_free_tx_skbs(struct bnx2 *bp)
>  			j++;
>  			for (k = 0; k < last; k++, j++) {
>  				tx_buf = &txr->tx_buf_ring[TX_RING_IDX(j)];
> -				pci_unmap_page(bp->pdev,
> +				dma_unmap_page(&bp->pdev->dev,
>  					dma_unmap_addr(tx_buf, mapping),
>  					skb_shinfo(skb)->frags[k].size,
>  					PCI_DMA_TODEVICE);
> @@ -5379,7 +5384,7 @@ bnx2_free_rx_skbs(struct bnx2 *bp)
>  			if (skb == NULL)
>  				continue;
>  
> -			pci_unmap_single(bp->pdev,
> +			dma_unmap_single(&bp->pdev->dev,
>  					 dma_unmap_addr(rx_buf, mapping),
>  					 bp->rx_buf_use_size,
>  					 PCI_DMA_FROMDEVICE);
> @@ -5732,9 +5737,9 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
>  	for (i = 14; i < pkt_size; i++)
>  		packet[i] = (unsigned char) (i & 0xff);
>  
> -	map = pci_map_single(bp->pdev, skb->data, pkt_size,
> -		PCI_DMA_TODEVICE);
> -	if (pci_dma_mapping_error(bp->pdev, map)) {
> +	map = dma_map_single(&bp->pdev->dev, skb->data, pkt_size,
> +			     PCI_DMA_TODEVICE);
> +	if (dma_mapping_error(&bp->pdev->dev, map)) {
>  		dev_kfree_skb(skb);
>  		return -EIO;
>  	}
> @@ -5772,7 +5777,7 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
>  
>  	udelay(5);
>  
> -	pci_unmap_single(bp->pdev, map, pkt_size, PCI_DMA_TODEVICE);
> +	dma_unmap_single(&bp->pdev->dev, map, pkt_size, PCI_DMA_TODEVICE);
>  	dev_kfree_skb(skb);
>  
>  	if (bnx2_get_hw_tx_cons(tx_napi) != txr->tx_prod)
> @@ -5789,7 +5794,7 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
>  	rx_hdr = rx_buf->desc;
>  	skb_reserve(rx_skb, BNX2_RX_OFFSET);
>  
> -	pci_dma_sync_single_for_cpu(bp->pdev,
> +	dma_sync_single_for_cpu(&bp->pdev->dev,
>  		dma_unmap_addr(rx_buf, mapping),
>  		bp->rx_buf_size, PCI_DMA_FROMDEVICE);
>  
> @@ -6457,8 +6462,8 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
>  	} else
>  		mss = 0;
>  
> -	mapping = pci_map_single(bp->pdev, skb->data, len, PCI_DMA_TODEVICE);
> -	if (pci_dma_mapping_error(bp->pdev, mapping)) {
> +	mapping = dma_map_single(&bp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE);
> +	if (dma_mapping_error(&bp->pdev->dev, mapping)) {
>  		dev_kfree_skb(skb);
>  		return NETDEV_TX_OK;
>  	}
> @@ -6486,9 +6491,9 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
>  		txbd = &txr->tx_desc_ring[ring_prod];
>  
>  		len = frag->size;
> -		mapping = pci_map_page(bp->pdev, frag->page, frag->page_offset,
> -			len, PCI_DMA_TODEVICE);
> -		if (pci_dma_mapping_error(bp->pdev, mapping))
> +		mapping = dma_map_page(&bp->pdev->dev, frag->page, frag->page_offset,
> +				       len, PCI_DMA_TODEVICE);
> +		if (dma_mapping_error(&bp->pdev->dev, mapping))
>  			goto dma_error;
>  		dma_unmap_addr_set(&txr->tx_buf_ring[ring_prod], mapping,
>  				   mapping);
> @@ -6527,7 +6532,7 @@ dma_error:
>  	ring_prod = TX_RING_IDX(prod);
>  	tx_buf = &txr->tx_buf_ring[ring_prod];
>  	tx_buf->skb = NULL;
> -	pci_unmap_single(bp->pdev, dma_unmap_addr(tx_buf, mapping),
> +	dma_unmap_single(&bp->pdev->dev, dma_unmap_addr(tx_buf, mapping),
>  			 skb_headlen(skb), PCI_DMA_TODEVICE);
>  
>  	/* unmap remaining mapped pages */
> @@ -6535,7 +6540,7 @@ dma_error:
>  		prod = NEXT_TX_BD(prod);
>  		ring_prod = TX_RING_IDX(prod);
>  		tx_buf = &txr->tx_buf_ring[ring_prod];
> -		pci_unmap_page(bp->pdev, dma_unmap_addr(tx_buf, mapping),
> +		dma_unmap_page(&bp->pdev->dev, dma_unmap_addr(tx_buf, mapping),
>  			       skb_shinfo(skb)->frags[i].size,
>  			       PCI_DMA_TODEVICE);
>  	}



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 1/2] bnx2: allocate with GFP_KERNEL flag on RX path init
  2010-07-16 21:24       ` Michael Chan
@ 2010-07-18 21:43         ` David Miller
  0 siblings, 0 replies; 14+ messages in thread
From: David Miller @ 2010-07-18 21:43 UTC (permalink / raw)
  To: mchan; +Cc: sgruszka, netdev

From: "Michael Chan" <mchan@broadcom.com>
Date: Fri, 16 Jul 2010 14:24:38 -0700

> 
> On Fri, 2010-07-16 at 01:55 -0700, Stanislaw Gruszka wrote:
>> Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
> 
> Acked-by: Michael Chan <mchan@broadcom.com>

Applied.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] bnx2: use device model DMA API
  2010-07-16 21:29   ` Michael Chan
@ 2010-07-18 21:43     ` David Miller
  0 siblings, 0 replies; 14+ messages in thread
From: David Miller @ 2010-07-18 21:43 UTC (permalink / raw)
  To: mchan; +Cc: sgruszka, netdev

From: "Michael Chan" <mchan@broadcom.com>
Date: Fri, 16 Jul 2010 14:29:19 -0700

> 
> On Thu, 2010-07-15 at 07:25 -0700, Stanislaw Gruszka wrote:
>> Use DMA API as PCI equivalents will be deprecated. This change also allow
>> to allocate with GFP_KERNEL in some places.
>> 
>> Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
> 
> Acked-by: Michael Chan <mchan@broadcom.com>

Applied.

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2010-07-18 21:43 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-07-15 14:25 [PATCH -next 0/2] bnx2: allow sleep during allocation Stanislaw Gruszka
2010-07-15 14:25 ` [PATCH 1/2] bnx2: allocate with GFP_KERNEL flag on RX path init Stanislaw Gruszka
2010-07-15 14:48   ` Michael Chan
2010-07-16  3:25     ` David Miller
2010-07-16  5:57       ` Mitchell Erblich
2010-07-16  7:13       ` Stanislaw Gruszka
2010-07-16  8:55     ` [PATCH v2 " Stanislaw Gruszka
2010-07-16 21:24       ` Michael Chan
2010-07-18 21:43         ` David Miller
2010-07-15 18:57   ` [PATCH " Mitchell Erblich
2010-07-16  7:30     ` Stanislaw Gruszka
2010-07-15 14:25 ` [PATCH 2/2] bnx2: use device model DMA API Stanislaw Gruszka
2010-07-16 21:29   ` Michael Chan
2010-07-18 21:43     ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).