All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-help] Kernel Oops calling rt_dev_close
@ 2008-09-02  9:50 Steven Kauffmann
  2008-09-02 10:22 ` Jan Kiszka
  0 siblings, 1 reply; 5+ messages in thread
From: Steven Kauffmann @ 2008-09-02  9:50 UTC (permalink / raw)
  To: xenomai

Hi all,

I'm getting Kernel oops when calling rt_dev_close in my application
[*]. The application creates a new real-time task and in this task
rt_dev_recvfrom is waiting for incoming CAN messages.

In the close function of the application I first call rt_dev_close and
after that I kill the thread with rt_task_delete. I also wait for the
termination of this thread with rt_task_join. But when rt_dev_close is
called, the kernel oops occurs.

I'm using the xenomai 2.4.x branch revision 4163 and Linux kernel 2.6.26.3.

Any ideas?

Regards

Steven

[*] Kernel Oops

Xenomai: watchdog triggered -- killing runaway thread 'Read can rtcan0'
Clocksource tsc unstable (delta = 3150076657 ns)
BUG: unable to handle kernel paging request at 00100104
IP: [<f89d159b>] :xeno_can:rtcan_socket_cleanup+0x8e/0xbb
*pde = 00000000
Oops: 0002 [#1] PREEMPT
Modules linked in: xeno_native ext2 dm_mod loop xeno_can_peak_pci
xeno_can_sja1000 xeno_can
intel_agp agpgart xeno_rtdm  ta_piix libata scsi_mod ehci_hcd uhci_hcd
usbcore e1000 ide_cd_mod cdrom

Pid: 3880, comm: unit_test_rtcan Not tainted (2.6.26.3-ipipe-2.0-09 #1)
EIP: 0060:[<f89d159b>] EFLAGS: 00010046 CPU: 0
EIP is at rtcan_socket_cleanup+0x8e/0xbb [xeno_can]
EAX: 00200200 EBX: f7720e28 ECX: 00000000 EDX: 00100100
ESI: 00000001 EDI: 00000000 EBP: 00000000 ESP: f6ecff2c
 DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 0068
Process unit_test_rtcan (pid: 3880, ti=f6ece000 task=f78163a0
task.ti=f6ece000)<0>
I-pipe domain Linux
Stack: f7720e28 00000000 f7720e10 f89d214a f7720e10 00000001 00000000 f88fc1c3
       f78163a0 00000050 f6ecffb8 00000000 00000018 c0139cfc 00000001 00000000
       00000002 c02e6f04 c02e6f00 c012f638 f6ecffb8 00000021 c02e6f00 c0139c6b
Call Trace:
 [<f89d214a>] rtcan_raw_close+0x78/0x7e [xeno_can]
 [<f88fc1c3>] __rt_dev_close+0x8a/0x154 [xeno_rtdm]
 [<c0139cfc>] losyscall_event+0x91/0x13b
 [<c012f638>] __ipipe_dispatch_event+0x96/0x14e
 [<c0139c6b>] losyscall_event+0x0/0x13b
 [<c0109dc3>] __ipipe_syscall_root+0x6f/0xe7
 [<c0102a59>] system_call+0x29/0x4a
 =======================
Code: 75 c7 85 f6 74 9d 8d 83 24 04 00 00 ba 02 00 00 00 e8 92 c3 f2
ff fa 0f ba 2d c0 08 2a c0 00
19 c0 89 c1 83 e1 01 03 00 01 10 00 c7 43 04 00 02 20 00 a1 c0 08
EIP: [<f89d159b>] rtcan_socket_cleanup+0x8e/0xbb [xeno_can] SS:ESP 0068:f6ecff2c
---[ end trace 6b394a1e918d7480 ]---


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

* Re: [Xenomai-help] Kernel Oops calling rt_dev_close
  2008-09-02  9:50 [Xenomai-help] Kernel Oops calling rt_dev_close Steven Kauffmann
@ 2008-09-02 10:22 ` Jan Kiszka
  2008-09-02 12:18   ` Steven Kauffmann
  0 siblings, 1 reply; 5+ messages in thread
From: Jan Kiszka @ 2008-09-02 10:22 UTC (permalink / raw)
  To: Steven Kauffmann; +Cc: xenomai

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

Steven Kauffmann wrote:
> Hi all,
> 
> I'm getting Kernel oops when calling rt_dev_close in my application
> [*]. The application creates a new real-time task and in this task
> rt_dev_recvfrom is waiting for incoming CAN messages.
> 
> In the close function of the application I first call rt_dev_close and
> after that I kill the thread with rt_task_delete. I also wait for the
> termination of this thread with rt_task_join. But when rt_dev_close is
> called, the kernel oops occurs.

Do you have a (small) test case for this issue? Does it work with a
virtual CAN device as well? That would be the fastest way to track down
the issue.

Otherwise, some disassembly of drivers/xenomai/can/rtcan_socket.o would
be nice (objdump -drS). Also, enabling CONFIG_IPIPE_TRACE_PANIC would
enrich the backtrace with some longer function call history. But, again,
local reproducibility would be best.

Jan


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

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

* Re: [Xenomai-help] Kernel Oops calling rt_dev_close
  2008-09-02 10:22 ` Jan Kiszka
