All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-core] [PATCH] Fix to RTDM open problems
@ 2006-01-27 10:29 Anders Blomdell
  2006-01-27 12:03 ` Jan Kiszka
  0 siblings, 1 reply; 3+ messages in thread
From: Anders Blomdell @ 2006-01-27 10:29 UTC (permalink / raw)
  To: xenomai

When RTDM is exposed to code like this:

   device1 = rt_dev_open("some_device", O_RDWR);
   device2 = rt_dev_open("some_device", O_RDWR);

I get a SEGFAULT, which I attribute to a missing assignment to context_ptr in 
the case when the device is already busy, the lack of this assignment leads to a 
segfault in cleanup_instance.


--- xenomai-2.1-rc2/ksrc/skins/rtdm/core.c~     2006-01-07 18:08:34.000000000 +0100
+++ xenomai-2.1-rc2/ksrc/skins/rtdm/core.c      2006-01-27 11:14:43.000000000 +0100
@@ -136,6 +136,8 @@

          if (context->device) {
              xnlock_put_irqrestore(&rt_dev_lock, s);
+
+            *context_ptr = NULL;
              return -EBUSY;
          }
          context->device = device;



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

* Re: [Xenomai-core] [PATCH] Fix to RTDM open problems
  2006-01-27 10:29 [Xenomai-core] [PATCH] Fix to RTDM open problems Anders Blomdell
@ 2006-01-27 12:03 ` Jan Kiszka
  2006-01-27 12:48   ` Luotao Fu
  0 siblings, 1 reply; 3+ messages in thread
From: Jan Kiszka @ 2006-01-27 12:03 UTC (permalink / raw)
  To: Anders Blomdell; +Cc: xenomai

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

Anders Blomdell wrote:
> When RTDM is exposed to code like this:
> 
>   device1 = rt_dev_open("some_device", O_RDWR);
>   device2 = rt_dev_open("some_device", O_RDWR);
> 
> I get a SEGFAULT, which I attribute to a missing assignment to
> context_ptr in the case when the device is already busy, the lack of
> this assignment leads to a segfault in cleanup_instance.
> 
> 
> --- xenomai-2.1-rc2/ksrc/skins/rtdm/core.c~     2006-01-07
> 18:08:34.000000000 +0100
> +++ xenomai-2.1-rc2/ksrc/skins/rtdm/core.c      2006-01-27
> 11:14:43.000000000 +0100
> @@ -136,6 +136,8 @@
> 
>          if (context->device) {
>              xnlock_put_irqrestore(&rt_dev_lock, s);
> +
> +            *context_ptr = NULL;
>              return -EBUSY;
>          }
>          context->device = device;
> 

Yep, correct. Don't know, I must have smoked something while trying to
fix this bug some weeks ago. Thanks for reporting and also providing a
patch.

I just gave it another try, also re-organising the involved function
create_instance() slightly. Please checkout latest SVN or try the
following patch and let me know if this works now, really.

Thanks again,
Jan


Index: core.c
===================================================================
--- core.c      (revision 475)
+++ core.c      (working copy)
@@ -116,13 +116,13 @@
     spl_t                   s;


+    *context_ptr = NULL;
+
     xnlock_get_irqsave(&rt_fildes_lock, s);

     *fildes_ptr = fildes = free_fildes;
-    if (!fildes) {
+    if (unlikely(!fildes)) {
         xnlock_put_irqrestore(&rt_fildes_lock, s);
-
-        *context_ptr = NULL;
         return -ENFILE;
     }
     free_fildes = fildes->next;
@@ -134,15 +134,13 @@
     if (context) {
         xnlock_get_irqsave(&rt_dev_lock, s);

-        if (context->device) {
+        if (unlikely(context->device)) {
             xnlock_put_irqrestore(&rt_dev_lock, s);
             return -EBUSY;
         }
         context->device = device;

         xnlock_put_irqrestore(&rt_dev_lock, s);
-
-        *context_ptr = context;
     } else {
         if (nrt_mem)
             context = kmalloc(sizeof(struct rtdm_dev_context) +
@@ -150,13 +148,14 @@
         else
             context = xnmalloc(sizeof(struct rtdm_dev_context) +
                                device->context_size);
-        *context_ptr = context;
-        if (!context)
+        if (unlikely(!context))
             return -ENOMEM;

         context->device = device;
     }

+    *context_ptr = context;
+
     context->fd  = get_fd(fildes);
     context->ops = &device->ops;
     atomic_set(&context->close_lock_count, 0);



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

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

* Re: [Xenomai-core] [PATCH] Fix to RTDM open problems
  2006-01-27 12:03 ` Jan Kiszka
@ 2006-01-27 12:48   ` Luotao Fu
  0 siblings, 0 replies; 3+ messages in thread
From: Luotao Fu @ 2006-01-27 12:48 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai

Jan Kiszka schrieb:
..........
> Yep, correct. Don't know, I must have smoked something while trying to
> fix this bug some weeks ago. 
...........

Ah, now I know why it always smells a little funny in your office, must
be good stuff. :-)

SCNR.

Cheers
Fu


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

end of thread, other threads:[~2006-01-27 12:48 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-01-27 10:29 [Xenomai-core] [PATCH] Fix to RTDM open problems Anders Blomdell
2006-01-27 12:03 ` Jan Kiszka
2006-01-27 12:48   ` Luotao Fu

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.