diff mbox

[net,1/2] e1000: Do not overestimate descriptor counts in Tx pre-check

Message ID 20160302211601.2124.64160.stgit@localhost.localdomain
State Awaiting Upstream, archived
Delegated to: David Miller
Headers show

Commit Message

Alexander Duyck March 2, 2016, 9:16 p.m. UTC
The current code path is capable of grossly overestimating the number of
descriptors needed to transmit a new frame.  This specifically occurs if
the skb contains a number of 4K pages.  The issue is that the logic for
determining the descriptors needed is ((S) >> (X)) + 1.  When X is 12 it
means that we were indicating that we required 2 descriptors for each 4K
page when we only needed one.

This change corrects this by instead adding (1 << (X)) - 1 to the S value
instead of adding 1 after the fact.  This way we get an accurate descriptor
needed count as we are essentially doing a DIV_ROUNDUP().

Reported-by: Ivan Suzdal <isuzdal@mirantis.com>
Signed-off-by: Alexander Duyck <aduyck@mirantis.com>
---
 drivers/net/ethernet/intel/e1000/e1000_main.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Brown, Aaron F March 9, 2016, 11:50 p.m. UTC | #1
> From: netdev-owner@vger.kernel.org [mailto:netdev-

> owner@vger.kernel.org] On Behalf Of Alexander Duyck

> Sent: Wednesday, March 2, 2016 1:16 PM

> To: netdev@vger.kernel.org; jogreene@redhat.com; intel-wired-

> lan@lists.osuosl.org; Kirsher, Jeffrey T <jeffrey.t.kirsher@intel.com>;

> sassmann@redhat.com

> Subject: [net PATCH 1/2] e1000: Do not overestimate descriptor counts in Tx

> pre-check

> 

> The current code path is capable of grossly overestimating the number of

> descriptors needed to transmit a new frame.  This specifically occurs if

> the skb contains a number of 4K pages.  The issue is that the logic for

> determining the descriptors needed is ((S) >> (X)) + 1.  When X is 12 it

> means that we were indicating that we required 2 descriptors for each 4K

> page when we only needed one.

> 

> This change corrects this by instead adding (1 << (X)) - 1 to the S value

> instead of adding 1 after the fact.  This way we get an accurate descriptor

> needed count as we are essentially doing a DIV_ROUNDUP().

> 

> Reported-by: Ivan Suzdal <isuzdal@mirantis.com>

> Signed-off-by: Alexander Duyck <aduyck@mirantis.com>

> ---

>  drivers/net/ethernet/intel/e1000/e1000_main.c |    2 +-

>  1 file changed, 1 insertion(+), 1 deletion(-)


Tested-by: Aaron Brown <aaron.f.brown@intel.com>
diff mbox

Patch

diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c
index 3fc7bde..d213fb4 100644
--- a/drivers/net/ethernet/intel/e1000/e1000_main.c
+++ b/drivers/net/ethernet/intel/e1000/e1000_main.c
@@ -3106,7 +3106,7 @@  static int e1000_maybe_stop_tx(struct net_device *netdev,
 	return __e1000_maybe_stop_tx(netdev, size);
 }
 
-#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1)
+#define TXD_USE_COUNT(S, X) (((S) + ((1 << (X)) - 1)) >> (X))
 static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
 				    struct net_device *netdev)
 {