All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-core] Fix rt_task_shadow error path without __thread.
@ 2009-04-02  9:14 Gilles Chanteperdrix
  2009-04-02 16:52 ` Jan Kiszka
  0 siblings, 1 reply; 4+ messages in thread
From: Gilles Chanteperdrix @ 2009-04-02  9:14 UTC (permalink / raw)
  To: xenomai-core


Hi,

it seems that rt_task_shadow currently leaves the self tsd assigned (and
uninitialized) in case of error. So, here is an attempt to fix this
situation:

Index: src/skins/native/task.c
===================================================================
--- src/skins/native/task.c     (revision 4727)
+++ src/skins/native/task.c     (working copy)
@@ -187,15 +187,8 @@

 #ifdef HAVE___THREAD
        self = &__native_self;
-#else /* !HAVE___THREAD */
-       self = pthread_getspecific(__native_tskey);
+#endif /* HAVE___THREAD */

-       if (!self)
-               self = malloc(sizeof(*self));
-
-       pthread_setspecific(__native_tskey, self);
-#endif /* !HAVE___THREAD */
-
        if (task == NULL)
                task = &task_desc; /* Discarded. */

@@ -217,9 +210,13 @@
                                NULL);

        if (!err) {
-               if (self)
-                       *self = *task;
+#ifndef HAVE___THREAD
+               self = malloc(sizeof(*self));

+               pthread_setspecific(__native_tskey, self);
+#endif /* !HAVE___THREAD */
+               *self = *task;
+
                xeno_set_current();

                if (mode & T_WARNSW)


-- 
                                                 Gilles.


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

* Re: [Xenomai-core] Fix rt_task_shadow error path without __thread.
  2009-04-02  9:14 [Xenomai-core] Fix rt_task_shadow error path without __thread Gilles Chanteperdrix
@ 2009-04-02 16:52 ` Jan Kiszka
  2009-04-03 14:22   ` Gilles Chanteperdrix
  0 siblings, 1 reply; 4+ messages in thread
From: Jan Kiszka @ 2009-04-02 16:52 UTC (permalink / raw)
  To: Gilles Chanteperdrix; +Cc: xenomai-core

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

Gilles Chanteperdrix wrote:
> Hi,
> 
> it seems that rt_task_shadow currently leaves the self tsd assigned (and
> uninitialized) in case of error. So, here is an attempt to fix this
> situation:

Good point.

> 
> Index: src/skins/native/task.c
> ===================================================================
> --- src/skins/native/task.c     (revision 4727)
> +++ src/skins/native/task.c     (working copy)
> @@ -187,15 +187,8 @@
> 
>  #ifdef HAVE___THREAD
>         self = &__native_self;
> -#else /* !HAVE___THREAD */
> -       self = pthread_getspecific(__native_tskey);
> +#endif /* HAVE___THREAD */
> 
> -       if (!self)
> -               self = malloc(sizeof(*self));
> -
> -       pthread_setspecific(__native_tskey, self);
> -#endif /* !HAVE___THREAD */
> -
>         if (task == NULL)
>                 task = &task_desc; /* Discarded. */
> 
> @@ -217,9 +210,13 @@
>                                 NULL);
> 
>         if (!err) {
> -               if (self)
> -                       *self = *task;
> +#ifndef HAVE___THREAD
> +               self = malloc(sizeof(*self));

Hmm, this creates a potential relaxation point (and may raise SIGXCPU if
the warn flag is set). I would prefer to keep early allocation and
release the chunk properly on error (as well as reset the tsd).

> 
> +               pthread_setspecific(__native_tskey, self);
> +#endif /* !HAVE___THREAD */
> +               *self = *task;

And if self is NULL, ie. malloc failed for whatever obscure reasons? The
existing code skipped over this, maybe we should actually handle it and
return an error code.

> +
>                 xeno_set_current();
> 
>                 if (mode & T_WARNSW)
> 
> 

Jan


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

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

* Re: [Xenomai-core] Fix rt_task_shadow error path without __thread.
  2009-04-02 16:52 ` Jan Kiszka
@ 2009-04-03 14:22   ` Gilles Chanteperdrix
  2009-04-03 16:34     ` Jan Kiszka
  0 siblings, 1 reply; 4+ messages in thread
From: Gilles Chanteperdrix @ 2009-04-03 14:22 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai-core

