From patchwork Wed May 25 16:50:36 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 626276 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3rFJFB4CXfz9sdn for ; Thu, 26 May 2016 02:50:54 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b=WXTMk4pB; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755913AbcEYQut (ORCPT ); Wed, 25 May 2016 12:50:49 -0400 Received: from mail-pf0-f177.google.com ([209.85.192.177]:34222 "EHLO mail-pf0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755900AbcEYQus (ORCPT ); Wed, 25 May 2016 12:50:48 -0400 Received: by mail-pf0-f177.google.com with SMTP id y69so20113612pfb.1 for ; Wed, 25 May 2016 09:50:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=SsBH+qt7L9xSK94u0SimpUJj2Gj2a0ztuL0+j/xV/L4=; b=WXTMk4pBgIOfbn5VdYbVILMMdiyFD1ZW/Jg3pcjOAeF68kw32YL3omqDB1YH8/9P/W f26lHJKRBQRBfKtz89qFcxGJN+xyDqxAnmHn+5cx0uc+heWEluDgIEKfN478ngijU5JN jsJG21Tl0WJjykE7SN2tVR7nxrgq3F7W6BnoSDeZ75CxVWvaAWAyioEu5IBqUh8BfMIP VDza4P43B1A03/HtGq+J+AF2XIXcI1Bo1M0+GOOPhwdK/fNvjFcxlM1i0nhQz7t3+HEJ Vq4kluouUCvgSdN5KiTZZm9bIq8AaIEMq/2L6EV4fYXG7tbkqhOMJtuj7CVo1MzliYKL gn1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=SsBH+qt7L9xSK94u0SimpUJj2Gj2a0ztuL0+j/xV/L4=; b=Io1mARinkQNNygiGrkxo0pqVDecFsAZXWS0sv+dGYPXCgRgf+i+otl84RG3zZRNR9l CqZX8V3XhMkqSpzMMPW9a9utQ6+L3FbeDGQsD41aeTuFwEBsBRkiU7l7Hrp1lBrZxd7X qg5sTnWr/NHUF7j0P1Qi/aP669UN0CyYUFWjFMTgtVKrDUMKlYYs0vS5pQ5rSOFCsnWW xcrauqYMkeIxaZ3o78Uxu5mb0q7vw0Akb0CWGT/u7RDHy0rSrYFjTLqfWJccaMpjRMIN OAENpgmXx89ALbMLYQIPZD1x7WJ0QPOe6FNtB6+t2O0CRw+fd9JP/hoGniCbnvnu66kh uWdw== X-Gm-Message-State: ALyK8tLzKEPVop5HKveHPXIZs/fh7G+B2EeTk6TGDoWsk5vWC9Fq92ajE6rOQb4vkDNfJ6B4 X-Received: by 10.98.29.77 with SMTP id d74mr7302202pfd.164.1464195047194; Wed, 25 May 2016 09:50:47 -0700 (PDT) Received: from localhost ([2620:0:1000:3002:80ca:c984:215:ea53]) by smtp.gmail.com with ESMTPSA id k71sm14268784pfb.50.2016.05.25.09.50.46 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 25 May 2016 09:50:46 -0700 (PDT) From: Eric Dumazet To: "David S . Miller" Cc: netdev , Eric Dumazet , Willem de Bruijn , Eugenia Emantayev , Eric Dumazet Subject: [PATCH net 1/4] net/mlx4_en: fix tx_dropped bug Date: Wed, 25 May 2016 09:50:36 -0700 Message-Id: <1464195039-5098-2-git-send-email-edumazet@google.com> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 In-Reply-To: <1464195039-5098-1-git-send-email-edumazet@google.com> References: <1464195039-5098-1-git-send-email-edumazet@google.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 1) mlx4_en_xmit() can increment priv->stats.tx_dropped, but this variable is overwritten in mlx4_en_DUMP_ETH_STATS(). 2) This increment was not SMP safe, as a port might have many TX queues. Add a per TX ring tx_dropped to fix these issues. This is u32 as mlx4_en_DUMP_ETH_STATS() will add a 32bit field. So lets avoid bugs with SNMP agents having to cope with partial overwraps. (One of these agents being bond_fold_stats()) Signed-off-by: Eric Dumazet Reported-by: Willem de Bruijn Cc: Eugenia Emantayev Acked-by: Alexei Starovoitov --- drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 1 + drivers/net/ethernet/mellanox/mlx4/en_port.c | 4 +++- drivers/net/ethernet/mellanox/mlx4/en_tx.c | 8 ++++---- drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 1 + 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index 92e0624f4cf0..cfd50206f7c3 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c @@ -1892,6 +1892,7 @@ static void mlx4_en_clear_stats(struct net_device *dev) priv->tx_ring[i]->bytes = 0; priv->tx_ring[i]->packets = 0; priv->tx_ring[i]->tx_csum = 0; + priv->tx_ring[i]->tx_dropped = 0; } for (i = 0; i < priv->rx_ring_num; i++) { priv->rx_ring[i]->bytes = 0; diff --git a/drivers/net/ethernet/mellanox/mlx4/en_port.c b/drivers/net/ethernet/mellanox/mlx4/en_port.c index 20b6c2e678b8..3df8690154b1 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_port.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_port.c @@ -188,6 +188,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset) } stats->tx_packets = 0; stats->tx_bytes = 0; + stats->tx_dropped = 0; priv->port_stats.tx_chksum_offload = 0; priv->port_stats.queue_stopped = 0; priv->port_stats.wake_queue = 0; @@ -199,6 +200,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset) stats->tx_packets += ring->packets; stats->tx_bytes += ring->bytes; + stats->tx_dropped += ring->tx_dropped; priv->port_stats.tx_chksum_offload += ring->tx_csum; priv->port_stats.queue_stopped += ring->queue_stopped; priv->port_stats.wake_queue += ring->wake_queue; @@ -251,7 +253,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset) stats->tx_fifo_errors = 0; stats->tx_heartbeat_errors = 0; stats->tx_window_errors = 0; - stats->tx_dropped = be32_to_cpu(mlx4_en_stats->TDROP); + stats->tx_dropped += be32_to_cpu(mlx4_en_stats->TDROP); /* RX stats */ priv->pkstats.rx_multicast_packets = stats->multicast; diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c index f6e61570cb2c..76aa4d27183c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c @@ -726,12 +726,12 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) bool inline_ok; u32 ring_cons; - if (!priv->port_up) - goto tx_drop; - tx_ind = skb_get_queue_mapping(skb); ring = priv->tx_ring[tx_ind]; + if (!priv->port_up) + goto tx_drop; + /* fetch ring->cons far ahead before needing it to avoid stall */ ring_cons = ACCESS_ONCE(ring->cons); @@ -1030,7 +1030,7 @@ tx_drop_unmap: tx_drop: dev_kfree_skb_any(skb); - priv->stats.tx_dropped++; + ring->tx_dropped++; return NETDEV_TX_OK; } diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index cc84e09f324a..9a9124031fc7 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h @@ -270,6 +270,7 @@ struct mlx4_en_tx_ring { unsigned long tx_csum; unsigned long tso_packets; unsigned long xmit_more; + unsigned int tx_dropped; struct mlx4_bf bf; unsigned long queue_stopped;