Jan Kiszka wrote:
Am 03.11.2010 17:46, Anders Blomdell wrote:
Anders Blomdell wrote:
Anders Blomdell wrote:
Jan Kiszka wrote:
additional barrier. Can you check this?
diff --git a/include/nucleus/sched.h b/include/nucleus/sched.h
index df56417..66b52ad 100644
--- a/include/nucleus/sched.h
+++ b/include/nucleus/sched.h
@@ -187,6 +187,7 @@ static inline int xnsched_self_resched_p(struct
xnsched *sched)
if (current_sched != (__sched__)) { \
xnarch_cpu_set(xnsched_cpu(__sched__),
current_sched->resched); \
setbits((__sched__)->status, XNRESCHED); \
+ xnarch_memory_barrier(); \
} \
} while (0)
In progress, if nothing breaks before, I'll report status tomorrow
morning.
It still breaks (in approximately the same way). I'm currently putting a
barrier in the other macro doing a RESCHED, also adding some tracing to
see if a read barrier is needed.
Nope, no luck there either. Will start interesting tracepoint
adding/conversion :-(
Strange. But it was too easy anyway...
Any reason why xn_nucleus_sched_remote should ever report status = 0?
Really don't know yet. You could trigger on this state and call
ftrace_stop() then. Provided you had the functions tracer enabled, that
should give a nice pictures of what happened before.
Isn't there a race betweeen these two (still waiting for compilation to
be finished)?
static inline int __xnpod_test_resched(struct xnsched *sched)
{
int resched = testbits(sched->status, XNRESCHED);
#ifdef CONFIG_SMP
/* Send resched IPI to remote CPU(s). */
if (unlikely(xnsched_resched_p(sched))) {
xnarch_send_ipi(sched->resched);
xnarch_cpus_clear(sched->resched);
}
#endif
clrbits(sched->status, XNRESCHED);
return resched;
}
#define xnsched_set_resched(__sched__) do { \
xnsched_t *current_sched = xnpod_current_sched(); \
setbits(current_sched->status, XNRESCHED); \
if (current_sched != (__sched__)) { \
xnarch_cpu_set(xnsched_cpu(__sched__), current_sched->resched); \
setbits((__sched__)->status, XNRESCHED); \
xnarch_memory_barrier(); \
} \
} while (0)
I would suggest (if I have got all the macros right):
static inline int __xnpod_test_resched(struct xnsched *sched)
{
int resched = testbits(sched->status, XNRESCHED);
if (unlikely(resched)) {
#ifdef CONFIG_SMP
/* Send resched IPI to remote CPU(s). */
xnarch_send_ipi(sched->resched);
xnarch_cpus_clear(sched->resched);
#endif
clrbits(sched->status, XNRESCHED);
}
return resched;
}
/Anders
_______________________________________________
Xenomai-core mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-core