From aa219008b5907e7c27db183ca3e6ca9248d335a3 Mon Sep 17 00:00:00 2001
From: Armin Luntzer <armin.luntzer@univie.ac.at>
Date: Tue, 12 Nov 2019 11:12:37 +0100
Subject: [PATCH] CLOCKEVENT: disable scheduling when checking clock device and
 keep             interrupts enabled

---
 kernel/clockevent.c | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/kernel/clockevent.c b/kernel/clockevent.c
index 2ba32ee..a1f1475 100644
--- a/kernel/clockevent.c
+++ b/kernel/clockevent.c
@@ -15,6 +15,7 @@
 #include <kernel/clockevent.h>
 #include <kernel/export.h>
 #include <kernel/tick.h>
+#include <kernel/sched.h>
 #include <errno.h>
 
 
@@ -242,9 +243,16 @@ void clockevents_register_device(struct clock_event_device *dev)
 	spin_lock(&clockevents_spinlock);
 	list_add_tail(&dev->node, &clockevent_devices);
 
-	arch_local_irq_disable();
+	/* this should be safe without disabling interrupts, if not,
+	 * we need a different strategy to calibrate the tick period of the
+	 * device...
+	 *
+	 * XXX need long-time run-time testing for verifcation
+	 */
+
+	sched_disable();
 	tick_check_device(dev);
-	arch_local_irq_enable();
+	sched_enable();
 
 	spin_unlock(&clockevents_spinlock);
 }
@@ -266,9 +274,16 @@ int clockevents_offer_device(void)
 		if (dev->state != CLOCK_EVT_STATE_UNUSED)
 			continue;
 
-		arch_local_irq_disable();
+		/* this should be save without disabling interrupts, if not,
+		 * we need a different strategy to calibrate the tick period of
+		 * the device...
+		 *
+		 * XXX need long-time run-time testing for verifcation
+		 */
+
+		sched_disable();
 		tick_check_device(dev);
-		arch_local_irq_enable();
+		sched_enable();
 
 		return 0;
 	}
-- 
GitLab