All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq
@ 2007-01-10 11:59 M. Koehrer
  2007-01-10 12:35 ` Jan Kiszka
  0 siblings, 1 reply; 17+ messages in thread
From: M. Koehrer @ 2007-01-10 11:59 UTC (permalink / raw)
  To: xenomai


[-- Attachment #1.1: Type: text/plain, Size: 2460 bytes --]

Hi all,

I am just trying out the interrupt mechanism of Xenomai.
For that, I have create a kernel module that uses rt_intr_create (from the native skin) to
create an IRQ handler. So far that looks fine.
However, I noticed, that I have to pass a non-NULL argument  name to rt_intr_create().
Otherwise, cat /proc/xenomai/irq crashes with a kernel oops.
I think this is a bug as the API documentation allows the usage of a NULL name in rt_intr_create.
Probably, the zero pointer will not be checked in the proc reading function.
I am using 2.6.19.1 on a Pentium 4 (UP) with Xenomai 2.3.

I have enclosed a minimum kernel module that leads to a kernel oops to see the effect.

Here is the kernel oops:
---------- BEGIN ----------
BUG: unable to handle kernel NULL pointer dereference at virtual address 0000000
0
 printing eip:
*pde = 00000000
Oops: 0000 [#1]
PREEMPT
Modules linked in: irqtest e1000
CPU:    0
EIP:    0060:[<c0144daf>]    Not tainted VLI
EFLAGS: 00010046   (2.6.19.1 #5)
EIP is at xnintr_irq_proc+0x8c/0xcd
eax: d881a02a   ebx: d881a021   ecx: 00000580   edx: e097770c
esi: 00000000   edi: d881a02a   ebp: 00000000   esp: d9443ee4
ds: 007b   es: 007b   ss: 0068
Process cat (pid: 2480, ti=d9442000 task=c15c6030 task.ti=d9442000)
Stack: d881a015 0000000b 00000580 d881a02a c0261afb d881a015 d881a021 0000000b
       00000580 d881a000 c0145836 0000000b d881a021 00000000 d9443fa4 00000400
       d881a000 00000400 c01bced0 d881a000 d9443f50 00000000 00000400 d9443f54
Call Trace:
 [<c0261afb>] sprintf+0x2b/0x2f
 [<c0145836>] irq_read_proc+0x85/0xea
 [<c01bced0>] proc_file_read+0x11c/0x24c
 [<c0185fc7>] vfs_read+0xa0/0x170
 [<c0186407>] sys_read+0x4b/0x71
 [<c0103146>] syscall_call+0x7/0xb
 =======================
Code: 83 e5 01 c1 e1 07 8b 91 8c e5 4c c0 89 de 85 d2 74 34 be 3f 27 3e c0 89 df
 ac aa 84 c0 75 fa 8d 43 09 89 44 24 0c 8b 72 18 89 c7 <ac> aa 84 c0 75 fa 8b 52
 18 31 c0 83 c9 ff 89 d7 f2 ae f7 d1 49
EIP: [<c0144daf>] xnintr_irq_proc+0x8c/0xcd SS:ESP 0068:d9443ee4
--------- END ---------------

Regards

Mathias



-- 
Mathias Koehrer
mathias_koehrer@domain.hid


Viel oder wenig? Schnell oder langsam? Unbegrenzt surfen + telefonieren
ohne Zeit- und Volumenbegrenzung? DAS TOP ANGEBOT JETZT bei Arcor: günstig
und schnell mit DSL - das All-Inclusive-Paket für clevere Doppel-Sparer,
nur  44,85 €  inkl. DSL- und ISDN-Grundgebühr!
http://www.arcor.de/rd/emf-dsl-2

[-- Attachment #2: irqtest.tgz --]
[-- Type: application/octet-stream, Size: 731 bytes --]

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

* Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq
  2007-01-10 11:59 [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq M. Koehrer
@ 2007-01-10 12:35 ` Jan Kiszka
  2007-01-10 13:49   ` Dmitry Adamushko
  0 siblings, 1 reply; 17+ messages in thread
From: Jan Kiszka @ 2007-01-10 12:35 UTC (permalink / raw)
  To: M. Koehrer; +Cc: xenomai


[-- Attachment #1.1: Type: text/plain, Size: 1072 bytes --]

M. Koehrer wrote:
> Hi all,
> 
> I am just trying out the interrupt mechanism of Xenomai.
> For that, I have create a kernel module that uses rt_intr_create (from the native skin) to
> create an IRQ handler. So far that looks fine.
> However, I noticed, that I have to pass a non-NULL argument  name to rt_intr_create().
> Otherwise, cat /proc/xenomai/irq crashes with a kernel oops.
> I think this is a bug as the API documentation allows the usage of a NULL name in rt_intr_create.
> Probably, the zero pointer will not be checked in the proc reading function.
> I am using 2.6.19.1 on a Pentium 4 (UP) with Xenomai 2.3.
> 
> I have enclosed a minimum kernel module that leads to a kernel oops to see the effect.
> 

Untested, but this patch should fix the issue - also for RTDM drivers
passing a NULL name to rtdm_irq_request (which was not forbidden so far
too). Nevertheless, passing a name is recommended to ease the system
diagnosis. Maybe the native doc should be changed in this regard too (I
already did so for RTDM in 2.3 and trunk).

Jan

[-- Attachment #1.2: xnintr-handle-NULL-name.patch --]
[-- Type: text/plain, Size: 1293 bytes --]

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 2056)
+++ ChangeLog	(working copy)
@@ -1,3 +1,8 @@
+2007-01-10  Jan Kiszka  <jan.kiszka@domain.hid>
+
+	* ksrc/nucleus/intr.c (xnintr_init): Always set xnintr::name to
+	non-NULL content.
+
 2007-01-04  Philippe Gerum  <rpm@xenomai.org>
 
 	* include/nucleus/timebase.h (xntbase_convert): Add time base
Index: ksrc/nucleus/intr.c
===================================================================
--- ksrc/nucleus/intr.c	(revision 2056)
+++ ksrc/nucleus/intr.c	(working copy)
@@ -490,7 +490,7 @@ int xnintr_mount(void) { return 0; }
  * therefore it must be allocated in permanent memory.
  *
  * @param name An ASCII string standing for the symbolic name of the
- * interrupt object.
+ * interrupt object or NULL ("<unknown>" will be applied then).
  *
  * @param irq The hardware interrupt channel associated with the
  * interrupt object. This value is architecture-dependent. An
@@ -541,7 +541,7 @@ int xnintr_init(xnintr_t *intr,
 	intr->isr = isr;
 	intr->iack = iack;
 	intr->cookie = NULL;
-	intr->name = name;
+	intr->name = name ? : "<unknown>";
 	intr->flags = flags;
 	intr->unhandled = 0;
 	memset(&intr->stat, 0, sizeof(intr->stat));

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

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

* Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq
  2007-01-10 12:35 ` Jan Kiszka
