All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anders Blomdell <anders.blomdell@domain.hid>
To: Jan Kiszka <jan.kiszka@domain.hid>
Cc: "xenomai@xenomai.org" <xenomai@xenomai.org>
Subject: Re: [Xenomai-core] Potential problem with rt_eepro100
Date: Thu, 04 Nov 2010 11:42:28 +0100	[thread overview]
Message-ID: <4CD28E14.3030609@domain.hid> (raw)
In-Reply-To: <4CD27DC2.7060607@domain.hid>

Jan Kiszka wrote:
> Am 04.11.2010 10:26, Jan Kiszka wrote:
>> Am 04.11.2010 10:16, Gilles Chanteperdrix wrote:
>>> Jan Kiszka wrote:
>>>> Take a step back and look at the root cause for this issue again. Unlocked
>>>>
>>>> 	if need-resched
>>>> 		__xnpod_schedule
>>>>
>>>> is inherently racy and will always be (not only for the remote
>>>> reschedule case BTW).
>>> Ok, let us examine what may happen with this code if we only set the
>>> XNRESCHED bit on the local cpu. First, other bits than XNRESCHED do not
>>> matter, because they can not change under our feet. So, we have two
>>> cases for this race:
>>> 1- we see the XNRESCHED bit, but it has been cleared once nklock is
>>> locked in __xnpod_schedule.
>>> 2- we do not see the XNRESCHED bit, but it get set right after we test it.
>>>
>>> 1 is not a problem.
>> Yes, as long as we remove the debug check from the scheduler code (or
>> fix it somehow). The scheduling code already catches this race.
>>
>>> 2 is not a problem, because anything which sets the XNRESCHED (it may
>>> only be an interrupt in fact) bit will cause xnpod_schedule to be called
>>> right after that.
>>>
>>> So no, no race here provided that we only set the XNRESCHED bit on the
>>> local cpu.
>>>
>>>  So we either have to accept this and remove the
>>>> debugging check from the scheduler or push the check back to
>>>> __xnpod_schedule where it once came from. When this it cleaned up, we
>>>> can look into the remote resched protocol again.
>>> The problem of the debug check is that it checks whether the scheduler
>>> state is modified without the XNRESCHED bit being set. And this is the
>>> problem, because yes, in that case, we have a race: the scheduler state
>>> may be modified before the XNRESCHED bit is set by an IPI.
>>>
>>> If we want to fix the debug check, we have to have a special bit, on in
>>> the sched->status flag, only for the purpose of debugging. Or remove the
>>> debug check.
>> Exactly my point. Is there any benefit in keeping the debug check? The
>> code to make it work may end up as "complex" as the logic it verifies,
>> at least that's my current feeling.
>>
> 
> This would be the radical approach of removing the check (and cleaning
> up some bits). If it's acceptable, I would split it up properly.
> 
> diff --git a/include/nucleus/pod.h b/include/nucleus/pod.h
> index 01ff0a7..71f8311 100644
> --- a/include/nucleus/pod.h
> +++ b/include/nucleus/pod.h
> @@ -277,14 +277,9 @@ static inline void xnpod_schedule(void)
>  	 * context is active, or if we are caught in the middle of a
>  	 * unlocked context switch.
>  	 */
> -#if XENO_DEBUG(NUCLEUS)
> -	if (testbits(sched->status, XNKCOUT|XNINIRQ|XNSWLOCK))
> -		return;
> -#else /* !XENO_DEBUG(NUCLEUS) */
>  	if (testbits(sched->status,
>  		     XNKCOUT|XNINIRQ|XNSWLOCK|XNRESCHED) != XNRESCHED)
>  		return;
> -#endif /* !XENO_DEBUG(NUCLEUS) */
>  
>  	__xnpod_schedule(sched);
>  }
> diff --git a/include/nucleus/sched.h b/include/nucleus/sched.h
> index df56417..c832b91 100644
> --- a/include/nucleus/sched.h
> +++ b/include/nucleus/sched.h
> @@ -177,17 +177,16 @@ static inline int xnsched_self_resched_p(struct xnsched *sched)
>  
>  /* Set self resched flag for the given scheduler. */
>  #define xnsched_set_self_resched(__sched__) do {		\
> -  setbits((__sched__)->status, XNRESCHED);			\
> +	__setbits((__sched__)->status, XNRESCHED);		\
>  } while (0)
>  
>  /* Set specific resched flag into the local scheduler mask. */
>  #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);				\
> -  }									\
> +	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);			\
>  } while (0)
>  
>  void xnsched_zombie_hooks(struct xnthread *thread);
> diff --git a/ksrc/nucleus/pod.c b/ksrc/nucleus/pod.c
> index 9e135f3..87dc136 100644
> --- a/ksrc/nucleus/pod.c
> +++ b/ksrc/nucleus/pod.c
> @@ -284,10 +284,11 @@ void xnpod_schedule_handler(void) /* Called with hw interrupts off. */
>  	trace_xn_nucleus_sched_remote(sched);
>  #if defined(CONFIG_SMP) && defined(CONFIG_XENO_OPT_PRIOCPL)
>  	if (testbits(sched->status, XNRPICK)) {
> -		clrbits(sched->status, XNRPICK);
> +		__clrbits(sched->status, XNRPICK);
>  		xnshadow_rpi_check();
>  	}
>  #endif /* CONFIG_SMP && CONFIG_XENO_OPT_PRIOCPL */
> +	xnsched_set_resched(sched);
>  	xnpod_schedule();
>  }
>  
> @@ -2162,21 +2163,21 @@ static inline void xnpod_switch_to(xnsched_t *sched,
>  
>  static inline int __xnpod_test_resched(struct xnsched *sched)
>  {
> -	int resched = testbits(sched->status, XNRESCHED);
> +	int resched = xnsched_resched_p(sched);
>  #ifdef CONFIG_SMP
>  	/* Send resched IPI to remote CPU(s). */
> -	if (unlikely(xnsched_resched_p(sched))) {
> +	if (unlikely(resched)) {
>  		xnarch_send_ipi(sched->resched);
>  		xnarch_cpus_clear(sched->resched);
>  	}
>  #endif
> -	clrbits(sched->status, XNRESCHED);
> +	__clrbits(sched->status, XNRESCHED);
>  	return resched;
>  }
>  
>  void __xnpod_schedule(struct xnsched *sched)
>  {
> -	int zombie, switched, need_resched, shadow;
> +	int zombie, switched, shadow;
>  	struct xnthread *prev, *next, *curr;
>  	spl_t s;
>  
> @@ -2194,11 +2195,10 @@ void __xnpod_schedule(struct xnsched *sched)
>  			 xnthread_current_priority(curr));
>  reschedule:
>  	switched = 0;
> -	need_resched = __xnpod_test_resched(sched);
> -#if !XENO_DEBUG(NUCLEUS)
> -	if (!need_resched)
> +
> +	if (!__xnpod_test_resched(sched))
>  		goto signal_unlock_and_exit;
> -#endif /* !XENO_DEBUG(NUCLEUS) */
> +
>  	zombie = xnthread_test_state(curr, XNZOMBIE);
>  
>  	next = xnsched_pick_next(sched);
> @@ -2213,8 +2213,6 @@ reschedule:
>  		goto signal_unlock_and_exit;
>  	}
>  
> -	XENO_BUGON(NUCLEUS, need_resched == 0);
> -
>  	prev = curr;
>  
>  	trace_xn_nucleus_sched_switch(prev, next);

And remember to make the diff to head and not ftrace branch :-)

