Received: by 2002:ac0:a679:0:0:0:0:0 with SMTP id p54csp137697imp; Tue, 19 Feb 2019 20:09:56 -0800 (PST) X-Google-Smtp-Source: AHgI3IbmD9IPp53PWjHP/iSgG+WgUYeZITxO4v14LOGwqZjUERw/rpi1BqSS5K4YZEYpxfSH+wJI X-Received: by 2002:a63:2bd5:: with SMTP id r204mr27705067pgr.48.1550635796194; Tue, 19 Feb 2019 20:09:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1550635796; cv=none; d=google.com; s=arc-20160816; b=EWqIr0Yy71hjllCDMj39OvT7y0Qe19W6h2pAhVjgimLyWV0QIdhYc5MRA7lhTa6tp5 Z44PRf1Ggt4xnaZEy/owGfttmI5nUPzm5RvPCOARxcAIl08gk0yPQC7Az5bgqGoU2Yc3 pNHcPTEO2ewMk0TpsLyuwxl2KluyylA1nkXF5CcG8jtWoKmJPmipS7rwdnZM/O9x4WV0 kgPRRI1MhSH8+9AfLlSgOm5DbnH57Jhl5rx6ILMLEYxOYW5ulio7unEcHLW1cxyAX4bw /TABbf6wMaqiIzaaz6VxsQDpVzQcJOqCd0sP0t4lPaCn9Ng7ihcrOHX/DCkf14HwOQQJ FptA== 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=P1C55xJx/uAH3YLT6Vk7PSnsH5amwpGoZRQoHvwEukE=; b=TA+KjF4CVXdAtMEJdyWABSXO0z7wEnUM0pJklxfp1GBcaS/t0gayQ453htb84Aa7i2 G7kHKRcYSuiVkYBeqPqnAcOFt063u2H2rLKQmyCixYQlMZ1WxEV5tTj+kFymoQde4qxM Tw7MoBxPbMvM9ZRlZrArlR1N2CG/Ik4tGQvph8FqKny2ZrgjAqOFpx61DJ25CE18g/Ko jDcgPJdIBOV0S+MnTunO3ZChxIiZexPgvkKxCfSLCvfVqueYh2XYY+PdUI70sgSweC3N JzJ5UC1LNHHUqfDeZh/4/uPxO866wstGGNgxwZ7aMqBm+xdZBdGSJ6QZMeOrWNRFvJTQ Wj9w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b="UyZw/B4f"; 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 n66si17807401pfg.249.2019.02.19.20.09.41; Tue, 19 Feb 2019 20:09:56 -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="UyZw/B4f"; 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 S1730415AbfBTEJL (ORCPT + 99 others); Tue, 19 Feb 2019 23:09:11 -0500 Received: from mail-qk1-f195.google.com ([209.85.222.195]:36208 "EHLO mail-qk1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730376AbfBTEJK (ORCPT ); Tue, 19 Feb 2019 23:09:10 -0500 Received: by mail-qk1-f195.google.com with SMTP id o125so1144911qkf.3 for ; Tue, 19 Feb 2019 20:09:09 -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=P1C55xJx/uAH3YLT6Vk7PSnsH5amwpGoZRQoHvwEukE=; b=UyZw/B4fiNHUYDJUNfiS5hkWYfP0lwpKvyAB5zcqI8UfU62YyWx9alAF5kVcJWS8/T VfVFeJB7pjC7a89hMsyqbQTdRd6vY6VJHZHUMSrGzC7rA7Ong3ARGbRPPHH5/c3mlsyq wr8goT+AesLpCk+OHYDqabldcgIIrxKktcYxc= 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=P1C55xJx/uAH3YLT6Vk7PSnsH5amwpGoZRQoHvwEukE=; b=K+PrvucWL5Ukgov6IJhUCYM7zv5Tvkzzl/M1pbJegqbiigrZWXmVDfhsLxMDxC4dTk yQUDDzHVTx7Pw6q3vfxskdac2+m5cLyAbJpVqrwIZAaGy0iwd1UZTfDmVBQrnLCKms2m Btsr6trwjIZvGMSbZQKaIH0YDmknXuhgklPEkuhxSopY4nKLJP45xUy5ymFmIDvWZavM D58oj0v353vmgR9JuNxU8vEVtz5wSytRNveARKzRaGqhe0+5RQLwFCxGRg7bMSe9M0sA AMI4LhM7YCki8WpWOmqwzETGDnv3GKr0o3QK52c2iTlXme35SCBzpncuvYvnqI+6i+kU CaoA== X-Gm-Message-State: AHQUAuabUsBeaJtIrTA8dHAZ9lEyOHostMAQDwVIhyPY35uttgXrYs1C wtRFUd4Lm010YAYTSEY9/q05DF4Puwo= X-Received: by 2002:a0c:96c1:: with SMTP id b1mr24723353qvd.45.1550635748756; Tue, 19 Feb 2019 20:09:08 -0800 (PST) Received: from joelaf.cam.corp.google.com ([2620:0:1004:1100:cca9:fccc:8667:9bdc]) by smtp.gmail.com with ESMTPSA id s19sm2024593qth.80.2019.02.19.20.09.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Feb 2019 20:09:07 -0800 (PST) From: "Joel Fernandes (Google)" To: linux-kernel@vger.kernel.org, rcu@vger.kernel.org Cc: Joel Fernandes , paulmck@linux.ibm.com Subject: [RFC 2/5] ixgbe: Fix incorrect RCU API usage Date: Tue, 19 Feb 2019 23:08:24 -0500 Message-Id: <20190220040827.136184-3-joel@joelfernandes.org> X-Mailer: git-send-email 2.21.0.rc0.258.g878e2cd30e-goog In-Reply-To: <20190220040827.136184-1-joel@joelfernandes.org> References: <20190220040827.136184-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 From: Joel Fernandes 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 --- drivers/net/ethernet/intel/ixgbe/ixgbe.h | 4 ++-- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 16 +++++++++++----- 2 files changed, 13 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..aad7b800aacd 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_dereference(adapter->xdp_prog); + rcu_assign_pointer(adapter->xdp_prog, prog); /* If transitioning XDP modes reconfigure rings */ if (!!prog != !!old_prog) { @@ -10271,13 +10272,18 @@ 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; + int ret; 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