Module: xenomai-3
Branch: next
Commit: bc761d8cf25c21944620a2f6f0d67c1b8fce9bed
URL:    
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=bc761d8cf25c21944620a2f6f0d67c1b8fce9bed

Author: Philippe Gerum <r...@xenomai.org>
Date:   Thu Feb  5 13:22:24 2015 +0100

cobalt/kernel: distinguish u/k/i latencies in Kconfig

---

 kernel/cobalt/Kconfig                              |   60 +++++++++++++++-----
 .../arch/arm/include/asm/xenomai/calibration.h     |   30 +++++-----
 .../blackfin/include/asm/xenomai/calibration.h     |   12 ++--
 .../arch/nios2/include/asm/xenomai/calibration.h   |   13 ++---
 .../arch/powerpc/include/asm/xenomai/calibration.h |   12 ++--
 .../arch/sh/include/asm/xenomai/calibration.h      |   11 ++--
 .../arch/x86/include/asm/xenomai/calibration.h     |   18 +++---
 kernel/cobalt/clock.c                              |   10 ++--
 8 files changed, 102 insertions(+), 64 deletions(-)

diff --git a/kernel/cobalt/Kconfig b/kernel/cobalt/Kconfig
index 2e49d37..9c754f5 100644
--- a/kernel/cobalt/Kconfig
+++ b/kernel/cobalt/Kconfig
@@ -173,19 +173,6 @@ config XENO_OPT_AUTOTUNE
        adjusting the core timing services to the intrinsic latency of
        the platform.
 
-config XENO_OPT_TIMING_SCHEDLAT
-       int "Scheduling latency (ns)"
-       default 0
-       help
-       Scheduling latency is the time between the termination of an
-       interrupt handler and the execution of the first instruction
-       of the real-time thread this handler resumes. A default value
-       of 0 (recommended) will cause a pre-calibrated value to be
-       used.
-
-       If the auto-tuner is enabled, this value will be used as the
-       factory default when running "autotune --reset".
-
 config XENO_OPT_SCALABLE_SCHED
        bool "O(1) scheduler"
        help
@@ -344,6 +331,53 @@ config XENO_OPT_DEBUG_TRACE_LOGSZ
 
 endmenu
 
+menu "Latency settings"
+
+config XENO_OPT_TIMING_SCHEDLAT
+       int "User scheduling latency (ns)"
+       default 0
+       help
+       The user scheduling latency is the time between the
+       termination of an interrupt handler and the execution of the
+       first instruction of the real-time application thread this
+       handler resumes. A default value of 0 (recommended) will cause
+       a pre-calibrated value to be used.
+
+       If the auto-tuner is enabled, this value will be used as the
+       factory default when running "autotune --reset".
+
+config XENO_OPT_TIMING_KSCHEDLAT
+       int "Intra-kernel scheduling latency (ns)"
+       default 0
+       help
+       The intra-kernel scheduling latency is the time between the
+       termination of an interrupt handler and the execution of the
+       first instruction of the RTDM kernel thread this handler
+       resumes. A default value of 0 (recommended) will cause a
+       pre-calibrated value to be used.
+
+       Intra-kernel latency is usually significantly lower than user
+       scheduling latency on MMU-enabled platforms, due to CPU cache
+       latency.
+
+       If the auto-tuner is enabled, this value will be used as the
+       factory default when running "autotune --reset".
+
+config XENO_OPT_TIMING_IRQLAT
+       int "Interrupt latency (ns)"
+       default 0
+       help
+
+       The interrupt latency is the time between the occurrence of an
+       IRQ and the first instruction of the interrupt handler which
+       will service it. A default value of 0 (recommended) will cause
+       a pre-calibrated value to be used.
+
+       If the auto-tuner is enabled, this value will be used as the
+       factory default when running "autotune --reset".
+
+endmenu
+
 menuconfig XENO_OPT_DEBUG
        depends on XENO_OPT_VFILE
        bool "Debug support"
