lkml.org 
[lkml]   [2022]   [Aug]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.19 01/21] block: fix default IO priority handling again
    Date
    From: Jan Kara <jack@suse.cz>

    commit e589f46445960c274cc813a1cc8e2fc73b2a1849 upstream.

    Commit e70344c05995 ("block: fix default IO priority handling")
    introduced an inconsistency in get_current_ioprio() that tasks without
    IO context return IOPRIO_DEFAULT priority while tasks with freshly
    allocated IO context will return 0 (IOPRIO_CLASS_NONE/0) IO priority.
    Tasks without IO context used to be rare before 5a9d041ba2f6 ("block:
    move io_context creation into where it's needed") but after this commit
    they became common because now only BFQ IO scheduler setups task's IO
    context. Similar inconsistency is there for get_task_ioprio() so this
    inconsistency is now exposed to userspace and userspace will see
    different IO priority for tasks operating on devices with BFQ compared
    to devices without BFQ. Furthemore the changes done by commit
    e70344c05995 change the behavior when no IO priority is set for BFQ IO
    scheduler which is also documented in ioprio_set(2) manpage:

    "If no I/O scheduler has been set for a thread, then by default the I/O
    priority will follow the CPU nice value (setpriority(2)). In Linux
    kernels before version 2.6.24, once an I/O priority had been set using
    ioprio_set(), there was no way to reset the I/O scheduling behavior to
    the default. Since Linux 2.6.24, specifying ioprio as 0 can be used to
    reset to the default I/O scheduling behavior."

    So make sure we default to IOPRIO_CLASS_NONE as used to be the case
    before commit e70344c05995. Also cleanup alloc_io_context() to
    explicitely set this IO priority for the allocated IO context to avoid
    future surprises. Note that we tweak ioprio_best() to maintain
    ioprio_get(2) behavior and make this commit easily backportable.

    CC: stable@vger.kernel.org
    Fixes: e70344c05995 ("block: fix default IO priority handling")
    Reviewed-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
    Tested-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
    Signed-off-by: Jan Kara <jack@suse.cz>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Link: https://lore.kernel.org/r/20220623074840.5960-1-jack@suse.cz
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    block/blk-ioc.c | 2 ++
    block/ioprio.c | 4 ++--
    include/linux/ioprio.h | 2 +-
    3 files changed, 5 insertions(+), 3 deletions(-)

    --- a/block/blk-ioc.c
    +++ b/block/blk-ioc.c
    @@ -247,6 +247,8 @@ static struct io_context *alloc_io_conte
    INIT_HLIST_HEAD(&ioc->icq_list);
    INIT_WORK(&ioc->release_work, ioc_release_fn);
    #endif
    + ioc->ioprio = IOPRIO_DEFAULT;
    +
    return ioc;
    }

    --- a/block/ioprio.c
    +++ b/block/ioprio.c
    @@ -157,9 +157,9 @@ out:
    int ioprio_best(unsigned short aprio, unsigned short bprio)
    {
    if (!ioprio_valid(aprio))
    - aprio = IOPRIO_DEFAULT;
    + aprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, IOPRIO_BE_NORM);
    if (!ioprio_valid(bprio))
    - bprio = IOPRIO_DEFAULT;
    + bprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, IOPRIO_BE_NORM);

    return min(aprio, bprio);
    }
    --- a/include/linux/ioprio.h
    +++ b/include/linux/ioprio.h
    @@ -11,7 +11,7 @@
    /*
    * Default IO priority.
    */
    -#define IOPRIO_DEFAULT IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, IOPRIO_BE_NORM)
    +#define IOPRIO_DEFAULT IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0)

    /*
    * Check that a priority value has a valid class.

    \
     
     \ /
      Last update: 2022-08-09 20:31    [W:3.214 / U:1.724 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site