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 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) | |||
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 | } |