Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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.

Cc: stable@vger.kernel.org
Fixes: 39d4a501a9ef ("s390/cpum_sf: Adjust sampling interval to avoid hitting sample limits")
Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
Reviewed-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
Reviewed-by: Hendrik Brueckner <brueckner@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>

authored by

Thomas Richter and committed by
Vasily Gorbik
57ad0d4a 598bbefa

+5 -1
+5 -1
arch/s390/kernel/perf_cpum_sf.c
··· 1168 1168 static void hw_perf_event_update(struct perf_event *event, int flush_all) 1169 1169 { 1170 1170 unsigned long long event_overflow, sampl_overflow, num_sdb; 1171 + struct cpu_hw_sf *cpuhw = this_cpu_ptr(&cpu_hw_sf); 1171 1172 struct hw_perf_event *hwc = &event->hw; 1172 1173 union hws_trailer_header prev, new; 1173 1174 struct hws_trailer_entry *te; ··· 1248 1247 * are dropped. 1249 1248 * Slightly increase the interval to avoid hitting this limit. 1250 1249 */ 1251 - if (event_overflow) 1250 + if (event_overflow) { 1252 1251 SAMPL_RATE(hwc) += DIV_ROUND_UP(SAMPL_RATE(hwc), 10); 1252 + if (SAMPL_RATE(hwc) > cpuhw->qsi.max_sampl_rate) 1253 + SAMPL_RATE(hwc) = cpuhw->qsi.max_sampl_rate; 1254 + } 1253 1255 } 1254 1256 1255 1257 static inline unsigned long aux_sdb_index(struct aux_buffer *aux,