Message ID | 20200603144949.1122421-6-a.darwish@linutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | seqlock: seqcount_t call sites bugfixes | expand |
On 6/3/20 8:49 AM, Ahmed S. Darwish wrote: > For optimized block readers not holding a mutex, the "number of sectors" > 64-bit value is protected from tearing on 32-bit architectures by a > sequence counter. > > Disable preemption before entering that sequence counter's write side > critical section. Otherwise, the read side can preempt the write side > section and spin for the entire scheduler tick. If the reader belongs to > a real-time scheduling class, it can spin forever and the kernel will > livelock. Applied, thanks.
diff --git a/block/blk.h b/block/blk.h index 0a94ec68af32..151f86932547 100644 --- a/block/blk.h +++ b/block/blk.h @@ -470,9 +470,11 @@ static inline sector_t part_nr_sects_read(struct hd_struct *part) static inline void part_nr_sects_write(struct hd_struct *part, sector_t size) { #if BITS_PER_LONG==32 && defined(CONFIG_SMP) + preempt_disable(); write_seqcount_begin(&part->nr_sects_seq); part->nr_sects = size; write_seqcount_end(&part->nr_sects_seq); + preempt_enable(); #elif BITS_PER_LONG==32 && defined(CONFIG_PREEMPTION) preempt_disable(); part->nr_sects = size;