[Xenomai-git] Philippe Gerum : cobalt/kernel: stop wrapping common memory barriers
Module: xenomai-forge Branch: master Commit: d9493f51ea13c662002c8068eccfdf7132533e30 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=d9493f51ea13c662002c8068eccfdf7132533e30 Author: Philippe Gerum Date: Tue Jun 25 09:39:27 2013 +0200 cobalt/kernel: stop wrapping common memory barriers As the simulator build was dropped long ago, there is no point in wrapping membars anymore. Use generic kernel memory barriers when applicable. --- include/cobalt/asm-generic/atomic.h | 36 -- include/cobalt/kernel/pod.h |7 +++-- include/cobalt/kernel/seqlock.h |8 +++--- include/cobalt/kernel/stat.h|2 +- kernel/cobalt/intr.c|6 ++-- kernel/cobalt/pod.c |5 +-- lib/cobalt/printf.c |8 +++--- 7 files changed, 35 insertions(+), 37 deletions(-) diff --git a/include/cobalt/asm-generic/atomic.h b/include/cobalt/asm-generic/atomic.h index aeeca83..7b44887 100644 --- a/include/cobalt/asm-generic/atomic.h +++ b/include/cobalt/asm-generic/atomic.h @@ -30,12 +30,10 @@ typedef unsigned long atomic_flags_t; #include #include -#define xnarch_memory_barrier()smp_mb() -#define xnarch_read_memory_barrier()rmb() -#define xnarch_write_memory_barrier() wmb() - -/* atomic_set_mask, atomic_clear_mask are not standard among linux - ports */ +/* + * atomic_set_mask, atomic_clear_mask may not be available from all + * linux ports. + */ #ifndef xnarch_atomic_set_mask #define xnarch_atomic_set_mask(pflags,mask) atomic_set_mask((mask),(pflags)) #endif @@ -52,20 +50,8 @@ typedef struct { unsigned long v; } atomic_long_t; -#ifndef xnarch_memory_barrier -#define xnarch_memory_barrier() __sync_synchronize() -#endif - -#ifndef xnarch_read_memory_barrier -#define xnarch_read_memory_barrier() xnarch_memory_barrier() -#endif - -#ifndef xnarch_write_memory_barrier -#define xnarch_write_memory_barrier() xnarch_memory_barrier() -#endif - #ifndef cpu_relax -#define cpu_relax() xnarch_memory_barrier() +#define cpu_relax() __sync_synchronize() #endif #ifndef atomic_long_read @@ -83,6 +69,18 @@ typedef struct { (typeof((p)->v))(n)) #endif +#ifndef smp_mb +#define smp_mb() __sync_synchronize() +#endif + +#ifndef smp_rmb +#define smp_rmb() __sync_synchronize() +#endif + +#ifndef smp_wmb +#define smp_wmb() __sync_synchronize() +#endif + #endif /* !__KERNEL__ */ #endif /* _COBALT_ASM_GENERIC_ATOMIC_H */ diff --git a/include/cobalt/kernel/pod.h b/include/cobalt/kernel/pod.h index 2840d2d..c01cd8e 100644 --- a/include/cobalt/kernel/pod.h +++ b/include/cobalt/kernel/pod.h @@ -232,10 +232,11 @@ static inline void xnpod_schedule(void) * be either valid, or unused. */ sched = xnpod_current_sched(); + smp_rmb(); /* -* No immediate rescheduling is possible if an ISR or callout -* context is active, or if we are caught in the middle of a -* unlocked context switch. +* No immediate rescheduling is possible if an ISR context is +* active, or if we are caught in the middle of a unlocked +* context switch. */ #if XENO_DEBUG(NUCLEUS) if (testbits(sched->status | sched->lflags, diff --git a/include/cobalt/kernel/seqlock.h b/include/cobalt/kernel/seqlock.h index 7732a8f..9abe1a3 100644 --- a/include/cobalt/kernel/seqlock.h +++ b/include/cobalt/kernel/seqlock.h @@ -19,7 +19,7 @@ static inline unsigned xnread_seqcount_begin(const xnseqcount_t *s) repeat: ret = s->sequence; - xnarch_read_memory_barrier(); + smp_rmb(); if (ret & 1) { cpu_relax(); goto repeat; @@ -32,7 +32,7 @@ repeat: */ static inline int xnread_seqcount_retry(const xnseqcount_t *s, unsigned start) { - xnarch_read_memory_barrier(); + smp_rmb(); return s->sequence != start; } @@ -45,12 +45,12 @@ static inline int xnread_seqcount_retry(const xnseqcount_t *s, unsigned start) static inline void xnwrite_seqcount_begin(xnseqcount_t *s) { s->sequence++; - xnarch_write_memory_barrier(); + smp_wmb(); } static inline void xnwrite_seqcount_end(xnseqcount_t *s) { - xnarch_write_memory_barrier(); + smp_wmb(); s->sequence++; } diff --git a/include/cobalt/kernel/stat.h b/include/cobalt/kernel/stat.h index c9a182f..df9f983 100644 --- a/include/cobalt/kernel/stat.h +++ b/include/cobalt/kernel/stat.h @@ -46,7 +46,7 @@ do { \ (sched)->last_account_switch = date; \ /* All changes must be committed before changing the current_account \ reference in sched (required for xnintr_sync_stat_references) */ \ - xnarch_memory_barrier(); \ + smp_wmb(); \ } while (0) /* Update the current account reference, returning the previous one. */ diff --git a/kernel/cobalt/intr.c b/kernel/cobalt/intr.c index b07a44f..fbc4478 100644 ---
[Xenomai-git] Philippe Gerum : cobalt/kernel: stop wrapping common memory barriers
Module: xenomai-forge Branch: next Commit: d9493f51ea13c662002c8068eccfdf7132533e30 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=d9493f51ea13c662002c8068eccfdf7132533e30 Author: Philippe Gerum Date: Tue Jun 25 09:39:27 2013 +0200 cobalt/kernel: stop wrapping common memory barriers As the simulator build was dropped long ago, there is no point in wrapping membars anymore. Use generic kernel memory barriers when applicable. --- include/cobalt/asm-generic/atomic.h | 36 -- include/cobalt/kernel/pod.h |7 +++-- include/cobalt/kernel/seqlock.h |8 +++--- include/cobalt/kernel/stat.h|2 +- kernel/cobalt/intr.c|6 ++-- kernel/cobalt/pod.c |5 +-- lib/cobalt/printf.c |8 +++--- 7 files changed, 35 insertions(+), 37 deletions(-) diff --git a/include/cobalt/asm-generic/atomic.h b/include/cobalt/asm-generic/atomic.h index aeeca83..7b44887 100644 --- a/include/cobalt/asm-generic/atomic.h +++ b/include/cobalt/asm-generic/atomic.h @@ -30,12 +30,10 @@ typedef unsigned long atomic_flags_t; #include #include -#define xnarch_memory_barrier()smp_mb() -#define xnarch_read_memory_barrier()rmb() -#define xnarch_write_memory_barrier() wmb() - -/* atomic_set_mask, atomic_clear_mask are not standard among linux - ports */ +/* + * atomic_set_mask, atomic_clear_mask may not be available from all + * linux ports. + */ #ifndef xnarch_atomic_set_mask #define xnarch_atomic_set_mask(pflags,mask) atomic_set_mask((mask),(pflags)) #endif @@ -52,20 +50,8 @@ typedef struct { unsigned long v; } atomic_long_t; -#ifndef xnarch_memory_barrier -#define xnarch_memory_barrier() __sync_synchronize() -#endif - -#ifndef xnarch_read_memory_barrier -#define xnarch_read_memory_barrier() xnarch_memory_barrier() -#endif - -#ifndef xnarch_write_memory_barrier -#define xnarch_write_memory_barrier() xnarch_memory_barrier() -#endif - #ifndef cpu_relax -#define cpu_relax() xnarch_memory_barrier() +#define cpu_relax() __sync_synchronize() #endif #ifndef atomic_long_read @@ -83,6 +69,18 @@ typedef struct { (typeof((p)->v))(n)) #endif +#ifndef smp_mb +#define smp_mb() __sync_synchronize() +#endif + +#ifndef smp_rmb +#define smp_rmb() __sync_synchronize() +#endif + +#ifndef smp_wmb +#define smp_wmb() __sync_synchronize() +#endif + #endif /* !__KERNEL__ */ #endif /* _COBALT_ASM_GENERIC_ATOMIC_H */ diff --git a/include/cobalt/kernel/pod.h b/include/cobalt/kernel/pod.h index 2840d2d..c01cd8e 100644 --- a/include/cobalt/kernel/pod.h +++ b/include/cobalt/kernel/pod.h @@ -232,10 +232,11 @@ static inline void xnpod_schedule(void) * be either valid, or unused. */ sched = xnpod_current_sched(); + smp_rmb(); /* -* No immediate rescheduling is possible if an ISR or callout -* context is active, or if we are caught in the middle of a -* unlocked context switch. +* No immediate rescheduling is possible if an ISR context is +* active, or if we are caught in the middle of a unlocked +* context switch. */ #if XENO_DEBUG(NUCLEUS) if (testbits(sched->status | sched->lflags, diff --git a/include/cobalt/kernel/seqlock.h b/include/cobalt/kernel/seqlock.h index 7732a8f..9abe1a3 100644 --- a/include/cobalt/kernel/seqlock.h +++ b/include/cobalt/kernel/seqlock.h @@ -19,7 +19,7 @@ static inline unsigned xnread_seqcount_begin(const xnseqcount_t *s) repeat: ret = s->sequence; - xnarch_read_memory_barrier(); + smp_rmb(); if (ret & 1) { cpu_relax(); goto repeat; @@ -32,7 +32,7 @@ repeat: */ static inline int xnread_seqcount_retry(const xnseqcount_t *s, unsigned start) { - xnarch_read_memory_barrier(); + smp_rmb(); return s->sequence != start; } @@ -45,12 +45,12 @@ static inline int xnread_seqcount_retry(const xnseqcount_t *s, unsigned start) static inline void xnwrite_seqcount_begin(xnseqcount_t *s) { s->sequence++; - xnarch_write_memory_barrier(); + smp_wmb(); } static inline void xnwrite_seqcount_end(xnseqcount_t *s) { - xnarch_write_memory_barrier(); + smp_wmb(); s->sequence++; } diff --git a/include/cobalt/kernel/stat.h b/include/cobalt/kernel/stat.h index c9a182f..df9f983 100644 --- a/include/cobalt/kernel/stat.h +++ b/include/cobalt/kernel/stat.h @@ -46,7 +46,7 @@ do { \ (sched)->last_account_switch = date; \ /* All changes must be committed before changing the current_account \ reference in sched (required for xnintr_sync_stat_references) */ \ - xnarch_memory_barrier(); \ + smp_wmb(); \ } while (0) /* Update the current account reference, returning the previous one. */ diff --git a/kernel/cobalt/intr.c b/kernel/cobalt/intr.c index b07a44f..fbc4478 100644 --- a