All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-core] xnregistry_fetch & friends
@ 2008-08-25 20:19 Jan Kiszka
  2008-08-25 22:11 ` Philippe Gerum
  0 siblings, 1 reply; 14+ messages in thread
From: Jan Kiszka @ 2008-08-25 20:19 UTC (permalink / raw)
  To: xenomai-core

[-- Attachment #1: Type: text/plain, Size: 849 bytes --]

Hi,

trying to select a sane kernel-side looking scheme for fast native
mutexes, I had a closer look at the registry usage in that skin (and
many others). The typical pattern is

object = xnregistry_fetch(handle);
perform_operation(object);

There is no lock around those two, both services do nklock acquisition
only internally. So this is a bit racy against concurrent object
destruction and memory releasing / object reconstruction. Well, I guess
the rational is: we test against object magics and the underlying memory
is normally not vanishing (immediately) on destruction, right? Remains
just object reconstruction. Not a real-life issue?

But then I wonder

 a) why xnregistry_fetch uses nklock at all (even for totally uncritical
    XNOBJECT_SELF!)

 b) what the ideas/plans on unused xnregistry_put/get are.

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 257 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Xenomai-core] xnregistry_fetch & friends
  2008-08-25 20:19 [Xenomai-core] xnregistry_fetch & friends Jan Kiszka
@ 2008-08-25 22:11 ` Philippe Gerum
  2008-08-25 22:58   ` Jan Kiszka
  0 siblings, 1 reply; 14+ messages in thread
From: Philippe Gerum @ 2008-08-25 22:11 UTC (permalink / raw)
  Cc: Jan Kiszka, xenomai-core

Jan Kiszka wrote:
> Hi,
> 
> trying to select a sane kernel-side looking scheme for fast native
> mutexes, I had a closer look at the registry usage in that skin (and
> many others). The typical pattern is
> 
> object = xnregistry_fetch(handle);
> perform_operation(object);
> 
> There is no lock around those two, both services do nklock acquisition
> only internally. So this is a bit racy against concurrent object
> destruction and memory releasing /

Nope.

 object reconstruction.

Yes, and no.

 Well, I guess
> the rational is: we test against object magics and the underlying memory
> is normally not vanishing (immediately) on destruction, right? 

We don't even care of that. The magic is intentionally garbled under nklock when
the object is freed, so it won't match.

Remains
> just object reconstruction. Not a real-life issue?
> 

Not for userland code calling syscall wrappers that fetch objects addresses from
handles, since we can't lock around code in the application to always make sure
that kernel space will certainly operate on the intended object, I mean, without
explicit care taken at user-space level. What helps, is that the registry does
not recycle handle values immediately, which is not 100% reliable if the slot
table is almost full, but still better than a LIFO option.

safe:

If paranoid or have a valid case for more safety, call xnregistry_remove_safe()
when deleting the object, along with xnregistry_get/put() to maintain safe
references on it.

> But then I wonder
> 
>  a) why xnregistry_fetch uses nklock at all (even for totally uncritical
>     XNOBJECT_SELF!)
> 

registry_validate() returns a pointer we want to dereference; we'd better keep
this unpreemptable, although it's useless for the self-fetching op (which is an
unused calling mode so far). If using xnregistry_remove() while fetching the
object, the worst case is that your action ends up acting upon an object of the
same type, instead of the initially intended one. If that's a problem, goto safe;

>  b) what the ideas/plans on unused xnregistry_put/get are.
> 
> Jan
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Xenomai-core mailing list
> Xenomai-core@domain.hid
> https://mail.gna.org/listinfo/xenomai-core


-- 
Philippe.


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Xenomai-core] xnregistry_fetch & friends
  2008-08-25 22:11 ` Philippe Gerum
@ 2008-08-25 22:58   ` Jan Kiszka
  2008-08-26  8:06     ` Philippe Gerum
  0 siblings, 1 reply; 14+ messages in thread
From: Jan Kiszka @ 2008-08-25 22:58 UTC (permalink / raw)
  To: rpm; +Cc: xenomai-core

[-- Attachment #1: Type: text/plain, Size: 1102 bytes --]

Philippe Gerum wrote:
> Jan Kiszka wrote:
>> But then I wonder
>>
>>  a) why xnregistry_fetch uses nklock at all (even for totally uncritical
>>     XNOBJECT_SELF!)
>>
> 
> registry_validate() returns a pointer we want to dereference; we'd better keep
> this unpreemptable, although it's useless for the self-fetching op (which is an
> unused calling mode so far). If using xnregistry_remove() while fetching the
> object, the worst case is that your action ends up acting upon an object of the
> same type, instead of the initially intended one. If that's a problem, goto safe;

I still don't see the benefit in picking up the object pointer under
nklock compared to the overhead of acquiring and releasing that lock.
That's all not truly safe anyway. Even if you ensure that handle and
object match, someone may change that pair before we can do the lookup
under nklock.

