Commit af6e1dbc authored by Jens Axboe's avatar Jens Axboe Committed by Jialin Zhang
Browse files

kernel: provide create_io_thread() helper

stable inclusion
from stable-v5.10.162
commit 1500fed00878fd59b2d6a1832b8d3f7c261a5671
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I6BTWC
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.10.168&id=1500fed00878fd59b2d6a1832b8d3f7c261a5671



--------------------------------

[ Upstream commit cc440e87 ]

Provide a generic helper for setting up an io_uring worker. Returns a
task_struct so that the caller can do whatever setup is needed, then call
wake_up_new_task() to kick it into gear.

Add a kernel_clone_args member, io_thread, which tells copy_process() to
mark the task with PF_IO_WORKER.

Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarLi Lingfeng <lilingfeng3@huawei.com>
Reviewed-by: default avatarZhang Yi <yi.zhang@huawei.com>
Reviewed-by: default avatarWang Weiyang <wangweiyang2@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parent de68e074
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ struct kernel_clone_args {
	/* Number of elements in *set_tid */
	size_t set_tid_size;
	int cgroup;
	int io_thread;
	struct cgroup *cgrp;
	struct css_set *cset;
};
@@ -85,6 +86,7 @@ extern void exit_files(struct task_struct *);
extern void exit_itimers(struct task_struct *);

extern pid_t kernel_clone(struct kernel_clone_args *kargs);
struct task_struct *create_io_thread(int (*fn)(void *), void *arg, int node);
struct task_struct *fork_idle(int);
struct mm_struct *copy_init_mm(void);
extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
+30 −0
Original line number Diff line number Diff line
@@ -2023,6 +2023,8 @@ static __latent_entropy struct task_struct *copy_process(
	p = dup_task_struct(current, node);
	if (!p)
		goto fork_out;
	if (args->io_thread)
		p->flags |= PF_IO_WORKER;

	/*
	 * This _must_ happen before we call free_task(), i.e. before we jump
@@ -2506,6 +2508,34 @@ struct mm_struct *copy_init_mm(void)
	return dup_mm(NULL, &init_mm);
}

/*
 * This is like kernel_clone(), but shaved down and tailored to just
 * creating io_uring workers. It returns a created task, or an error pointer.
 * The returned task is inactive, and the caller must fire it up through
 * wake_up_new_task(p). All signals are blocked in the created task.
 */
struct task_struct *create_io_thread(int (*fn)(void *), void *arg, int node)
{
	unsigned long flags = CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|
				CLONE_IO;
	struct kernel_clone_args args = {
		.flags		= ((lower_32_bits(flags) | CLONE_VM |
				    CLONE_UNTRACED) & ~CSIGNAL),
		.exit_signal	= (lower_32_bits(flags) & CSIGNAL),
		.stack		= (unsigned long)fn,
		.stack_size	= (unsigned long)arg,
		.io_thread	= 1,
	};
	struct task_struct *tsk;

	tsk = copy_process(NULL, 0, node, &args);
	if (!IS_ERR(tsk)) {
		sigfillset(&tsk->blocked);
		sigdelsetmask(&tsk->blocked, sigmask(SIGKILL));
	}
	return tsk;
}

/*
 *  Ok, this is the main fork-routine.
 *