Skip to content

Commit

Permalink
lib: Fix possible deadlock in flexible proportion code
Browse files Browse the repository at this point in the history
When percpu counter function in fprop_new_period() is interrupted by an
interrupt while holding counter lock, it can cause deadlock when the
interrupt wants to take the lock as well. Fix the problem by disabling
interrupts when calling percpu counter functions.

Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
  • Loading branch information
Jan Kara authored and Fengguang Wu committed Jun 8, 2012
1 parent f3109a5 commit e78d483
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions lib/flex_proportions.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,20 +62,26 @@ 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;
/* Use addition to avoid losing events happening between sum and set */
percpu_counter_add(&p->events, -events);
p->period += periods;
write_seqcount_end(&p->sequence);
local_irq_restore(flags);

return true;
}
Expand Down

0 comments on commit e78d483

Please sign in to comment.