Jan Kiszka wrote:
> Gilles Chanteperdrix wrote:
>> Hi,
>>
>> it seems that rt_task_shadow currently leaves the self tsd assigned (and
>> uninitialized) in case of error. So, here is an attempt to fix this
>> situation:
> 
> Good point.
> 
>> Index: src/skins/native/task.c
>> ===================================================================
>> --- src/skins/native/task.c     (revision 4727)
>> +++ src/skins/native/task.c     (working copy)
>> @@ -187,15 +187,8 @@
>>
>>  #ifdef HAVE___THREAD
>>         self = &__native_self;
>> -#else /* !HAVE___THREAD */
>> -       self = pthread_getspecific(__native_tskey);
>> +#endif /* HAVE___THREAD */
>>
>> -       if (!self)
>> -               self = malloc(sizeof(*self));
>> -
>> -       pthread_setspecific(__native_tskey, self);
>> -#endif /* !HAVE___THREAD */
>> -
>>         if (task == NULL)
>>                 task = &task_desc; /* Discarded. */
>>
>> @@ -217,9 +210,13 @@
>>                                 NULL);
>>
>>         if (!err) {
>> -               if (self)
>> -                       *self = *task;
>> +#ifndef HAVE___THREAD
>> +               self = malloc(sizeof(*self));
> 
> Hmm, this creates a potential relaxation point (and may raise SIGXCPU if
> the warn flag is set). I would prefer to keep early allocation and
> release the chunk properly on error (as well as reset the tsd).
> 
>> +               pthread_setspecific(__native_tskey, self);
>> +#endif /* !HAVE___THREAD */
>> +               *self = *task;
> 
> And if self is NULL, ie. malloc failed for whatever obscure reasons? The
> existing code skipped over this, maybe we should actually handle it and
> return an error code.

Ok. Here is a new version which addresses the above critics. Note that 
there is still a potential for SIGXCPU: if the task calling 
rt_task_shadow has already been mapped by another skin, the 
__native_task_create syscall will fail, and free will be called. 
However, such use of rt_task_shadow may be considered a programming 
error, and we may accept a SIGXCPU in such a case.

diff --git a/src/skins/native/task.c b/src/skins/native/task.c
index 905d366..e448576 100644
--- a/src/skins/native/task.c
+++ b/src/skins/native/task.c
@@ -188,10 +188,13 @@ int rt_task_shadow(RT_TASK *task, const char *name, int prio
 #ifdef HAVE___THREAD
        self = &__native_self;
 #else /* !HAVE___THREAD */
-       self = pthread_getspecific(__native_tskey);
+       if (pthread_getspecific(__native_tskey))
+               /* Current task is already a native taks. */
+               return -EBUSY;

+       self = malloc(sizeof(*self));
        if (!self)
-               self = malloc(sizeof(*self));
+               return -ENOMEM;

        pthread_setspecific(__native_tskey, self);
 #endif /* !HAVE___THREAD */
@@ -210,21 +213,30 @@ int rt_task_shadow(RT_TASK *task, const char *name, int prio
        bulk.a5 = (u_long)pthread_self();
        bulk.a6 = (u_long)xeno_init_current_mode();

-       if (!bulk.a6)
-               return -ENOMEM;
+       if (!bulk.a6) {
+               err = -ENOMEM;
+               goto fail;
+       }

        err = XENOMAI_SKINCALL2(__native_muxid, __native_task_create, &bulk,
                                NULL);
+       if (err)
+               goto fail;

-       if (!err) {
-               if (self)
-                       *self = *task;
+       *self = *task;

-               xeno_set_current();
+       xeno_set_current();

-               if (mode & T_WARNSW)
-                       xeno_sigxcpu_no_mlock = 0;
-       }
+       if (mode & T_WARNSW)
+               xeno_sigxcpu_no_mlock = 0;
+
+       return 0;
+
+  fail:
+#ifndef HAVE___THREAD
+       pthread_setspecific(__native_tskey, NULL);
+       free(self);
+#endif  /* !HAVE___THREAD */

        return err;
 }


-- 
					    Gilles.


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

* Re: [Xenomai-core] Fix rt_task_shadow error path without __thread.
  2009-04-03 14:22   ` Gilles Chanteperdrix
@ 2009-04-03 16:34     ` Jan Kiszka
  0 siblings, 0 replies; 4+ messages in thread
From: Jan Kiszka @ 2009-04-03 16:34 UTC (permalink / raw)
  To: Gilles Chanteperdrix; +Cc: xenomai-core

Gilles Chanteperdrix wrote:
> Jan Kiszka wrote:
>> Gilles Chanteperdrix wrote:
>>> Hi,
>>>
>>> it seems that rt_task_shadow currently leaves the self tsd assigned (and
>>> uninitialized) in case of error. So, here is an attempt to fix this
>>> situation:
>> Good point.
>>
>>> Index: src/skins/native/task.c
>>> ===================================================================
>>> --- src/skins/native/task.c     (revision 4727)
>>> +++ src/skins/native/task.c     (working copy)
>>> @@ -187,15 +187,8 @@
>>>
>>>  #ifdef HAVE___THREAD
>>>         self = &__native_self;
>>> -#else /* !HAVE___THREAD */
>>> -       self = pthread_getspecific(__native_tskey);
>>> +#endif /* HAVE___THREAD */
>>>
>>> -       if (!self)
>>> -               self = malloc(sizeof(*self));
>>> -
>>> -       pthread_setspecific(__native_tskey, self);
>>> -#endif /* !HAVE___THREAD */
>>> -
>>>         if (task == NULL)
>>>                 task = &task_desc; /* Discarded. */
>>>
>>> @@ -217,9 +210,13 @@
>>>                                 NULL);
>>>
>>>         if (!err) {
>>> -               if (self)
>>> -                       *self = *task;
>>> +#ifndef HAVE___THREAD
>>> +               self = malloc(sizeof(*self));
>> Hmm, this creates a potential relaxation point (and may raise SIGXCPU if
>> the warn flag is set). I would prefer to keep early allocation and
>> release the chunk properly on error (as well as reset the tsd).
>>
>>> +               pthread_setspecific(__native_tskey, self);
>>> +#endif /* !HAVE___THREAD */
>>> +               *self = *task;
>> And if self is NULL, ie. malloc failed for whatever obscure reasons? The
>> existing code skipped over this, maybe we should actually handle it and
>> return an error code.
> 
> Ok. Here is a new version which addresses the above critics. Note that 
> there is still a potential for SIGXCPU: if the task calling 
> rt_task_shadow has already been mapped by another skin, the 
> __native_task_create syscall will fail, and free will be called. 
> However, such use of rt_task_shadow may be considered a programming 
> error, and we may accept a SIGXCPU in such a case.

Agreed.

> 
> diff --git a/src/skins/native/task.c b/src/skins/native/task.c
> index 905d366..e448576 100644
> --- a/src/skins/native/task.c
> +++ b/src/skins/native/task.c
> @@ -188,10 +188,13 @@ int rt_task_shadow(RT_TASK *task, const char *name, int prio
>  #ifdef HAVE___THREAD
>         self = &__native_self;
>  #else /* !HAVE___THREAD */
> -       self = pthread_getspecific(__native_tskey);
> +       if (pthread_getspecific(__native_tskey))
> +               /* Current task is already a native taks. */
> +               return -EBUSY;
> 
> +       self = malloc(sizeof(*self));
>         if (!self)
> -               self = malloc(sizeof(*self));
> +               return -ENOMEM;
> 
>         pthread_setspecific(__native_tskey, self);
>  #endif /* !HAVE___THREAD */
> @@ -210,21 +213,30 @@ int rt_task_shadow(RT_TASK *task, const char *name, int prio
>         bulk.a5 = (u_long)pthread_self();
>         bulk.a6 = (u_long)xeno_init_current_mode();
> 
> -       if (!bulk.a6)
> -               return -ENOMEM;
> +       if (!bulk.a6) {
> +               err = -ENOMEM;
> +               goto fail;
> +       }
> 
>         err = XENOMAI_SKINCALL2(__native_muxid, __native_task_create, &bulk,
>                                 NULL);
> +       if (err)
> +               goto fail;
> 
> -       if (!err) {
> -               if (self)
> -                       *self = *task;
> +       *self = *task;
> 
> -               xeno_set_current();
> +       xeno_set_current();
> 
> -               if (mode & T_WARNSW)
> -                       xeno_sigxcpu_no_mlock = 0;
> -       }
> +       if (mode & T_WARNSW)
> +               xeno_sigxcpu_no_mlock = 0;
> +
> +       return 0;
> +
> +  fail:
> +#ifndef HAVE___THREAD
> +       pthread_setspecific(__native_tskey, NULL);
> +       free(self);
> +#endif  /* !HAVE___THREAD */
> 
>         return err;
>  }
> 

Looks good to me.

Jan

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


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

end of thread, other threads:[~2009-04-03 16:34 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-02  9:14 [Xenomai-core] Fix rt_task_shadow error path without __thread Gilles Chanteperdrix
2009-04-02 16:52 ` Jan Kiszka
2009-04-03 14:22   ` Gilles Chanteperdrix
2009-04-03 16:34     ` 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.