In my understanding, registry slots either contain NULL or a pointer to
some object. If that object is valid, that is checked _after_ releasing
the lock, so we are unsafe again, _nothing_ gained.

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 257 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Xenomai-core] xnregistry_fetch & friends
  2008-08-25 22:58   ` Jan Kiszka
@ 2008-08-26  8:06     ` Philippe Gerum
  2008-08-26  8:27       ` Jan Kiszka
  0 siblings, 1 reply; 14+ messages in thread
From: Philippe Gerum @ 2008-08-26  8:06 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai-core

Jan Kiszka wrote:
> Philippe Gerum wrote:
>> Jan Kiszka wrote:
>>> But then I wonder
>>>
>>>  a) why xnregistry_fetch uses nklock at all (even for totally uncritical
>>>     XNOBJECT_SELF!)
>>>
>> registry_validate() returns a pointer we want to dereference; we'd better keep
>> this unpreemptable, although it's useless for the self-fetching op (which is an
>> unused calling mode so far). If using xnregistry_remove() while fetching the
>> object, the worst case is that your action ends up acting upon an object of the
>> same type, instead of the initially intended one. If that's a problem, goto safe;
> 
> I still don't see the benefit in picking up the object pointer under
> nklock compared to the overhead of acquiring and releasing that lock.
> That's all not truly safe anyway. Even if you ensure that handle and
> object match, someone may change that pair before we can do the lookup
> under nklock.

Indeed, this is the whole point of the discussion unless I'm mistaken.

> 
> In my understanding, registry slots either contain NULL or a pointer to
> some object. If that object is valid, that is checked _after_ releasing
> the lock, so we are unsafe again, _nothing_ gained.

Yes, I agree. I was focusing on _put/_get which maintain the refcount and ought
to be locked, but solely fetching under lock makes no sense. It's probably a
paranoid surge about having dynamically allocated slots, which won't happen
anytime soon.

> 
> Jan
> 


-- 
Philippe.


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Xenomai-core] xnregistry_fetch & friends
  2008-08-26  8:06     ` Philippe Gerum
@ 2008-08-26  8:27       ` Jan Kiszka
  2008-08-26  8:41         ` Philippe Gerum
  0 siblings, 1 reply; 14+ messages in thread
From: Jan Kiszka @ 2008-08-26  8:27 UTC (permalink / raw)
  To: rpm; +Cc: xenomai-core

Philippe Gerum wrote:
> Jan Kiszka wrote:
>> Philippe Gerum wrote:
>>> Jan Kiszka wrote:
>>>> But then I wonder
>>>>
>>>>  a) why xnregistry_fetch uses nklock at all (even for totally uncritical
>>>>     XNOBJECT_SELF!)
>>>>
>>> registry_validate() returns a pointer we want to dereference; we'd better keep
>>> this unpreemptable, although it's useless for the self-fetching op (which is an
>>> unused calling mode so far). If using xnregistry_remove() while fetching the
>>> object, the worst case is that your action ends up acting upon an object of the
>>> same type, instead of the initially intended one. If that's a problem, goto safe;
>> I still don't see the benefit in picking up the object pointer under
>> nklock compared to the overhead of acquiring and releasing that lock.
>> That's all not truly safe anyway. Even if you ensure that handle and
>> object match, someone may change that pair before we can do the lookup
>> under nklock.
> 
> Indeed, this is the whole point of the discussion unless I'm mistaken.
> 
>> In my understanding, registry slots either contain NULL or a pointer to
>> some object. If that object is valid, that is checked _after_ releasing
>> the lock, so we are unsafe again, _nothing_ gained.
> 
> Yes, I agree. I was focusing on _put/_get which maintain the refcount and ought
> to be locked, but solely fetching under lock makes no sense. It's probably a
> paranoid surge about having dynamically allocated slots, which won't happen
> anytime soon.

Then you are fine with this patch?

---
 ChangeLog               |    5 +++++
 ksrc/nucleus/registry.c |   20 ++++----------------
 2 files changed, 9 insertions(+), 16 deletions(-)

Index: b/ChangeLog
===================================================================
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-08-26  Jan Kiszka  <jan.kiszka@domain.hid>
+
+	* ksrc/nucleus/registry.c (xnregistry_fetch): Remove pointless
+	locking.
+
 2008-08-25  Jan Kiszka  <jan.kiszka@domain.hid>
 
 	* include/asm-generic/wrappers.h: Provide atomic_long wrappings.
