All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kiszka <jan.kiszka@web.de>
To: Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>,
	xenomai@xenomai.org
Cc: xenomai-git@xenomai.org
Subject: Re: [Xenomai] [Xenomai-git] Jan Kiszka : cobalt/kernel: Fix locking for xnthread info manipulations
Date: Fri, 26 Jun 2015 22:17:21 +0200	[thread overview]
Message-ID: <558DB351.8090804@web.de> (raw)
In-Reply-To: <20150626160109.GA8276@hermes.click-hack.org>

On 2015-06-26 18:01, Gilles Chanteperdrix wrote:
> On Fri, Jun 26, 2015 at 04:12:44PM +0200, git repository hosting wrote:
>> Module: xenomai-jki
>> Branch: for-forge
>> Commit: 67a64e164b737759cc171d3b04b05770e1450cb6
>> URL:    http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=67a64e164b737759cc171d3b04b05770e1450cb6
>>
>> Author: Jan Kiszka <jan.kiszka@siemens.com>
>> Date:   Fri Jun 26 15:11:42 2015 +0200
>>
>> cobalt/kernel: Fix locking for xnthread info manipulations
>>
>> nklock must be held when manipulating bits of xnthread::info. Not all
>> callsites of xnthread_set/clear_info follow this rule so far, directly
>> or indirectly, fix them (and possibly some other races along this).
>>
>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>>
>> ---
>>
>>  include/cobalt/kernel/rtdm/driver.h |    8 ++++----
>>  kernel/cobalt/posix/syscall.c       |    5 +++++
>>  kernel/cobalt/synch.c               |    2 ++
>>  kernel/cobalt/thread.c              |    5 +++++
>>  4 files changed, 16 insertions(+), 4 deletions(-)
>>
>> diff --git a/include/cobalt/kernel/rtdm/driver.h b/include/cobalt/kernel/rtdm/driver.h
>> index c14198b..de476ca 100644
>> --- a/include/cobalt/kernel/rtdm/driver.h
>> +++ b/include/cobalt/kernel/rtdm/driver.h
>> @@ -553,7 +553,7 @@ static inline void rtdm_lock_get(rtdm_lock_t *lock)
>>  {
>>  	XENO_BUG_ON(COBALT, !spltest());
>>  	spin_lock(lock);
>> -	__xnsched_lock();
>> +	xnsched_lock();
>>  }
>>  
>>  /**
>> @@ -566,7 +566,7 @@ static inline void rtdm_lock_get(rtdm_lock_t *lock)
>>  static inline void rtdm_lock_put(rtdm_lock_t *lock)
>>  {
>>  	spin_unlock(lock);
>> -	__xnsched_unlock();
>> +	xnsched_unlock();
>>  }
>>  
>>  /**
>> @@ -584,7 +584,7 @@ static inline rtdm_lockctx_t __rtdm_lock_get_irqsave(rtdm_lock_t *lock)
>>  
>>  	context = ipipe_test_and_stall_head();
>>  	spin_lock(lock);
>> -	__xnsched_lock();
>> +	xnsched_lock();
>>  
>>  	return context;
>>  }
>> @@ -603,7 +603,7 @@ static inline
>>  void rtdm_lock_put_irqrestore(rtdm_lock_t *lock, rtdm_lockctx_t context)
>>  {
>>  	spin_unlock(lock);
>> -	__xnsched_unlock();
>> +	xnsched_unlock();
>>  	ipipe_restore_head(context);
>>  }
> 
> These changes are not without risk: is not there a risk of deadlock
> if one thread calls rtdm_lock_get without holding the nklock and
> another calls it while holding it?

That could happen, although the "normal" pattern does not involve
explicit nklock acquisition if nesting is used, rather rtdm_lock before
calling nklock-acquiring services. Not a reasonable ordering either, but
common practice now.

We could also try to rework the whole scheduler lock so that it avoids
unsafe thread fields, ideally converting it to something more
lightweight as Linux' preempt_disable/enable().

BTW, xnsched has those two types of flags fields: status requires
nklock, lflags must only be locally modified, thus are fine with
interrupt disabling as protection.

Jan

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: OpenPGP digital signature
URL: <http://xenomai.org/pipermail/xenomai/attachments/20150626/e986a9f2/attachment.sig>

  reply	other threads:[~2015-06-26 20:17 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <E1Z8UN2-0004n4-Gc@sd-51317.xenomai.org>
2015-06-26 16:01 ` [Xenomai] [Xenomai-git] Jan Kiszka : cobalt/kernel: Fix locking for xnthread info manipulations Gilles Chanteperdrix
2015-06-26 20:17   ` Jan Kiszka [this message]
2015-06-27 10:03     ` Gilles Chanteperdrix
2015-06-27 10:50       ` Philippe Gerum
2015-06-27 10:59         ` Gilles Chanteperdrix
2015-06-27 13:05           ` Philippe Gerum
2015-06-30 18:40             ` Jan Kiszka
2015-06-30 18:55               ` Philippe Gerum
     [not found] <E1ZG585-0002oE-L7@sd-51317.xenomai.org>
2015-07-17 13:13 ` Philippe Gerum

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=558DB351.8090804@web.de \
    --to=jan.kiszka@web.de \
    --cc=gilles.chanteperdrix@xenomai.org \
    --cc=xenomai-git@xenomai.org \
    --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.