[PATCH] um: add RCU syscall hack for time-travel

Benjamin Berg benjamin at sipsolutions.net
Fri Aug 30 08:38:25 PDT 2024


From: Benjamin Berg <benjamin.berg at intel.com>

In time-travel mode userspace can do a lot of work without any time
passing. Unfortunately, this can result in OOM situations as the RCU
core code will never be run.

Work around that by kicking the RCU using rcu_sched_clock_irq. So
behave to the RCU code as if a clock tick happened every syscall.

Signed-off-by: Benjamin Berg <benjamin.berg at intel.com>

---

This patch is on top of "um: fix time-travel syscall scheduling hack"
---
 arch/um/kernel/skas/syscall.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/arch/um/kernel/skas/syscall.c b/arch/um/kernel/skas/syscall.c
index b09e85279d2b..4b4ab8bf8a0c 100644
--- a/arch/um/kernel/skas/syscall.c
+++ b/arch/um/kernel/skas/syscall.c
@@ -19,6 +19,21 @@ void handle_syscall(struct uml_pt_regs *r)
 	struct pt_regs *regs = container_of(r, struct pt_regs, regs);
 	int syscall;
 
+	/*
+	 * This is a "bit" of a hack. But in time-travel mode userspace can do
+	 * a lot of work without any time passing. Unfortunately, this can
+	 * result in OOM situations as the RCU core code will never be run.
+	 *
+	 * Work around that by kicking the RCU using rcu_sched_clock_irq. So
+	 * behave to the RCU code as if a clock tick happened every syscall.
+	 */
+	if (time_travel_mode == TT_MODE_INFCPU ||
+	    time_travel_mode == TT_MODE_EXTERNAL) {
+		local_irq_disable();
+		rcu_sched_clock_irq(1);
+		local_irq_enable();
+	}
+
 	/* Initialize the syscall number and default return value. */
 	UPT_SYSCALL_NR(r) = PT_SYSCALL_NR(r->gp);
 	PT_REGS_SET_SYSCALL_RETURN(regs, -ENOSYS);
-- 
2.46.0




More information about the linux-um mailing list