kernel: add CLONE_IO to specifically request sharing of IO contexts
syslets (or other threads/processes that want io context sharing) can set this to enforce sharing of io context. Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
521f3bbdba
commit
fadad878cc
2 changed files with 11 additions and 4 deletions
|
@ -27,6 +27,7 @@
|
||||||
#define CLONE_NEWUSER 0x10000000 /* New user namespace */
|
#define CLONE_NEWUSER 0x10000000 /* New user namespace */
|
||||||
#define CLONE_NEWPID 0x20000000 /* New pid namespace */
|
#define CLONE_NEWPID 0x20000000 /* New pid namespace */
|
||||||
#define CLONE_NEWNET 0x40000000 /* New network namespace */
|
#define CLONE_NEWNET 0x40000000 /* New network namespace */
|
||||||
|
#define CLONE_IO 0x80000000 /* Clone io context */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Scheduling policies
|
* Scheduling policies
|
||||||
|
|
|
@ -792,15 +792,21 @@ out:
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int copy_io(struct task_struct *tsk)
|
static int copy_io(unsigned long clone_flags, struct task_struct *tsk)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_BLOCK
|
#ifdef CONFIG_BLOCK
|
||||||
struct io_context *ioc = current->io_context;
|
struct io_context *ioc = current->io_context;
|
||||||
|
|
||||||
if (!ioc)
|
if (!ioc)
|
||||||
return 0;
|
return 0;
|
||||||
|
/*
|
||||||
if (ioprio_valid(ioc->ioprio)) {
|
* Share io context with parent, if CLONE_IO is set
|
||||||
|
*/
|
||||||
|
if (clone_flags & CLONE_IO) {
|
||||||
|
tsk->io_context = ioc_task_link(ioc);
|
||||||
|
if (unlikely(!tsk->io_context))
|
||||||
|
return -ENOMEM;
|
||||||
|
} else if (ioprio_valid(ioc->ioprio)) {
|
||||||
tsk->io_context = alloc_io_context(GFP_KERNEL, -1);
|
tsk->io_context = alloc_io_context(GFP_KERNEL, -1);
|
||||||
if (unlikely(!tsk->io_context))
|
if (unlikely(!tsk->io_context))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -1176,7 +1182,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
|
||||||
goto bad_fork_cleanup_mm;
|
goto bad_fork_cleanup_mm;
|
||||||
if ((retval = copy_namespaces(clone_flags, p)))
|
if ((retval = copy_namespaces(clone_flags, p)))
|
||||||
goto bad_fork_cleanup_keys;
|
goto bad_fork_cleanup_keys;
|
||||||
if ((retval = copy_io(p)))
|
if ((retval = copy_io(clone_flags, p)))
|
||||||
goto bad_fork_cleanup_namespaces;
|
goto bad_fork_cleanup_namespaces;
|
||||||
retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs);
|
retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs);
|
||||||
if (retval)
|
if (retval)
|
||||||
|
|
Loading…
Add table
Reference in a new issue