diff --git a/kernel/cobalt/arch/arm/include/asm/xenomai/calibration.h 
b/kernel/cobalt/arch/arm/include/asm/xenomai/calibration.h
index 6f8f3bf..82ff68d 100644
--- a/kernel/cobalt/arch/arm/include/asm/xenomai/calibration.h
+++ b/kernel/cobalt/arch/arm/include/asm/xenomai/calibration.h
@@ -22,30 +22,34 @@
 #ifndef _COBALT_ARM_ASM_CALIBRATION_H
 #define _COBALT_ARM_ASM_CALIBRATION_H
 
-extern unsigned omap_rev(void);
+unsigned int omap_rev(void);
 #define cpu_is_omap44xx() ((omap_rev() & 0xff) == 0x44)
 
-static inline unsigned long xnarch_get_sched_latency (void)
+static inline void xnarch_get_latencies(struct xnclock_gravity *p)
 {
+       unsigned int ulat;
 #if CONFIG_XENO_OPT_TIMING_SCHEDLAT != 0
-       return CONFIG_XENO_OPT_TIMING_SCHEDLAT;
-#else
-#if defined(CONFIG_ARCH_AT91RM9200)
-       return 8500;
+       ulat = CONFIG_XENO_OPT_TIMING_SCHEDLAT;
+#elif defined(CONFIG_ARCH_AT91RM9200)
+       ulat = 8500;
 #elif defined(CONFIG_ARCH_AT91SAM9263)
-       return 11000;
+       ulat = 11000;
+#elif defined(CONFIG_SOC_IMX6Q)
+       ulat = 6000;
 #elif defined(CONFIG_ARCH_MX51)
-       return 5000;
+       ulat = 5000;
 #elif defined(CONFIG_ARCH_MX53)
-       return 5000;
+       ulat = 5000;
 #elif defined(CONFIG_ARCH_MX6)
-       return 2000;
+       ulat = 2000;
 #elif defined(CONFIG_ARCH_OMAP)
-       return cpu_is_omap44xx() ? 2500 : 5000;
+       ulat = cpu_is_omap44xx() ? 2500 : 5000;
 #else
-       return 9500;    /* XXX sane ? */
-#endif
+       ulat = 9500;    /* XXX sane? */
 #endif
+       p->user = xnclock_ns_to_ticks(&nkclock, ulat);
+       p->kernel = xnclock_ns_to_ticks(&nkclock, 
CONFIG_XENO_OPT_TIMING_KSCHEDLAT);
+       p->irq = xnclock_ns_to_ticks(&nkclock, CONFIG_XENO_OPT_TIMING_IRQLAT);
 }
 
 #endif /* !_COBALT_ARM_ASM_CALIBRATION_H */
diff --git a/kernel/cobalt/arch/blackfin/include/asm/xenomai/calibration.h 
b/kernel/cobalt/arch/blackfin/include/asm/xenomai/calibration.h
index b1f6464..08895e8 100644
--- a/kernel/cobalt/arch/blackfin/include/asm/xenomai/calibration.h
+++ b/kernel/cobalt/arch/blackfin/include/asm/xenomai/calibration.h
@@ -19,13 +19,11 @@
 #ifndef _COBALT_BLACKFIN_ASM_CALIBRATION_H
 #define _COBALT_BLACKFIN_ASM_CALIBRATION_H
 
-static inline unsigned long xnarch_get_sched_latency (void)
-
+static inline void xnarch_get_latencies(struct xnclock_gravity *p)
 {
 #if CONFIG_XENO_OPT_TIMING_SCHEDLAT != 0
 #define __sched_latency CONFIG_XENO_OPT_TIMING_SCHEDLAT
-#else
-#ifdef CONFIG_BF533
+#elif defined(CONFIG_BF533)
 #define __sched_latency 5000
 #elif defined(CONFIG_BF537)
 #define __sched_latency 4800
@@ -48,9 +46,9 @@ static inline unsigned long xnarch_get_sched_latency (void)
 #else
 #error "unsupported Blackfin processor"
 #endif
-#endif /* CONFIG_XENO_OPT_TIMING_SCHEDLAT */
-
-    return __sched_latency;
+       p->user = __sched_latency;
+       p->kernel = CONFIG_XENO_OPT_TIMING_KSCHEDLAT;
+       p->irq = CONFIG_XENO_OPT_TIMING_IRQLAT;
 }
 
 #undef __sched_latency