Index: b/ksrc/nucleus/registry.c
===================================================================
--- a/ksrc/nucleus/registry.c
+++ b/ksrc/nucleus/registry.c
@@ -1150,28 +1150,16 @@ u_long xnregistry_put(xnhandle_t handle)
 void *xnregistry_fetch(xnhandle_t handle)
 {
 	xnobject_t *object;
-	void *objaddr;
-	spl_t s;
 
-	xnlock_get_irqsave(&nklock, s);
-
-	if (handle == XNOBJECT_SELF) {
-		objaddr = xnpod_primary_p()? xnpod_current_thread() : NULL;
-		goto unlock_and_exit;
-	}
+	if (handle == XNOBJECT_SELF)
+		return xnpod_primary_p()? xnpod_current_thread() : NULL;
 
 	object = registry_validate(handle);
 
 	if (object)
-		objaddr = object->objaddr;
+		return object->objaddr;
 	else
-		objaddr = NULL;
-
-      unlock_and_exit:
-
-	xnlock_put_irqrestore(&nklock, s);
-
-	return objaddr;
+		return NULL;
 }
 
 /*@}*/


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Xenomai-core] xnregistry_fetch & friends
  2008-08-26  8:27       ` Jan Kiszka
@ 2008-08-26  8:41         ` Philippe Gerum
  2008-08-26  8:52           ` Jan Kiszka
  0 siblings, 1 reply; 14+ messages in thread
From: Philippe Gerum @ 2008-08-26  8:41 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai-core

Jan Kiszka wrote:
> Philippe Gerum wrote:
>> Jan Kiszka wrote:
>>> Philippe Gerum wrote:
>>>> Jan Kiszka wrote:
>>>>> But then I wonder
>>>>>
>>>>>  a) why xnregistry_fetch uses nklock at all (even for totally uncritical
>>>>>     XNOBJECT_SELF!)
>>>>>
>>>> registry_validate() returns a pointer we want to dereference; we'd better keep
>>>> this unpreemptable, although it's useless for the self-fetching op (which is an
>>>> unused calling mode so far). If using xnregistry_remove() while fetching the
>>>> object, the worst case is that your action ends up acting upon an object of the
>>>> same type, instead of the initially intended one. If that's a problem, goto safe;
>>> I still don't see the benefit in picking up the object pointer under
>>> nklock compared to the overhead of acquiring and releasing that lock.
>>> That's all not truly safe anyway. Even if you ensure that handle and
>>> object match, someone may change that pair before we can do the lookup
>>> under nklock.
>> Indeed, this is the whole point of the discussion unless I'm mistaken.
>>
>>> In my understanding, registry slots either contain NULL or a pointer to
>>> some object. If that object is valid, that is checked _after_ releasing
>>> the lock, so we are unsafe again, _nothing_ gained.
>> Yes, I agree. I was focusing on _put/_get which maintain the refcount and ought
>> to be locked, but solely fetching under lock makes no sense. It's probably a
>> paranoid surge about having dynamically allocated slots, which won't happen
>> anytime soon.
> 
> Then you are fine with this patch?
> 

Yes, only nitpicking about the else statement, but the logic is ok for me. While
your are at it, you may also want to move the other self-directed requests out
of the locked section.

> ---
>  ChangeLog               |    5 +++++
>  ksrc/nucleus/registry.c |   20 ++++----------------
>  2 files changed, 9 insertions(+), 16 deletions(-)
> 
> Index: b/ChangeLog
> ===================================================================
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,8 @@
> +2008-08-26  Jan Kiszka  <jan.kiszka@domain.hid>
> +
> +	* ksrc/nucleus/registry.c (xnregistry_fetch): Remove pointless
> +	locking.
> +
>  2008-08-25  Jan Kiszka  <jan.kiszka@domain.hid>
>  
>  	* include/asm-generic/wrappers.h: Provide atomic_long wrappings.
> Index: b/ksrc/nucleus/registry.c
> ===================================================================
> --- a/ksrc/nucleus/registry.c
> +++ b/ksrc/nucleus/registry.c
> @@ -1150,28 +1150,16 @@ u_long xnregistry_put(xnhandle_t handle)
>  void *xnregistry_fetch(xnhandle_t handle)
>  {
>  	xnobject_t *object;
> -	void *objaddr;
> -	spl_t s;
>  
> -	xnlock_get_irqsave(&nklock, s);
> -
> -	if (handle == XNOBJECT_SELF) {
> -		objaddr = xnpod_primary_p()? xnpod_current_thread() : NULL;
> -		goto unlock_and_exit;
> -	}
> +	if (handle == XNOBJECT_SELF)
> +		return xnpod_primary_p()? xnpod_current_thread() : NULL;
>  
>  	object = registry_validate(handle);
>  
>  	if (object)
> -		objaddr = object->objaddr;
> +		return object->objaddr;
>  	else

-	else

> -		objaddr = NULL;
> -
> -      unlock_and_exit:
> -
> -	xnlock_put_irqrestore(&nklock, s);
> -
> -	return objaddr;
> +		return NULL;
+	return NULL;
>  }
>  
>  /*@}*/
> 


-- 
Philippe.


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Xenomai-core] xnregistry_fetch & friends
  2008-08-26  8:41         ` Philippe Gerum
