mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-27 17:11:46 +00:00
kernel: provide create_io_thread() helper
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: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
dd59a3d595
commit
cc440e8738
2 changed files with 32 additions and 0 deletions
|
@ -31,6 +31,7 @@ struct kernel_clone_args {
|
||||||
/* Number of elements in *set_tid */
|
/* Number of elements in *set_tid */
|
||||||
size_t set_tid_size;
|
size_t set_tid_size;
|
||||||
int cgroup;
|
int cgroup;
|
||||||
|
int io_thread;
|
||||||
struct cgroup *cgrp;
|
struct cgroup *cgrp;
|
||||||
struct css_set *cset;
|
struct css_set *cset;
|
||||||
};
|
};
|
||||||
|
@ -82,6 +83,7 @@ extern void exit_files(struct task_struct *);
|
||||||
extern void exit_itimers(struct signal_struct *);
|
extern void exit_itimers(struct signal_struct *);
|
||||||
|
|
||||||
extern pid_t kernel_clone(struct kernel_clone_args *kargs);
|
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 task_struct *fork_idle(int);
|
||||||
struct mm_struct *copy_init_mm(void);
|
struct mm_struct *copy_init_mm(void);
|
||||||
extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
|
extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
|
||||||
|
|
|
@ -1940,6 +1940,8 @@ static __latent_entropy struct task_struct *copy_process(
|
||||||
p = dup_task_struct(current, node);
|
p = dup_task_struct(current, node);
|
||||||
if (!p)
|
if (!p)
|
||||||
goto fork_out;
|
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
|
* This _must_ happen before we call free_task(), i.e. before we jump
|
||||||
|
@ -2410,6 +2412,34 @@ struct mm_struct *copy_init_mm(void)
|
||||||
return dup_mm(NULL, &init_mm);
|
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.
|
* Ok, this is the main fork-routine.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue