From: Philippe Gerum <[email protected]>

Since the low-level tick management code is pipeline specific, we may
flatten the call stack by using the underlying pipeline API directly.

At this chance, fix a uniprocessor build issue with IPIs.

Signed-off-by: Philippe Gerum <[email protected]>
---
 .../kernel/dovetail/pipeline/pipeline.h       | 23 ++++++++++++++++++-
 .../cobalt/kernel/ipipe/pipeline/pipeline.h   | 20 ++++++++--------
 include/cobalt/kernel/timer.h                 | 11 ---------
 kernel/cobalt/ipipe/tick.c                    | 11 ++++++---
 kernel/cobalt/sched.c                         |  4 ----
 kernel/cobalt/timer.c                         | 10 --------
 6 files changed, 39 insertions(+), 40 deletions(-)

diff --git a/include/cobalt/kernel/dovetail/pipeline/pipeline.h 
b/include/cobalt/kernel/dovetail/pipeline/pipeline.h
index 4b8f6b259..a2e025e35 100644
--- a/include/cobalt/kernel/dovetail/pipeline/pipeline.h
+++ b/include/cobalt/kernel/dovetail/pipeline/pipeline.h
@@ -74,7 +74,28 @@ static inline void pipeline_send_timer_ipi(const struct 
cpumask *dest)
        TODO();
 }
 
-#endif
+#else  /* !CONFIG_SMP */
+
+static inline int pipeline_request_resched_ipi(void (*handler)(void))
+{
+       return 0;
+}
+
+
+static inline void pipeline_free_resched_ipi(void)
+{
+}
+
+static inline int pipeline_request_timer_ipi(void (*handler)(void))
+{
+       return 0;
+}
+
+static inline void pipeline_free_timer_ipi(void)
+{
+}
+
+#endif /* CONFIG_SMP */
 
 static inline void pipeline_prepare_panic(void)
 {
diff --git a/include/cobalt/kernel/ipipe/pipeline/pipeline.h 
b/include/cobalt/kernel/ipipe/pipeline/pipeline.h
index fb0465fb2..ceba7e3b0 100644
--- a/include/cobalt/kernel/ipipe/pipeline/pipeline.h
+++ b/include/cobalt/kernel/ipipe/pipeline/pipeline.h
@@ -51,26 +51,24 @@ static inline void pipeline_send_resched_ipi(const struct 
cpumask *dest)
        ipipe_send_ipi(IPIPE_RESCHEDULE_IPI, *dest);
 }
 
-static inline int pipeline_request_timer_ipi(void (*handler)(void))
+static inline void pipeline_send_timer_ipi(const struct cpumask *dest)
 {
-       return ipipe_request_irq(&cobalt_pipeline.domain,
-                               IPIPE_HRTIMER_IPI,
-                               (ipipe_irq_handler_t)handler,
-                               NULL, NULL);
+       ipipe_send_ipi(IPIPE_HRTIMER_IPI, *dest);
 }
 
-static inline void pipeline_free_timer_ipi(void)
+#else  /* !CONFIG_SMP */
+
+static inline int pipeline_request_resched_ipi(void (*handler)(void))
 {
-       return ipipe_free_irq(&cobalt_pipeline.domain,
-                       IPIPE_HRTIMER_IPI);
+       return 0;
 }
 
-static inline void pipeline_send_timer_ipi(const struct cpumask *dest)
+
+static inline void pipeline_free_resched_ipi(void)
 {
-       ipipe_send_ipi(IPIPE_HRTIMER_IPI, *dest);
 }
 
-#endif
+#endif /* CONFIG_SMP */
 
 static inline void pipeline_prepare_panic(void)
 {
diff --git a/include/cobalt/kernel/timer.h b/include/cobalt/kernel/timer.h
index 691be7a3b..703a13506 100644
--- a/include/cobalt/kernel/timer.h
+++ b/include/cobalt/kernel/timer.h
@@ -517,10 +517,6 @@ void xntimer_migrate(struct xntimer *timer, struct xnsched 
*sched)
                __xntimer_migrate(timer, sched);
 }
 
