block: fix default IO priority handling
authorDamien Le Moal <damien.lemoal@wdc.com>
Wed, 11 Aug 2021 03:37:02 +0000 (12:37 +0900)
committerJens Axboe <axboe@kernel.dk>
Wed, 18 Aug 2021 13:23:15 +0000 (07:23 -0600)
The default IO priority is the best effort (BE) class with the
normal priority level IOPRIO_NORM (4). However, get_task_ioprio()
returns IOPRIO_CLASS_NONE/IOPRIO_NORM as the default priority and
get_current_ioprio() returns IOPRIO_CLASS_NONE/0. Let's be consistent
with the defined default and have both of these functions return the
default priority IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, IOPRIO_NORM) when
the user did not define another default IO priority for the task.

In include/uapi/linux/ioprio.h, introduce the IOPRIO_BE_NORM macro as
an alias to IOPRIO_NORM to clarify that this default level applies to
the BE priotity class. In include/linux/ioprio.h, define the macro
IOPRIO_DEFAULT as IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, IOPRIO_BE_NORM)
and use this new macro when setting a priority to the default.

Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
Link: https://lore.kernel.org/r/20210811033702.368488-7-damien.lemoal@wdc.com
[axboe: drop unnecessary lightnvm change]
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bfq-iosched.c
block/ioprio.c
include/linux/ioprio.h
include/uapi/linux/ioprio.h

index 4b43436..e92bc03 100644 (file)
@@ -5411,7 +5411,7 @@ static struct bfq_queue **bfq_async_queue_prio(struct bfq_data *bfqd,
        case IOPRIO_CLASS_RT:
                return &bfqg->async_bfqq[0][ioprio];
        case IOPRIO_CLASS_NONE:
-               ioprio = IOPRIO_NORM;
+               ioprio = IOPRIO_BE_NORM;
                fallthrough;
        case IOPRIO_CLASS_BE:
                return &bfqg->async_bfqq[1][ioprio];
index ca6b136..0e4ff24 100644 (file)
@@ -170,7 +170,7 @@ static int get_task_ioprio(struct task_struct *p)
        ret = security_task_getioprio(p);
        if (ret)
                goto out;
-       ret = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, IOPRIO_NORM);
+       ret = IOPRIO_DEFAULT;
        task_lock(p);
        if (p->io_context)
                ret = p->io_context->ioprio;
@@ -182,9 +182,9 @@ out:
 int ioprio_best(unsigned short aprio, unsigned short bprio)
 {
        if (!ioprio_valid(aprio))
-               aprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, IOPRIO_NORM);
+               aprio = IOPRIO_DEFAULT;
        if (!ioprio_valid(bprio))
-               bprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, IOPRIO_NORM);
+               bprio = IOPRIO_DEFAULT;
 
        return min(aprio, bprio);
 }
index 2ee3373..3f53bc2 100644 (file)
@@ -9,6 +9,11 @@
 #include <uapi/linux/ioprio.h>
 
 /*
+ * Default IO priority.
+ */
+#define IOPRIO_DEFAULT IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, IOPRIO_BE_NORM)
+
+/*
  * Check that a priority value has a valid class.
  */
 static inline bool ioprio_valid(unsigned short ioprio)
@@ -51,7 +56,7 @@ static inline int get_current_ioprio(void)
 
        if (ioc)
                return ioc->ioprio;
-       return IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0);
+       return IOPRIO_DEFAULT;
 }
 
 /*
index aac3933..f70f259 100644 (file)
@@ -44,8 +44,9 @@ enum {
 };
 
 /*
- * Fallback BE priority
+ * Fallback BE priority level.
  */
-#define IOPRIO_NORM    (4)
+#define IOPRIO_NORM    4
+#define IOPRIO_BE_NORM IOPRIO_NORM
 
 #endif /* _UAPI_LINUX_IOPRIO_H */