diff options
| -rw-r--r-- | arch/s390/kernel/perf_cpum_sf.c | 16 | 
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c index c07fdcd73726..3f6b02ee73ec 100644 --- a/arch/s390/kernel/perf_cpum_sf.c +++ b/arch/s390/kernel/perf_cpum_sf.c @@ -1315,6 +1315,22 @@ static void hw_perf_event_update(struct perf_event *event, int flush_all)  	if (sampl_overflow)  		OVERFLOW_REG(hwc) = DIV_ROUND_UP(OVERFLOW_REG(hwc) +  						 sampl_overflow, 1 + num_sdb); + +	/* Perf_event_overflow() and perf_event_account_interrupt() limit +	 * the interrupt rate to an upper limit. Roughly 1000 samples per +	 * task tick. +	 * Hitting this limit results in a large number +	 * of throttled REF_REPORT_THROTTLE entries and the samples +	 * are dropped. +	 * Slightly increase the interval to avoid hitting this limit. +	 */ +	if (event_overflow) { +		SAMPL_RATE(hwc) += DIV_ROUND_UP(SAMPL_RATE(hwc), 10); +		debug_sprintf_event(sfdbg, 1, "%s: rate adjustment %ld\n", +				    __func__, +				    DIV_ROUND_UP(SAMPL_RATE(hwc), 10)); +	} +  	if (sampl_overflow || event_overflow)  		debug_sprintf_event(sfdbg, 4, "%s: "  				    "overflows: sample %llu event %llu"  | 
