Received: by 2002:ac0:a679:0:0:0:0:0 with SMTP id p54csp153207imp; Wed, 20 Feb 2019 21:51:12 -0800 (PST) X-Google-Smtp-Source: AHgI3Ib/rtth+Jj8ks+fETsZU93/5lQnjflu2OCNg0VSwn7PX77WsjG+Mk5PY1t9pU0sUEsnvbj4 X-Received: by 2002:a63:6a07:: with SMTP id f7mr32874875pgc.118.1550728272873; Wed, 20 Feb 2019 21:51:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1550728272; cv=none; d=google.com; s=arc-20160816; b=gmimeyZTsHFRNGjrUmPFaGJ7Csm5HChZfo0NYJAOKxDpv+XKcfxhROEsOZeDWJe3N2 zzXLb/sGEdMwyrRITLzD6SqCzyQd8TBBwRBK+QQQDC2d+7mp78zSIzhj+YEtSGOXmUc8 0VYazPYj+EIMxqVGfkAJ1tfeUsnhN5/ZXFNwsepH/B0T4Cyg5+6tn5KaR4NrccZf167d SHUiyFl77onESIhk6e6WWcaos5NOFlTgrWoP2mP2f+3c4kDFh62AsBH9LtWSjKGi69fN K6a4hBwnk2F1YjFQCtgNz7DtzvbbimJVQYtgDQ3TLCYcUftggSUQ57JmnxuCK7Kh2Gmm Vibw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=JmLFpdRORBxQq944X6ow6jxn2Py1BtKo1o+DDQDbcPs=; b=w4q11aCKxseXZpmjBI+lQpjkHG8bnGYMxEPzh2qTmhlt7ntUV5cH6tuBx412MUGQgb 105EnIVVsgnS4WDPAaIHM6MepAxtkZbSR0OhCzfGxGmEfyd8khGqXk+/gSSg8nRcvymf LMZIqso+UNkr5gM0p07cMbD+i/08JvQk/SAdKy9OwbpTXL2iFhISuzH3fXjzJJ3iTUzB oru7Yz9c6CgD4YksPBu2gu18dPNcB6hNcSZa+o1zxyscZUpvP7ZVvkhQBGidndIXavuu GWb1o01PecrG+Id2xjU7lOVtpd6BnDmuw7uYlmgtQ6hcJmBQhUdbyXjPyCVXyCMfPoFn QW7A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=jT740G6e; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 91si21404313ply.222.2019.02.20.21.50.57; Wed, 20 Feb 2019 21:51:12 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=jT740G6e; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726856AbfBUFuE (ORCPT + 99 others); Thu, 21 Feb 2019 00:50:04 -0500 Received: from mail-qk1-f195.google.com ([209.85.222.195]:35075 "EHLO mail-qk1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726723AbfBUFuB (ORCPT ); Thu, 21 Feb 2019 00:50:01 -0500 Received: by mail-qk1-f195.google.com with SMTP id z13so2302620qki.2 for ; Wed, 20 Feb 2019 21:50:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joelfernandes.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=JmLFpdRORBxQq944X6ow6jxn2Py1BtKo1o+DDQDbcPs=; b=jT740G6evoueaiJkbiGaGk2LjNX0z7MTAZi+fD2cpXIP210C+G4HEXamwzwB9f3j3n okdYQ422tOGTD2Sxn/0g/EyMYJJk0CzjHVDJh5+fUmQcBDwYkvWB18jKitux3eahODAo 2GIame4vikPR+xBuFaIgPHpPxTizicTNgU7WU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=JmLFpdRORBxQq944X6ow6jxn2Py1BtKo1o+DDQDbcPs=; b=eL6IYGKSiaOujeZapu6A1nFoHTUYy4jOeEeHHWbr4rZH7OAVVJW4OF1bkspMSo2n0W MjH5Vw/yGFezXJCqBHUp2pTzqWbOzZx9/DES84yCb0w/Sq4buYbw7LjtYPM+Bs4EdUNg zl8uptF6k45MJ8AqderXr9uUP53NV2sHYO6QijJ8KU7ntc3Dfp5VFe3ODx4XrboqbG8P FVn2nhCNmOmLqAxw4hDfd+ghAhmwNvg36qklHqKntcPx+3tmL+/mZljLJwQVZsYCfel0 9DHuhM0uI8nQQfGZ8pyYKRrE7T26RjEeQi95G+5HNZwkfUM/0dxtkVtuMDX8EDFHk/mt v3tg== X-Gm-Message-State: AHQUAuarwQnqqtBXp2DYKSea4pVek+rMpajs1XeOwFiWkC2w4Q9W7hLd sDLRtvbHzveRLQ4ggINoKaY3LInfzbQ= X-Received: by 2002:a37:8d01:: with SMTP id p1mr28226874qkd.91.1550728200127; Wed, 20 Feb 2019 21:50:00 -0800 (PST) Received: from joelaf.cam.corp.google.com ([2620:0:1004:1100:cca9:fccc:8667:9bdc]) by smtp.gmail.com with ESMTPSA id k185sm11561219qkd.62.2019.02.20.21.49.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Feb 2019 21:49:59 -0800 (PST) From: "Joel Fernandes (Google)" To: linux-kernel@vger.kernel.org Cc: "Joel Fernandes (Google)" , Alexei Starovoitov , Christian Brauner , Daniel Borkmann , David Ahern , "David S. Miller" , Ido Schimmel , Ingo Molnar , intel-wired-lan@lists.osuosl.org (moderated list:INTEL ETHERNET DRIVERS), Jakub Kicinski , Jeff Kirsher , Jesper Dangaard Brouer , John Fastabend , Josh Triplett , keescook@chromium.org, Lai Jiangshan , Martin KaFai Lau , Mathieu Desnoyers , netdev@vger.kernel.org, "Paul E. McKenney" , Peter Zijlstra , rcu@vger.kernel.org, Song Liu , Steven Rostedt , xdp-newbies@vger.kernel.org, Yonghong Song Subject: [PATCH RFC 2/5] ixgbe: Fix incorrect RCU API usage Date: Thu, 21 Feb 2019 00:49:39 -0500 Message-Id: <20190221054942.132388-3-joel@joelfernandes.org> X-Mailer: git-send-email 2.21.0.rc0.258.g878e2cd30e-goog In-Reply-To: <20190221054942.132388-1-joel@joelfernandes.org> References: <20190221054942.132388-1-joel@joelfernandes.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Recently, I added an RCU annotation check in rcu_assign_pointer. This caused a sparse error to be reported by the ixgbe driver. Further looking, it seems the adapter->xdp_prog pointer is not annotated with __rcu. Annonating it fixed the error, but caused a bunch of other warnings. This patch tries to fix all warnings by using RCU API properly. This makes sense to do because not using RCU properly can result in various hard to find bugs. This is a best effort fix and is only build tested. The sparse errors and warnings go away with the change. I request maintainers / developers in this area to test it properly. Signed-off-by: Joel Fernandes (Google) --- drivers/net/ethernet/intel/ixgbe/ixgbe.h | 4 ++-- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h index 08d85e336bd4..3b14daf27516 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h @@ -311,7 +311,7 @@ struct ixgbe_ring { struct ixgbe_ring *next; /* pointer to next ring in q_vector */ struct ixgbe_q_vector *q_vector; /* backpointer to host q_vector */ struct net_device *netdev; /* netdev ring belongs to */ - struct bpf_prog *xdp_prog; + struct bpf_prog __rcu *xdp_prog; struct device *dev; /* device for DMA mapping */ void *desc; /* descriptor ring memory */ union { @@ -560,7 +560,7 @@ struct ixgbe_adapter { unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; /* OS defined structs */ struct net_device *netdev; - struct bpf_prog *xdp_prog; + struct bpf_prog __rcu *xdp_prog; struct pci_dev *pdev; struct mii_bus *mii_bus; diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index daff8183534b..6aa59bb13a14 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -2199,7 +2199,7 @@ static struct sk_buff *ixgbe_run_xdp(struct ixgbe_adapter *adapter, u32 act; rcu_read_lock(); - xdp_prog = READ_ONCE(rx_ring->xdp_prog); + xdp_prog = rcu_dereference(rx_ring->xdp_prog); if (!xdp_prog) goto xdp_out; @@ -6547,7 +6547,7 @@ int ixgbe_setup_rx_resources(struct ixgbe_adapter *adapter, rx_ring->queue_index) < 0) goto err; - rx_ring->xdp_prog = adapter->xdp_prog; + rcu_assign_pointer(rx_ring->xdp_prog, adapter->xdp_prog); return 0; err: @@ -10246,7 +10246,10 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog) if (nr_cpu_ids > MAX_XDP_QUEUES) return -ENOMEM; - old_prog = xchg(&adapter->xdp_prog, prog); + rcu_read_lock(); + old_prog = rcu_dereference(adapter->xdp_prog); + rcu_assign_pointer(adapter->xdp_prog, prog); + rcu_read_unlock(); /* If transitioning XDP modes reconfigure rings */ if (!!prog != !!old_prog) { @@ -10271,13 +10274,17 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog) static int ixgbe_xdp(struct net_device *dev, struct netdev_bpf *xdp) { struct ixgbe_adapter *adapter = netdev_priv(dev); + struct bpf_prog *prog; switch (xdp->command) { case XDP_SETUP_PROG: return ixgbe_xdp_setup(dev, xdp->prog); case XDP_QUERY_PROG: - xdp->prog_id = adapter->xdp_prog ? - adapter->xdp_prog->aux->id : 0; + rcu_read_lock(); + prog = rcu_dereference(adapter->xdp_prog); + xdp->prog_id = prog ? prog->aux->id : 0; + rcu_read_unlock(); + return 0; case XDP_QUERY_XSK_UMEM: return ixgbe_xsk_umem_query(adapter, &xdp->xsk.umem, -- 2.21.0.rc0.258.g878e2cd30e-goog