netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net 0/2] net: bcmgenet: TX reclaim and DMA fixes
@ 2014-09-19  0:48 Florian Fainelli
  2014-09-19  0:48 ` [PATCH net 1/2] net: bcmgenet: fix TX reclaim accounting for fragments Florian Fainelli
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Florian Fainelli @ 2014-09-19  0:48 UTC (permalink / raw)
  To: netdev; +Cc: davem, Florian Fainelli

Hi David,

This patch set contains one fix for an accounting problem while reclaiming
transmitted buffers having fragments, and the second fix is to make sure
that the DMA shutdown is properly controlled.

Florian Fainelli (2):
  net: bcmgenet: fix TX reclaim accounting for fragments
  net: bcmgenet: call bcmgenet_dma_teardown in bcmgenet_fini_dma

 drivers/net/ethernet/broadcom/genet/bcmgenet.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

-- 
1.9.1

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

* [PATCH net 1/2] net: bcmgenet: fix TX reclaim accounting for fragments
  2014-09-19  0:48 [PATCH net 0/2] net: bcmgenet: TX reclaim and DMA fixes Florian Fainelli
@ 2014-09-19  0:48 ` Florian Fainelli
  2014-09-19  0:48 ` [PATCH net 2/2] net: bcmgenet: call bcmgenet_dma_teardown in bcmgenet_fini_dma Florian Fainelli
  2014-09-22 18:46 ` [PATCH net 0/2] net: bcmgenet: TX reclaim and DMA fixes David Miller
  2 siblings, 0 replies; 5+ messages in thread
From: Florian Fainelli @ 2014-09-19  0:48 UTC (permalink / raw)
  To: netdev; +Cc: davem, Florian Fainelli

The GENET driver supports SKB fragments, and succeeds in transmitting
them properly, but when reclaiming these transmitted fragments, we will
only update the count of free buffer descriptors by 1, even for SKBs
with fragments. This leads to the networking stack thinking it has more
room than the hardware has when pushing new SKBs, and backing off
consequently because we return NETDEV_TX_BUSY.

Fix this by accounting for the SKB nr_frags plus one (itself) and update
ring->free_bds accordingly with that value for each iteration loop in
__bcmgenet_tx_reclaim().

