diff options
author | wuchi <wuchi.zero@gmail.com> | 2022-06-04 15:15:02 +0200 |
---|---|---|
committer | akpm <akpm@linux-foundation.org> | 2022-06-17 04:58:20 +0200 |
commit | a91befde350375b1ff954635acdde14dc92cd9a8 (patch) | |
tree | 44c26e747a9826eea28e678713138f7e3fd976df /lib/flex_proportions.c | |
parent | lib/list_debug.c: Detect uninitialized lists (diff) | |
download | linux-a91befde350375b1ff954635acdde14dc92cd9a8.tar.xz linux-a91befde350375b1ff954635acdde14dc92cd9a8.zip |
lib/flex_proportions.c: remove local_irq_ops in fprop_new_period()
commit e78d4833c03e28> "lib: Fix possible deadlock in flexible proportion
code" adds the local_irq_ops because percpu_counter_{sum |add} ops'lock
can cause deadlock by interrupts. Now percpu_counter _{sum|add} ops use
raw_spin_(un)lock_irq*, so revert the commit and resolve the conflict.
Link: https://lkml.kernel.org/r/20220604131502.5190-1-wuchi.zero@gmail.com
Signed-off-by: wuchi <wuchi.zero@gmail.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'lib/flex_proportions.c')
-rw-r--r-- | lib/flex_proportions.c | 10 |
1 files changed, 2 insertions, 8 deletions
diff --git a/lib/flex_proportions.c b/lib/flex_proportions.c index 53e7eb1dd76c..05cccbcf1661 100644 --- a/lib/flex_proportions.c +++ b/lib/flex_proportions.c @@ -63,18 +63,13 @@ void fprop_global_destroy(struct fprop_global *p) */ bool fprop_new_period(struct fprop_global *p, int periods) { - s64 events; - unsigned long flags; + s64 events = percpu_counter_sum(&p->events); - local_irq_save(flags); - events = percpu_counter_sum(&p->events); /* * Don't do anything if there are no events. */ - if (events <= 1) { - local_irq_restore(flags); + if (events <= 1) return false; - } write_seqcount_begin(&p->sequence); if (periods < 64) events -= events >> periods; @@ -82,7 +77,6 @@ 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; } |