From patchwork Thu Feb 21 05:49:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Fernandes X-Patchwork-Id: 1045763 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=joelfernandes.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=joelfernandes.org header.i=@joelfernandes.org header.b="qShTQcTd"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 444k8B37cKz9sBF for ; Thu, 21 Feb 2019 16:50:02 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726729AbfBUFuB (ORCPT ); Thu, 21 Feb 2019 00:50:01 -0500 Received: from mail-qt1-f196.google.com ([209.85.160.196]:38079 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726559AbfBUFt7 (ORCPT ); Thu, 21 Feb 2019 00:49:59 -0500 Received: by mail-qt1-f196.google.com with SMTP id s1so4080958qte.5 for ; Wed, 20 Feb 2019 21:49:58 -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=Zc6wY8rNCewGZVDgSPtq8BlfOuPURI6nN/IPxD75L4o=; b=qShTQcTd754XHzpJwI56vyDHKKusPA4VcL8Y+AAFePWXkeiXxU3ZDqJWhjH7k4OOyI TXzMqcdej7TKfKh4dmxMtAfmzK8tYkqqPaq7S6GQZmzMsCVbt1M+LHHodwNxQfjthC6c HlkgBykGg3dfgV7xxcqaGoC/3UD8IgTj43wn4= 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=Zc6wY8rNCewGZVDgSPtq8BlfOuPURI6nN/IPxD75L4o=; b=BwVCaLxvVXhBoLocEx6c90qqV7C+dL1/1TCgK+V3VCqMblvoAHjZ9BXVdMriw/WRUB GKL1ofSJmOnw4qiYTDoldaQXPZgWGDp+t1m6HSWqj5XAOYmx6NSzpx2BcXf5Y4Si3yrn Wa43KTooOlGudbnVT9hDaIERmUoilhRrz4FSoSIBDJT8MX2ouKslNprGBihCQmx5GZCw 6dE4U2j1kZzuxnoHJ4QvryK1FmGy5hoeRFPd4X6uBnSijF5zQJFwvHEiEYo6rlHJpq1R /l5370T+vsCOIxFtIzAILL/mYOR+JS7eUCUfvRnPPfk4SIgy5Pba81uC0PjWFTEIDsdt uGPA== X-Gm-Message-State: AHQUAua4bJjxihyNy2WaUUbJQkX/HV2W64f0UhDLdtSqx9rFIOrAH3Zr V6mjAcv3iXzwoNLAO21ZA/HS3Q== X-Google-Smtp-Source: AHgI3IZDtKyppM3lu4JTN4viMA53x3Iwpt/uImBH+1nEX2ySNpJsklPizojrXDvzLS5DPjNzUrdbrg== X-Received: by 2002:ac8:35ad:: with SMTP id k42mr5322820qtb.4.1550728198163; Wed, 20 Feb 2019 21:49:58 -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.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Feb 2019 21:49:57 -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 1/5] net: rtnetlink: Fix incorrect RCU API usage Date: Thu, 21 Feb 2019 00:49:38 -0500 Message-Id: <20190221054942.132388-2-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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org rtnl_register_internal() and rtnl_unregister_all tries to directly dereference an RCU protected pointed outside RCU read side section. While this is Ok to do since a lock is held, let us use the correct API to avoid programmer bugs in the future. This also fixes sparse warnings arising from not using RCU API. net/core/rtnetlink.c:332:13: warning: incorrect type in assignment (different address spaces) net/core/rtnetlink.c:332:13: expected struct rtnl_link **tab net/core/rtnetlink.c:332:13: got struct rtnl_link *[noderef] * Signed-off-by: Joel Fernandes (Google) --- net/core/rtnetlink.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 5ea1bed08ede..98be4b4818a9 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -188,7 +188,7 @@ static int rtnl_register_internal(struct module *owner, msgindex = rtm_msgindex(msgtype); rtnl_lock(); - tab = rtnl_msg_handlers[protocol]; + tab = rtnl_dereference(rtnl_msg_handlers[protocol]); if (tab == NULL) { tab = kcalloc(RTM_NR_MSGTYPES, sizeof(void *), GFP_KERNEL); if (!tab) @@ -329,7 +329,7 @@ void rtnl_unregister_all(int protocol) BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX); rtnl_lock(); - tab = rtnl_msg_handlers[protocol]; + tab = rtnl_dereference(rtnl_msg_handlers[protocol]); if (!tab) { rtnl_unlock(); return; From patchwork Thu Feb 21 05:49:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Fernandes X-Patchwork-Id: 1045766 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=joelfernandes.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=joelfernandes.org header.i=@joelfernandes.org header.b="jT740G6e"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 444k8d2nx6z9s2R for ; Thu, 21 Feb 2019 16:50:25 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726779AbfBUFuD (ORCPT ); Thu, 21 Feb 2019 00:50:03 -0500 Received: from mail-qk1-f195.google.com ([209.85.222.195]:36473 "EHLO mail-qk1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726706AbfBUFuB (ORCPT ); Thu, 21 Feb 2019 00:50:01 -0500 Received: by mail-qk1-f195.google.com with SMTP id o125so3618690qkf.3 for ; Wed, 20 Feb 2019 21:50:00 -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=eyKaqxE4MB+1FQ47tGWnqJ1JBN/Ur38caGRs0QUxwna2KVH2Zi0QjXmE3ZB2Dhws7P tux8R/+LjzRabbLsNZOgiQd00sx3XqZwbxcbJq/zKN4C0C2f/naLYRusmwBxdK2wyunZ sA1NdELPCx+jrzskgRH60TPbqyDHH/sVnNc2oMf9+wWCL9WMKKjS/ek0Xk2OOwkkjplO Z1jzcrWW8+3Myto6oC8MDRcaf0EmQ6qJK5uWwAGpGNLRvltXxI4N/cDlqPT1YA/5VYMb kHXyrC+L3OZs8DQqKcrjSpe+OGl7SyAiitIzNdoUNMPCCvlMaH/nWAiHj6gPwpYCik+V Q1jQ== X-Gm-Message-State: AHQUAuZyAyTKxzxZ/jc2d9Sk4yCHuwjIdMgvn1FVMiB51tS17RKLQz2s iV4dzXoyL1IM843WHKXIVMvCYA== X-Google-Smtp-Source: AHgI3IbOR4CRoe9MkfK2GQWb1kgEoC51CJYPHhkELH+l4iSnuB0HTltkfM39dpwbfZwR6vOy5FGzWg== 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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@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, From patchwork Thu Feb 21 05:49:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Fernandes X-Patchwork-Id: 1045767 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=joelfernandes.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=joelfernandes.org header.i=@joelfernandes.org header.b="uoqFMMbj"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 444k8s6nz6z9s2R for ; Thu, 21 Feb 2019 16:50:37 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727258AbfBUFuc (ORCPT ); Thu, 21 Feb 2019 00:50:32 -0500 Received: from mail-qk1-f193.google.com ([209.85.222.193]:42563 "EHLO mail-qk1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726559AbfBUFuD (ORCPT ); Thu, 21 Feb 2019 00:50:03 -0500 Received: by mail-qk1-f193.google.com with SMTP id y140so3594388qkb.9 for ; Wed, 20 Feb 2019 21:50:02 -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=yJQh9OTMcc8GKjMOMevDLRheK40LG7vhJJv8Mr0Iw/w=; b=uoqFMMbjjyp/Ye2yvo+ESfFkN4f+MztM+/NmqQuFjSGfOx7yPbiRx71jZUAVQnxPxy 0REAyP5KXc4D7bmiEU7b/79C3M7DLd85cHRWrQfm2ti6u7zrQJG8eW2N+sxtTnkFj0Ux 5ccIv/xRONCSuio88pfmb02DI+AS6hzE2cfD0= 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=yJQh9OTMcc8GKjMOMevDLRheK40LG7vhJJv8Mr0Iw/w=; b=WFioz1Hb4kRRKfibBTX10feLlcV1ABcyKVg4XVLCz7uJnoUF/wCp4w7GkgufI42ojV pifnfHmY3dG1fMr+bCJOa9/VyMNLk4T9YTNkcqQY9AFi9/pv2an8c0XAPdp6Km1BR3f0 /KOCYKe91SSm6362qnpKKwfKQyncbsHeg/w0Uo4kadOUkbUHhRSDn5UW5esIvMb4aGO0 +g47ua0mRZvajyB+yUjYILyYvRVumPPkgemzgsGdrEbq3D7jS+l31v3BIUNPYhhOf8I9 ji97OyMJfwUqisfHjvJrbZS1srFGD5Jeoge3vMVKg5oFXA6fbRUuTDKZ06CSsmj95ZAz K4Xg== X-Gm-Message-State: AHQUAuYHzc5qBOq9ff7I6hNFgfv8L6dvV+k7HJ94bdRiQLKbMY5dCF1J PY2hxUZbqe2qyEwgO0QN9iCXwQ== X-Google-Smtp-Source: AHgI3Iah2BBNad0wXiymDZmJBDHzs14if7tgY8VwDYE9gs3+e3rurxaYWcDkNNqyQRz1Mp1KaW/X/w== X-Received: by 2002:a37:9682:: with SMTP id y124mr14167594qkd.288.1550728202015; Wed, 20 Feb 2019 21:50:02 -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.50.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Feb 2019 21:50:01 -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 3/5] sched/cpufreq: Fix incorrect RCU API usage Date: Thu, 21 Feb 2019 00:49:40 -0500 Message-Id: <20190221054942.132388-4-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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Recently I added an RCU annotation check to rcu_assign_pointer(). All pointers assigned to RCU protected data are to be annotated with __rcu inorder to be able to use rcu_assign_pointer() similar to checks in other RCU APIs. This resulted in a sparse error: kernel//sched/cpufreq.c:41:9: sparse: error: incompatible types in comparison expression (different address spaces) Fix this by using the correct APIs for RCU accesses. This will potentially avoid any future bugs in the code. If it is felt that RCU protection is not needed here, then the rcu_assign_pointer call can be dropped and replaced with, say, WRITE_ONCE or smp_store_release. Or, may be we add a new API to do it. But calls rcu_assign_pointer seems an abuse of the RCU API unless RCU is being used. Signed-off-by: Joel Fernandes (Google) --- kernel/sched/cpufreq.c | 8 ++++++-- kernel/sched/sched.h | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/kernel/sched/cpufreq.c b/kernel/sched/cpufreq.c index 22bd8980f32f..c9aeb3bf5dc2 100644 --- a/kernel/sched/cpufreq.c +++ b/kernel/sched/cpufreq.c @@ -7,7 +7,7 @@ */ #include "sched.h" -DEFINE_PER_CPU(struct update_util_data *, cpufreq_update_util_data); +DEFINE_PER_CPU(struct update_util_data __rcu *, cpufreq_update_util_data); /** * cpufreq_add_update_util_hook - Populate the CPU's update_util_data pointer. @@ -34,8 +34,12 @@ void cpufreq_add_update_util_hook(int cpu, struct update_util_data *data, if (WARN_ON(!data || !func)) return; - if (WARN_ON(per_cpu(cpufreq_update_util_data, cpu))) + rcu_read_lock(); + if (WARN_ON(rcu_dereference(per_cpu(cpufreq_update_util_data, cpu)))) { + rcu_read_unlock(); return; + } + rcu_read_unlock(); data->func = func; rcu_assign_pointer(per_cpu(cpufreq_update_util_data, cpu), data); diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index d04530bf251f..2ab545d40381 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -2166,7 +2166,7 @@ static inline u64 irq_time_read(int cpu) #endif /* CONFIG_IRQ_TIME_ACCOUNTING */ #ifdef CONFIG_CPU_FREQ -DECLARE_PER_CPU(struct update_util_data *, cpufreq_update_util_data); +DECLARE_PER_CPU(struct update_util_data __rcu *, cpufreq_update_util_data); /** * cpufreq_update_util - Take a note about CPU utilization changes. From patchwork Thu Feb 21 05:49:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Fernandes X-Patchwork-Id: 1045765 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=joelfernandes.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=joelfernandes.org header.i=@joelfernandes.org header.b="cD4jri7b"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 444k8R4J5qz9s2R for ; Thu, 21 Feb 2019 16:50:15 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726988AbfBUFuH (ORCPT ); Thu, 21 Feb 2019 00:50:07 -0500 Received: from mail-qk1-f194.google.com ([209.85.222.194]:33466 "EHLO mail-qk1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725891AbfBUFuF (ORCPT ); Thu, 21 Feb 2019 00:50:05 -0500 Received: by mail-qk1-f194.google.com with SMTP id x9so3627153qkf.0 for ; Wed, 20 Feb 2019 21:50:04 -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=Nv7hlAboBR8L2d9iWBFCyqBxcQDbn2qbimp9HVyPCpU=; b=cD4jri7b+UoIGO3mo90h05zxo//ZEQOkVVfU8eLmaukA3Qx9dexvFlsWoDfh2YynV2 tvzghbBkC2P0wqpE1wwjrvrsarXMxPPY+uqMuUriFWzu7ZCLJqe+t1rVqntH2CIE/6K4 bu2JYMFh1/uA69c7iEUEw3drY6W6UIJloY+as= 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=Nv7hlAboBR8L2d9iWBFCyqBxcQDbn2qbimp9HVyPCpU=; b=UVeAXC8FYXGujTZw1yLasdjVCkKtW5fg6lLDY/LQt/bOFpRoZgk0QrK1k/ZvO8Fd6R WI0CcDBdUFst9IMrrTrxpXZwPiHZK3Nr0L4XnrMkn1+doNSTCb+vq8ar+XpyxP/C5d0a C9H71SBBSJftiyqBe8SoFgFswame2pQl7/2xEeBuw5r/Wn3tBb375Wk75JzRVfG6eFic u8z35uOJ7OKAsUm013ZmS7x/nVvFn27mkQIH5lKoadHvNUbcK1++FbfMwGBpYPLtprQl ecWRmaVPZvGKv+RNEldB/f69/1JOrsfiUYCK9m1tr+68eF0tjLl49+wSYnbBGrenEyVF vhTA== X-Gm-Message-State: AHQUAuZoC/EaLl9a6O8pwdwFhIq1h5txdzr3fiZxsZB54DkRPoYyT8lB 2D3xm+qcXZt7WqLHm3xR/Sr0wg== X-Google-Smtp-Source: AHgI3IYD251OD9feSlohnYi9tpXZ3AzdO4nIwcK+7mKpsrnA1wnYeSkmdy3EAfBu5zxbgOgBdew/Ww== X-Received: by 2002:a37:7845:: with SMTP id t66mr27515988qkc.103.1550728203902; Wed, 20 Feb 2019 21:50:03 -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.50.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Feb 2019 21:50:02 -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 4/5] sched/topology: Annonate RCU pointers properly Date: Thu, 21 Feb 2019 00:49:41 -0500 Message-Id: <20190221054942.132388-5-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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The scheduler's topology code uses rcu_assign_pointer() to initialize various pointers. Let us annotate the pointers correctly which also help avoid future bugs. This suppresses the new sparse errors caused by an annotation check I added to rcu_assign_pointer(). Also replace rcu_assign_pointer call on rq->sd with WRITE_ONCE. This should be sufficient for the rq->sd initialization. This fixes sparse errors: kernel//sched/topology.c:378:9: sparse: error: incompatible types in comparison expression (different address spaces) kernel//sched/topology.c:387:9: sparse: error: incompatible types in comparison expression (different address spaces) kernel//sched/topology.c:612:9: sparse: error: incompatible types in comparison expression (different address spaces) kernel//sched/topology.c:615:9: sparse: error: incompatible types in comparison expression (different address spaces) kernel//sched/topology.c:618:9: sparse: error: incompatible types in comparison expression (different address spaces) kernel//sched/topology.c:621:9: sparse: error: incompatible types in comparison expression (different address spaces) Signed-off-by: Joel Fernandes (Google) --- kernel/sched/sched.h | 12 ++++++------ kernel/sched/topology.c | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 2ab545d40381..806703afd4b0 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -780,7 +780,7 @@ struct root_domain { * NULL-terminated list of performance domains intersecting with the * CPUs of the rd. Protected by RCU. */ - struct perf_domain *pd; + struct perf_domain __rcu *pd; }; extern struct root_domain def_root_domain; @@ -1305,13 +1305,13 @@ static inline struct sched_domain *lowest_flag_domain(int cpu, int flag) return sd; } -DECLARE_PER_CPU(struct sched_domain *, sd_llc); +DECLARE_PER_CPU(struct sched_domain __rcu *, sd_llc); DECLARE_PER_CPU(int, sd_llc_size); DECLARE_PER_CPU(int, sd_llc_id); -DECLARE_PER_CPU(struct sched_domain_shared *, sd_llc_shared); -DECLARE_PER_CPU(struct sched_domain *, sd_numa); -DECLARE_PER_CPU(struct sched_domain *, sd_asym_packing); -DECLARE_PER_CPU(struct sched_domain *, sd_asym_cpucapacity); +DECLARE_PER_CPU(struct sched_domain_shared __rcu *, sd_llc_shared); +DECLARE_PER_CPU(struct sched_domain __rcu *, sd_numa); +DECLARE_PER_CPU(struct sched_domain __rcu *, sd_asym_packing); +DECLARE_PER_CPU(struct sched_domain __rcu *, sd_asym_cpucapacity); extern struct static_key_false sched_asym_cpucapacity; struct sched_group_capacity { diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c index 3f35ba1d8fde..2eab2e16ded5 100644 --- a/kernel/sched/topology.c +++ b/kernel/sched/topology.c @@ -586,13 +586,13 @@ static void destroy_sched_domains(struct sched_domain *sd) * the cpumask of the domain), this allows us to quickly tell if * two CPUs are in the same cache domain, see cpus_share_cache(). */ -DEFINE_PER_CPU(struct sched_domain *, sd_llc); +DEFINE_PER_CPU(struct sched_domain __rcu *, sd_llc); DEFINE_PER_CPU(int, sd_llc_size); DEFINE_PER_CPU(int, sd_llc_id); -DEFINE_PER_CPU(struct sched_domain_shared *, sd_llc_shared); -DEFINE_PER_CPU(struct sched_domain *, sd_numa); -DEFINE_PER_CPU(struct sched_domain *, sd_asym_packing); -DEFINE_PER_CPU(struct sched_domain *, sd_asym_cpucapacity); +DEFINE_PER_CPU(struct sched_domain_shared __rcu *, sd_llc_shared); +DEFINE_PER_CPU(struct sched_domain __rcu *, sd_numa); +DEFINE_PER_CPU(struct sched_domain __rcu *, sd_asym_packing); +DEFINE_PER_CPU(struct sched_domain __rcu *, sd_asym_cpucapacity); DEFINE_STATIC_KEY_FALSE(sched_asym_cpucapacity); static void update_top_cache_domain(int cpu) @@ -668,7 +668,7 @@ cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu) rq_attach_root(rq, rd); tmp = rq->sd; - rcu_assign_pointer(rq->sd, sd); + WRITE_ONCE(rq->sd, sd); dirty_sched_domain_sysctl(cpu); destroy_sched_domains(tmp); From patchwork Thu Feb 21 05:49:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Fernandes X-Patchwork-Id: 1045764 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=joelfernandes.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=joelfernandes.org header.i=@joelfernandes.org header.b="uye2tYOO"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 444k8L6ZQgz9s2R for ; Thu, 21 Feb 2019 16:50:10 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727071AbfBUFuI (ORCPT ); Thu, 21 Feb 2019 00:50:08 -0500 Received: from mail-qt1-f195.google.com ([209.85.160.195]:41428 "EHLO mail-qt1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726723AbfBUFuH (ORCPT ); Thu, 21 Feb 2019 00:50:07 -0500 Received: by mail-qt1-f195.google.com with SMTP id v10so30227588qtp.8 for ; Wed, 20 Feb 2019 21:50:06 -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=Ugol0rgDCJ10tdYejpAP4lSNDuzdaHwVbfjsfuyPKr4=; b=uye2tYOOC0bZ39eWdPJnH1bptH+S4Cs9o0M6xgMzLkhahm4hMVUOBbQkW51Ti19KMR oerpGE8JpjWjD4HGM4SeomN1VM20+2cy3mnkc8I/+NV3bEp6ey8gbknhjyzULWebul0a 6udN8DWGUjVYkGNzqLEre31/UHMSHjLYlYWYM= 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=Ugol0rgDCJ10tdYejpAP4lSNDuzdaHwVbfjsfuyPKr4=; b=IdeqpZ3EskxdYRHP0SUtQa45LJF99EFfdDdt9mXWqA3r6ERzv0dv+rqGfE8OceQhWM u28btB0EzvD5B0bMpX4d8xSSpk8UBMkHByduKyBB9uYNvbmLKSaW4IVyR/+XSWLQKx00 r+at9j3Ohedx/H4uOpWEfvFmUFgmw0Dw6NFwzE7fdwUyw3o2woIe2YpaPvpJBH44/Ivx AE8YOSzW9qE2NI+B8ee8pc7fH4VqlwHWaKeaAe6sMNiZqrE+JyShINPASa+mPE5KXXZp K+cQy6H8iBVWjti8jVmnOb8EUOAedF9FJjQsUGNcKffW8V0JEcuacC+wo+ylLBI8NtR2 d/2g== X-Gm-Message-State: AHQUAubeh+M25/LCkUwZ5lEpF45st6MqHcYCOsqmphtku83nwcSwhdP9 tgx+fvoHs/1v05GbGz9XVBRbDg== X-Google-Smtp-Source: AHgI3IY1x2CsKnOyckwybfdh/IC8vE4HGJ48wjA9vpW4LbhlPy2SxC91fb7T2aBEZJUZvnNh7C0Y8A== X-Received: by 2002:a0c:b60d:: with SMTP id f13mr4809691qve.209.1550728205769; Wed, 20 Feb 2019 21:50:05 -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.50.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Feb 2019 21:50:04 -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 5/5] rcuwait: Replace rcu_assign_pointer() with WRITE_ONCE Date: Thu, 21 Feb 2019 00:49:42 -0500 Message-Id: <20190221054942.132388-6-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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This suppresses a sparse error generated due to the recently added rcu_assign_pointer sparse check below. It seems WRITE_ONCE should be sufficient here. >> kernel//locking/percpu-rwsem.c:162:9: sparse: error: incompatible types in comparison expression (different address spaces) Signed-off-by: Joel Fernandes (Google) --- include/linux/rcuwait.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/rcuwait.h b/include/linux/rcuwait.h index 90bfa3279a01..9e5b4760e6c2 100644 --- a/include/linux/rcuwait.h +++ b/include/linux/rcuwait.h @@ -44,7 +44,7 @@ extern void rcuwait_wake_up(struct rcuwait *w); */ \ WARN_ON(current->exit_state); \ \ - rcu_assign_pointer((w)->task, current); \ + WRITE_ONCE((w)->task, current); \ for (;;) { \ /* \ * Implicit barrier (A) pairs with (B) in \