diff options
Diffstat (limited to 'lib')
| -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 e02a3883ae01..c785554f9523 100644 --- a/lib/flex_proportions.c +++ b/lib/flex_proportions.c | |||
| @@ -62,13 +62,18 @@ void fprop_global_destroy(struct fprop_global *p) | |||
| 62 | */ | 62 | */ |
| 63 | bool fprop_new_period(struct fprop_global *p, int periods) | 63 | bool fprop_new_period(struct fprop_global *p, int periods) |
| 64 | { | 64 | { |
| 65 | u64 events = percpu_counter_sum(&p->events); | 65 | u64 events; |
| 66 | unsigned long flags; | ||
| 66 | 67 | ||
| 68 | local_irq_save(flags); | ||
| 69 | events = percpu_counter_sum(&p->events); | ||
| 67 | /* | 70 | /* |
| 68 | * Don't do anything if there are no events. | 71 | * Don't do anything if there are no events. |
| 69 | */ | 72 | */ |
| 70 | if (events <= 1) | 73 | if (events <= 1) { |
| 74 | local_irq_restore(flags); | ||
| 71 | return false; | 75 | return false; |
| 76 | } | ||
| 72 | write_seqcount_begin(&p->sequence); | 77 | write_seqcount_begin(&p->sequence); |
| 73 | if (periods < 64) | 78 | if (periods < 64) |
| 74 | events -= events >> periods; | 79 | events -= events >> periods; |
| @@ -76,6 +81,7 @@ bool fprop_new_period(struct fprop_global *p, int periods) | |||
| 76 | percpu_counter_add(&p->events, -events); | 81 | percpu_counter_add(&p->events, -events); |
| 77 | p->period += periods; | 82 | p->period += periods; |
| 78 | write_seqcount_end(&p->sequence); | 83 | write_seqcount_end(&p->sequence); |
| 84 | local_irq_restore(flags); | ||
| 79 | 85 | ||
| 80 | return true; | 86 | return true; |
| 81 | } | 87 | } |
