Commit 893e5d32 authored by Jan Kara's avatar Jan Kara Committed by Jens Axboe
Browse files

block: Generalize get_current_ioprio() for any task



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: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
Tested-by: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20220623074840.5960-3-jack@suse.cz


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent f7eda402
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -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;
+10 −16
Original line number Diff line number Diff line
@@ -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);
}

/*