On 6/21/22 21:36, Jan Kara wrote: > On Tue 21-06-22 12:24:40, Jan Kara wrote: >> 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. >> >> Signed-off-by: Jan Kara <jack@xxxxxxx> > > Bah, I've messed up the prototype of the stub function for !CONFIG_BLOCK. > One more fixup will be needed here but let me wait if people have more > comments... Oops. Missed it :) > > Honza > >> --- >> block/ioprio.c | 26 ++++++++++++++++++++++++++ >> include/linux/ioprio.h | 26 ++++++++++---------------- >> 2 files changed, 36 insertions(+), 16 deletions(-) >> >> diff --git a/block/ioprio.c b/block/ioprio.c >> index 2a34cbca18ae..c4e3476155a1 100644 >> --- a/block/ioprio.c >> +++ b/block/ioprio.c >> @@ -138,6 +138,32 @@ SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio) >> 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; >> diff --git a/include/linux/ioprio.h b/include/linux/ioprio.h >> index 61ed6bb4998e..788a8ff57068 100644 >> --- a/include/linux/ioprio.h >> +++ b/include/linux/ioprio.h >> @@ -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(int ioprio) >> { >> - 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); >> } >> >> /* >> -- >> 2.35.3 >> -- Damien Le Moal Western Digital Research