diff --git a/kernel/cobalt/arch/nios2/include/asm/xenomai/calibration.h 
b/kernel/cobalt/arch/nios2/include/asm/xenomai/calibration.h
index 0366754..36cc2a5 100644
--- a/kernel/cobalt/arch/nios2/include/asm/xenomai/calibration.h
+++ b/kernel/cobalt/arch/nios2/include/asm/xenomai/calibration.h
@@ -19,21 +19,20 @@
 #ifndef _COBALT_NIOS2_ASM_CALIBRATION_H
 #define _COBALT_NIOS2_ASM_CALIBRATION_H
 
-static inline unsigned long xnarch_get_sched_latency (void)
+static inline void xnarch_get_latencies(struct xnclock_gravity *p)
 {
 #if CONFIG_XENO_OPT_TIMING_SCHEDLAT != 0
 #define __sched_latency CONFIG_XENO_OPT_TIMING_SCHEDLAT
-#else
-#ifdef CONFIG_ALTERA_DE2
+#elif defined(CONFIG_ALTERA_DE2)
 #define __sched_latency  10000
-#elif CONFIG_NEEK
+#elif defined(CONFIG_NEEK)
 #define __sched_latency  10000
 #else
 #error "unsupported NIOS2 platform"
 #endif
-#endif /* CONFIG_XENO_OPT_TIMING_SCHEDLAT */
-
-    return __sched_latency;
+       p->user = __sched_latency;
+       p->kernel = CONFIG_XENO_OPT_TIMING_KSCHEDLAT;
+       p->irq = CONFIG_XENO_OPT_TIMING_IRQLAT;
 }
 
 #undef __sched_latency
diff --git a/kernel/cobalt/arch/powerpc/include/asm/xenomai/calibration.h 
b/kernel/cobalt/arch/powerpc/include/asm/xenomai/calibration.h
index b801759..e849e41 100644
--- a/kernel/cobalt/arch/powerpc/include/asm/xenomai/calibration.h
+++ b/kernel/cobalt/arch/powerpc/include/asm/xenomai/calibration.h
@@ -22,12 +22,11 @@
 #ifndef _COBALT_POWERPC_ASM_CALIBRATION_H
 #define _COBALT_POWERPC_ASM_CALIBRATION_H
 
-static inline unsigned long xnarch_get_sched_latency(void)
+static inline void xnarch_get_latencies(struct xnclock_gravity *p)
 {
 #if CONFIG_XENO_OPT_TIMING_SCHEDLAT != 0
 #define __sched_latency CONFIG_XENO_OPT_TIMING_SCHEDLAT
-#else
-#if defined(CONFIG_PPC_PASEMI)
+#elif defined(CONFIG_PPC_PASEMI)
 #define __sched_latency 1000
 #elif defined(CONFIG_WALNUT)
 #define __sched_latency 11000
@@ -99,10 +98,9 @@ static inline unsigned long xnarch_get_sched_latency(void)
 #define __sched_latency 4000
 #endif
 #endif
-
-#endif /* CONFIG_XENO_OPT_TIMING_SCHEDLAT */
-
-       return __sched_latency;
+       p->user = xnclock_ns_to_ticks(&nkclock, __sched_latency);
+       p->kernel = xnclock_ns_to_ticks(&nkclock, 
CONFIG_XENO_OPT_TIMING_KSCHEDLAT);
+       p->irq = xnclock_ns_to_ticks(&nkclock, CONFIG_XENO_OPT_TIMING_IRQLAT);
 }
 
 #undef __sched_latency
diff --git a/kernel/cobalt/arch/sh/include/asm/xenomai/calibration.h 
b/kernel/cobalt/arch/sh/include/asm/xenomai/calibration.h
index 1ce64e6..834febf 100644
--- a/kernel/cobalt/arch/sh/include/asm/xenomai/calibration.h
+++ b/kernel/cobalt/arch/sh/include/asm/xenomai/calibration.h
@@ -19,19 +19,18 @@
 #ifndef _COBALT_SH_ASM_CALIBRATION_H
 #define _COBALT_SH_ASM_CALIBRATION_H
 
