On 6/21/22 19:24, 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> Looks OK to me. Reviewed-by: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx> > --- > 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); > } > > /* -- Damien Le Moal Western Digital Research