On Wed, 2010-11-03 at 20:38 +0100, Anders Blomdell wrote:
> 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)?
We always hold the nklock in both contexts.
>
> 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
--
Philippe.
_______________________________________________
Xenomai-core mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-core