@ 2008-09-02 12:18   ` Steven Kauffmann
  2008-09-02 12:29     ` Jan Kiszka
  2008-09-03  6:14     ` Jan Kiszka
  0 siblings, 2 replies; 5+ messages in thread
From: Steven Kauffmann @ 2008-09-02 12:18 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai

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

On Tue, Sep 2, 2008 at 12:22 PM, Jan Kiszka <jan.kiszka@domain.hid> wrote:
> Steven Kauffmann wrote:
>> Hi all,
>>
>> I'm getting Kernel oops when calling rt_dev_close in my application
>> [*]. The application creates a new real-time task and in this task
>> rt_dev_recvfrom is waiting for incoming CAN messages.
>>
>> In the close function of the application I first call rt_dev_close and
>> after that I kill the thread with rt_task_delete. I also wait for the
>> termination of this thread with rt_task_join. But when rt_dev_close is
>> called, the kernel oops occurs.
>
> Do you have a (small) test case for this issue? Does it work with a
> virtual CAN device as well? That would be the fastest way to track down
> the issue.

The test case (see attached file) reproduces the kernel oops.

The kernel oops also occurs when using the virtual CAN device.

> Otherwise, some disassembly of drivers/xenomai/can/rtcan_socket.o would
> be nice (objdump -drS). Also, enabling CONFIG_IPIPE_TRACE_PANIC would
> enrich the backtrace with some longer function call history. But, again,
> local reproducibility would be best.
>
> Jan
>
>

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: rtcan.c --]
[-- Type: text/x-csrc; name=rtcan.c, Size: 1886 bytes --]

#include <rtdm/rtcan.h>
#include <native/task.h>

#include <sys/mman.h>

#define TASK_PRIO  99 /* Highest RT priority */
#define TASK_MODE  T_JOINABLE /* Flags */

RT_TASK task;
RT_TASK read_can_task;

int socket_id;
struct ifreq ifr;
struct sockaddr_can addr;

void read_can() 
{
  struct can_frame frame;
  struct sockaddr_can recvaddr;
  socklen_t addrlen = sizeof(recvaddr);
  while(1)
     rt_dev_recvfrom(socket_id, (void *)&frame, sizeof(can_frame_t), 0,
			       (struct sockaddr *)&recvaddr, &addrlen);
}


int main() {
  int ret;
  
  mlockall(MCL_CURRENT|MCL_FUTURE);

  rt_task_shadow(&task, 0, TASK_PRIO, TASK_MODE);

  socket_id = rt_dev_socket(PF_CAN, SOCK_RAW, CAN_RAW);
  if (socket_id < 0) {
    printf("Cannot open socket, error %d\n", socket_id);
    return -1;
  }

  strcpy(ifr.ifr_name, "rtcan0");

  ret = rt_dev_ioctl(socket_id, SIOCGIFINDEX, &ifr);
  if(ret) {
    printf("rt_dev_ioctl error %d\n", ret);
    return -1;
  }
  
  addr.can_family = AF_CAN;  
  addr.can_ifindex = ifr.ifr_ifindex;
  
  ret = rt_dev_bind(socket_id, (struct sockaddr *)&addr, sizeof(addr));
  if(ret) {
    printf("cannot bind, error %d\n", ret);
    return -1;
  }

  ret = rt_task_create(&read_can_task, "Read can rtcan0", 0, TASK_PRIO, T_JOINABLE);
  if(ret) {
    printf("cannot create task, error %d\n", ret);
    return -1;
  }
  
  ret = rt_task_start(&read_can_task, &read_can, NULL);
  if(ret) {
    printf("Cannot start task, error %d\n", ret);
    return -1;
  }
  
  sleep(2);
  
  ret = rt_dev_close(socket_id);
  if(ret) {
    printf("Cannot close socket, error %d\n", ret);
    return -1;
  }

  ret = rt_task_delete(&read_can_task);
  if(ret) {
    printf("Error while deleting the RT task %d\n", ret);
    return -1;
  }

  ret = rt_task_join(&read_can_task);
  if(ret) {
    printf("Error while joining the RT task %d\n", ret);
    return -1;
  }

  return 0;
}

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

* Re: [Xenomai-help] Kernel Oops calling rt_dev_close
  2008-09-02 12:18   ` Steven Kauffmann