@ 2007-01-10 13:49   ` Dmitry Adamushko
  2007-01-10 14:00     ` Jan Kiszka
  0 siblings, 1 reply; 17+ messages in thread
From: Dmitry Adamushko @ 2007-01-10 13:49 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Xenomai help

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

Hi,

I suppose, one more thing was missed. intr_reg.patch is to address it.

intr_swap.patch - to be safe with xnintr_t::name in all cases. In
particular, the reported crash should disappear without other
additional patches.


-- 
Best regards,
Dmitry Adamushko

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: intr_reg.patch --]
[-- Type: text/x-patch; name="intr_reg.patch", Size: 1137 bytes --]

--- ./ksrc/skins/native/intr.c	2006-06-15 14:15:44.000000000 +0200
+++ ./ksrc/skins/native/intr-new.c	2007-01-10 14:45:26.320565000 +0100
@@ -223,6 +223,7 @@ static xnpnode_t __intr_pnode = {
  *
  * - Kernel module initialization/cleanup code
  * - Kernel-based task
+ * - User-space task
  *
  * Rescheduling: possible.
  *
@@ -262,11 +263,21 @@ int rt_intr_create(RT_INTR *intr,
 	/* <!> Since xnregister_enter() may reschedule, only register
 	   complete objects, so that the registry cannot return handles to
 	   half-baked objects... */
+	if (!err && name) {
+		xnpnode_t *pnode = &__intr_pnode;
 
-	if (!err)
-		err =
-		    xnregistry_enter(intr->name, intr, &intr->handle,
-				     &__intr_pnode);
+		if (!*name) {
+			/* Since this is an anonymous object (empty name on entry)
+			 * from user-space, it gets registered under an unique
+			 * internal name but is not exported through /proc. */
+			xnobject_create_name(intr->name, sizeof(intr->name),
+				(void *)intr);
+			pnode = NULL;
+		}
+
+		err = xnregistry_enter(intr->name, intr, &intr->handle, pnode);
+	}	
+	
 #endif /* CONFIG_XENO_OPT_REGISTRY */
 
 	if (err)

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: intr_swap.patch --]
[-- Type: text/x-patch; name="intr_swap.patch", Size: 542 bytes --]

--- ./ksrc/skins/native/intr-new.c	2007-01-10 14:45:26.320565000 +0100
+++ ./ksrc/skins/native/intr-new2.c	2007-01-10 14:46:08.319442000 +0100
@@ -242,8 +242,8 @@ int rt_intr_create(RT_INTR *intr,
 	if (xnpod_asynch_p())
 		return -EPERM;
 
-	xnintr_init(&intr->intr_base, name, irq, isr, iack, mode);
 	xnobject_copy_name(intr->name, name);
+	xnintr_init(&intr->intr_base, intr->name, irq, isr, iack, mode);
 #if defined(__KERNEL__) && defined(CONFIG_XENO_OPT_PERVASIVE)
 	xnsynch_init(&intr->synch_base, XNSYNCH_PRIO);
 	intr->pending = 0;

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

* Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq
  2007-01-10 13:49   ` Dmitry Adamushko
@ 2007-01-10 14:00     ` Jan Kiszka
  2007-01-10 14:19       ` Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads M. Koehrer
  2007-01-10 14:21       ` [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq Dmitry Adamushko
  0 siblings, 2 replies; 17+ messages in thread
From: Jan Kiszka @ 2007-01-10 14:00 UTC (permalink / raw)
  To: Dmitry Adamushko; +Cc: Xenomai help

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

Dmitry Adamushko wrote:
> Hi,
> 
> I suppose, one more thing was missed. intr_reg.patch is to address it.
> 
> intr_swap.patch - to be safe with xnintr_t::name in all cases. In
> particular, the reported crash should disappear without other
> additional patches.
> 
> 
> 
> ------------------------------------------------------------------------
> 
> --- ./ksrc/skins/native/intr.c	2006-06-15 14:15:44.000000000 +0200
> +++ ./ksrc/skins/native/intr-new.c	2007-01-10 14:45:26.320565000 +0100
> @@ -223,6 +223,7 @@ static xnpnode_t __intr_pnode = {
>   *
>   * - Kernel module initialization/cleanup code
>   * - Kernel-based task
> + * - User-space task
>   *
>   * Rescheduling: possible.
>   *
> @@ -262,11 +263,21 @@ int rt_intr_create(RT_INTR *intr,
>  	/* <!> Since xnregister_enter() may reschedule, only register
>  	   complete objects, so that the registry cannot return handles to
>  	   half-baked objects... */
> +	if (!err && name) {
> +		xnpnode_t *pnode = &__intr_pnode;
>  
> -	if (!err)
> -		err =
> -		    xnregistry_enter(intr->name, intr, &intr->handle,
> -				     &__intr_pnode);
> +		if (!*name) {
> +			/* Since this is an anonymous object (empty name on entry)

Isn't a NULL name representing an anonymous object as well?

> +			 * from user-space, it gets registered under an unique
> +			 * internal name but is not exported through /proc. */
> +			xnobject_create_name(intr->name, sizeof(intr->name),
> +				(void *)intr);
> +			pnode = NULL;
> +		}
> +
> +		err = xnregistry_enter(intr->name, intr, &intr->handle, pnode);
> +	}	
> +	
>  #endif /* CONFIG_XENO_OPT_REGISTRY */
>  
>  	if (err)
> 
> 
> ------------------------------------------------------------------------
> 
> --- ./ksrc/skins/native/intr-new.c	2007-01-10 14:45:26.320565000 +0100
> +++ ./ksrc/skins/native/intr-new2.c	2007-01-10 14:46:08.319442000 +0100
> @@ -242,8 +242,8 @@ int rt_intr_create(RT_INTR *intr,
>  	if (xnpod_asynch_p())
>  		return -EPERM;
>  
> -	xnintr_init(&intr->intr_base, name, irq, isr, iack, mode);
>  	xnobject_copy_name(intr->name, name);
> +	xnintr_init(&intr->intr_base, intr->name, irq, isr, iack, mode);

This will set xnintr_t::name to "" if name is NULL - intentionally?

Jan


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

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

* Re: Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads
  2007-01-10 14:00     ` Jan Kiszka
@ 2007-01-10 14:19       ` M. Koehrer
  2007-01-10 14:35         ` Dmitry Adamushko
  2007-01-10 14:21       ` [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq Dmitry Adamushko
  1 sibling, 1 reply; 17+ messages in thread
From: M. Koehrer @ 2007-01-10 14:19 UTC (permalink / raw)
  To: jan.kiszka, dmitry.adamushko; +Cc: xenomai

Hi,

one more comment on this issue:
Regarding to the API documentation it is not required to use a static allocated
string for the name parameter
(API docu: "When non-NULL and non-empty, this string is copied to a safe place into the descriptor").

However, when I use a name variable that is created on the stack (using sprintf), I see
that the /proc/xenomai/registry/native/interrupts/xxx  name is fine, however the name in 
/proc/xenomai/irq is not valid.
I.e. I have to use a static name variable to pass to rt_inter_create() as the name pointer
seems to be used without a copy action in /proc/xenomai/irq.


Regards

Mathias
> > Hi,
> > 
> > I suppose, one more thing was missed. intr_reg.patch is to address it.
> > 
> > intr_swap.patch - to be safe with xnintr_t::name in all cases. In
> > particular, the reported crash should disappear without other
> > additional patches.
> > 
> > 
> > 
> > ------------------------------------------------------------------------
> > 
> > --- ./ksrc/skins/native/intr.c	2006-06-15 14:15:44.000000000 +0200
> > +++ ./ksrc/skins/native/intr-new.c	2007-01-10 14:45:26.320565000 +0100
> > @@ -223,6 +223,7 @@ static xnpnode_t __intr_pnode = {
> >   *
> >   * - Kernel module initialization/cleanup code
> >   * - Kernel-based task
> > + * - User-space task
> >   *
> >   * Rescheduling: possible.
> >   *
> > @@ -262,11 +263,21 @@ int rt_intr_create(RT_INTR *intr,
> >  	/* <!> Since xnregister_enter() may reschedule, only register
> >  	   complete objects, so that the registry cannot return handles to
> >  	   half-baked objects... */
> > +	if (!err && name) {
> > +		xnpnode_t *pnode = &__intr_pnode;
> >  
> > -	if (!err)
> > -		err =
> > -		    xnregistry_enter(intr->name, intr, &intr->handle,
> > -				     &__intr_pnode);
> > +		if (!*name) {
> > +			/* Since this is an anonymous object (empty name on entry)
> 
> Isn't a NULL name representing an anonymous object as well?
> 
> > +			 * from user-space, it gets registered under an unique
> > +			 * internal name but is not exported through /proc. */
> > +			xnobject_create_name(intr->name, sizeof(intr->name),
> > +				(void *)intr);
> > +			pnode = NULL;
> > +		}
> > +
> > +		err = xnregistry_enter(intr->name, intr, &intr->handle, pnode);
> > +	}	
> > +	
> >  #endif /* CONFIG_XENO_OPT_REGISTRY */
> >  
> >  	if (err)
> > 
> > 
> > ------------------------------------------------------------------------
> > 
> > --- ./ksrc/skins/native/intr-new.c	2007-01-10 14:45:26.320565000 +0100
> > +++ ./ksrc/skins/native/intr-new2.c	2007-01-10 14:46:08.319442000 +0100
> > @@ -242,8 +242,8 @@ int rt_intr_create(RT_INTR *intr,
> >  	if (xnpod_asynch_p())
> >  		return -EPERM;
> >  
> > -	xnintr_init(&intr->intr_base, name, irq, isr, iack, mode);
> >  	xnobject_copy_name(intr->name, name);
> > +	xnintr_init(&intr->intr_base, intr->name, irq, isr, iack, mode);
> 
> This will set xnintr_t::name to "" if name is NULL - intentionally?
> 
> Jan
> 
> 

-- 
Mathias Koehrer
mathias_koehrer@domain.hid


Viel oder wenig? Schnell oder langsam? Unbegrenzt surfen + telefonieren
ohne Zeit- und Volumenbegrenzung? DAS TOP ANGEBOT JETZT bei Arcor: günstig
und schnell mit DSL - das All-Inclusive-Paket für clevere Doppel-Sparer,
nur  44,85 €  inkl. DSL- und ISDN-Grundgebühr!
http://www.arcor.de/rd/emf-dsl-2


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

* Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq
  2007-01-10 14:00     ` Jan Kiszka
  2007-01-10 14:19       ` Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads M. Koehrer
@ 2007-01-10 14:21       ` Dmitry Adamushko
  2007-01-10 14:29         ` Dmitry Adamushko
  2007-01-10 14:35         ` Jan Kiszka
  1 sibling, 2 replies; 17+ messages in thread
From: Dmitry Adamushko @ 2007-01-10 14:21 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Xenomai help

> > +     if (!err && name) {
> > +             xnpnode_t *pnode = &__intr_pnode;
> >
> > -     if (!err)
> > -             err =
> > -                 xnregistry_enter(intr->name, intr, &intr->handle,
> > -                                  &__intr_pnode);
> > +             if (!*name) {
> > +                     /* Since this is an anonymous object (empty name on entry)
>
> Isn't a NULL name representing an anonymous object as well?

Anonymous objects are supported only for user-space clients.
We agreed on it with Philippe when similar code was introduced for
other objects. In this case, name is not NULL but "\0" on entry of
native::rt_object_create (object = mutex,event,etc.).

Now, don't ask me why the same is not applicable for the kernel-side
objects as I'll have to think about it (can't recall right now) and
may overheat. Likely, just some political issues. Yes, we want to make
life of kernel-side developers a bit more difficult. Namely, want an
object to be exported via registry? Give a valid name upon its
creation.

> > -     xnintr_init(&intr->intr_base, name, irq, isr, iack, mode);
> >       xnobject_copy_name(intr->name, name);
> > +     xnintr_init(&intr->intr_base, intr->name, irq, isr, iack, mode);
>
> This will set xnintr_t::name to "" if name is NULL - intentionally?

xnintr_t::name becomes a reference to RT_INTR::name. The later one
exists as long as the former anyway so there shoudn't be a broken
reference.

Just in case xnintr::name is used somewhere else, aside of xnintr_irq_proc().

>
> Jan
>


-- 
Best regards,
Dmitry Adamushko


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

* Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq
  2007-01-10 14:21       ` [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq Dmitry Adamushko
@ 2007-01-10 14:29         ` Dmitry Adamushko
  2007-01-10 14:35         ` Jan Kiszka
  1 sibling, 0 replies; 17+ messages in thread
From: Dmitry Adamushko @ 2007-01-10 14:29 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Xenomai help

On 10/01/07, Dmitry Adamushko <dmitry.adamushko@domain.hid> wrote:
> > > +     if (!err && name) {
> > > +             xnpnode_t *pnode = &__intr_pnode;
> > >
> > > -     if (!err)
> > > -             err =
> > > -                 xnregistry_enter(intr->name, intr, &intr->handle,
> > > -                                  &__intr_pnode);
> > > +             if (!*name) {
> > > +                     /* Since this is an anonymous object (empty name on entry)
> >
> > Isn't a NULL name representing an anonymous object as well?
>
> Anonymous objects are supported only for user-space clients.
> We agreed on it with Philippe when similar code was introduced for
> other objects. In this case, name is not NULL but "\0" on entry of
> native::rt_object_create (object = mutex,event,etc.).
>
> Now, don't ask me why the same is not applicable for the kernel-side
> objects as I'll have to think about it (can't recall right now) and
> may overheat. Likely, just some political issues. Yes, we want to make
> life of kernel-side developers a bit more difficult. Namely, want an
> object to be exported via registry? Give a valid name upon its
> creation.
>

Although, intr objects would be an exception. As their names are
visible not only through the register but also through
/proc/xenomai/irq. On the other hand, showing something like 81234560
(an address of the object - if we use xnobject_create_name) instead
wouldn't be of any great avail?
Ah, at least one would see how many "anonymous" kernel-side handlers
are attached to the line.


-- 
Best regards,
Dmitry Adamushko


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

* Re: Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads
  2007-01-10 14:19       ` Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads M. Koehrer
@ 2007-01-10 14:35         ` Dmitry Adamushko
  0 siblings, 0 replies; 17+ messages in thread
From: Dmitry Adamushko @ 2007-01-10 14:35 UTC (permalink / raw)
  To: M. Koehrer; +Cc: Xenomai help, Jan Kiszka

On 10/01/07, M. Koehrer <mathias_koehrer@domain.hid> wrote:
> Hi,
>
> one more comment on this issue:
> Regarding to the API documentation it is not required to use a static allocated
> string for the name parameter
> (API docu: "When non-NULL and non-empty, this string is copied to a safe place into the descriptor").
>
> However, when I use a name variable that is created on the stack (using sprintf), I see
> that the /proc/xenomai/registry/native/interrupts/xxx  name is fine, however the name in
> /proc/xenomai/irq is not valid.
> I.e. I have to use a static name variable to pass to rt_inter_create() as the name pointer
> seems to be used without a copy action in /proc/xenomai/irq.

You didn't apply the patches I sent, did you?

The second patch (intr_swap.patch) should address this issue.


-- 
Best regards,
Dmitry Adamushko


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

* Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq
  2007-01-10 14:21       ` [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq Dmitry Adamushko
  2007-01-10 14:29         ` Dmitry Adamushko
@ 2007-01-10 14:35         ` Jan Kiszka
  2007-01-10 14:55           ` Dmitry Adamushko
  1 sibling, 1 reply; 17+ messages in thread
From: Jan Kiszka @ 2007-01-10 14:35 UTC (permalink / raw)
  To: Dmitry Adamushko; +Cc: Xenomai help

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

Dmitry Adamushko wrote:
>> > +     if (!err && name) {
>> > +             xnpnode_t *pnode = &__intr_pnode;
>> >
>> > -     if (!err)
>> > -             err =
>> > -                 xnregistry_enter(intr->name, intr, &intr->handle,
>> > -                                  &__intr_pnode);
>> > +             if (!*name) {
>> > +                     /* Since this is an anonymous object (empty
>> name on entry)
>>
>> Isn't a NULL name representing an anonymous object as well?
> 
> Anonymous objects are supported only for user-space clients.
> We agreed on it with Philippe when similar code was introduced for
> other objects. In this case, name is not NULL but "\0" on entry of
> native::rt_object_create (object = mutex,event,etc.).

OK, I see.

> 
> Now, don't ask me why the same is not applicable for the kernel-side
> objects as I'll have to think about it (can't recall right now) and
> may overheat. Likely, just some political issues. Yes, we want to make
> life of kernel-side developers a bit more difficult. Namely, want an
> object to be exported via registry? Give a valid name upon its
> creation.
> 
>> > -     xnintr_init(&intr->intr_base, name, irq, isr, iack, mode);
>> >       xnobject_copy_name(intr->name, name);
>> > +     xnintr_init(&intr->intr_base, intr->name, irq, isr, iack, mode);
>>
>> This will set xnintr_t::name to "" if name is NULL - intentionally?
> 
> xnintr_t::name becomes a reference to RT_INTR::name. The later one
> exists as long as the former anyway so there shoudn't be a broken
> reference.

Yes, this specifically addresses Mathias' concern about passed names
that are temporary variables.

It just leaves xnintr_t::name with an emptry string instead of "unknown"
in some cases. Either xnintr_init needs to take care of this, or we
should catch that case already here. I think empty strings in
/proc/xenomai/irq are bad in case of shared IRQ lists.

Jan


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

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

* Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq
  2007-01-10 14:35         ` Jan Kiszka
@ 2007-01-10 14:55           ` Dmitry Adamushko
  2007-01-10 15:13             ` Jan Kiszka
  0 siblings, 1 reply; 17+ messages in thread
From: Dmitry Adamushko @ 2007-01-10 14:55 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Xenomai help

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

> >>
> >> This will set xnintr_t::name to "" if name is NULL - intentionally?
> >
> > xnintr_t::name becomes a reference to RT_INTR::name. The later one
> > exists as long as the former anyway so there shoudn't be a broken
> > reference.
>
> Yes, this specifically addresses Mathias' concern about passed names
> that are temporary variables.
>
> It just leaves xnintr_t::name with an emptry string instead of "unknown"
> in some cases. Either xnintr_init needs to take care of this, or we
> should catch that case already here. I think empty strings in
> /proc/xenomai/irq are bad in case of shared IRQ lists.
>

Yes, this is what I've mentioned as a possible exception in my previous mail.

This patch should address it (although, it makes a code flow a bit
obscure but not too much :)


> Jan
>


-- 
Best regards,
Dmitry Adamushko

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: intr_3.patch --]
[-- Type: text/x-patch; name="intr_3.patch", Size: 737 bytes --]

--- ./ksrc/skins/native/intr-new2.c	2007-01-10 14:46:08.319442000 +0100
+++ ./ksrc/skins/native/intr-new3.c	2007-01-10 15:51:22.933976000 +0100
@@ -242,7 +242,14 @@ int rt_intr_create(RT_INTR *intr,
 	if (xnpod_asynch_p())
 		return -EPERM;
 
-	xnobject_copy_name(intr->name, name);
+	if (name)
+		xnobject_copy_name(intr->name, name);
+	else
+		/* Kernel-side "anonymous" objects (name == NULL) get unique names.
+		 * Nevertheless, they will not be exported via the registry. */
+		xnobject_create_name(intr->name, sizeof(intr->name),
+			(void *)intr);
+
 	xnintr_init(&intr->intr_base, intr->name, irq, isr, iack, mode);
 #if defined(__KERNEL__) && defined(CONFIG_XENO_OPT_PERVASIVE)
 	xnsynch_init(&intr->synch_base, XNSYNCH_PRIO);

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

* Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq
  2007-01-10 14:55           ` Dmitry Adamushko
@ 2007-01-10 15:13             ` Jan Kiszka
  2007-01-10 15:58               ` Dmitry Adamushko
  0 siblings, 1 reply; 17+ messages in thread
From: Jan Kiszka @ 2007-01-10 15:13 UTC (permalink / raw)
  To: Dmitry Adamushko; +Cc: Xenomai help

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

Dmitry Adamushko wrote:
>> >>
>> >> This will set xnintr_t::name to "" if name is NULL - intentionally?
>> >
>> > xnintr_t::name becomes a reference to RT_INTR::name. The later one
>> > exists as long as the former anyway so there shoudn't be a broken
>> > reference.
>>
>> Yes, this specifically addresses Mathias' concern about passed names
>> that are temporary variables.
>>
>> It just leaves xnintr_t::name with an emptry string instead of "unknown"
>> in some cases. Either xnintr_init needs to take care of this, or we
>> should catch that case already here. I think empty strings in
>> /proc/xenomai/irq are bad in case of shared IRQ lists.
>>
> 
> Yes, this is what I've mentioned as a possible exception in my previous
> mail.
> 
> This patch should address it (although, it makes a code flow a bit
> obscure but not too much :)
> 

I'm fine with it.

Mind bundling all the snippets to one complete patch so that people
don't have to collect the pieces?

Thanks,
Jan


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

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

* Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq
  2007-01-10 15:13             ` Jan Kiszka
@ 2007-01-10 15:58               ` Dmitry Adamushko
  2007-01-10 15:59                 ` Dmitry Adamushko
  0 siblings, 1 reply; 17+ messages in thread
From: Dmitry Adamushko @ 2007-01-10 15:58 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Xenomai help

> I'm fine with it.
>
> Mind bundling all the snippets to one complete patch so that people
> don't have to collect the pieces?

Attached. Keep in mind that although it's a simple patch I,
personally, haven't tested it (even compilation-wise).
Anyone who would like to give it a try (Mathias?) is wellcome.


>
> Thanks,
> Jan
>

-- 
Best regards,
Dmitry Adamushko


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

* Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq
  2007-01-10 15:58               ` Dmitry Adamushko
@ 2007-01-10 15:59                 ` Dmitry Adamushko
  2007-01-10 16:32                   ` M. Koehrer
  2007-01-11 19:19                   ` Philippe Gerum
  0 siblings, 2 replies; 17+ messages in thread
From: Dmitry Adamushko @ 2007-01-10 15:59 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Xenomai help

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

>
> Attached. Keep in mind that although it's a simple patch I,
> personally, haven't tested it (even compilation-wise).
> Anyone who would like to give it a try (Mathias?) is wellcome.

Now finally attached.

-- 
Best regards,
Dmitry Adamushko

[-- Attachment #2: intr.patch --]
[-- Type: text/x-patch, Size: 1813 bytes --]

--- ./ksrc/skins/native/intr.c	2006-06-15 14:15:44.000000000 +0200
+++ ./ksrc/skins/native/intr-new3.c	2007-01-10 15:51:22.933976000 +0100
@@ -223,6 +223,7 @@ static xnpnode_t __intr_pnode = {
  *
  * - Kernel module initialization/cleanup code
  * - Kernel-based task
+ * - User-space task
  *
  * Rescheduling: possible.
  *
@@ -241,8 +242,15 @@ int rt_intr_create(RT_INTR *intr,
 	if (xnpod_asynch_p())
 		return -EPERM;
 
-	xnintr_init(&intr->intr_base, name, irq, isr, iack, mode);
-	xnobject_copy_name(intr->name, name);
+	if (name)
+		xnobject_copy_name(intr->name, name);
+	else
+		/* Kernel-side "anonymous" objects (name == NULL) get unique names.
+		 * Nevertheless, they will not be exported via the registry. */
+		xnobject_create_name(intr->name, sizeof(intr->name),
+			(void *)intr);
+
+	xnintr_init(&intr->intr_base, intr->name, irq, isr, iack, mode);
 #if defined(__KERNEL__) && defined(CONFIG_XENO_OPT_PERVASIVE)
 	xnsynch_init(&intr->synch_base, XNSYNCH_PRIO);
 	intr->pending = 0;
@@ -262,11 +270,21 @@ int rt_intr_create(RT_INTR *intr,
 	/* <!> Since xnregister_enter() may reschedule, only register
 	   complete objects, so that the registry cannot return handles to
 	   half-baked objects... */
+	if (!err && name) {
+		xnpnode_t *pnode = &__intr_pnode;
 
-	if (!err)
-		err =
-		    xnregistry_enter(intr->name, intr, &intr->handle,
-				     &__intr_pnode);
+		if (!*name) {
+			/* Since this is an anonymous object (empty name on entry)
+			 * from user-space, it gets registered under an unique
+			 * internal name but is not exported through /proc. */
+			xnobject_create_name(intr->name, sizeof(intr->name),
+				(void *)intr);
+			pnode = NULL;
+		}
+
+		err = xnregistry_enter(intr->name, intr, &intr->handle, pnode);
+	}	
+	
 #endif /* CONFIG_XENO_OPT_REGISTRY */
 
 	if (err)

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

* Re: Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq
  2007-01-10 15:59                 ` Dmitry Adamushko
@ 2007-01-10 16:32                   ` M. Koehrer
  2007-01-11 19:19                   ` Philippe Gerum
  1 sibling, 0 replies; 17+ messages in thread
From: M. Koehrer @ 2007-01-10 16:32 UTC (permalink / raw)
  To: dmitry.adamushko, jan.kiszka; +Cc: xenomai

Hi Dmitry,

I have tested the patch.
Compiling works fine.

Then, I ran the test I have sent to the list.
Now, cat /proc/xenomai/irq works.
I get the output:
--------------
IRQ         CPU0
 11:           0         e0977700
216:         174         [timer]
226:           0         [virtual]
--------------
which seems to be ok.

Then I modified my kernel module to pass a string that is build on the stack.
This works fine as well.

I.e. everything is fixed! Great work.
Thanks for the fast response time!

Best regards

Mathias
> >
> > Attached. Keep in mind that although it's a simple patch I,
> > personally, haven't tested it (even compilation-wise).
> > Anyone who would like to give it a try (Mathias?) is wellcome.
> 
> Now finally attached.
> 
> -- 
> Best regards,
> Dmitry Adamushko
> 

-- 
Mathias Koehrer
mathias_koehrer@domain.hid


Viel oder wenig? Schnell oder langsam? Unbegrenzt surfen + telefonieren
ohne Zeit- und Volumenbegrenzung? DAS TOP ANGEBOT JETZT bei Arcor: günstig
und schnell mit DSL - das All-Inclusive-Paket für clevere Doppel-Sparer,
nur  44,85 €  inkl. DSL- und ISDN-Grundgebühr!
http://www.arcor.de/rd/emf-dsl-2


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

* Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq
  2007-01-10 15:59                 ` Dmitry Adamushko
  2007-01-10 16:32                   ` M. Koehrer
@ 2007-01-11 19:19                   ` Philippe Gerum
  2007-01-11 20:49                     ` Jan Kiszka
  1 sibling, 1 reply; 17+ messages in thread
From: Philippe Gerum @ 2007-01-11 19:19 UTC (permalink / raw)
  To: Dmitry Adamushko; +Cc: Xenomai help, Jan Kiszka

On Wed, 2007-01-10 at 16:59 +0100, Dmitry Adamushko wrote:
> >
> > Attached. Keep in mind that although it's a simple patch I,
> > personally, haven't tested it (even compilation-wise).
> > Anyone who would like to give it a try (Mathias?) is wellcome.
> 
> Now finally attached.
> 

Merged, thanks.

> _______________________________________________
> Xenomai-help mailing list
> Xenomai-help@domain.hid
> https://mail.gna.org/listinfo/xenomai-help
-- 
Philippe.




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

* Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq
  2007-01-11 19:19                   ` Philippe Gerum
@ 2007-01-11 20:49                     ` Jan Kiszka
  2007-01-11 21:01                       ` Philippe Gerum
  0 siblings, 1 reply; 17+ messages in thread
From: Jan Kiszka @ 2007-01-11 20:49 UTC (permalink / raw)
  To: rpm; +Cc: Xenomai help

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

Philippe Gerum wrote:
> On Wed, 2007-01-10 at 16:59 +0100, Dmitry Adamushko wrote:
>>> Attached. Keep in mind that although it's a simple patch I,
>>> personally, haven't tested it (even compilation-wise).
>>> Anyone who would like to give it a try (Mathias?) is wellcome.
>> Now finally attached.
>>
> 
> Merged, thanks.

Please also apply my patch to cover RTDM drivers passing NULL (though
this is discouraged -- now).

Thanks,
Jan


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

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

* Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq
  2007-01-11 20:49                     ` Jan Kiszka
@ 2007-01-11 21:01                       ` Philippe Gerum
  0 siblings, 0 replies; 17+ messages in thread
From: Philippe Gerum @ 2007-01-11 21:01 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Xenomai help

On Thu, 2007-01-11 at 21:49 +0100, Jan Kiszka wrote:
> Philippe Gerum wrote:
> > On Wed, 2007-01-10 at 16:59 +0100, Dmitry Adamushko wrote:
> >>> Attached. Keep in mind that although it's a simple patch I,
> >>> personally, haven't tested it (even compilation-wise).
> >>> Anyone who would like to give it a try (Mathias?) is wellcome.
> >> Now finally attached.
> >>
> > 
> > Merged, thanks.
> 
> Please also apply my patch to cover RTDM drivers passing NULL (though
> this is discouraged -- now).
> 

Ok, merged. Thanks.

> Thanks,
> Jan
> 
-- 
Philippe.




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

end of thread, other threads:[~2007-01-11 21:01 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-01-10 11:59 [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq M. Koehrer
2007-01-10 12:35 ` Jan Kiszka
2007-01-10 13:49   ` Dmitry Adamushko
2007-01-10 14:00     ` Jan Kiszka
2007-01-10 14:19       ` Re: [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads M. Koehrer
2007-01-10 14:35         ` Dmitry Adamushko
2007-01-10 14:21       ` [Xenomai-help] Xenomai Bug: rt_intr_create with NULL-name leads to Kernel oops in /proc/xenomai/irq Dmitry Adamushko
2007-01-10 14:29         ` Dmitry Adamushko
2007-01-10 14:35         ` Jan Kiszka
2007-01-10 14:55           ` Dmitry Adamushko
2007-01-10 15:13             ` Jan Kiszka
2007-01-10 15:58               ` Dmitry Adamushko
2007-01-10 15:59                 ` Dmitry Adamushko
2007-01-10 16:32                   ` M. Koehrer
2007-01-11 19:19                   ` Philippe Gerum
2007-01-11 20:49                     ` Jan Kiszka
2007-01-11 21:01                       ` Philippe Gerum

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.