From c851b189c591fb9a07697e7efa17a482acb5e389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Fri, 4 Feb 2022 16:12:48 +0100 Subject: [PATCH] lx_emul: add wake_q_add/wake_up_q in shadow impl. The function within this commit were taken verbatim from the original Linux implementation. Ref genodelabs/genode#4411 --- .../lib/lx_emul/shadow/kernel/sched/core.c | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/repos/dde_linux/src/lib/lx_emul/shadow/kernel/sched/core.c b/repos/dde_linux/src/lib/lx_emul/shadow/kernel/sched/core.c index 6f2627f651..933b1fdf54 100644 --- a/repos/dde_linux/src/lib/lx_emul/shadow/kernel/sched/core.c +++ b/repos/dde_linux/src/lib/lx_emul/shadow/kernel/sched/core.c @@ -214,3 +214,41 @@ int get_nohz_timer_target(void) #endif #endif + + +static bool __wake_q_add(struct wake_q_head *head, struct task_struct *task) +{ + struct wake_q_node *node = &task->wake_q; + + smp_mb__before_atomic(); + if (unlikely(cmpxchg_relaxed(&node->next, NULL, WAKE_Q_TAIL))) + return false; + + *head->lastp = node; + head->lastp = &node->next; + return true; +} + + +void wake_q_add(struct wake_q_head *head, struct task_struct *task) +{ + if (__wake_q_add(head, task)) + get_task_struct(task); +} + + +void wake_up_q(struct wake_q_head *head) +{ + struct wake_q_node *node = head->first; + + while (node != WAKE_Q_TAIL) { + struct task_struct *task; + + task = container_of(node, struct task_struct, wake_q); + node = node->next; + task->wake_q.next = NULL; + + wake_up_process(task); + put_task_struct(task); + } +}