@ 2008-09-02 12:29     ` Jan Kiszka
  2008-09-03  6:14     ` Jan Kiszka
  1 sibling, 0 replies; 5+ messages in thread
From: Jan Kiszka @ 2008-09-02 12:29 UTC (permalink / raw)
  To: Steven Kauffmann; +Cc: xenomai

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

Steven Kauffmann wrote:
> On Tue, Sep 2, 2008 at 12:22 PM, Jan Kiszka <jan.kiszka@domain.hid> wrote:
>> Steven Kauffmann wrote:
>>> Hi all,
>>>
>>> I'm getting Kernel oops when calling rt_dev_close in my application
>>> [*]. The application creates a new real-time task and in this task
>>> rt_dev_recvfrom is waiting for incoming CAN messages.
>>>
>>> In the close function of the application I first call rt_dev_close and
>>> after that I kill the thread with rt_task_delete. I also wait for the
>>> termination of this thread with rt_task_join. But when rt_dev_close is
>>> called, the kernel oops occurs.
>> Do you have a (small) test case for this issue? Does it work with a
>> virtual CAN device as well? That would be the fastest way to track down
>> the issue.
> 
> The test case (see attached file) reproduces the kernel oops.

So it's socket closing while some other tasks blocks in recv.

> 
> The kernel oops also occurs when using the virtual CAN device.

Great, will look into this later today.

Jan


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

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

* Re: [Xenomai-help] Kernel Oops calling rt_dev_close
  2008-09-02 12:18   ` Steven Kauffmann
  2008-09-02 12:29     ` Jan Kiszka
@ 2008-09-03  6:14     ` Jan Kiszka
  1 sibling, 0 replies; 5+ messages in thread
From: Jan Kiszka @ 2008-09-03  6:14 UTC (permalink / raw)
  To: Steven Kauffmann; +Cc: xenomai

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

Steven Kauffmann wrote:
> On Tue, Sep 2, 2008 at 12:22 PM, Jan Kiszka <jan.kiszka@domain.hid> wrote:
>> Steven Kauffmann wrote:
>>> Hi all,
>>>
>>> I'm getting Kernel oops when calling rt_dev_close in my application
>>> [*]. The application creates a new real-time task and in this task
>>> rt_dev_recvfrom is waiting for incoming CAN messages.
>>>
>>> In the close function of the application I first call rt_dev_close and
>>> after that I kill the thread with rt_task_delete. I also wait for the
>>> termination of this thread with rt_task_join. But when rt_dev_close is
>>> called, the kernel oops occurs.
>> Do you have a (small) test case for this issue? Does it work with a
>> virtual CAN device as well? That would be the fastest way to track down
>> the issue.
> 
> The test case (see attached file) reproduces the kernel oops.
> 
> The kernel oops also occurs when using the virtual CAN device.

Fixed both in SVN HEAD and 2.4.x. I also happen to fix a nasty 64-bit
issue of RTDM at this chance.

But you now have to fix your test case as well: read_can() will enter a
tight endless loop when you close the socket underneath it and don't
check for the error rt_dev_recvfrom returns.

Jan


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

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

end of thread, other threads:[~2008-09-03  6:14 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-09-02  9:50 [Xenomai-help] Kernel Oops calling rt_dev_close Steven Kauffmann
2008-09-02 10:22 ` Jan Kiszka
2008-09-02 12:18   ` Steven Kauffmann
2008-09-02 12:29     ` Jan Kiszka
2008-09-03  6:14     ` 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.