/Anders


  reply	other threads:[~2010-11-04 10:42 UTC|newest]

Thread overview: 85+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <4CC82C8D.3080808@domain.hid>
     [not found] ` <4CC84327.9070202@domain.hid>
2010-10-28  7:34   ` [Xenomai-core] [RTnet-users] Potential problem with rt_eepro100 Anders Blomdell
2010-10-28  7:40     ` Jan Kiszka
2010-10-28  9:34       ` Anders Blomdell
2010-10-28 10:18         ` Jan Kiszka
2010-10-28 13:02           ` [Xenomai-core] " Anders Blomdell
2010-10-28 15:05             ` Anders Blomdell
2010-10-28 15:09               ` Jan Kiszka
2010-10-28 15:18                 ` Anders Blomdell
2010-10-28 15:34                   ` Jan Kiszka
2010-10-29 17:42                     ` Anders Blomdell
2010-10-29 18:06                       ` Jan Kiszka
2010-10-29 19:29                         ` Anders Blomdell
2010-11-01 16:55           ` Anders Blomdell
2010-11-03  8:17             ` Jan Kiszka
2010-11-03 10:33               ` Anders Blomdell
2010-11-03 11:44                 ` Anders Blomdell
2010-11-03 11:50                   ` Jan Kiszka
2010-11-03 11:55                     ` Jan Kiszka
2010-11-03 12:07                       ` Anders Blomdell
2010-11-03 12:17                         ` Jan Kiszka
2010-11-03 13:40                           ` Anders Blomdell
2010-11-03 16:02                             ` Anders Blomdell
2010-11-03 16:46                               ` Anders Blomdell
2010-11-03 16:53                                 ` Jan Kiszka
2010-11-03 19:38                                   ` Anders Blomdell
2010-11-03 20:41                                     ` Philippe Gerum
2010-11-03 22:03                                       ` Jan Kiszka
2010-11-03 22:11                                         ` Jan Kiszka
2010-11-03 22:56                                           ` Jan Kiszka
2010-11-03 23:11                                             ` Gilles Chanteperdrix
2010-11-03 23:15                                               ` Jan Kiszka
2010-11-03 23:18                                                 ` Gilles Chanteperdrix
2010-11-03 23:41                                                   ` Jan Kiszka
2010-11-03 23:44                                                     ` Gilles Chanteperdrix
2010-11-03 23:49                                                       ` Jan Kiszka
2010-11-03 23:56                                                         ` Gilles Chanteperdrix
2010-11-04  0:06                                                           ` Jan Kiszka
2010-11-04  0:13                                                             ` Gilles Chanteperdrix
2010-11-04  7:30                                                               ` Jan Kiszka
2010-11-04  8:45                                                                 ` Anders Blomdell
2010-11-04  9:10                                                                   ` Jan Kiszka
2010-11-04  9:17                                                                   ` Gilles Chanteperdrix
2010-11-04  9:16                                                                 ` Gilles Chanteperdrix
2010-11-04  9:18                                                                   ` Gilles Chanteperdrix
2010-11-04  9:26                                                                   ` Jan Kiszka
2010-11-04  9:32                                                                     ` Jan Kiszka
2010-11-04 10:42                                                                       ` Anders Blomdell [this message]
2010-11-04 12:39                                                                       ` Gilles Chanteperdrix
2010-11-04 13:18                                                                         ` Anders Blomdell
2010-11-04 14:37                                                                           ` Jan Kiszka
2010-11-04 14:53                                                                             ` Anders Blomdell
2010-11-04 15:33                                                                               ` Jan Kiszka
2010-11-04 22:08                                                                                 ` Gilles Chanteperdrix
2010-11-04 23:10                                                                                   ` Jan Kiszka
2010-11-04 23:25                                                                                     ` Gilles Chanteperdrix
2010-11-04 23:32                                                                                       ` Jan Kiszka
2010-11-04 23:46                                                                                         ` Gilles Chanteperdrix
2010-11-05  0:09                                                                                           ` Jan Kiszka
2010-11-05  0:11                                                                                             ` Gilles Chanteperdrix
2010-11-05  1:35                                                                                           ` Gilles Chanteperdrix
2010-11-05  9:59                                                                                             ` Anders Blomdell
2010-11-04 22:06                                                                             ` Gilles Chanteperdrix
2010-11-04 23:17                                                                               ` Jan Kiszka
2010-11-04 23:24                                                                                 ` Gilles Chanteperdrix
2010-11-04 23:35                                                                                   ` Jan Kiszka
2010-11-05  1:28                                                                                     ` Gilles Chanteperdrix
2010-11-05 10:21                                                                                       ` Anders Blomdell
2010-11-06  0:27                                                                                         ` Gilles Chanteperdrix
2010-11-06 20:26                                                                                           ` Anders Blomdell
2010-11-06 20:37                                                                                             ` Gilles Chanteperdrix
2010-11-06 22:49                                                                                               ` Philippe Gerum
2010-11-07  1:00                                                                                                 ` Jan Kiszka
2010-11-07  8:31                                                                                                   ` Gilles Chanteperdrix
2010-11-07  9:46                                                                                                     ` Jan Kiszka
2010-11-07  9:57                                                                                                       ` Gilles Chanteperdrix
2010-11-07 10:00                                                                                                         ` Jan Kiszka
2010-11-07 10:03                                                                                                     ` Philippe Gerum
2010-11-07 10:08                                                                                                       ` Jan Kiszka
2010-11-07 10:12                                                                                                         ` Gilles Chanteperdrix
2010-11-07 10:14                                                                                                           ` Jan Kiszka
2010-11-07 10:49                                                                                                             ` Philippe Gerum
2010-11-07  9:46                                                                                                   ` Philippe Gerum
2010-11-11 15:46                                                                                                   ` Gilles Chanteperdrix
2010-11-12 15:36                                                                                                     ` Jan Kiszka
2010-11-13 18:31                                                                                                       ` Gilles Chanteperdrix

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4CD28E14.3030609@domain.hid \
    --to=anders.blomdell@domain.hid \
    --cc=jan.kiszka@domain.hid \
    --cc=xenomai@xenomai.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.