summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>2022-08-25 18:41:30 +0200
committerThomas Gleixner <tglx@linutronix.de>2022-09-19 14:35:08 +0200
commit9458e0a78c45bc6537ce11eb9f03489eab92f9c2 (patch)
treea8fb3afdf9cc749b56242fed822c372f8158432d /lib
parentc7e0b3d088717d148707cd6fcb12f97c6fd961c1 (diff)
flex_proportions: Disable preemption entering the write section.
The seqcount fprop_global::sequence is not associated with a lock. The write section (fprop_new_period()) is invoked from a timer and since the softirq is preemptible on PREEMPT_RT it is possible to preempt the write section which is not desited. Disable preemption around the write section on PREEMPT_RT. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/r/20220825164131.402717-8-bigeasy@linutronix.de
Diffstat (limited to 'lib')
-rw-r--r--lib/flex_proportions.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/lib/flex_proportions.c b/lib/flex_proportions.c
index 05cccbcf1661..83332fefa6f4 100644
--- a/lib/flex_proportions.c
+++ b/lib/flex_proportions.c
@@ -70,6 +70,7 @@ bool fprop_new_period(struct fprop_global *p, int periods)
*/
if (events <= 1)
return false;
+ preempt_disable_nested();
write_seqcount_begin(&p->sequence);
if (periods < 64)
events -= events >> periods;
@@ -77,6 +78,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);
+ preempt_enable_nested();
return true;
}