{"id":21382,"date":"2026-09-12T04:31:06","date_gmt":"2026-09-11T20:31:06","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89460"},"modified":"2026-09-12T04:31:06","modified_gmt":"2026-09-11T20:31:06","slug":"cve-2026-89460","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89460","title":{"rendered":"CVE-2026-89460 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\ns390\/cpum_cf: Handle"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>s390\/cpum_cf: Handle CPU hotplug via prepare\/dead callbacks<\/p>\n<p>The command &#8216;perf stat -e cycles &#8212; &#8216; crashes the kernel<br \/>\nwhen CPUs are hotplug added during that run.<\/p>\n<p>Root cause is the allocation of struct cpu_cf_events at first<br \/>\nevent initialization. The allocation is dynamic and the first<br \/>\nevent that has task context creates such a structure for<br \/>\neach online CPU. This is not sufficient. CPUs may be offline<br \/>\nduring event creation and can be set online during the<br \/>\nperf run time. For example commands<\/p>\n<p> # echo 0 &gt; \/sys\/devices\/system\/cpu\/cpu1\/online<br \/>\n # perf stat -e cycles -i &#8212; stress-ng -t10s &#8211;matrix X<br \/>\n # sleep 1<br \/>\n # echo 1 &gt; \/sys\/devices\/system\/cpu\/cpu1\/online<\/p>\n<p>create an event for CPUs 0,2-X. Since the events are created with<br \/>\ntask-context, the scheduler will eventually schedule the program<br \/>\non CPU1. This CPU has not created and initialized any per<br \/>\nCPU event infrastructure as that CPU was not online at the time<br \/>\nof the perf invocation. Thus when the scheduler runs stress-ng<br \/>\non CPU1, the function cpumf_pmu_add() refers to a NULL pointer:<\/p>\n<p> struct cpu_cf_events *cpuhw = this_cpu_cfhw();<\/p>\n<p>This function call is invoked after the task stress-ng has been<br \/>\nmade runnable on CPU1. And this_cpu_cfhw() returns NULL.<\/p>\n<p>The result is a panic:<br \/>\nUnable to handle kernel pointer dereference in virtual kernel address space<br \/>\nFailing address: 0000000000000000 TEID: 0000000000000483<br \/>\n&#8230;.<br \/>\nKrnl PSW : 0404d00180000000 000003ef8291fd0c (cpumf_pmu_add+0x3c\/0x80)<br \/>\n&#8230;.<br \/>\nCall Trace:<br \/>\n [] cpumf_pmu_add+0x3c\/0x80<br \/>\n [] event_sched_in+0xae\/0x190<br \/>\n [] merge_sched_in+0x1b6\/0x390<br \/>\n [] visit_groups_merge.constprop.0.isra.0+0x308\/0x5b0<br \/>\n [] pmu_groups_sched_in+0x3a\/0x50<br \/>\n [] ctx_sched_in+0x180\/0x260<br \/>\n [] perf_event_context_sched_in+0x11c\/0x2d0<br \/>\n [] __perf_event_task_sched_in+0x2e\/0xc0<br \/>\n [] finish_task_switch.isra.0+0x1a4\/0x250<br \/>\n&#8230;.<br \/>\nLast Breaking-Event-Address:<br \/>\n [] this_cpu_cfhw+0x38\/0x40<\/p>\n<p>The issue arises only in per-task context when the CPUMF facility is<br \/>\nused and the scheduler picks a random CPU for such a process to run on.<br \/>\nThe scheduler enables the CPUMF infrastructure via PMU callback<br \/>\nfunctions pmu::add() and pmu::del().<\/p>\n<p>Introduce a CPU hotplug prepare\/dead callback pair which creates and<br \/>\nremoves the per CPU counter data while the CPU is offline. Count the<br \/>\nusers which track every CPU (cpu == -1), that is perf_event_open()<br \/>\nevents with task context and \/dev\/hwctr device sessions, in the new<br \/>\ncounter cpu_cf_root::tskcnt, protected by pmc_reserve_mutex.<br \/>\nThis ensures the infrastructure is available when<br \/>\nnew CPU is selected to run the per-task context process.<\/p>\n<p>In cpum_cf_free_root() and cpum_cf_free_cpu() ensure the reference<br \/>\npointer to data structures is set to NULL before the data is freed<br \/>\nto prevent interrupt handlers to access stale data.<\/p>\n<p>[gor@linux.ibm.com: change commit message]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>s390\/cpum_cf: Handle CPU hotplug via prepare\/dead callbacks<\/p>\n<p>The command &#8216;perf stat -e cycles &#8212; &#8216; crashes the kernel<br \/>\nwhen CPUs are<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-21382","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/21382","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21382"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21382"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21382"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}