lkml.org 
[lkml]   [2020]   [Jun]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 068/135] block: nr_sects_write(): Disable preemption on seqcount write
    Date
    From: "Ahmed S. Darwish" <a.darwish@linutronix.de>

    [ Upstream commit 15b81ce5abdc4b502aa31dff2d415b79d2349d2f ]

    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.

    Fixes: c83f6bf98dc1 ("block: add partition resize function to blkpg ioctl")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Ahmed S. Darwish <a.darwish@linutronix.de>
    Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    include/linux/genhd.h | 2 ++
    1 file changed, 2 insertions(+)

    diff --git a/include/linux/genhd.h b/include/linux/genhd.h
    index 5012fcdb4c9ed..a27d0aef07f66 100644
    --- a/include/linux/genhd.h
    +++ b/include/linux/genhd.h
    @@ -727,9 +727,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_LBDAF) && 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_LBDAF) && defined(CONFIG_PREEMPT)
    preempt_disable();
    part->nr_sects = size;
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-29 21:03    [W:2.260 / U:1.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site