From: Philippe Gerum <r...@xenomai.org>

Since we are dealing with pipeline specific code, we may flatten the
call stack by using the Dovetail API directly.

Signed-off-by: Philippe Gerum <r...@xenomai.org>
Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>
---
 .../kernel/dovetail/pipeline/pipeline.h       | 43 +------------------
 kernel/cobalt/dovetail/sched.c                |  8 ++++
 kernel/cobalt/dovetail/tick.c                 | 26 ++++++-----
 3 files changed, 26 insertions(+), 51 deletions(-)

diff --git a/include/cobalt/kernel/dovetail/pipeline/pipeline.h 
b/include/cobalt/kernel/dovetail/pipeline/pipeline.h
index bbd45d13b3..3cc7268d00 100644
--- a/include/cobalt/kernel/dovetail/pipeline/pipeline.h
+++ b/include/cobalt/kernel/dovetail/pipeline/pipeline.h
@@ -12,8 +12,6 @@
 
 typedef unsigned long spl_t;
 
-void xnintr_core_clock_handler(void);
-
 /*
  * We only keep the LSB when testing in SMP mode in order to strip off
  * the recursion marker (0x2) the nklock may store there.
@@ -33,19 +31,13 @@ void xnintr_core_clock_handler(void);
 
 #ifdef CONFIG_SMP
 
-static irqreturn_t reschedule_interrupt_handler(int irq, void *dev_id)
-{
-
-       /* Will reschedule from irq_exit_pipeline. */
-
-       return IRQ_HANDLED;
-}
+irqreturn_t pipeline_reschedule_ipi_handler(int irq, void *dev_id);
 
 static inline int pipeline_request_resched_ipi(void (*handler)(void))
 {
        /* Trap the out-of-band rescheduling interrupt. */
        return __request_percpu_irq(RESCHEDULE_OOB_IPI,
-                       reschedule_interrupt_handler,
+                       pipeline_reschedule_ipi_handler,
                        IRQF_OOB,
                        "Xenomai reschedule",
                        &cobalt_machine_cpudata);
@@ -66,28 +58,6 @@ static inline void pipeline_send_resched_ipi(const struct 
cpumask *dest)
        irq_send_oob_ipi(RESCHEDULE_OOB_IPI, dest);
 }
 
-static irqreturn_t timer_ipi_interrupt_handler(int irq, void *dev_id)
-{
-       xnintr_core_clock_handler();
-
-       return IRQ_HANDLED;
-}
-
-static inline int pipeline_request_timer_ipi(void (*handler)(void))
-{
-       /* Trap the out-of-band timer interrupt. */
-       return __request_percpu_irq(TIMER_OOB_IPI,
-                       timer_ipi_interrupt_handler,
-                       IRQF_OOB, "Xenomai timer IPI",
-                       &cobalt_machine_cpudata);
-}
-
-static inline void pipeline_free_timer_ipi(void)
-{
-       /* Release the out-of-band timer interrupt. */
-       free_percpu_irq(TIMER_OOB_IPI, &cobalt_machine_cpudata);
-}
-
 static inline void pipeline_send_timer_ipi(const struct cpumask *dest)
 {
        /*
@@ -108,15 +78,6 @@ 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/kernel/cobalt/dovetail/sched.c b/kernel/cobalt/dovetail/sched.c
index 82e29136ca..de7c43b70c 100644
--- a/kernel/cobalt/dovetail/sched.c
+++ b/kernel/cobalt/dovetail/sched.c
@@ -75,3 +75,11 @@ void pipeline_clear_mayday(void) /* May solely affect 
current. */
 {
        clear_thread_flag(TIF_MAYDAY);
 }
+
+irqreturn_t pipeline_reschedule_ipi_handler(int irq, void *dev_id)
+{
+
+       /* Will reschedule from irq_exit_pipeline(). */
+
+       return IRQ_HANDLED;
+}
diff --git a/kernel/cobalt/dovetail/tick.c b/kernel/cobalt/dovetail/tick.c
index 502ec27b22..81eaab84a8 100644
--- a/kernel/cobalt/dovetail/tick.c
+++ b/kernel/cobalt/dovetail/tick.c
@@ -79,12 +79,7 @@ static int proxy_set_next_ktime(ktime_t expires,
        return ret ? -ETIME : 0;
 }
 
-void xn_core_tick(struct clock_event_device *dummy) /* hard irqs off */
-{
-       xnintr_core_clock_handler();
-}
-
-inline bool pipeline_must_force_program_tick(struct xnsched *sched)
+bool pipeline_must_force_program_tick(struct xnsched *sched)
 {
        return sched->lflags & XNTSTOP;
 }
@@ -126,7 +121,8 @@ static void setup_proxy(struct clock_proxy_device *dev)
 {
        struct clock_event_device *proxy_dev = &dev->proxy_device;
 
-       dev->handle_oob_event = xn_core_tick;
+       dev->handle_oob_event = (typeof(dev->handle_oob_event))
+               xnintr_core_clock_handler;
        proxy_dev->features |= CLOCK_EVT_FEAT_KTIME;
        proxy_dev->set_next_ktime = proxy_set_next_ktime;
        if (proxy_dev->set_state_oneshot_stopped)
@@ -134,11 +130,21 @@ static void setup_proxy(struct clock_proxy_device *dev)
        __this_cpu_write(proxy_device, dev);
 }
 
+static irqreturn_t tick_ipi_handler(int irq, void *dev_id)
+{
+       xnintr_core_clock_handler();
+
+       return IRQ_HANDLED;
+}
+
 int pipeline_install_tick_proxy(void)
 {
        int ret;
 
-       ret = pipeline_request_timer_ipi(xnintr_core_clock_handler);
+       ret = __request_percpu_irq(TIMER_OOB_IPI,
+                               tick_ipi_handler,
+                               IRQF_OOB, "Xenomai timer IPI",
+                               &cobalt_machine_cpudata);
        if (ret)
                return ret;
 
@@ -150,7 +156,7 @@ int pipeline_install_tick_proxy(void)
        return 0;
 
 fail_proxy:
-       pipeline_free_timer_ipi();
+       free_percpu_irq(TIMER_OOB_IPI, &cobalt_machine_cpudata);
 
        return ret;
 }
@@ -160,5 +166,5 @@ void pipeline_uninstall_tick_proxy(void)
        /* Uninstall the proxy tick device. */
        tick_uninstall_proxy(&xnsched_realtime_cpus);
 
-       pipeline_free_timer_ipi();
+       free_percpu_irq(TIMER_OOB_IPI, &cobalt_machine_cpudata);
 }
-- 
2.26.2


Reply via email to