From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 30C443112B7 for ; Fri, 21 Nov 2025 22:56:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.118.77.11 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763765814; cv=none; b=AaMzs+5SVVUKqcU0oJ69/ZeVWyMmcOXyO+yJSus6TWj3kupk7Z5nJRMZY2vpuYvmCCYbyBdexxU2KbsQI/WrKqNVzlUYAZW3fQYezRW3jKqV40ERCf5aZIkQ2tPGgh8Mi7JxyurcP2T9g7WZqR1fBQTdJsDDC+zIy0xR94wmEuo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763765814; c=relaxed/simple; bh=q+eQWQxoLRuMiTJx1RdL8zC0PLxriMtLn0yNSDQ97oM=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:From:In-Reply-To: Content-Type:References; b=o6YndqnT1TchGhe8ZrI4AY/0JuYFRio8+fldIKCO04WhpVsP5i9VWoKgcsQ+jTM7uhxtElUd6I7U0+dXW+kay1getSIaYPDd0sCefXFQIKClD+6TdcK7Y+BSV1AP+jpdcY10rd8ejN13lErEaxBjvkURRj1HIc3TG12w1DHQWQE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com; spf=pass smtp.mailfrom=samsung.com; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b=eQ9cI8GM; arc=none smtp.client-ip=210.118.77.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=samsung.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="eQ9cI8GM" Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20251121225645euoutp013f9db3b6d6d12b2d6ae66f20a4a98beb~6J6fO-bEE0587105871euoutp01N for ; Fri, 21 Nov 2025 22:56:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20251121225645euoutp013f9db3b6d6d12b2d6ae66f20a4a98beb~6J6fO-bEE0587105871euoutp01N DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1763765805; bh=gy021Ks/QIIxbEdxsJrWL/9iFCHKDNXdRBKBeyRict8=; h=Date:Subject:To:Cc:From:In-Reply-To:References:From; b=eQ9cI8GMmL51okT50ffW3XqrWwHD9DC9GHKHGx1zFgJf4FRCT2yyjnsA54TLEP+cf 1cOHCf+AvCEPSNsTkQ23Hq3ckAMCaTCHVhxVwzqvFUwHmXEy7FNK0TR0zN9NgZwR6J +9jS+p/tV1Fs1sN5xpq7QOplmqpspQZGlcNFcqTc= Received: from eusmtip1.samsung.com (unknown [203.254.199.221]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20251121225645eucas1p2d0165821efb61ea8732d14b62c50af52~6J6ezDVvT1217512175eucas1p2U; Fri, 21 Nov 2025 22:56:45 +0000 (GMT) Received: from [106.210.134.192] (unknown [106.210.134.192]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20251121225644eusmtip141f5ba9ffbc3ff07e3e601d2fc028af4~6J6eB-8972263122631eusmtip1t; Fri, 21 Nov 2025 22:56:44 +0000 (GMT) Message-ID: <89c7106e-a431-443a-9527-3d5fbce77fe1@samsung.com> Date: Fri, 21 Nov 2025 23:56:44 +0100 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Betterbird (Windows) Subject: Re: [patch V5 09/20] cpumask: Cache num_possible_cpus() To: Thomas Gleixner , LKML Cc: Peter Zijlstra , Gabriele Monaco , Mathieu Desnoyers , Michael Jeanson , Jens Axboe , "Paul E. McKenney" , "Gautham R. Shenoy" , Florian Weimer , Tim Chen , Yury Norov , Shrikanth Hegde Content-Language: en-US From: Marek Szyprowski In-Reply-To: <20251119172549.578653738@linutronix.de> Content-Transfer-Encoding: 8bit X-CMS-MailID: 20251121225645eucas1p2d0165821efb61ea8732d14b62c50af52 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20251121225645eucas1p2d0165821efb61ea8732d14b62c50af52 X-EPHeader: CA X-CMS-RootMailID: 20251121225645eucas1p2d0165821efb61ea8732d14b62c50af52 References: <20251119171016.815482037@linutronix.de> <20251119172549.578653738@linutronix.de> Hi On 19.11.2025 18:27, Thomas Gleixner wrote: > Reevaluating num_possible_cpus() over and over does not make sense. That > becomes a constant after init as cpu_possible_mask is marked ro_after_init. > > Cache the value during initialization and provide that for consumption. > > Signed-off-by: Thomas Gleixner > Reviewed-by: Yury Norov > Reviewed-by: Mathieu Desnoyers > Reviewed-by: Shrikanth Hegde This patch landed recently in linux-next as commit d0f23ccf6ba9 ("cpumask: Cache num_possible_cpus()"). I found that it triggers the following warning during boot on some of my test systems (namely Raspberry Pi 3 and 4): kvm [1]: nv: 568 coarse grained trap handlers kvm [1]: IPA Size Limit: 40 bits ------------[ cut here ]------------ WARNING: CPU: 1 PID: 1 at arch/arm64/kvm/vmid.c:183 kvm_arm_vmid_alloc_init+0x98/0xac Modules linked in: CPU: 1 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.18.0-rc4+ #16195 PREEMPT Hardware name: Raspberry Pi 3 Model B (DT) pstate: 20000005 (nzCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : kvm_arm_vmid_alloc_init+0x98/0xac lr : kvm_arm_vmid_alloc_init+0x1c/0xac ... Call trace:  kvm_arm_vmid_alloc_init+0x98/0xac (P)  kvm_arm_init+0x144/0x153c  do_one_initcall+0x64/0x308  kernel_init_freeable+0x280/0x4fc  kernel_init+0x20/0x1d8  ret_from_fork+0x10/0x20 irq event stamp: 65606 hardirqs last  enabled at (65605): [] __up_console_sem+0x6c/0x80 hardirqs last disabled at (65606): [] el1_brk64+0x20/0x60 softirqs last  enabled at (65262): [] handle_softirqs+0x4c4/0x4dc softirqs last disabled at (65257): [] __do_softirq+0x14/0x20 ---[ end trace 0000000000000000 ]--- kvm [1]: Hyp nVHE mode initialized successfully Reverting it on top of linux-next fixes the issue. Let me know how can I help debugging it. > --- > V4: Add comment why this is not marked __init .... > V2: New patch > --- > include/linux/cpumask.h | 10 ++++++++-- > kernel/cpu.c | 19 +++++++++++++++++++ > 2 files changed, 27 insertions(+), 2 deletions(-) > --- a/include/linux/cpumask.h > +++ b/include/linux/cpumask.h > @@ -126,6 +126,7 @@ extern struct cpumask __cpu_dying_mask; > #define cpu_dying_mask ((const struct cpumask *)&__cpu_dying_mask) > > extern atomic_t __num_online_cpus; > +extern unsigned int __num_possible_cpus; > > extern cpumask_t cpus_booted_once_mask; > > @@ -1152,13 +1153,13 @@ void init_cpu_possible(const struct cpum > #define __assign_cpu(cpu, mask, val) \ > __assign_bit(cpumask_check(cpu), cpumask_bits(mask), (val)) > > -#define set_cpu_possible(cpu, possible) assign_cpu((cpu), &__cpu_possible_mask, (possible)) > #define set_cpu_enabled(cpu, enabled) assign_cpu((cpu), &__cpu_enabled_mask, (enabled)) > #define set_cpu_present(cpu, present) assign_cpu((cpu), &__cpu_present_mask, (present)) > #define set_cpu_active(cpu, active) assign_cpu((cpu), &__cpu_active_mask, (active)) > #define set_cpu_dying(cpu, dying) assign_cpu((cpu), &__cpu_dying_mask, (dying)) > > void set_cpu_online(unsigned int cpu, bool online); > +void set_cpu_possible(unsigned int cpu, bool possible); > > /** > * to_cpumask - convert a NR_CPUS bitmap to a struct cpumask * > @@ -1211,7 +1212,12 @@ static __always_inline unsigned int num_ > { > return raw_atomic_read(&__num_online_cpus); > } > -#define num_possible_cpus() cpumask_weight(cpu_possible_mask) > + > +static __always_inline unsigned int num_possible_cpus(void) > +{ > + return __num_possible_cpus; > +} > + > #define num_enabled_cpus() cpumask_weight(cpu_enabled_mask) > #define num_present_cpus() cpumask_weight(cpu_present_mask) > #define num_active_cpus() cpumask_weight(cpu_active_mask) > --- a/kernel/cpu.c > +++ b/kernel/cpu.c > @@ -3108,6 +3108,9 @@ EXPORT_SYMBOL(__cpu_dying_mask); > atomic_t __num_online_cpus __read_mostly; > EXPORT_SYMBOL(__num_online_cpus); > > +unsigned int __num_possible_cpus __ro_after_init = NR_CPUS; > +EXPORT_SYMBOL(__num_possible_cpus); > + > void init_cpu_present(const struct cpumask *src) > { > cpumask_copy(&__cpu_present_mask, src); > @@ -3116,6 +3119,7 @@ void init_cpu_present(const struct cpuma > void init_cpu_possible(const struct cpumask *src) > { > cpumask_copy(&__cpu_possible_mask, src); > + __num_possible_cpus = cpumask_weight(&__cpu_possible_mask); > } > > void set_cpu_online(unsigned int cpu, bool online) > @@ -3139,6 +3143,21 @@ void set_cpu_online(unsigned int cpu, bo > } > } > > +/* > + * This should be marked __init, but there is a boatload of call sites > + * which need to be fixed up to do so. Sigh... > + */ > +void set_cpu_possible(unsigned int cpu, bool possible) > +{ > + if (possible) { > + if (!cpumask_test_and_set_cpu(cpu, &__cpu_possible_mask)) > + __num_possible_cpus++; > + } else { > + if (cpumask_test_and_clear_cpu(cpu, &__cpu_possible_mask)) > + __num_possible_cpus--; > + } > +} > + > /* > * Activate the first processor. > */ > > > Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland