Received: by 2002:ac0:b08d:0:0:0:0:0 with SMTP id l13csp4896398imc; Mon, 25 Feb 2019 13:11:12 -0800 (PST) X-Google-Smtp-Source: AHgI3IaVwy69zPP7XLQQlej04+tWL3ZVHRtQAhANhGTZssQz63WyRDhEc3gNmmPt6Y1j8v499xji X-Received: by 2002:a63:144:: with SMTP id 65mr21111483pgb.38.1551129072145; Mon, 25 Feb 2019 13:11:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1551129072; cv=none; d=google.com; s=arc-20160816; b=zPhAl/gfw0dbbGuNoZPcaGwsz0fRIqD8b5nk+W5UuixNtNXYhzWGdholyAGiqMvOdq ipGJhGynwiPo6OZRhnq2XNvvbrPn1hiH9hrdkTAQemKzePF/QQZxY/DFUeNe7PXbUT0z Ff56lKXdqp3MRdcZ4utEjsdrFAzj7nWiigsygSZKpojILF7FJFMSFuJTu2kHuTMzOt4i hHDS2YXg/OVCWHiv0Rq3zRT/Fk/Cy4JzMCS0z5Vgk+l3L+nd+7yNFS1T4sv4oiwABKFB dtG6SuSR+oPQywaM61ALkvPA+hLGQXXf/LC4h2DGO/qQnPVzwxAYa3/C1q3yytK7SANf FQJA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:user-agent:in-reply-to :content-disposition:mime-version:references:reply-to:subject:cc:to :from:date; bh=ZAo95NF7IVSunPu+3QZJP+P9Vsvq+UJSWGoPgYx7Q5E=; b=j/3LngqjCgQ35CjF+dWbNGT+mUFqPHduH1KgsoVIxqPF4gNG4o9kOD1xp53XrZ1SOT WnxKBhcoDQXcT6CAM0m6ENpm1QUgKoU3FZzDiOG2a9jGXIh3+swNt5OrAek9+mSgRBxI gX4sJCHPCw5NfQM8IAkMyoAfmL3PnIZ5/ZzoSKQt6zYdzDJmSWtyMvGamdq8Zsycdm8L RLaom0rEVDmvWOGUCIpbeuuRyS5VNQBsRNFtSpBS4ETif/YXFJPyaHbMXaWJg4qhweGA CoOF26Le2RsfwZKi0aowLXT/CBaPBfbfr/LXOT8RokpIy3Trj4AHnju0mfTS7paUxa0M Jvag== ARC-Authentication-Results: i=1; mx.google.com; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k71si10183089pge.507.2019.02.25.13.10.56; Mon, 25 Feb 2019 13:11: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; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727969AbfBYVKG (ORCPT + 99 others); Mon, 25 Feb 2019 16:10:06 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:54428 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727323AbfBYVKG (ORCPT ); Mon, 25 Feb 2019 16:10:06 -0500 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id x1PL4rvo052639 for ; Mon, 25 Feb 2019 16:10:05 -0500 Received: from e15.ny.us.ibm.com (e15.ny.us.ibm.com [129.33.205.205]) by mx0a-001b2d01.pphosted.com with ESMTP id 2qvnamyyrr-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 25 Feb 2019 16:10:04 -0500 Received: from localhost by e15.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 25 Feb 2019 21:10:03 -0000 Received: from b01cxnp23034.gho.pok.ibm.com (9.57.198.29) by e15.ny.us.ibm.com (146.89.104.202) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Mon, 25 Feb 2019 21:09:56 -0000 Received: from b01ledav003.gho.pok.ibm.com (b01ledav003.gho.pok.ibm.com [9.57.199.108]) by b01cxnp23034.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id x1PL9tST23199922 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 25 Feb 2019 21:09:55 GMT Received: from b01ledav003.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 371DEB2066; Mon, 25 Feb 2019 21:09:55 +0000 (GMT) Received: from b01ledav003.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 054EFB2064; Mon, 25 Feb 2019 21:09:54 +0000 (GMT) Received: from paulmck-ThinkPad-W541 (unknown [9.70.82.188]) by b01ledav003.gho.pok.ibm.com (Postfix) with ESMTP; Mon, 25 Feb 2019 21:09:54 +0000 (GMT) Received: by paulmck-ThinkPad-W541 (Postfix, from userid 1000) id 213E516C1510; Mon, 25 Feb 2019 13:09:55 -0800 (PST) Date: Mon, 25 Feb 2019 13:09:55 -0800 From: "Paul E. McKenney" To: "Joel Fernandes (Google)" Cc: linux-kernel@vger.kernel.org, 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, Peter Zijlstra , Quentin Perret , rcu@vger.kernel.org, Song Liu , Steven Rostedt , Vincent Guittot , xdp-newbies@vger.kernel.org, Yonghong Song Subject: Re: [PATCH v2 2/6] ixgbe: Fix incorrect RCU API usage Reply-To: paulmck@linux.ibm.com References: <20190223063434.6793-1-joel@joelfernandes.org> <20190223063434.6793-3-joel@joelfernandes.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190223063434.6793-3-joel@joelfernandes.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-TM-AS-GCONF: 00 x-cbid: 19022521-0068-0000-0000-0000039A2C7A X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00010663; HX=3.00000242; KW=3.00000007; PH=3.00000004; SC=3.00000281; SDB=6.01166317; UDB=6.00609217; IPR=6.00946920; MB=3.00025738; MTD=3.00000008; XFM=3.00000015; UTC=2019-02-25 21:10:03 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 19022521-0069-0000-0000-000047A0E4C3 Message-Id: <20190225210955.GW4072@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2019-02-25_11:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1902250151 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, Feb 23, 2019 at 01:34:30AM -0500, Joel Fernandes (Google) wrote: > 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) From an RCU perspective: Reviewed-by: Paul E. McKenney > --- > 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 >