From patchwork Mon Nov 7 09:57:56 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Poirier X-Patchwork-Id: 691845 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 3tC7dW6YB0z9vG1 for ; Mon, 7 Nov 2016 21:16:31 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="iJFwO8c2"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752517AbcKGKQ0 (ORCPT ); Mon, 7 Nov 2016 05:16:26 -0500 Received: from mail-pf0-f195.google.com ([209.85.192.195]:36477 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752469AbcKGKQW (ORCPT ); Mon, 7 Nov 2016 05:16:22 -0500 Received: by mail-pf0-f195.google.com with SMTP id n85so15775783pfi.3 for ; Mon, 07 Nov 2016 02:15:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id; bh=+IYkmYoxKHYk6/KdbhNb++ei9KQjBjn/H4Vb5eSwB4I=; b=iJFwO8c2nE8yEBBdVoJW4EpHxpfsOiTR+1LFWgJqlXXOKJowqOAXRDNYSrdU3vcHQJ Ej1BNpyi456AKhDZ6azarBEfVn0SlsUJC0hDbwEUoq1qDIX/5Tr1JKM9rol6LiDed+8g TNpTja4DV5mdYxYixH/9kLrPHchIo2eil7jqiYjW+GvByhBijwz00bsYs6+vn8ov2+mU J6URBt1E6c1OaI/GTDII6WdLec7HzWn0uaUdQCLrtN3UJuORUrA+da9a9i0oKE8ksOAq kzyHSSC9Jy4YJP9vbhbolbBs7p/9gjxvp698Md4suBGmhzxDKmShpvBt1HNw97LW3QH5 C50Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=+IYkmYoxKHYk6/KdbhNb++ei9KQjBjn/H4Vb5eSwB4I=; b=Yn1v/tmDtMqv+E4wLnMVu5CaRrj1xGOa5hv5JrDNVRyFnspjr7ulwy/LWZZFdyIyY/ Wbn/jT1FV0MjrOJDFiTGidQue4uayuB6u6ARsF869Gy9w3DX7YsT6SpNM44b4TSP8/rT CjKbLnIHrd/EUf0FJ2lXebpopq94GNUOZcIs/R5tYdiay1eeAFXFAsC6ar4Hwl975WEs MgeZjv4/1rRL7+GA/N5hwyz25pqniPsZPnHvKPy+O1Ksgh9TOCNkKHq0Z6KWdo2ymwxb SyZ9cZz/7FNlb3ebHqtjWsxhq4hlJqtd3GCMxZacbv4UPT9EwpUUkEciN0D0raPg2NRg p16w== X-Gm-Message-State: ABUngvc/lP8yjxkIsdqAsfPqxWTzJlFHBtS8jawVGagLU7pMkz5bjZ13jke+eXS/gseL1w== X-Received: by 10.98.200.203 with SMTP id i72mr11921344pfk.181.1478512692820; Mon, 07 Nov 2016 01:58:12 -0800 (PST) Received: from f1.synalogic.ca ([203.192.156.9]) by smtp.gmail.com with ESMTPSA id wg1sm4132301pab.46.2016.11.07.01.58.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 07 Nov 2016 01:58:12 -0800 (PST) From: Benjamin Poirier To: netdev@vger.kernel.org Cc: Rasesh Mody , Sudarsana Kalluru , Dept-GELinuxNICDev@cavium.com Subject: [PATCH] bna: Add synchronization for tx ring. Date: Mon, 7 Nov 2016 17:57:56 +0800 Message-Id: <20161107095756.15343-1-bpoirier@suse.com> X-Mailer: git-send-email 2.9.3 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org We received two reports of BUG_ON in bnad_txcmpl_process() where hw_consumer_index appeared to be ahead of producer_index. Out of order write/read of these variables could explain these reports. bnad_start_xmit(), as a producer of tx descriptors, has a few memory barriers sprinkled around writes to producer_index and the device's doorbell but they're not paired with anything in bnad_txcmpl_process(), a consumer. Since we are synchronizing with a device, we must use mandatory barriers, not smp_*. Also, I didn't see the purpose of the last smp_mb() in bnad_start_xmit(). Signed-off-by: Benjamin Poirier --- drivers/net/ethernet/brocade/bna/bnad.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c index f9df4b5a..f42f672 100644 --- a/drivers/net/ethernet/brocade/bna/bnad.c +++ b/drivers/net/ethernet/brocade/bna/bnad.c @@ -177,6 +177,7 @@ bnad_txcmpl_process(struct bnad *bnad, struct bna_tcb *tcb) return 0; hw_cons = *(tcb->hw_consumer_index); + rmb(); cons = tcb->consumer_index; q_depth = tcb->q_depth; @@ -3094,7 +3095,7 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev) BNA_QE_INDX_INC(prod, q_depth); tcb->producer_index = prod; - smp_mb(); + wmb(); if (unlikely(!test_bit(BNAD_TXQ_TX_STARTED, &tcb->flags))) return NETDEV_TX_OK; @@ -3102,7 +3103,6 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev) skb_tx_timestamp(skb); bna_txq_prod_indx_doorbell(tcb); - smp_mb(); return NETDEV_TX_OK; }