-int xntimer_setup_ipi(void);
-
-void xntimer_release_ipi(void);
-
 void __xntimer_set_affinity(struct xntimer *timer,
                            struct xnsched *sched);
 
@@ -539,13 +535,6 @@ static inline void xntimer_migrate(struct xntimer *timer,
        timer->sched = sched;
 }
 
-static inline int xntimer_setup_ipi(void)
-{
-       return 0;
-}
-
-static inline void xntimer_release_ipi(void) { }
-
 static inline void xntimer_set_affinity(struct xntimer *timer,
                                        struct xnsched *sched)
 {
diff --git a/kernel/cobalt/ipipe/tick.c b/kernel/cobalt/ipipe/tick.c
index da1563a66..b80e56dc7 100644
--- a/kernel/cobalt/ipipe/tick.c
+++ b/kernel/cobalt/ipipe/tick.c
@@ -187,7 +187,10 @@ int pipeline_install_tick_proxy(void)
        nkclock.wallclock_offset =
                ktime_to_ns(ktime_get_real()) - 
xnclock_read_monotonic(&nkclock);
 
-       ret = xntimer_setup_ipi();
+       ret = ipipe_request_irq(&cobalt_pipeline.domain,
+                               IPIPE_HRTIMER_IPI,
+                               (ipipe_irq_handler_t)xnintr_core_clock_handler,
+                               NULL, NULL);
        if (ret)
                return ret;
 
@@ -244,7 +247,8 @@ fail:
                ipipe_timer_stop(_cpu);
        }
 
-       xntimer_release_ipi();
+       ipipe_free_irq(&cobalt_pipeline.domain,
+                      IPIPE_HRTIMER_IPI);
 
        return ret;
 }
@@ -270,7 +274,8 @@ void pipeline_uninstall_tick_proxy(void)
        for_each_realtime_cpu(cpu)
                ipipe_timer_stop(cpu);
 
-       xntimer_release_ipi();
+       ipipe_free_irq(&cobalt_pipeline.domain,
+                      IPIPE_HRTIMER_IPI);
 
 #ifdef CONFIG_XENO_OPT_STATS_IRQS
        xnintr_destroy(&nktimer);
diff --git a/kernel/cobalt/sched.c b/kernel/cobalt/sched.c
index 8a5621642..7873fd652 100644
--- a/kernel/cobalt/sched.c
+++ b/kernel/cobalt/sched.c
@@ -235,9 +235,7 @@ void xnsched_init_all(void)
                xnsched_init(sched, cpu);
        }
 
-#ifdef CONFIG_SMP
        pipeline_request_resched_ipi(__xnsched_run_handler);
-#endif
 }
 
 static void xnsched_destroy(struct xnsched *sched)
@@ -258,9 +256,7 @@ void xnsched_destroy_all(void)
        int cpu;
        spl_t s;
 
-#ifdef CONFIG_SMP
        pipeline_free_resched_ipi();
-#endif
 
        xnlock_get_irqsave(&nklock, s);
 
diff --git a/kernel/cobalt/timer.c b/kernel/cobalt/timer.c
index 7f5033c87..f9aa457ce 100644
--- a/kernel/cobalt/timer.c
+++ b/kernel/cobalt/timer.c
@@ -574,16 +574,6 @@ void __xntimer_set_affinity(struct xntimer *timer, struct 
xnsched *sched)
 }
 EXPORT_SYMBOL_GPL(__xntimer_set_affinity);
 
-int xntimer_setup_ipi(void)
-{
-       return pipeline_request_timer_ipi(xnintr_core_clock_handler);
-}
-
-void xntimer_release_ipi(void)
-{
-       pipeline_free_timer_ipi();
-}
-
 #endif /* CONFIG_SMP */
 
 /**
-- 
2.26.2


Reply via email to