@ 2008-08-26  8:52           ` Jan Kiszka
  2008-08-26  9:09             ` Philippe Gerum
  2008-08-26 12:49             ` Gilles Chanteperdrix
  0 siblings, 2 replies; 14+ messages in thread
From: Jan Kiszka @ 2008-08-26  8:52 UTC (permalink / raw)
  To: rpm; +Cc: xenomai-core

Philippe Gerum wrote:
> Jan Kiszka wrote:
>> Philippe Gerum wrote:
>>> Jan Kiszka wrote:
>>>> Philippe Gerum wrote:
>>>>> Jan Kiszka wrote:
>>>>>> But then I wonder
>>>>>>
>>>>>>  a) why xnregistry_fetch uses nklock at all (even for totally uncritical
>>>>>>     XNOBJECT_SELF!)
>>>>>>
>>>>> registry_validate() returns a pointer we want to dereference; we'd better keep
>>>>> this unpreemptable, although it's useless for the self-fetching op (which is an
>>>>> unused calling mode so far). If using xnregistry_remove() while fetching the
>>>>> object, the worst case is that your action ends up acting upon an object of the
>>>>> same type, instead of the initially intended one. If that's a problem, goto safe;
>>>> I still don't see the benefit in picking up the object pointer under
>>>> nklock compared to the overhead of acquiring and releasing that lock.
>>>> That's all not truly safe anyway. Even if you ensure that handle and
>>>> object match, someone may change that pair before we can do the lookup
>>>> under nklock.
>>> Indeed, this is the whole point of the discussion unless I'm mistaken.
>>>
>>>> In my understanding, registry slots either contain NULL or a pointer to
>>>> some object. If that object is valid, that is checked _after_ releasing
>>>> the lock, so we are unsafe again, _nothing_ gained.
>>> Yes, I agree. I was focusing on _put/_get which maintain the refcount and ought
>>> to be locked, but solely fetching under lock makes no sense. It's probably a
>>> paranoid surge about having dynamically allocated slots, which won't happen
>>> anytime soon.
>> Then you are fine with this patch?
>>
> 
> Yes, only nitpicking about the else statement, but the logic is ok for me. While
> your are at it, you may also want to move the other self-directed requests out
> of the locked section.

Updated patch below.

Another question came up here: Why do we allocate hash table objects
dynamically, why not putting the holding "structure" (probably only a
next pointer) in xnobject_t directly?

BTW, I'm also preparing a patch to overcome hash chain registrations for
anonymous (handle-only) objects as I need more of them (one for each
thread) for fast mutexes - to avoid fiddling with kernel pointers in
userland.

Jan

---
 ChangeLog               |    6 ++++++
 ksrc/nucleus/registry.c |   42 +++++++++++++-----------------------------
 2 files changed, 19 insertions(+), 29 deletions(-)

Index: b/ChangeLog
===================================================================
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-08-26  Jan Kiszka  <jan.kiszka@domain.hid>
+
+	* ksrc/nucleus/registry.c (xnregistry_fetch/get/put): Remove
+	pointless locking, move XNOBJECT_SELF lookups out of critical
+	sections.
+
 2008-08-25  Jan Kiszka  <jan.kiszka@domain.hid>
 
 	* include/asm-generic/wrappers.h: Provide atomic_long wrappings.
Index: b/ksrc/nucleus/registry.c
===================================================================
--- a/ksrc/nucleus/registry.c
+++ b/ksrc/nucleus/registry.c
@@ -1024,16 +1024,14 @@ void *xnregistry_get(xnhandle_t handle)
 	void *objaddr;
 	spl_t s;
 
-	xnlock_get_irqsave(&nklock, s);
-
 	if (handle == XNOBJECT_SELF) {
-		if (!xnpod_primary_p()) {
-			objaddr = NULL;
-			goto unlock_and_exit;
-		}
+		if (!xnpod_primary_p())
+			return NULL;
 		handle = xnpod_current_thread()->registry.handle;
 	}
 
+	xnlock_get_irqsave(&nklock, s);
+
 	object = registry_validate(handle);
 
 	if (object) {
@@ -1087,17 +1085,14 @@ u_long xnregistry_put(xnhandle_t handle)
 	u_long newlock;
 	spl_t s;
 
-	xnlock_get_irqsave(&nklock, s);
-
 	if (handle == XNOBJECT_SELF) {
-		if (!xnpod_primary_p()) {
-			newlock = 0;
-			goto unlock_and_exit;
-		}
-
+		if (!xnpod_primary_p())
+			return 0;
 		handle = xnpod_current_thread()->registry.handle;
 	}
 
+	xnlock_get_irqsave(&nklock, s);
+
 	object = registry_validate(handle);
 
 	if (!object) {
@@ -1150,28 +1145,17 @@ u_long xnregistry_put(xnhandle_t handle)
 void *xnregistry_fetch(xnhandle_t handle)
 {
 	xnobject_t *object;
-	void *objaddr;
-	spl_t s;
 
-	xnlock_get_irqsave(&nklock, s);
-
-	if (handle == XNOBJECT_SELF) {
-		objaddr = xnpod_primary_p()? xnpod_current_thread() : NULL;
-		goto unlock_and_exit;
-	}
+	if (handle == XNOBJECT_SELF)
+		return xnpod_primary_p()? xnpod_current_thread() : NULL;
 
 	object = registry_validate(handle);
 
-	if (object)
-		objaddr = object->objaddr;
-	else
-		objaddr = NULL;
+	if (!object)
+		return NULL;
 
-      unlock_and_exit:
+	return object->objaddr;
 
-	xnlock_put_irqrestore(&nklock, s);
-
-	return objaddr;
 }
 
 /*@}*/


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Xenomai-core] xnregistry_fetch & friends
  2008-08-26  8:52           ` Jan Kiszka
