syscall_user_dispatch: Split up set_syscall_user_dispatch()
authorGregory Price <gourry.memverge@gmail.com>
Fri, 7 Apr 2023 17:18:31 +0000 (13:18 -0400)
committerThomas Gleixner <tglx@linutronix.de>
Sun, 16 Apr 2023 12:23:07 +0000 (14:23 +0200)
syscall user dispatch configuration is not covered by checkpoint/restore.

To prepare for ptrace access to the syscall user dispatch configuration,
move the inner working of set_syscall_user_dispatch() into a helper
function. Make the helper function task pointer based and let
set_syscall_user_dispatch() invoke it with task=current.

No functional change.

Signed-off-by: Gregory Price <gregory.price@memverge.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Oleg Nesterov <oleg@redhat.com>
Link: https://lore.kernel.org/r/20230407171834.3558-2-gregory.price@memverge.com
kernel/entry/syscall_user_dispatch.c

index 0b6379adff6bdd4327ace5ae7029cfd24369e825..22396b234854560c33996b24dec39c2c6d5d26f9 100644 (file)
@@ -68,8 +68,9 @@ bool syscall_user_dispatch(struct pt_regs *regs)
        return true;
 }
 
-int set_syscall_user_dispatch(unsigned long mode, unsigned long offset,
-                             unsigned long len, char __user *selector)
+static int task_set_syscall_user_dispatch(struct task_struct *task, unsigned long mode,
+                                         unsigned long offset, unsigned long len,
+                                         char __user *selector)
 {
        switch (mode) {
        case PR_SYS_DISPATCH_OFF:
@@ -94,15 +95,21 @@ int set_syscall_user_dispatch(unsigned long mode, unsigned long offset,
                return -EINVAL;
        }
 
-       current->syscall_dispatch.selector = selector;
-       current->syscall_dispatch.offset = offset;
-       current->syscall_dispatch.len = len;
-       current->syscall_dispatch.on_dispatch = false;
+       task->syscall_dispatch.selector = selector;
+       task->syscall_dispatch.offset = offset;
+       task->syscall_dispatch.len = len;
+       task->syscall_dispatch.on_dispatch = false;
 
        if (mode == PR_SYS_DISPATCH_ON)
-               set_syscall_work(SYSCALL_USER_DISPATCH);
+               set_task_syscall_work(task, SYSCALL_USER_DISPATCH);
        else
-               clear_syscall_work(SYSCALL_USER_DISPATCH);
+               clear_task_syscall_work(task, SYSCALL_USER_DISPATCH);
 
        return 0;
 }
+
+int set_syscall_user_dispatch(unsigned long mode, unsigned long offset,
+                             unsigned long len, char __user *selector)
+{
+       return task_set_syscall_user_dispatch(current, mode, offset, len, selector);
+}