Received: by 2002:ac0:a679:0:0:0:0:0 with SMTP id p54csp642116imp; Thu, 21 Feb 2019 08:19:17 -0800 (PST) X-Google-Smtp-Source: AHgI3IYCX+po2uz1M5lAEE7HCRlOnvKr6JkYRR+kwIcjq4nNSWCmtlXqPFSaGTeE6jAfKQHX1qDe X-Received: by 2002:a17:902:9893:: with SMTP id s19mr43764880plp.165.1550765957722; Thu, 21 Feb 2019 08:19:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1550765957; cv=none; d=google.com; s=arc-20160816; b=xLQ3nD87V95hiiaN0pyyZqSpJvKrY7EXJMDUntCu6GZMH88wIFutBnYy8Ymfl8U7t8 dc24sH+Cu0zydF8AkL0DHJSehv+A8mB1Wjkg3xkqM3r2tEA0hlgus1j2pCEbaLgG6Kd5 d7MxMRnaU52oaAS4OyQkiyoIqeM+XT9FttW4gO/GzXLFJSriHecE07EL+0qc/H3c/5MD jx1nB5fUrOgTQVvF8jsxpQ+KIBnjOhp46nQYmkdI0T+mjEpRcFlmqSvpTBsjtUO1q+zO G5AF5yTQNqqfL8yRIP+S/WNgXJGcbVxssp+gbdt1oPiIctTMO+8IW0jZgdjWW/BIg8Rc yNVg== 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:subject:cc:to:from:date; bh=kgIb9/FD91wuIwsReTBdmB66TK9N25g6BrQR4FdC6c0=; b=AURcl9N3Y1M62UuAdXjEbIfv67XiEBDd6Fw1dyDA3pmrmYFwfTKaKzniAHwLN9XsSj pCVDfrPuqeqPiuCkqETHULPpPcBQgESqILfQMv2E1Y85oaF//k+gSttbgjPODiUa7uNn SXvb7spi3nNrb2R1u/FVz5MbF0DlaM2Z2Jj4Qnb3nGeIlXF5748gasye114dSSyP+WlD cW+4YwbGnw8nDAcsovlKNNen5gYtoWlDG9GQzu+R8spZtSI+JpJDXjeYNRCMalwiYgXA 94L4J3GTObOVlol1J2ytD/DRBkISfzaQniWm3NrznkzUoWbipgSIL9A1u3G/KZOhifsr wsNw== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s71si21590036pfk.105.2019.02.21.08.19.01; Thu, 21 Feb 2019 08:19:17 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727085AbfBUQRR (ORCPT + 99 others); Thu, 21 Feb 2019 11:17:17 -0500 Received: from mail.kernel.org ([198.145.29.99]:36648 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725932AbfBUQRR (ORCPT ); Thu, 21 Feb 2019 11:17:17 -0500 Received: from gandalf.local.home (cpe-66-24-58-225.stny.res.rr.com [66.24.58.225]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 74B5C20836; Thu, 21 Feb 2019 16:17:13 +0000 (UTC) Date: Thu, 21 Feb 2019 11:17:12 -0500 From: Steven Rostedt To: "Joel Fernandes (Google)" Cc: linux-kernel@vger.kernel.org, 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 , xdp-newbies@vger.kernel.org, Yonghong Song , "Rafael J. Wysocki" Subject: Re: [PATCH RFC 3/5] sched/cpufreq: Fix incorrect RCU API usage Message-ID: <20190221111712.72ba57e8@gandalf.local.home> In-Reply-To: <20190221054942.132388-4-joel@joelfernandes.org> References: <20190221054942.132388-1-joel@joelfernandes.org> <20190221054942.132388-4-joel@joelfernandes.org> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 21 Feb 2019 00:49:40 -0500 "Joel Fernandes (Google)" wrote: > 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. This all looks broken, and this patch is papering over the issue, or worse, hiding it. > > 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); An rcu_assign_pointer() is to update something that is going to be read under rcu_read_lock() elsewhere. But updates to an rcu variable are not protected by rcu_read_lock() (hence the "read" in the name). Adding rcu_read_lock() above does nothing, but perhaps hides an issue. Writes usually have something else that protects against races. Thus, the above shouldn't be switched to using a rcu_dereference(), but perhaps a rcu_dereference_protected(), with whatever is protecting updates? Which doing a bit of investigating, looks to be the rwsem "policy->rwsem", where policy comes from: policy = cpufreq_cpu_get(cpu); I would say the code as is, is not broken. But this patch isn't helping anything. -- Steve > 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.