@ 2008-08-26  9:09             ` Philippe Gerum
  2008-08-26 12:49             ` Gilles Chanteperdrix
  1 sibling, 0 replies; 14+ messages in thread
From: Philippe Gerum @ 2008-08-26  9:09 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai-core

Jan Kiszka wrote:
> Philippe Gerum wrote:
>> Jan Kiszka wrote:
>>> Philippe Gerum wrote:
>>>> Jan Kiszka wrote:
>>>>> Philippe Gerum wrote:
>>>>>> Jan Kiszka wrote:
>>>>>>> But then I wonder
>>>>>>>
>>>>>>>  a) why xnregistry_fetch uses nklock at all (even for totally uncritical
>>>>>>>     XNOBJECT_SELF!)
>>>>>>>
>>>>>> registry_validate() returns a pointer we want to dereference; we'd better keep
>>>>>> this unpreemptable, although it's useless for the self-fetching op (which is an
>>>>>> unused calling mode so far). If using xnregistry_remove() while fetching the
>>>>>> object, the worst case is that your action ends up acting upon an object of the
>>>>>> same type, instead of the initially intended one. If that's a problem, goto safe;
>>>>> I still don't see the benefit in picking up the object pointer under
>>>>> nklock compared to the overhead of acquiring and releasing that lock.
>>>>> That's all not truly safe anyway. Even if you ensure that handle and
>>>>> object match, someone may change that pair before we can do the lookup
>>>>> under nklock.
>>>> Indeed, this is the whole point of the discussion unless I'm mistaken.
>>>>
>>>>> In my understanding, registry slots either contain NULL or a pointer to
>>>>> some object. If that object is valid, that is checked _after_ releasing
>>>>> the lock, so we are unsafe again, _nothing_ gained.
>>>> Yes, I agree. I was focusing on _put/_get which maintain the refcount and ought
>>>> to be locked, but solely fetching under lock makes no sense. It's probably a
>>>> paranoid surge about having dynamically allocated slots, which won't happen
>>>> anytime soon.
>>> Then you are fine with this patch?
>>>
>> Yes, only nitpicking about the else statement, but the logic is ok for me. While
>> your are at it, you may also want to move the other self-directed requests out
>> of the locked section.
> 
> Updated patch below.
> 
> Another question came up here: Why do we allocate hash table objects
> dynamically, why not putting the holding "structure" (probably only a
> next pointer) in xnobject_t directly?
>

Prehistoric requirement that does not make sense since many moons now; at some
point, we had to support N:1 relationship between keys and objects, and the key
holder once belonged to objhash. This is definitely useless now and should be
simplified.

> BTW, I'm also preparing a patch to overcome hash chain registrations for
> anonymous (handle-only) objects as I need more of them (one for each
> thread) for fast mutexes - to avoid fiddling with kernel pointers in
> userland.

Ok.

