* [Xenomai-core] [PATCH] Catch multiple xnshadow_map attempts
@ 2008-11-21 10:18 Jan Kiszka
2008-11-21 11:19 ` Philippe Gerum
0 siblings, 1 reply; 8+ messages in thread
From: Jan Kiszka @ 2008-11-21 10:18 UTC (permalink / raw)
To: xenomai-core
My customer managed to find another hidden door to Xenomai's hell:
Trying to create a Xenomai POSIX thread from within a native thread. A
think the other way around would "work" as well. The precise scenario
was native thread -> dlopen(libs that's linked against libpthread_rt) ->
__init_posix_interface -> __wrap_pthread_setschedparam -> oops. That
scenario revealed two more issues in fact.
Here is a patch to remove this hell gate by catching xnshadow_map
invocations from withing already mapped shadow thread.
Jan
---
ChangeLog | 5 +++++
ksrc/nucleus/shadow.c | 5 +++++
2 files changed, 10 insertions(+)
Index: xenomai/ksrc/nucleus/shadow.c
===================================================================
--- xenomai.orig/ksrc/nucleus/shadow.c
+++ xenomai/ksrc/nucleus/shadow.c
@@ -1334,6 +1334,8 @@ void xnshadow_exit(void)
* - -EINVAL is returned if the thread control block does not bear the
* XNSHADOW bit, or if the thread has already been mapped.
*
+ * - -EBUSY is returned if the current Linux task is already mapped.
+ *
* Environments:
*
* This service can be called from:
@@ -1351,6 +1353,9 @@ int xnshadow_map(xnthread_t *thread, xnc
unsigned muxid, magic;
int err;
+ if (xnshadow_thread(current))
+ return -EBUSY;
+
if (!xnthread_test_state(thread, XNSHADOW))
return -EINVAL;
Index: xenomai/ChangeLog
===================================================================
--- xenomai.orig/ChangeLog
+++ xenomai/ChangeLog
@@ -1,3 +1,8 @@
+2008-11-21 Jan Kiszka <jan.kiszka@domain.hid>
+
+ * ksrc/nucleus/shadow.c (xnshadow_map): Reject already mapped
+ tasks with -EBUSY.
+
2008-11-16 Philippe Gerum <rpm@xenomai.org>
* ksrc/arch/blackfin/patches: Upgrade to to
--
Siemens AG, Corporate Technology, CT SE 2 ES-OS
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Xenomai-core] [PATCH] Catch multiple xnshadow_map attempts
2008-11-21 10:18 [Xenomai-core] [PATCH] Catch multiple xnshadow_map attempts Jan Kiszka
@ 2008-11-21 11:19 ` Philippe Gerum
2008-11-21 11:48 ` Jan Kiszka
0 siblings, 1 reply; 8+ messages in thread
From: Philippe Gerum @ 2008-11-21 11:19 UTC (permalink / raw)
To: Jan Kiszka; +Cc: xenomai-core
Jan Kiszka wrote:
> My customer managed to find another hidden door to Xenomai's hell:
> Trying to create a Xenomai POSIX thread from within a native thread. A
> think the other way around would "work" as well. The precise scenario
> was native thread -> dlopen(libs that's linked against libpthread_rt) ->
> __init_posix_interface -> __wrap_pthread_setschedparam -> oops. That
> scenario revealed two more issues in fact.
>
> Here is a patch to remove this hell gate by catching xnshadow_map
> invocations from withing already mapped shadow thread.
>
Any reason why the XNMAPPED predicate did not work in your case?
> Jan
>
> ---
> ChangeLog | 5 +++++
> ksrc/nucleus/shadow.c | 5 +++++
> 2 files changed, 10 insertions(+)
>
> Index: xenomai/ksrc/nucleus/shadow.c
> ===================================================================
> --- xenomai.orig/ksrc/nucleus/shadow.c
> +++ xenomai/ksrc/nucleus/shadow.c
> @@ -1334,6 +1334,8 @@ void xnshadow_exit(void)
> * - -EINVAL is returned if the thread control block does not bear the
> * XNSHADOW bit, or if the thread has already been mapped.
> *
> + * - -EBUSY is returned if the current Linux task is already mapped.
> + *
> * Environments:
> *
> * This service can be called from:
> @@ -1351,6 +1353,9 @@ int xnshadow_map(xnthread_t *thread, xnc
> unsigned muxid, magic;
> int err;
>
> + if (xnshadow_thread(current))
> + return -EBUSY;
> +
> if (!xnthread_test_state(thread, XNSHADOW))
> return -EINVAL;
>
> Index: xenomai/ChangeLog
> ===================================================================
> --- xenomai.orig/ChangeLog
> +++ xenomai/ChangeLog
> @@ -1,3 +1,8 @@
> +2008-11-21 Jan Kiszka <jan.kiszka@domain.hid>
> +
> + * ksrc/nucleus/shadow.c (xnshadow_map): Reject already mapped
> + tasks with -EBUSY.
> +
> 2008-11-16 Philippe Gerum <rpm@xenomai.org>
>
> * ksrc/arch/blackfin/patches: Upgrade to to
--
Philippe.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Xenomai-core] [PATCH] Catch multiple xnshadow_map attempts
2008-11-21 11:19 ` Philippe Gerum
@ 2008-11-21 11:48 ` Jan Kiszka
2008-11-21 14:59 ` Philippe Gerum
0 siblings, 1 reply; 8+ messages in thread
From: Jan Kiszka @ 2008-11-21 11:48 UTC (permalink / raw)
To: rpm; +Cc: xenomai-core
Philippe Gerum wrote:
> Jan Kiszka wrote:
>> My customer managed to find another hidden door to Xenomai's hell:
>> Trying to create a Xenomai POSIX thread from within a native thread. A
>> think the other way around would "work" as well. The precise scenario
>> was native thread -> dlopen(libs that's linked against libpthread_rt) ->
>> __init_posix_interface -> __wrap_pthread_setschedparam -> oops. That
>> scenario revealed two more issues in fact.
>>
>> Here is a patch to remove this hell gate by catching xnshadow_map
>> invocations from withing already mapped shadow thread.
>>
>
> Any reason why the XNMAPPED predicate did not work in your case?
Sorry, which one? Keep in mind that the thread thrown at the second
xnshadow_map is a virgin one, just allocated from scratch.
Jan
>
>> Jan
>>
>> ---
>> ChangeLog | 5 +++++
>> ksrc/nucleus/shadow.c | 5 +++++
>> 2 files changed, 10 insertions(+)
>>
>> Index: xenomai/ksrc/nucleus/shadow.c
>> ===================================================================
>> --- xenomai.orig/ksrc/nucleus/shadow.c
>> +++ xenomai/ksrc/nucleus/shadow.c
>> @@ -1334,6 +1334,8 @@ void xnshadow_exit(void)
>> * - -EINVAL is returned if the thread control block does not bear the
>> * XNSHADOW bit, or if the thread has already been mapped.
>> *
>> + * - -EBUSY is returned if the current Linux task is already mapped.
>> + *
>> * Environments:
>> *
>> * This service can be called from:
>> @@ -1351,6 +1353,9 @@ int xnshadow_map(xnthread_t *thread, xnc
>> unsigned muxid, magic;
>> int err;
>>
>> + if (xnshadow_thread(current))
>> + return -EBUSY;
>> +
>> if (!xnthread_test_state(thread, XNSHADOW))
>> return -EINVAL;
>>
>> Index: xenomai/ChangeLog
>> ===================================================================
>> --- xenomai.orig/ChangeLog
>> +++ xenomai/ChangeLog
>> @@ -1,3 +1,8 @@
>> +2008-11-21 Jan Kiszka <jan.kiszka@domain.hid>
>> +
>> + * ksrc/nucleus/shadow.c (xnshadow_map): Reject already mapped
>> + tasks with -EBUSY.
>> +
>> 2008-11-16 Philippe Gerum <rpm@xenomai.org>
>>
>> * ksrc/arch/blackfin/patches: Upgrade to to
>
>
--
Siemens AG, Corporate Technology, CT SE 2 ES-OS
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Xenomai-core] [PATCH] Catch multiple xnshadow_map attempts
2008-11-21 11:48 ` Jan Kiszka
@ 2008-11-21 14:59 ` Philippe Gerum
2008-11-21 15:03 ` Philippe Gerum
0 siblings, 1 reply; 8+ messages in thread
From: Philippe Gerum @ 2008-11-21 14:59 UTC (permalink / raw)
To: Jan Kiszka; +Cc: xenomai-core
Jan Kiszka wrote:
> Philippe Gerum wrote:
>> Jan Kiszka wrote:
>>> My customer managed to find another hidden door to Xenomai's hell:
>>> Trying to create a Xenomai POSIX thread from within a native thread. A
>>> think the other way around would "work" as well. The precise scenario
>>> was native thread -> dlopen(libs that's linked against libpthread_rt) ->
>>> __init_posix_interface -> __wrap_pthread_setschedparam -> oops. That
>>> scenario revealed two more issues in fact.
>>>
>>> Here is a patch to remove this hell gate by catching xnshadow_map
>>> invocations from withing already mapped shadow thread.
>>>
>> Any reason why the XNMAPPED predicate did not work in your case?
>
> Sorry, which one? Keep in mind that the thread thrown at the second
> xnshadow_map is a virgin one, just allocated from scratch.
>
Ok, got it, it's the converse case, so let's deal for that:
--- ksrc/nucleus/shadow.c (revision 4411)
+++ ksrc/nucleus/shadow.c (working copy)
@@ -1331,7 +1331,7 @@
* case, the real-time mapping operation has failed globally, and no
* Xenomai resource remains attached to it.
*
- * - -EINVAL is returned if the thread control block does not bear the
+ * - -EBUSY is returned if the thread control block does not bear the
* XNSHADOW bit, or if the thread has already been mapped.
*
* Environments:
@@ -1354,8 +1354,8 @@
if (!xnthread_test_state(thread, XNSHADOW))
return -EINVAL;
- if (xnthread_test_state(thread, XNMAPPED))
- return -EINVAL;
+ if (xnshadow_thread(current) || xnthread_test_state(thread, XNMAPPED))
+ return -EBUSY;
if (!access_wok(u_mode, sizeof(*u_mode)))
return -EFAULT;
> Jan
>
>>> Jan
>>>
>>> ---
>>> ChangeLog | 5 +++++
>>> ksrc/nucleus/shadow.c | 5 +++++
>>> 2 files changed, 10 insertions(+)
>>>
>>> Index: xenomai/ksrc/nucleus/shadow.c
>>> ===================================================================
>>> --- xenomai.orig/ksrc/nucleus/shadow.c
>>> +++ xenomai/ksrc/nucleus/shadow.c
>>> @@ -1334,6 +1334,8 @@ void xnshadow_exit(void)
>>> * - -EINVAL is returned if the thread control block does not bear the
>>> * XNSHADOW bit, or if the thread has already been mapped.
>>> *
>>> + * - -EBUSY is returned if the current Linux task is already mapped.
>>> + *
>>> * Environments:
>>> *
>>> * This service can be called from:
>>> @@ -1351,6 +1353,9 @@ int xnshadow_map(xnthread_t *thread, xnc
>>> unsigned muxid, magic;
>>> int err;
>>>
>>> + if (xnshadow_thread(current))
>>> + return -EBUSY;
>>> +
>>> if (!xnthread_test_state(thread, XNSHADOW))
>>> return -EINVAL;
>>>
>>> Index: xenomai/ChangeLog
>>> ===================================================================
>>> --- xenomai.orig/ChangeLog
>>> +++ xenomai/ChangeLog
>>> @@ -1,3 +1,8 @@
>>> +2008-11-21 Jan Kiszka <jan.kiszka@domain.hid>
>>> +
>>> + * ksrc/nucleus/shadow.c (xnshadow_map): Reject already mapped
>>> + tasks with -EBUSY.
>>> +
>>> 2008-11-16 Philippe Gerum <rpm@xenomai.org>
>>>
>>> * ksrc/arch/blackfin/patches: Upgrade to to
>>
>
>
--
Philippe.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Xenomai-core] [PATCH] Catch multiple xnshadow_map attempts
2008-11-21 14:59 ` Philippe Gerum
@ 2008-11-21 15:03 ` Philippe Gerum
2008-11-21 15:23 ` Jan Kiszka
0 siblings, 1 reply; 8+ messages in thread
From: Philippe Gerum @ 2008-11-21 15:03 UTC (permalink / raw)
To: Jan Kiszka; +Cc: xenomai-core
Philippe Gerum wrote:
> Jan Kiszka wrote:
>> Philippe Gerum wrote:
>>> Jan Kiszka wrote:
>>>> My customer managed to find another hidden door to Xenomai's hell:
>>>> Trying to create a Xenomai POSIX thread from within a native thread. A
>>>> think the other way around would "work" as well. The precise scenario
>>>> was native thread -> dlopen(libs that's linked against libpthread_rt) ->
>>>> __init_posix_interface -> __wrap_pthread_setschedparam -> oops. That
>>>> scenario revealed two more issues in fact.
>>>>
>>>> Here is a patch to remove this hell gate by catching xnshadow_map
>>>> invocations from withing already mapped shadow thread.
>>>>
>>> Any reason why the XNMAPPED predicate did not work in your case?
>> Sorry, which one? Keep in mind that the thread thrown at the second
>> xnshadow_map is a virgin one, just allocated from scratch.
>>
>
> Ok, got it, it's the converse case, so let's deal for that:
>
> --- ksrc/nucleus/shadow.c (revision 4411)
> +++ ksrc/nucleus/shadow.c (working copy)
> @@ -1331,7 +1331,7 @@
> * case, the real-time mapping operation has failed globally, and no
> * Xenomai resource remains attached to it.
> *
> - * - -EINVAL is returned if the thread control block does not bear the
> + * - -EBUSY is returned if the thread control block does not bear the
> * XNSHADOW bit, or if the thread has already been mapped.
> *
> * Environments:
> @@ -1354,8 +1354,8 @@
> if (!xnthread_test_state(thread, XNSHADOW))
> return -EINVAL;
>
> - if (xnthread_test_state(thread, XNMAPPED))
> - return -EINVAL;
> + if (xnshadow_thread(current) || xnthread_test_state(thread, XNMAPPED))
> + return -EBUSY;
>
> if (!access_wok(u_mode, sizeof(*u_mode)))
> return -EFAULT;
>
--- ksrc/nucleus/shadow.c (revision 4411)
+++ ksrc/nucleus/shadow.c (working copy)
@@ -1332,8 +1332,10 @@
* Xenomai resource remains attached to it.
*
* - -EINVAL is returned if the thread control block does not bear the
- * XNSHADOW bit, or if the thread has already been mapped.
+ * XNSHADOW bit.
*
+ * - -EBUSY is returned if the thread has already been mapped.
+ *
* Environments:
--
Philippe.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Xenomai-core] [PATCH] Catch multiple xnshadow_map attempts
2008-11-21 15:03 ` Philippe Gerum
@ 2008-11-21 15:23 ` Jan Kiszka
2008-11-21 16:40 ` Philippe Gerum
0 siblings, 1 reply; 8+ messages in thread
From: Jan Kiszka @ 2008-11-21 15:23 UTC (permalink / raw)
To: rpm; +Cc: xenomai-core
Philippe Gerum wrote:
> Philippe Gerum wrote:
>> Jan Kiszka wrote:
>>> Philippe Gerum wrote:
>>>> Jan Kiszka wrote:
>>>>> My customer managed to find another hidden door to Xenomai's hell:
>>>>> Trying to create a Xenomai POSIX thread from within a native thread. A
>>>>> think the other way around would "work" as well. The precise scenario
>>>>> was native thread -> dlopen(libs that's linked against libpthread_rt) ->
>>>>> __init_posix_interface -> __wrap_pthread_setschedparam -> oops. That
>>>>> scenario revealed two more issues in fact.
>>>>>
>>>>> Here is a patch to remove this hell gate by catching xnshadow_map
>>>>> invocations from withing already mapped shadow thread.
>>>>>
>>>> Any reason why the XNMAPPED predicate did not work in your case?
>>> Sorry, which one? Keep in mind that the thread thrown at the second
>>> xnshadow_map is a virgin one, just allocated from scratch.
>>>
>> Ok, got it, it's the converse case, so let's deal for that:
>>
>> --- ksrc/nucleus/shadow.c (revision 4411)
>> +++ ksrc/nucleus/shadow.c (working copy)
>> @@ -1331,7 +1331,7 @@
>> * case, the real-time mapping operation has failed globally, and no
>> * Xenomai resource remains attached to it.
>> *
>> - * - -EINVAL is returned if the thread control block does not bear the
>> + * - -EBUSY is returned if the thread control block does not bear the
>> * XNSHADOW bit, or if the thread has already been mapped.
>> *
>> * Environments:
>> @@ -1354,8 +1354,8 @@
>> if (!xnthread_test_state(thread, XNSHADOW))
>> return -EINVAL;
>>
>> - if (xnthread_test_state(thread, XNMAPPED))
>> - return -EINVAL;
>> + if (xnshadow_thread(current) || xnthread_test_state(thread, XNMAPPED))
>> + return -EBUSY;
>>
>> if (!access_wok(u_mode, sizeof(*u_mode)))
>> return -EFAULT;
>>
>
> --- ksrc/nucleus/shadow.c (revision 4411)
> +++ ksrc/nucleus/shadow.c (working copy)
> @@ -1332,8 +1332,10 @@
> * Xenomai resource remains attached to it.
> *
> * - -EINVAL is returned if the thread control block does not bear the
> - * XNSHADOW bit, or if the thread has already been mapped.
> + * XNSHADOW bit.
> *
> + * - -EBUSY is returned if the thread has already been mapped.
> + *
> * Environments:
The code now returns -EBUSY if someone passes down an already touched
xnthread object - for me a clear case of EINVAL (the object should be a
virgin one). EBUSY should be dedicated to the case that the current
_Linux_task_ is already mapped (to some other xnthread object). I think
my patch is clearer in this respect.
Jan
--
Siemens AG, Corporate Technology, CT SE 2 ES-OS
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Xenomai-core] [PATCH] Catch multiple xnshadow_map attempts
2008-11-21 15:23 ` Jan Kiszka
@ 2008-11-21 16:40 ` Philippe Gerum
2008-11-21 16:45 ` Jan Kiszka
0 siblings, 1 reply; 8+ messages in thread
From: Philippe Gerum @ 2008-11-21 16:40 UTC (permalink / raw)
To: Jan Kiszka; +Cc: xenomai-core
Jan Kiszka wrote:
> Philippe Gerum wrote:
>> Philippe Gerum wrote:
>>> Jan Kiszka wrote:
>>>> Philippe Gerum wrote:
>>>>> Jan Kiszka wrote:
>>>>>> My customer managed to find another hidden door to Xenomai's hell:
>>>>>> Trying to create a Xenomai POSIX thread from within a native thread. A
>>>>>> think the other way around would "work" as well. The precise scenario
>>>>>> was native thread -> dlopen(libs that's linked against libpthread_rt) ->
>>>>>> __init_posix_interface -> __wrap_pthread_setschedparam -> oops. That
>>>>>> scenario revealed two more issues in fact.
>>>>>>
>>>>>> Here is a patch to remove this hell gate by catching xnshadow_map
>>>>>> invocations from withing already mapped shadow thread.
>>>>>>
>>>>> Any reason why the XNMAPPED predicate did not work in your case?
>>>> Sorry, which one? Keep in mind that the thread thrown at the second
>>>> xnshadow_map is a virgin one, just allocated from scratch.
>>>>
>>> Ok, got it, it's the converse case, so let's deal for that:
>>>
>>> --- ksrc/nucleus/shadow.c (revision 4411)
>>> +++ ksrc/nucleus/shadow.c (working copy)
>>> @@ -1331,7 +1331,7 @@
>>> * case, the real-time mapping operation has failed globally, and no
>>> * Xenomai resource remains attached to it.
>>> *
>>> - * - -EINVAL is returned if the thread control block does not bear the
>>> + * - -EBUSY is returned if the thread control block does not bear the
>>> * XNSHADOW bit, or if the thread has already been mapped.
>>> *
>>> * Environments:
>>> @@ -1354,8 +1354,8 @@
>>> if (!xnthread_test_state(thread, XNSHADOW))
>>> return -EINVAL;
>>>
>>> - if (xnthread_test_state(thread, XNMAPPED))
>>> - return -EINVAL;
>>> + if (xnshadow_thread(current) || xnthread_test_state(thread, XNMAPPED))
>>> + return -EBUSY;
>>>
>>> if (!access_wok(u_mode, sizeof(*u_mode)))
>>> return -EFAULT;
>>>
>> --- ksrc/nucleus/shadow.c (revision 4411)
>> +++ ksrc/nucleus/shadow.c (working copy)
>> @@ -1332,8 +1332,10 @@
>> * Xenomai resource remains attached to it.
>> *
>> * - -EINVAL is returned if the thread control block does not bear the
>> - * XNSHADOW bit, or if the thread has already been mapped.
>> + * XNSHADOW bit.
>> *
>> + * - -EBUSY is returned if the thread has already been mapped.
>> + *
>> * Environments:
>
> The code now returns -EBUSY if someone passes down an already touched
> xnthread object - for me a clear case of EINVAL (the object should be a
> virgin one).
That's precisely a case for EBUSY; someone is attempting to reuse a TCB.
EBUSY should be dedicated to the case that the current
> _Linux_task_ is already mapped (to some other xnthread object). I think
> my patch is clearer in this respect.
>
My intent regarding XNMAPPED was precisely to catch that case on the xnthread
struct, returning -EINVAL was a bad idea: this did not convey the right
information. Your addition completes that test by checking the task_struct side
as well. EINVAL should be kept for out-of-bound / badly specified input param;
in the XNMAPPED case, the xnthread struct is ok, but in the wrong state. This is
what EBUSY is supposed to say.
> Jan
>
--
Philippe.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Xenomai-core] [PATCH] Catch multiple xnshadow_map attempts
2008-11-21 16:40 ` Philippe Gerum
@ 2008-11-21 16:45 ` Jan Kiszka
0 siblings, 0 replies; 8+ messages in thread
From: Jan Kiszka @ 2008-11-21 16:45 UTC (permalink / raw)
To: rpm; +Cc: xenomai-core
Philippe Gerum wrote:
> Jan Kiszka wrote:
>> Philippe Gerum wrote:
>>> Philippe Gerum wrote:
>>>> Jan Kiszka wrote:
>>>>> Philippe Gerum wrote:
>>>>>> Jan Kiszka wrote:
>>>>>>> My customer managed to find another hidden door to Xenomai's hell:
>>>>>>> Trying to create a Xenomai POSIX thread from within a native thread. A
>>>>>>> think the other way around would "work" as well. The precise scenario
>>>>>>> was native thread -> dlopen(libs that's linked against libpthread_rt) ->
>>>>>>> __init_posix_interface -> __wrap_pthread_setschedparam -> oops. That
>>>>>>> scenario revealed two more issues in fact.
>>>>>>>
>>>>>>> Here is a patch to remove this hell gate by catching xnshadow_map
>>>>>>> invocations from withing already mapped shadow thread.
>>>>>>>
>>>>>> Any reason why the XNMAPPED predicate did not work in your case?
>>>>> Sorry, which one? Keep in mind that the thread thrown at the second
>>>>> xnshadow_map is a virgin one, just allocated from scratch.
>>>>>
>>>> Ok, got it, it's the converse case, so let's deal for that:
>>>>
>>>> --- ksrc/nucleus/shadow.c (revision 4411)
>>>> +++ ksrc/nucleus/shadow.c (working copy)
>>>> @@ -1331,7 +1331,7 @@
>>>> * case, the real-time mapping operation has failed globally, and no
>>>> * Xenomai resource remains attached to it.
>>>> *
>>>> - * - -EINVAL is returned if the thread control block does not bear the
>>>> + * - -EBUSY is returned if the thread control block does not bear the
>>>> * XNSHADOW bit, or if the thread has already been mapped.
>>>> *
>>>> * Environments:
>>>> @@ -1354,8 +1354,8 @@
>>>> if (!xnthread_test_state(thread, XNSHADOW))
>>>> return -EINVAL;
>>>>
>>>> - if (xnthread_test_state(thread, XNMAPPED))
>>>> - return -EINVAL;
>>>> + if (xnshadow_thread(current) || xnthread_test_state(thread, XNMAPPED))
>>>> + return -EBUSY;
>>>>
>>>> if (!access_wok(u_mode, sizeof(*u_mode)))
>>>> return -EFAULT;
>>>>
>>> --- ksrc/nucleus/shadow.c (revision 4411)
>>> +++ ksrc/nucleus/shadow.c (working copy)
>>> @@ -1332,8 +1332,10 @@
>>> * Xenomai resource remains attached to it.
>>> *
>>> * - -EINVAL is returned if the thread control block does not bear the
>>> - * XNSHADOW bit, or if the thread has already been mapped.
>>> + * XNSHADOW bit.
>>> *
>>> + * - -EBUSY is returned if the thread has already been mapped.
>>> + *
>>> * Environments:
>> The code now returns -EBUSY if someone passes down an already touched
>> xnthread object - for me a clear case of EINVAL (the object should be a
>> virgin one).
>
> That's precisely a case for EBUSY; someone is attempting to reuse a TCB.
>
> EBUSY should be dedicated to the case that the current
>> _Linux_task_ is already mapped (to some other xnthread object). I think
>> my patch is clearer in this respect.
>>
>
> My intent regarding XNMAPPED was precisely to catch that case on the xnthread
> struct, returning -EINVAL was a bad idea: this did not convey the right
> information. Your addition completes that test by checking the task_struct side
> as well. EINVAL should be kept for out-of-bound / badly specified input param;
> in the XNMAPPED case, the xnthread struct is ok, but in the wrong state. This is
> what EBUSY is supposed to say.
Well, OK. But then clarify in the doc that EBUSY is about both the
thread structure and the current Linux task.
Jan
--
Siemens AG, Corporate Technology, CT SE 2 ES-OS
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2008-11-21 16:45 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-21 10:18 [Xenomai-core] [PATCH] Catch multiple xnshadow_map attempts Jan Kiszka
2008-11-21 11:19 ` Philippe Gerum
2008-11-21 11:48 ` Jan Kiszka
2008-11-21 14:59 ` Philippe Gerum
2008-11-21 15:03 ` Philippe Gerum
2008-11-21 15:23 ` Jan Kiszka
2008-11-21 16:40 ` Philippe Gerum
2008-11-21 16:45 ` Jan Kiszka
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.