block: Generalize get_current_ioprio() for any task
authorJan Kara <jack@suse.cz>
Thu, 23 Jun 2022 07:48:28 +0000 (09:48 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 27 Jun 2022 12:29:12 +0000 (06:29 -0600)
get_current_ioprio() operates only on current task. We will need the
same functionality for other tasks as well. Generalize
get_current_ioprio() for that and also move the bulk out of the header
file because it is large enough.

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-3-jack@suse.cz
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/ioprio.c
include/linux/ioprio.h

index 2a34cbc..c4e3476 100644 (file)
@@ -138,6 +138,32 @@ out:
        return ret;
 }
 
+/*
+ * If the task has set an I/O priority, use that. Otherwise, return
+ * the default I/O priority.
+ *
+ * Expected to be called for current task or with task_lock() held to keep
+ * io_context stable.
+ */
+int __get_task_ioprio(struct task_struct *p)
+{
+       struct io_context *ioc = p->io_context;
+       int prio;
+
+       if (p != current)
+               lockdep_assert_held(&p->alloc_lock);
+       if (ioc)
+               prio = ioc->ioprio;
+       else
+               prio = IOPRIO_DEFAULT;
+
+       if (IOPRIO_PRIO_CLASS(prio) == IOPRIO_CLASS_NONE)
+               prio = IOPRIO_PRIO_VALUE(task_nice_ioclass(p),
+                                        task_nice_ioprio(p));
+       return prio;
+}
+EXPORT_SYMBOL_GPL(__get_task_ioprio);
+
 static int get_task_ioprio(struct task_struct *p)
 {
        int ret;
index 61ed6bb..9752cf4 100644 (file)
@@ -46,24 +46,18 @@ static inline int task_nice_ioclass(struct task_struct *task)
                return IOPRIO_CLASS_BE;
 }
 
-/*
- * If the calling process has set an I/O priority, use that. Otherwise, return
- * the default I/O priority.
- */
-static inline int get_current_ioprio(void)
+#ifdef CONFIG_BLOCK
+int __get_task_ioprio(struct task_struct *p);
+#else
+static inline int __get_task_ioprio(struct task_struct *p)
 {
-       struct io_context *ioc = current->io_context;
-       int prio;
-
-       if (ioc)
-               prio = ioc->ioprio;
-       else
-               prio = IOPRIO_DEFAULT;
+       return IOPRIO_DEFAULT;
+}
+#endif /* CONFIG_BLOCK */
 
-       if (IOPRIO_PRIO_CLASS(prio) == IOPRIO_CLASS_NONE)
-               prio = IOPRIO_PRIO_VALUE(task_nice_ioclass(current),
-                                        task_nice_ioprio(current));
-       return prio;
+static inline int get_current_ioprio(void)
+{
+       return __get_task_ioprio(current);
 }
 
 /*