> 
> Jan
> 
> ---
>  ChangeLog               |    6 ++++++
>  ksrc/nucleus/registry.c |   42 +++++++++++++-----------------------------
>  2 files changed, 19 insertions(+), 29 deletions(-)
> 
> Index: b/ChangeLog
> ===================================================================
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,9 @@
> +2008-08-26  Jan Kiszka  <jan.kiszka@domain.hid>
> +
> +	* ksrc/nucleus/registry.c (xnregistry_fetch/get/put): Remove
> +	pointless locking, move XNOBJECT_SELF lookups out of critical
> +	sections.
> +
>  2008-08-25  Jan Kiszka  <jan.kiszka@domain.hid>
>  
>  	* include/asm-generic/wrappers.h: Provide atomic_long wrappings.
> Index: b/ksrc/nucleus/registry.c
> ===================================================================
> --- a/ksrc/nucleus/registry.c
> +++ b/ksrc/nucleus/registry.c
> @@ -1024,16 +1024,14 @@ void *xnregistry_get(xnhandle_t handle)
>  	void *objaddr;
>  	spl_t s;
>  
> -	xnlock_get_irqsave(&nklock, s);
> -
>  	if (handle == XNOBJECT_SELF) {
> -		if (!xnpod_primary_p()) {
> -			objaddr = NULL;
> -			goto unlock_and_exit;
> -		}
> +		if (!xnpod_primary_p())
> +			return NULL;
>  		handle = xnpod_current_thread()->registry.handle;
>  	}
>  
> +	xnlock_get_irqsave(&nklock, s);
> +
>  	object = registry_validate(handle);
>  
>  	if (object) {
> @@ -1087,17 +1085,14 @@ u_long xnregistry_put(xnhandle_t handle)
>  	u_long newlock;
>  	spl_t s;
>  
> -	xnlock_get_irqsave(&nklock, s);
> -
>  	if (handle == XNOBJECT_SELF) {
> -		if (!xnpod_primary_p()) {
> -			newlock = 0;
> -			goto unlock_and_exit;
> -		}
> -
> +		if (!xnpod_primary_p())
> +			return 0;
>  		handle = xnpod_current_thread()->registry.handle;
>  	}
>  
> +	xnlock_get_irqsave(&nklock, s);
> +
>  	object = registry_validate(handle);
>  
>  	if (!object) {
> @@ -1150,28 +1145,17 @@ u_long xnregistry_put(xnhandle_t handle)
>  void *xnregistry_fetch(xnhandle_t handle)
>  {
>  	xnobject_t *object;
> -	void *objaddr;
> -	spl_t s;
>  
> -	xnlock_get_irqsave(&nklock, s);
> -
> -	if (handle == XNOBJECT_SELF) {
> -		objaddr = xnpod_primary_p()? xnpod_current_thread() : NULL;
> -		goto unlock_and_exit;
> -	}
> +	if (handle == XNOBJECT_SELF)
> +		return xnpod_primary_p()? xnpod_current_thread() : NULL;
>  
>  	object = registry_validate(handle);
>  
> -	if (object)
> -		objaddr = object->objaddr;
> -	else
> -		objaddr = NULL;
> +	if (!object)
> +		return NULL;
>  
> -      unlock_and_exit:
> +	return object->objaddr;
>  
> -	xnlock_put_irqrestore(&nklock, s);
> -
> -	return objaddr;
>  }
>  
>  /*@}*/
> 


-- 
Philippe.


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Xenomai-core] xnregistry_fetch & friends
  2008-08-26  8:52           ` Jan Kiszka
  2008-08-26  9:09             ` Philippe Gerum
@ 2008-08-26 12:49             ` Gilles Chanteperdrix
  2008-08-26 13:08               ` Jan Kiszka
  1 sibling, 1 reply; 14+ messages in thread
From: Gilles Chanteperdrix @ 2008-08-26 12:49 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai-core

Jan Kiszka wrote:
> BTW, I'm also preparing a patch to overcome hash chain registrations for
> anonymous (handle-only) objects as I need more of them (one for each
> thread) for fast mutexes - to avoid fiddling with kernel pointers in
> userland.

Ok. You will have a problem mangling a registry handle with the claimed
bit. Or maybe we can assume that the bit 31 is not used or something ?

And by the way, I had an idea of removing the duplication of the owner
field between an xnsynch and a mutex object, this would allow saving a
syscall when a situation of mutex stealing happened. Using a handle
would prevent this. But I am not so sure it is a good idea now (namely
because it would move some compare-and-swap the owner logic to the
xnsynch API).

-- 
                                                 Gilles.


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Xenomai-core] xnregistry_fetch & friends
  2008-08-26 12:49             ` Gilles Chanteperdrix
@ 2008-08-26 13:08               ` Jan Kiszka
  2008-08-26 13:13                 ` Gilles Chanteperdrix
  0 siblings, 1 reply; 14+ messages in thread
From: Jan Kiszka @ 2008-08-26 13:08 UTC (permalink / raw)
  To: Gilles Chanteperdrix; +Cc: xenomai-core

Gilles Chanteperdrix wrote:
> Jan Kiszka wrote:
>> BTW, I'm also preparing a patch to overcome hash chain registrations for
>> anonymous (handle-only) objects as I need more of them (one for each
>> thread) for fast mutexes - to avoid fiddling with kernel pointers in
>> userland.
> 
> Ok. You will have a problem mangling a registry handle with the claimed
> bit. Or maybe we can assume that the bit 31 is not used or something ?

That's precisely my plan, use the highest bit (2^32 registry slots are
fairly unlikely even on 64 bit).

> 
> And by the way, I had an idea of removing the duplication of the owner
> field between an xnsynch and a mutex object, this would allow saving a
> syscall when a situation of mutex stealing happened. Using a handle
> would prevent this. But I am not so sure it is a good idea now (namely
> because it would move some compare-and-swap the owner logic to the
> xnsynch API).

How could you save one of the two syscalls on lock stealing? By
introducing another bit in the fast lock word that indicates something
like XNWAKEN? On first sight, this shouldn't require moving everything
into xnsynch (though generic fast locks were not that bad...) nor
interfere with handle-based lock words.

Jan

-- 
Siemens AG, Corporate Technology, CT SE 2
Corporate Competence Center Embedded Linux


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Xenomai-core] xnregistry_fetch & friends
  2008-08-26 13:08               ` Jan Kiszka
