Add enum umcg_kick_flags: @UMCG_KICK_RESCHED: reschedule the task; used for worker preemption @UMCG_KICK_TTWU: wake the task; used to wake servers. It is sometimes useful to wake UMCG servers from the userspace, for example when a server detects a worker wakeup and wakes an idle server to run the newly woken worker. Signed-off-by: Peter Oskolkov <posk@xxxxxxxxxx> --- include/uapi/linux/umcg.h | 10 ++++++++++ kernel/sched/umcg.c | 7 +++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/include/uapi/linux/umcg.h b/include/uapi/linux/umcg.h index 93fccb44283b..a29e5e91a251 100644 --- a/include/uapi/linux/umcg.h +++ b/include/uapi/linux/umcg.h @@ -148,4 +148,14 @@ enum umcg_ctl_flag { UMCG_CTL_WORKER = 0x10000, }; +/** + * enum umcg_kick_flag - flags to pass to sys_umcg_kick + * @UMCG_KICK_RESCHED: reschedule the task; used for worker preemption + * @UMCG_KICK_TTWU: wake the task; used to wake servers + */ +enum umcg_kick_flag { + UMCG_KICK_RESCHED = 0x001, + UMCG_KICK_TTWU = 0x002, +}; + #endif /* _UAPI_LINUX_UMCG_H */ diff --git a/kernel/sched/umcg.c b/kernel/sched/umcg.c index b85dec6b82e4..e33ec9eddc3e 100644 --- a/kernel/sched/umcg.c +++ b/kernel/sched/umcg.c @@ -669,12 +669,15 @@ SYSCALL_DEFINE2(umcg_kick, u32, flags, pid_t, tid) if (!task) return -ESRCH; - if (flags) + if (flags != UMCG_KICK_RESCHED && flags != UMCG_KICK_TTWU) return -EINVAL; #ifdef CONFIG_SMP - smp_send_reschedule(task_cpu(task)); + if (flags == UMCG_KICK_RESCHED) + smp_send_reschedule(task_cpu(task)); #endif + if (flags == UMCG_KICK_TTWU) + try_to_wake_up(task, TASK_NORMAL, 0); return 0; } -- 2.34.1.703.g22d0c6ccf7-goog