-static inline unsigned long xnarch_get_sched_latency (void)
+static inline void xnarch_get_latencies(struct xnclock_gravity *p)
 {
 #if CONFIG_XENO_OPT_TIMING_SCHEDLAT != 0
 #define __sched_latency CONFIG_XENO_OPT_TIMING_SCHEDLAT
-#else
-#ifdef CONFIG_SH_ST_MB442
+#elif defined(CONFIG_SH_ST_MB442)
 #define __sched_latency  5000
 #else
 #define __sched_latency  7000
 #endif
-#endif /* CONFIG_XENO_OPT_TIMING_SCHEDLAT */
-
-       return __sched_latency;
+       p->user = __sched_latency;
+       p->kernel = CONFIG_XENO_OPT_TIMING_KSCHEDLAT;
+       p->irq = CONFIG_XENO_OPT_TIMING_IRQLAT;
 }
 
 #undef __sched_latency
diff --git a/kernel/cobalt/arch/x86/include/asm/xenomai/calibration.h 
b/kernel/cobalt/arch/x86/include/asm/xenomai/calibration.h
index 95f6506..a9190e1 100644
--- a/kernel/cobalt/arch/x86/include/asm/xenomai/calibration.h
+++ b/kernel/cobalt/arch/x86/include/asm/xenomai/calibration.h
@@ -21,7 +21,12 @@
 
 #include <asm/processor.h>
 
-static inline unsigned long xnarch_get_sched_latency (void)
+static inline unsigned long __get_bogomips(void)
+{
+       return this_cpu_read(cpu_info.loops_per_jiffy)/(500000/HZ);
+}
+
+static inline void xnarch_get_latencies(struct xnclock_gravity *p)
 {
        unsigned long sched_latency;
 
@@ -48,19 +53,18 @@ static inline unsigned long xnarch_get_sched_latency (void)
                sched_latency = 1000;
 #endif /* !SMP */
        } else {
-#define __bogomips (this_cpu_read(cpu_info.loops_per_jiffy)/(500000/HZ))
-               sched_latency = (__bogomips < 250 ? 17000 :
-                                __bogomips < 2500 ? 4200 :
+               sched_latency = (__get_bogomips() < 250 ? 17000 :
+                                __get_bogomips() < 2500 ? 4200 :
                                 3500);
-#undef __bogomips
-
 #ifdef CONFIG_SMP
                sched_latency += 1000;
 #endif /* CONFIG_SMP */
        }
 #endif /* !CONFIG_XENO_OPT_TIMING_SCHEDLAT */
 
-       return sched_latency;
+       p->user = sched_latency;
+       p->kernel = CONFIG_XENO_OPT_TIMING_KSCHEDLAT;
+       p->irq = CONFIG_XENO_OPT_TIMING_IRQLAT;
 }
 
 #endif /* !_COBALT_X86_ASM_CALIBRATION_H */
diff --git a/kernel/cobalt/clock.c b/kernel/cobalt/clock.c
index 2c1219b..31b6fae 100644
--- a/kernel/cobalt/clock.c
+++ b/kernel/cobalt/clock.c
@@ -786,12 +786,14 @@ static int set_core_clock_gravity(struct xnclock *clock,
 
 static void reset_core_clock_gravity(struct xnclock *clock)
 {
-       xnticks_t schedlat = xnarch_get_sched_latency();
        struct xnclock_gravity gravity;
 
-       gravity.user = xnclock_ns_to_ticks(&nkclock, schedlat) + nktimerlat;
-       gravity.kernel = gravity.user;
-       gravity.irq = nktimerlat;
+       xnarch_get_latencies(&gravity);
+       gravity.user += nktimerlat;
+       if (gravity.kernel == 0)
+               gravity.kernel = gravity.user;
+       if (gravity.irq == 0)
+               gravity.irq = nktimerlat;
        set_core_clock_gravity(clock, &gravity);
 }
 


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

Reply via email to