@ 2008-08-26 13:13                 ` Gilles Chanteperdrix
  2008-08-26 13:18                   ` Gilles Chanteperdrix
  0 siblings, 1 reply; 14+ messages in thread
From: Gilles Chanteperdrix @ 2008-08-26 13:13 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai-core

Jan Kiszka wrote:
> Gilles Chanteperdrix wrote:
>> Jan Kiszka wrote:
>>> BTW, I'm also preparing a patch to overcome hash chain registrations for
>>> anonymous (handle-only) objects as I need more of them (one for each
>>> thread) for fast mutexes - to avoid fiddling with kernel pointers in
>>> userland.
>> Ok. You will have a problem mangling a registry handle with the claimed
>> bit. Or maybe we can assume that the bit 31 is not used or something ?
> 
> That's precisely my plan, use the highest bit (2^32 registry slots are
> fairly unlikely even on 64 bit).
> 
>> And by the way, I had an idea of removing the duplication of the owner
>> field between an xnsynch and a mutex object, this would allow saving a
>> syscall when a situation of mutex stealing happened. Using a handle
>> would prevent this. But I am not so sure it is a good idea now (namely
>> because it would move some compare-and-swap the owner logic to the
>> xnsynch API).
> 
> How could you save one of the two syscalls on lock stealing? By
> introducing another bit in the fast lock word that indicates something
> like XNWAKEN? On first sight, this shouldn't require moving everything
> into xnsynch (though generic fast locks were not that bad...) nor
> interfere with handle-based lock words.

The problem is that when the thread that did the stealing unlocks the
mutex, xnsynch_wakeup_one_sleeper must be called to set the xnsynch
owner to NULL, so that the robbed thread will succeed in getting the
xnsynch. But for xnsynch_wakeup_one_sleeper to be called, we must issue
the syscall. If the owner was shared between the mutex and the xnsynch,
the owner could be set to NULL by the mutex unlock from user-space.

-- 
                                                 Gilles.


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Xenomai-core] xnregistry_fetch & friends
  2008-08-26 13:13                 ` Gilles Chanteperdrix
@ 2008-08-26 13:18                   ` Gilles Chanteperdrix
  2008-08-26 13:32                     ` Jan Kiszka
  0 siblings, 1 reply; 14+ messages in thread
From: Gilles Chanteperdrix @ 2008-08-26 13:18 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai-core

Gilles Chanteperdrix wrote:
> Jan Kiszka wrote:
>> Gilles Chanteperdrix wrote:
>>> Jan Kiszka wrote:
>>>> BTW, I'm also preparing a patch to overcome hash chain registrations for
>>>> anonymous (handle-only) objects as I need more of them (one for each
>>>> thread) for fast mutexes - to avoid fiddling with kernel pointers in
>>>> userland.
>>> Ok. You will have a problem mangling a registry handle with the claimed
>>> bit. Or maybe we can assume that the bit 31 is not used or something ?
>> That's precisely my plan, use the highest bit (2^32 registry slots are
>> fairly unlikely even on 64 bit).
>>
>>> And by the way, I had an idea of removing the duplication of the owner
>>> field between an xnsynch and a mutex object, this would allow saving a
>>> syscall when a situation of mutex stealing happened. Using a handle
>>> would prevent this. But I am not so sure it is a good idea now (namely
>>> because it would move some compare-and-swap the owner logic to the
>>> xnsynch API).
>> How could you save one of the two syscalls on lock stealing? By
>> introducing another bit in the fast lock word that indicates something
>> like XNWAKEN? On first sight, this shouldn't require moving everything
>> into xnsynch (though generic fast locks were not that bad...) nor
>> interfere with handle-based lock words.
> 
> The problem is that when the thread that did the stealing unlocks the
> mutex, xnsynch_wakeup_one_sleeper must be called to set the xnsynch
> owner to NULL, so that the robbed thread will succeed in getting the
> xnsynch. But for xnsynch_wakeup_one_sleeper to be called, we must issue
> the syscall. If the owner was shared between the mutex and the xnsynch,
> the owner could be set to NULL by the mutex unlock from user-space.

That is what the "sleepers" field in the pse51_mutex_t structure is for.

-- 
                                                 Gilles.


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Xenomai-core] xnregistry_fetch & friends
  2008-08-26 13:18                   ` Gilles Chanteperdrix
