diff options
| -rw-r--r-- | arch/x86/kernel/msr.c | 18 | 
1 files changed, 15 insertions, 3 deletions
| diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c index 49dcfb85e773..b03001dfc613 100644 --- a/arch/x86/kernel/msr.c +++ b/arch/x86/kernel/msr.c @@ -80,18 +80,30 @@ static ssize_t msr_read(struct file *file, char __user *buf,  static int filter_write(u32 reg)  { +	/* +	 * MSRs writes usually happen all at once, and can easily saturate kmsg. +	 * Only allow one message every 30 seconds. +	 * +	 * It's possible to be smarter here and do it (for example) per-MSR, but +	 * it would certainly be more complex, and this is enough at least to +	 * avoid saturating the ring buffer. +	 */ +	static DEFINE_RATELIMIT_STATE(fw_rs, 30 * HZ, 1); +  	switch (allow_writes) {  	case MSR_WRITES_ON:  return 0;  	case MSR_WRITES_OFF: return -EPERM;  	default: break;  	} +	if (!__ratelimit(&fw_rs)) +		return 0; +  	if (reg == MSR_IA32_ENERGY_PERF_BIAS)  		return 0; -	pr_err_ratelimited("Write to unrecognized MSR 0x%x by %s\n" -			   "Please report to x86@kernel.org\n", -			   reg, current->comm); +	pr_err("Write to unrecognized MSR 0x%x by %s\n" +	       "Please report to x86@kernel.org\n", reg, current->comm);  	return 0;  } | 
