diff options
Diffstat (limited to 'lib/flex_proportions.c')
| -rw-r--r-- | lib/flex_proportions.c | 10 | 
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/flex_proportions.c b/lib/flex_proportions.c index e02a3883ae0..c785554f952 100644 --- a/lib/flex_proportions.c +++ b/lib/flex_proportions.c @@ -62,13 +62,18 @@ void fprop_global_destroy(struct fprop_global *p)   */  bool fprop_new_period(struct fprop_global *p, int periods)  { -	u64 events = percpu_counter_sum(&p->events); +	u64 events; +	unsigned long flags; +	local_irq_save(flags); +	events = percpu_counter_sum(&p->events);  	/*  	 * Don't do anything if there are no events.  	 */ -	if (events <= 1) +	if (events <= 1) { +		local_irq_restore(flags);  		return false; +	}  	write_seqcount_begin(&p->sequence);  	if (periods < 64)  		events -= events >> periods; @@ -76,6 +81,7 @@ bool fprop_new_period(struct fprop_global *p, int periods)  	percpu_counter_add(&p->events, -events);  	p->period += periods;  	write_seqcount_end(&p->sequence); +	local_irq_restore(flags);  	return true;  }  |