Received: by 2002:ac0:b08d:0:0:0:0:0 with SMTP id l13csp2252707imc; Fri, 22 Feb 2019 22:36:58 -0800 (PST) X-Google-Smtp-Source: AHgI3IaWu6Pwo60itY2mrwK2+lOr1HMv6pGUvH7HHQxc4YRlltghKyGrEAkqtuDT0FpwbAoj1u5G X-Received: by 2002:a17:902:10e:: with SMTP id 14mr7857221plb.14.1550903817932; Fri, 22 Feb 2019 22:36:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1550903817; cv=none; d=google.com; s=arc-20160816; b=dliogY3RQvo5x63u8F4/LN5v56Yo7vG0DBovhcAT5iGK/psWeKZslo//TEz28MRKzg ZFoSCZdgfEUWNK3WcwP6BbhNRmYj9ZTRCZkuhZq7E/6J9/fyzTS1zyY+j+oYqbEQCczC 7d01MjFAjRVOlrWpQmyXJCtSGLGVOX+/21im8Xb41nFG3knyTwnoth1IcgjZpPQ86Ou6 PCgSAdExU9SbJXdl/WTWX1OqljhX5fQ5ucYUMntFqTBQxcIAYFRRPx/k2jIfrxH4O710 NPeMbzRB7dhBsi/Dbnok5K867pyXUo3OUf/tJ0Qtx/wzsmpAHytvat0zpYX8hIYtiBxI /OLg== 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=+VRwkLma4QHsLodLyqLqscrFLAElLwMuFYkHuZgYCiA=; b=QAUPPt7Z3gB/IpVpeIsVR/4FQedK9CPhqV+bSUJR3kVgYepqw6KDSyTgKnxzUe8GIX KuU5mWEWNNMu1JRzVHFzaIeP5vGTvOvmyqkWfpksB1+KB4Jqb7A5c6MsS0l85stmS0c3 sFtKaTFvMmnUUIBc/40Ha6vAW1CSQVppm0EiXfKAlAUGLgW5UIwVXsaazkHRzNAHMgYT 2x97DHY5eQ2WNqgjhL9gPs4LVUO8FTKx/MrposVvfKxnetaDBFNHbyOTOFcqpoSiEIiv E8Lxn985/ecfkyuxuLkjMd1c2maPOCRdYC/VZOsMC79nvj+6u3Ae6hRdMuERYI+Kbmv2 ZJ9g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=LXf4B9ji; 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 a9si3221269pfj.71.2019.02.22.22.36.43; Fri, 22 Feb 2019 22:36:57 -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=LXf4B9ji; 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 S1727752AbfBWGe5 (ORCPT + 99 others); Sat, 23 Feb 2019 01:34:57 -0500 Received: from mail-qt1-f196.google.com ([209.85.160.196]:40598 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727687AbfBWGez (ORCPT ); Sat, 23 Feb 2019 01:34:55 -0500 Received: by mail-qt1-f196.google.com with SMTP id j36so5109742qta.7 for ; Fri, 22 Feb 2019 22:34:54 -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=+VRwkLma4QHsLodLyqLqscrFLAElLwMuFYkHuZgYCiA=; b=LXf4B9jiVhDDmWHqmpX8sitFrnlfo5OGBPgxZMG1SG9dPgcG05UwP/0ab87QJca35A +5vX47xZXK/bvlYBPDse0FJpr4WEcj+RtEPX3feM0h5vddYnqNxNRh1Wj7XVR3VJINey NNLEqhrf5Bc1rXkGgXSBIsTOm2/s0liaYt+t8= 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=+VRwkLma4QHsLodLyqLqscrFLAElLwMuFYkHuZgYCiA=; b=mZidMYkS7tkLlAu4xjwkFj9o53lyvzTTSARm+iAJraWUup7/7GetCYNyJQ36LxIlMU dmAIwNxBxuLb8W4DAs1vYKLn4WTHDYVqAb1tr0mBRWaMSlKyoKwD6A95lGmv/dDZ/l81 X4dkgLIsooSdxKCDmPLDxeQlrS/tb/CISwrE4AVsTKjKqrNUqD1KFoYR+OrzeqthyCvT drR0EMqGNNMM4+uTi4nl2+iMBI9vVtbroyODSSbypehrbySSw4kJCqC9bUMv7nMKPejI /cspcMkICk/0WUony0ylAlQQ47iKX5aeU+69uWrkIIofIBICMB0W1jtHSflWEjh+opXJ 1tkw== X-Gm-Message-State: AHQUAuaHImky3N9K0GtVBK8h/k3HxTGEdLourBgrSBJgXoyfxuO4l5Ip Lv0YalELL0BJCEIsZv5zMbos84wxD3I= X-Received: by 2002:a0c:92ec:: with SMTP id c41mr6220040qvc.158.1550903693796; Fri, 22 Feb 2019 22:34:53 -0800 (PST) Received: from joelaf.cam.corp.google.com ([2620:0:1004:1100:cca9:fccc:8667:9bdc]) by smtp.gmail.com with ESMTPSA id d32sm2189408qtc.88.2019.02.22.22.34.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Feb 2019 22:34:52 -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" , Ingo Molnar , Jakub Kicinski , Jeff Kirsher , Jesper Dangaard Brouer , John Fastabend , Josh Triplett , keescook@chromium.org, kernel-hardening@lists.openwall.com, kernel-team@android.com, Kirill Tkhai , Lai Jiangshan , Martin KaFai Lau , Mathieu Desnoyers , netdev@vger.kernel.org, "Paul E. McKenney" , Peter Zijlstra , Quentin Perret , rcu@vger.kernel.org, Song Liu , Steven Rostedt , Vincent Guittot , xdp-newbies@vger.kernel.org, Yonghong Song Subject: [PATCH v2 2/6] ixgbe: Fix incorrect RCU API usage Date: Sat, 23 Feb 2019 01:34:30 -0500 Message-Id: <20190223063434.6793-3-joel@joelfernandes.org> X-Mailer: git-send-email 2.21.0.rc0.258.g878e2cd30e-goog In-Reply-To: <20190223063434.6793-1-joel@joelfernandes.org> References: <20190223063434.6793-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 review / test it properly. The sparse error fixed is: ixgbe_main.c:10256:25: error: incompatible types in comparison expression Signed-off-by: Joel Fernandes (Google) --- drivers/net/ethernet/intel/ixgbe/ixgbe.h | 4 ++-- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 15 ++++++++++----- 2 files changed, 12 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..408a312aa6ba 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,8 @@ 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); + old_prog = rcu_access_pointer(adapter->xdp_prog); + rcu_assign_pointer(adapter->xdp_prog, prog); /* If transitioning XDP modes reconfigure rings */ if (!!prog != !!old_prog) { @@ -10271,13 +10272,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