FAILED: patch "[PATCH] s390/cpum_sf: Cap sampling rate to prevent lsctl exception" failed to apply to 6.12-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.12-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.12.y
git checkout FETCH_HEAD
git cherry-pick -x 57ad0d4a00f5d3e80f33ba2da8d560c73d83dc22
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026040840-running-plethora-7f54@gregkh' --subject-prefix 'PATCH 6.12.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 57ad0d4a00f5d3e80f33ba2da8d560c73d83dc22 Mon Sep 17 00:00:00 2001
From: Thomas Richter <[email protected]>
Date: Fri, 6 Mar 2026 13:50:31 +0100
Subject: [PATCH] s390/cpum_sf: Cap sampling rate to prevent lsctl exception
commit fcc43a7e294f ("s390/configs: Set HZ=1000") changed the interrupt frequency of the system. On machines with heavy load and many perf event overflows, this might lead to an exception. Dmesg displays these entries:
[112.242542] cpum_sf: Loading sampling controls failed: op 1 err -22
One line per CPU online.
The root cause is the CPU Measurement sampling facility overflow adjustment. Whenever an overflow (too much samples per tick) occurs, the sampling rate is adjusted and increased. This was done without observing the maximum sampling rate limit. When the current sampling interval is higher than the maximum sampling rate limit, the lsctl instruction raises an exception. The error messages is the result of such an exception. Observe the upper limit when the new sampling rate is recalculated.
arch/s390/kernel/perf_cpum_sf.c +5 -1
@@ -1168,6 +1168,7 @@ static void hw_collect_samples(struct perf_event *event, unsigned long *sdbt,static void hw_perf_event_update (struct perf_event *event,int flush_all) {unsigned long long event_overflow, sampl_overflow, num_sdb; +struct cpu_hw_sf *cpuhw =this_cpu_ptr (&cpu_hw_sf);struct hw_perf_event *hwc = &event->hw;union hws_trailer_header prev, new;struct hws_trailer_entry *te;
@@ -1247,8 +1248,11 @@ static void hw_perf_event_update(struct perf_event *event, int flush_all)* are dropped. * Slightly increase the interval to avoid hitting this limit. */ -if (event_overflow) +if (event_overflow) {SAMPL_RATE (hwc) +=DIV_ROUND_UP (SAMPL_RATE (hwc),10 ); +if (SAMPL_RATE (hwc) > cpuhw->qsi.max_sampl_rate) +SAMPL_RATE (hwc) = cpuhw->qsi.max_sampl_rate; + } } static inline unsigned long aux_sdb_index(struct aux_buffer *aux,
Sasha Levin
maintainerPATCH 1/2 s390/perf_cpum_sf: Convert to use try_cmpxchg128()
From: Heiko Carstens <[email protected]>
[ Upstream commit e449399ffd295a1202b74a258227193454ef333f ]
Convert cmpxchg128() usages to try_cmpxchg128() in order to generate slightly better code.
Stable-dep-of: 57ad0d4a00f5 ("s390/cpum_sf: Cap sampling rate to prevent lsctl exception")
--- arch/s390/kernel/perf_cpum_sf.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-)
arch/s390/kernel/perf_cpum_sf.c +9 -15
@@ -1188,8 +1188,8 @@ static void hw_collect_samples(struct perf_event *event, unsigned long *sdbt,static void hw_perf_event_update (struct perf_event *event,int flush_all) {unsigned long long event_overflow, sampl_overflow, num_sdb; -union hws_trailer_header old, prev, new;struct hw_perf_event *hwc = &event->hw; +union hws_trailer_header prev, new;struct hws_trailer_entry *te;unsigned long *sdbt, sdb;int done;
@@ -1233,13 +1233,11 @@ static void hw_perf_event_update(struct perf_event *event, int flush_all)/* Reset trailer (using compare-double-and-swap) */ prev.val =READ_ONCE_ALIGNED_128 (te->header.val);do { - old.val = prev.val; new.val = prev.val; new.f =0 ; new.a =1 ; new.overflow =0 ; - prev.val =cmpxchg128 (&te->header.val, old.val, new.val); - }while (prev.val != old.val); + }while (!try_cmpxchg128 (&te->header.val, &prev.val, new.val));/* Advance to next sample-data-block */ sdbt++;
@@ -1405,16 +1403,15 @@ static int aux_output_begin(struct perf_output_handle *handle,static bool aux_set_alert (struct aux_buffer *aux,unsigned long alert_index,unsigned long long *overflow) { -union hws_trailer_header old, prev, new; +union hws_trailer_header prev, new;struct hws_trailer_entry *te; te =aux_sdb_trailer (aux, alert_index); prev.val =READ_ONCE_ALIGNED_128 (te->header.val); do { - old.val = prev.val; new.val = prev.val; - *overflow = old.overflow; - if (old.f) { + *overflow = prev.overflow; + if (prev.f) { /* * SDB is already set by hardware. * Abort and try to set somewhere
@@ -1424,8 +1421,7 @@ static bool aux_set_alert(struct aux_buffer *aux, unsigned long alert_index, } new.a =1 ; new.overflow =0 ; - prev.val =cmpxchg128 (&te->header.val, old.val, new.val); - }while (prev.val != old.val); + }while (!try_cmpxchg128 (&te->header.val, &prev.val, new.val));return true; }
@@ -1454,7 +1450,7 @@ static bool aux_set_alert(struct aux_buffer *aux, unsigned long alert_index,static bool aux_reset_buffer (struct aux_buffer *aux,unsigned long range,unsigned long long *overflow) { -union hws_trailer_header old, prev, new; +union hws_trailer_header prev, new;unsigned long i, range_scan, idx;unsigned long long orig_overflow;struct hws_trailer_entry *te;
@@ -1486,17 +1482,15 @@ static bool aux_reset_buffer(struct aux_buffer *aux, unsigned long range, te =aux_sdb_trailer (aux, idx); prev.val =READ_ONCE_ALIGNED_128 (te->header.val);do { - old.val = prev.val; new.val = prev.val; - orig_overflow = old.overflow; + orig_overflow = prev.overflow; new.f =0 ; new.overflow =0 ;if (idx == aux->alert_mark) new.a =1 ;else new.a =0 ; - prev.val =cmpxchg128 (&te->header.val, old.val, new.val); - }while (prev.val != old.val); + }while (!try_cmpxchg128 (&te->header.val, &prev.val, new.val)); *overflow += orig_overflow; }
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 s390/cpum_sf: Cap sampling rate to prevent lsctl exception
From: Thomas Richter <[email protected]>
[ Upstream commit 57ad0d4a00f5d3e80f33ba2da8d560c73d83dc22 ]
commit fcc43a7e294f ("s390/configs: Set HZ=1000") changed the interrupt frequency of the system. On machines with heavy load and many perf event overflows, this might lead to an exception. Dmesg displays these entries:
[112.242542] cpum_sf: Loading sampling controls failed: op 1 err -22
One line per CPU online.
The root cause is the CPU Measurement sampling facility overflow adjustment. Whenever an overflow (too much samples per tick) occurs, the sampling rate is adjusted and increased. This was done without observing the maximum sampling rate limit. When the current sampling interval is higher than the maximum sampling rate limit, the lsctl instruction raises an exception. The error messages is the result of such an exception. Observe the upper limit when the new sampling rate is recalculated.
--- arch/s390/kernel/perf_cpum_sf.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
arch/s390/kernel/perf_cpum_sf.c +5 -1
@@ -1188,6 +1188,7 @@ static void hw_collect_samples(struct perf_event *event, unsigned long *sdbt,static void hw_perf_event_update (struct perf_event *event,int flush_all) {unsigned long long event_overflow, sampl_overflow, num_sdb; +struct cpu_hw_sf *cpuhw =this_cpu_ptr (&cpu_hw_sf);struct hw_perf_event *hwc = &event->hw;union hws_trailer_header prev, new;struct hws_trailer_entry *te;
@@ -1267,8 +1268,11 @@ static void hw_perf_event_update(struct perf_event *event, int flush_all)* are dropped. * Slightly increase the interval to avoid hitting this limit. */ -if (event_overflow) +if (event_overflow) {SAMPL_RATE (hwc) +=DIV_ROUND_UP (SAMPL_RATE (hwc),10 ); +if (SAMPL_RATE (hwc) > cpuhw->qsi.max_sampl_rate) +SAMPL_RATE (hwc) = cpuhw->qsi.max_sampl_rate; + } } static inline unsigned long aux_sdb_index(struct aux_buffer *aux,
Signature · 1 line
2.53.0