On 2025-02-24 08:28, Gabriele Monaco wrote:
[...]
diff --git a/kernel/rseq.c b/kernel/rseq.c
index 2cb16091ec0ae..936863fe7eb37 100644
--- a/kernel/rseq.c
+++ b/kernel/rseq.c
@@ -419,6 +419,7 @@ void __rseq_handle_notify_resume(struct ksignal *ksig, struct pt_regs *regs)
}
if (unlikely(rseq_update_cpu_node_id(t)))
goto error;
+ task_queue_mm_cid(t);
Given that task_queue_mm_cid() will be called quite frequently from
__rseq_handle_notify_resume, perhaps it would be best to move at least
the portion responsible for checks (including the time_before()) to
include/linux/sched.h to eliminate a function call from the fast path.
return;
error:
[...]
-void task_tick_mm_cid(struct rq *rq, struct task_struct *curr)
+void task_queue_mm_cid(struct task_struct *curr)
{
- struct callback_head *work = &curr->cid_work;
+ struct work_struct *work = &curr->mm->cid_work;
unsigned long now = jiffies;
- if (!curr->mm || (curr->flags & (PF_EXITING | PF_KTHREAD)) ||
- work->next != work)
+ if (!curr->mm || (curr->flags & (PF_EXITING | PF_KTHREAD)))
return;
if (time_before(now, READ_ONCE(curr->mm->mm_cid_next_scan)))
return;
- /* No page allocation under rq lock */
- task_work_add(curr, work, TWA_RESUME);
+ /* Ensure the mm exists when we run. */
+ mmgrab(curr->mm);
+ queue_work(system_unbound_wq, work);
}
Thanks,
Mathieu
--
Mathieu Desnoyers
EfficiOS Inc.
https://www.efficios.com