Subject: Re: linux-next: build warning after merge of the tip tree

From: "Liang, Kan" <[email-masked]>
Date: Wed, 11 Sep 2024 11:32:53 -0400

Hi Stephen,

On 2024-09-11 1:38 a.m., Stephen Rothwell wrote:
> Hi all,
> 
> After merging the tip tree, today's linux-next build (arm
> multi_v7_defconfig) produced this warning:
> 
> kernel/events/core.c: In function 'perf_event_setup_cpumask':
> kernel/events/core.c:14012:13: warning: the comparison will always evaluate as 'true' for the address of 'thread_sibling' will never be NULL [-Waddress]
> 14012 |         if (!topology_sibling_cpumask(cpu)) {

The perf_event_init_cpu() may be invoked at the early boot stage, while
the topology_*_cpumask hasn't been initialized yet. The check is to
specially handle the case.

X86 uses a per-cpu cpumask pointer, which could be NULL at the early
boot stage. However, it looks like ARM uses a global variable, which
never be NULL. If so, I think we should check whether it's empty.

The below patch should fix it (Only test on X86).

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 2766090de84e..fc0c17e57c86 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -14000,7 +14000,8 @@ static void perf_event_setup_cpumask(unsigned
int cpu)
 	 * The perf_online_<domain>_masks includes the first CPU of each domain.
 	 * Always uncondifionally set the boot CPU for the
perf_online_<domain>_masks.
 	 */
-	if (!topology_sibling_cpumask(cpu)) {
+	if (cpu == get_boot_cpu_id() &&
+	    (!topology_sibling_cpumask(cpu) ||
cpumask_empty(topology_sibling_cpumask(cpu)))) {
 		for (scope = PERF_PMU_SCOPE_NONE + 1; scope < PERF_PMU_MAX_SCOPE;
scope++) {
 			pmu_cpumask = perf_scope_cpumask(scope);
 			if (WARN_ON_ONCE(!pmu_cpumask))

Should I send the above as a separate patch to fix it?

Thanks,
Kan

>       |             ^
> In file included from include/linux/topology.h:30,
>                  from include/linux/gfp.h:8,
>                  from include/linux/xarray.h:16,
>                  from include/linux/list_lru.h:14,
>                  from include/linux/fs.h:13,
>                  from kernel/events/core.c:11:
> include/linux/arch_topology.h:78:19: note: 'thread_sibling' declared here
>    78 |         cpumask_t thread_sibling;
>       |                   ^~~~~~~~~~~~~~
> 
> Introduced by commit
> 
>   4ba4f1afb6a9 ("perf: Generic hotplug support for a PMU with a scope")
>