Fixes: 1c1008c793fa ("net: bcmgenet: add main driver file")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/ethernet/broadcom/genet/bcmgenet.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index cdef86a03862..11a96437862d 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -875,6 +875,7 @@ static void __bcmgenet_tx_reclaim(struct net_device *dev,
 	int last_tx_cn, last_c_index, num_tx_bds;
 	struct enet_cb *tx_cb_ptr;
 	struct netdev_queue *txq;
+	unsigned int bds_compl;
 	unsigned int c_index;
 
 	/* Compute how many buffers are transmitted since last xmit call */
@@ -899,7 +900,9 @@ static void __bcmgenet_tx_reclaim(struct net_device *dev,
 	/* Reclaim transmitted buffers */
 	while (last_tx_cn-- > 0) {
 		tx_cb_ptr = ring->cbs + last_c_index;
+		bds_compl = 0;
 		if (tx_cb_ptr->skb) {
+			bds_compl = skb_shinfo(tx_cb_ptr->skb)->nr_frags + 1;
 			dev->stats.tx_bytes += tx_cb_ptr->skb->len;
 			dma_unmap_single(&dev->dev,
 					 dma_unmap_addr(tx_cb_ptr, dma_addr),
@@ -916,7 +919,7 @@ static void __bcmgenet_tx_reclaim(struct net_device *dev,
 			dma_unmap_addr_set(tx_cb_ptr, dma_addr, 0);
 		}
 		dev->stats.tx_packets++;
-		ring->free_bds += 1;
+		ring->free_bds += bds_compl;
 
 		last_c_index++;
 		last_c_index &= (num_tx_bds - 1);
-- 
1.9.1

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

* [PATCH net 2/2] net: bcmgenet: call bcmgenet_dma_teardown in bcmgenet_fini_dma
  2014-09-19  0:48 [PATCH net 0/2] net: bcmgenet: TX reclaim and DMA fixes Florian Fainelli
  2014-09-19  0:48 ` [PATCH net 1/2] net: bcmgenet: fix TX reclaim accounting for fragments Florian Fainelli
@ 2014-09-19  0:48 ` Florian Fainelli
  2014-09-22 18:46 ` [PATCH net 0/2] net: bcmgenet: TX reclaim and DMA fixes David Miller
  2 siblings, 0 replies; 5+ messages in thread
From: Florian Fainelli @ 2014-09-19  0:48 UTC (permalink / raw)
  To: netdev; +Cc: davem, Florian Fainelli

We should not be manipulaging the DMA_CTRL registers directly by writing
0 to them to disable DMA. This is an operation that needs to be timed to
make sure the DMA engines have been properly stopped since their state
machine stops on a packet boundary, not immediately.

Make sure that tha bcmgenet_fini_dma() calls bcmgenet_dma_teardown() to
ensure a proper DMA engine state.

Fixes: 1c1008c793fa ("net: bcmgenet: add main driver file")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/ethernet/broadcom/genet/bcmgenet.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index 11a96437862d..5d9eac37993d 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -1749,8 +1749,7 @@ static void bcmgenet_fini_dma(struct bcmgenet_priv *priv)
 	int i;
 
 	/* disable DMA */
-	bcmgenet_rdma_writel(priv, 0, DMA_CTRL);
-	bcmgenet_tdma_writel(priv, 0, DMA_CTRL);
+	bcmgenet_dma_teardown(priv);
 
 	for (i = 0; i < priv->num_tx_bds; i++) {
 		if (priv->tx_cbs[i].skb != NULL) {
-- 
1.9.1

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

* Re: [PATCH net 0/2] net: bcmgenet: TX reclaim and DMA fixes
  2014-09-19  0:48 [PATCH net 0/2] net: bcmgenet: TX reclaim and DMA fixes Florian Fainelli
  2014-09-19  0:48 ` [PATCH net 1/2] net: bcmgenet: fix TX reclaim accounting for fragments Florian Fainelli
  2014-09-19  0:48 ` [PATCH net 2/2] net: bcmgenet: call bcmgenet_dma_teardown in bcmgenet_fini_dma Florian Fainelli
@ 2014-09-22 18:46 ` David Miller
  2014-09-22 18:50   ` Florian Fainelli
  2 siblings, 1 reply; 5+ messages in thread
From: David Miller @ 2014-09-22 18:46 UTC (permalink / raw)
  To: f.fainelli; +Cc: netdev

From: Florian Fainelli <f.fainelli@gmail.com>
Date: Thu, 18 Sep 2014 17:48:15 -0700

> This patch set contains one fix for an accounting problem while reclaiming
> transmitted buffers having fragments, and the second fix is to make sure
> that the DMA shutdown is properly controlled.

Florian I am seriesly irritated, are you even build testing these
changes?

bcmgenet_dma_teardown() is a static function declared far after the
new call you are adding in patch #2, so now we get:

drivers/net/ethernet/broadcom/genet/bcmgenet.c: In function ‘bcmgenet_fini_dma’:
drivers/net/ethernet/broadcom/genet/bcmgenet.c:1752:2: error: implicit declaration of function ‘bcmgenet_dma_teardown’ [-Werror=implicit-function-declaration]
drivers/net/ethernet/broadcom/genet/bcmgenet.c: At top level:
drivers/net/ethernet/broadcom/genet/bcmgenet.c:2111:12: error: static declaration of ‘bcmgenet_dma_teardown’ follows non-static declaration
drivers/net/ethernet/broadcom/genet/bcmgenet.c:1752:2: note: previous implicit declaration of ‘bcmgenet_dma_teardown’ was here

I want to make it clear to you that whatever time you think you're
saving by skipping even the most basic compilation test, goes directly
to _ME_ and you are therefore having a negative impact on every single
developer who is also waiting for me to review and integrate their
networking changes.

Please do not do this any more.

Thanks.

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

* Re: [PATCH net 0/2] net: bcmgenet: TX reclaim and DMA fixes
  2014-09-22 18:46 ` [PATCH net 0/2] net: bcmgenet: TX reclaim and DMA fixes David Miller
@ 2014-09-22 18:50   ` Florian Fainelli
  0 siblings, 0 replies; 5+ messages in thread
From: Florian Fainelli @ 2014-09-22 18:50 UTC (permalink / raw)
  To: David Miller; +Cc: netdev

On 09/22/2014 11:46 AM, David Miller wrote:
> From: Florian Fainelli <f.fainelli@gmail.com>
> Date: Thu, 18 Sep 2014 17:48:15 -0700
> 
>> This patch set contains one fix for an accounting problem while reclaiming
>> transmitted buffers having fragments, and the second fix is to make sure
>> that the DMA shutdown is properly controlled.
> 
> Florian I am seriesly irritated, are you even build testing these
> changes?
> 
> bcmgenet_dma_teardown() is a static function declared far after the
> new call you are adding in patch #2, so now we get:
> 
> drivers/net/ethernet/broadcom/genet/bcmgenet.c: In function ‘bcmgenet_fini_dma’:
> drivers/net/ethernet/broadcom/genet/bcmgenet.c:1752:2: error: implicit declaration of function ‘bcmgenet_dma_teardown’ [-Werror=implicit-function-declaration]
> drivers/net/ethernet/broadcom/genet/bcmgenet.c: At top level:
> drivers/net/ethernet/broadcom/genet/bcmgenet.c:2111:12: error: static declaration of ‘bcmgenet_dma_teardown’ follows non-static declaration
> drivers/net/ethernet/broadcom/genet/bcmgenet.c:1752:2: note: previous implicit declaration of ‘bcmgenet_dma_teardown’ was here
> 
> I want to make it clear to you that whatever time you think you're
> saving by skipping even the most basic compilation test, goes directly
> to _ME_ and you are therefore having a negative impact on every single
> developer who is also waiting for me to review and integrate their
> networking changes.
> 
> Please do not do this any more.

Very sorry about that, v2 is on your way, I will be more careful.
--
Florian

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

end of thread, other threads:[~2014-09-22 18:50 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-19  0:48 [PATCH net 0/2] net: bcmgenet: TX reclaim and DMA fixes Florian Fainelli
2014-09-19  0:48 ` [PATCH net 1/2] net: bcmgenet: fix TX reclaim accounting for fragments Florian Fainelli
2014-09-19  0:48 ` [PATCH net 2/2] net: bcmgenet: call bcmgenet_dma_teardown in bcmgenet_fini_dma Florian Fainelli
2014-09-22 18:46 ` [PATCH net 0/2] net: bcmgenet: TX reclaim and DMA fixes David Miller
2014-09-22 18:50   ` Florian Fainelli

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).