@ 2008-08-26 13:32                     ` Jan Kiszka
  2008-08-26 13:38                       ` Gilles Chanteperdrix
  0 siblings, 1 reply; 14+ messages in thread
From: Jan Kiszka @ 2008-08-26 13:32 UTC (permalink / raw)
  To: Gilles Chanteperdrix; +Cc: xenomai-core

Gilles Chanteperdrix wrote:
> Gilles Chanteperdrix wrote:
>> Jan Kiszka wrote:
>>> Gilles Chanteperdrix wrote:
>>>> Jan Kiszka wrote:
>>>>> BTW, I'm also preparing a patch to overcome hash chain registrations for
>>>>> anonymous (handle-only) objects as I need more of them (one for each
>>>>> thread) for fast mutexes - to avoid fiddling with kernel pointers in
>>>>> userland.
>>>> Ok. You will have a problem mangling a registry handle with the claimed
>>>> bit. Or maybe we can assume that the bit 31 is not used or something ?
>>> That's precisely my plan, use the highest bit (2^32 registry slots are
>>> fairly unlikely even on 64 bit).
>>>
>>>> And by the way, I had an idea of removing the duplication of the owner
>>>> field between an xnsynch and a mutex object, this would allow saving a
>>>> syscall when a situation of mutex stealing happened. Using a handle
>>>> would prevent this. But I am not so sure it is a good idea now (namely
>>>> because it would move some compare-and-swap the owner logic to the
>>>> xnsynch API).
>>> How could you save one of the two syscalls on lock stealing? By
>>> introducing another bit in the fast lock word that indicates something
>>> like XNWAKEN? On first sight, this shouldn't require moving everything
>>> into xnsynch (though generic fast locks were not that bad...) nor
>>> interfere with handle-based lock words.
>> The problem is that when the thread that did the stealing unlocks the
>> mutex, xnsynch_wakeup_one_sleeper must be called to set the xnsynch
>> owner to NULL, so that the robbed thread will succeed in getting the
>> xnsynch. But for xnsynch_wakeup_one_sleeper to be called, we must issue
>> the syscall. If the owner was shared between the mutex and the xnsynch,
>> the owner could be set to NULL by the mutex unlock from user-space.
> 
> That is what the "sleepers" field in the pse51_mutex_t structure is for.
> 

OK, this all sounds like fast-lock awareness would have to be taught to
xnsynch first. But that would also open the chance to teach it that
handles are stored inside the lock word, no pointers.

However, that's stuff for a second round. I will have to focus on
getting the native skin straight. Well, maybe this will already
introduce thread handles to the POSIX skin (due to common
__xn_sys_current)...

Jan

-- 
Siemens AG, Corporate Technology, CT SE 2
Corporate Competence Center Embedded Linux


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Xenomai-core] xnregistry_fetch & friends
  2008-08-26 13:32                     ` Jan Kiszka
@ 2008-08-26 13:38                       ` Gilles Chanteperdrix
  0 siblings, 0 replies; 14+ messages in thread
From: Gilles Chanteperdrix @ 2008-08-26 13:38 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai-core

Jan Kiszka wrote:
> OK, this all sounds like fast-lock awareness would have to be taught
> to xnsynch first. But that would also open the chance to teach it
> that handles are stored inside the lock word, no pointers.

That could be done too... But that would be really a critical change,
with updates in all skins.

> However, that's stuff for a second round.

Ok. No problem, but keep the pitfall in mind.

> I will have to focus on getting the native skin straight. Well, maybe
> this will already
> introduce thread handles to the POSIX skin (due to common 
> __xn_sys_current)...

Please, yes, do it, avoid implementing an __xn_sys_current_bis that
would return handles instead of pointers.

-- 
                                                 Gilles.


^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2008-08-26 13:38 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-25 20:19 [Xenomai-core] xnregistry_fetch & friends Jan Kiszka
2008-08-25 22:11 ` Philippe Gerum
2008-08-25 22:58   ` Jan Kiszka
2008-08-26  8:06     ` Philippe Gerum
2008-08-26  8:27       ` Jan Kiszka
2008-08-26  8:41         ` Philippe Gerum
2008-08-26  8:52           ` Jan Kiszka
2008-08-26  9:09             ` Philippe Gerum
2008-08-26 12:49             ` Gilles Chanteperdrix
2008-08-26 13:08               ` Jan Kiszka
2008-08-26 13:13                 ` Gilles Chanteperdrix
2008-08-26 13:18                   ` Gilles Chanteperdrix
2008-08-26 13:32                     ` Jan Kiszka
2008-08-26 13:38                       ` Gilles Chanteperdrix

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.