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.