All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-help] sock_sendmsg() causes crash
@ 2008-10-28 17:41 Alphan Ulusoy
  2008-10-30  9:38 ` Jan Kiszka
  0 siblings, 1 reply; 3+ messages in thread
From: Alphan Ulusoy @ 2008-10-28 17:41 UTC (permalink / raw)
  To: xenomai

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

Hi all,

I' am trying to send small UDP datagrams in a real-time system. I  
can't get a satisfactory performance when I send these packets from a  
userspace Xenomai task using sendto() call.

That's why I tried to code a small kernel module to make some  
measurements. However; whenever
	• A xenomai task
	• An alarm function
	• A thread created with kthread_run() form a xenomai task
that includes the sock_sendmsg() call runs, system crashes. However,  
if a write a regular kernel module, the it works just fine...

Below you can find the code and the crash dump.

Does anyone have any suggestions? Is there any other way that I can  
send a UDP packet from a kernel Xenomai task?


Best regards,

alphan

------- Code ---------

#include "misc_kernel.h"
#include "ncs_const.h"
#include "xenomai.h"
//TODO: Remove unnecessary includes
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kthread.h>

#include <linux/errno.h>
#include <linux/types.h>

#include <linux/netdevice.h>
#include <linux/ip.h>
#include <linux/in.h>

#include <linux/delay.h>

#define TASK_PRIO   		99              			 /* Highest RT priority */
#define TASK_MODE 		T_CPU(0)       	 	/* Bound to CPU #0 */
#define TASK_STKSZ  		32000           			/* Stack size (in bytes) *	
#define ALARM_PERIOD 		1000000000
#define INADDR_SEND 		(unsigned long int)0xC0A80204	//192.168.2.4 in hex
#define CONNECT_PORT 	6355


MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("Kernel UDP Transmission Latency & Jitter Test  
Module");

static RT_ALARM aid;
static RT_TASK tid;
static startMarkFrame currentStartMark;
static struct socket* sock_send;
static struct sockaddr_in addr_send;
static struct msghdr msg;
static struct iovec iov;
static mm_segment_t oldfs;

static void coordTask(void *cookie) {

	printk("\n");
	iov.iov_base = &currentStartMark;
	iov.iov_len = sizeof(currentStartMark);
	
	msg.msg_flags = 0;
	msg.msg_name = &addr_send;
	msg.msg_namelen  = sizeof(struct sockaddr_in);
	msg.msg_control = NULL;
	msg.msg_controllen = 0;
	msg.msg_iov = &iov;
	msg.msg_iovlen = 1;
	msg.msg_control = NULL;
	
	oldfs = get_fs();
	printk("21 ");
	set_fs(KERNEL_DS);
	printk("22 ");
	sock_sendmsg(sock_send,&msg,sizeof(currentStartMark));
	printk("23 ");
	set_fs(oldfs);
	printk("24 ");
	
	currentStartMark.sequenceNumber++;
	printk("25 ");
}

int coordInit(void) {
	
	int err;

	printk("\nStarting Kernel UDP Transmission Test Module...\n");

	/*								*/
	/* Create Socket					*/
	/*								*/	
	if ((err = sock_create(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock_send))  
< 0 )
	{
		printk("sock_create() failed with code: %d\n",err);
		goto fail;
	}
	addr_send.sin_family = AF_INET;
	addr_send.sin_addr.s_addr = htonl(INADDR_SEND);
	addr_send.sin_port = htons(CONNECT_PORT);
	
	if ((err = sock_send->ops->connect(sock_send, (struct sockaddr  
*)&addr_send, sizeof(struct sockaddr), 0) < 0 ))
	{
		printk("connect() failed with code: %d \n",err);
		goto fail;
	}
	

	/*								*/
	/* Initialize variables				*/
	/*								*/
	currentStartMark.frameType = START_MARK_FRAME;
	currentStartMark.sequenceNumber = 0x00;

	
	err = rt_task_create(&tid, "Kenrel UDP Task", TASK_STKSZ, TASK_PRIO,  
TASK_MODE);
	if (err) {
		printk("rt_task_create() failed: code %d\n", err);
		goto fail;
	}
	
	
	rt_task_start(&tid,&coordTask,NULL);
	

fail:

	return err;
	
}

void coordCleanup(void) {
	//rt_alarm_delete(&aid);
	rt_task_delete(&tid);
	printk("\nKernel UDP module removed!\n");
}

module_init(coordInit);
module_exit(coordCleanup);


-------- Stack trace ----------

[  454.999957] Starting Kernel UDP Transmission Test Module...
[  455.021232] 1 2 3 4 5 6 <3>BUG: Unhandled exception over domain  
Xenomai at 0xc0145cfe - switching to ROOT
[  455.021484] Pid: 3643, comm: insmod Not tainted 2.6.26.5 #9
[  455.021558]  [<c0112351>] __ipipe_handle_exception+0x1b1/0x1c0
[  455.021644]  [<c0145cfe>] __ipipe_restore_root+0x1e/0x30
[  455.021724]  [<c03a7633>] error_code+0x6f/0x7c
[  455.021803]  [<c0326c96>] __alloc_skb+0x36/0x120
[  455.021881]  [<c0145cfe>] __ipipe_restore_root+0x1e/0x30
[  455.021960]  [<c0182795>] kmem_cache_alloc+0x55/0xd0
[  455.022001]  [<c0326c96>] __alloc_skb+0x36/0x120
[  455.022001]  [<c0322c08>] sock_alloc_send_skb+0x168/0x1b0
[  455.022001]  [<c0348611>] ip_append_data+0x711/0x970
[  455.022001]  [<c0349540>] ip_generic_getfrag+0x0/0xb0
[  455.022001]  [<c0364730>] udp_sendmsg+0x2f0/0x660
[  455.022001]  [<c036ab37>] inet_sendmsg+0x37/0x70
[  455.022001]  [<c032062e>] sock_sendmsg+0xbe/0xf0
[  455.022001]  [<c0150260>] xntimer_start_aperiodic+0x0/0x200
[  455.022001]  [<c012ef50>] autoremove_wake_function+0x0/0x50
[  455.022001]  [<c0150260>] xntimer_start_aperiodic+0x0/0x200
[  455.022001]  [<c014bc35>] xnpod_suspend_thread+0x1f5/0x200
[  455.022001]  [<c027e184>] vscnprintf+0x14/0x20
[  455.022001]  [<c011cc04>] printk+0xc4/0xe0
[  455.022001]  [<f890b180>] coordTask+0x0/0x104 [deneme2]
[  455.022001]  [<f890b238>] coordTask+0xb8/0x104 [deneme2]
[  455.022001]  [<c014c162>] xnarch_thread_redirect+0x32/0x50
[  455.022001]  [<f890b180>] coordTask+0x0/0x104 [deneme2]
[  455.022001]  =======================
[  455.022001] ------------[ cut here ]------------
[  455.022001] kernel BUG at kernel/ipipe/core.c:323!
[  455.022001] invalid opcode: 0000 [#1] PREEMPT
[  455.022001] Modules linked in: deneme2(+) arc4 ecb crypto_blkcipher  
cryptomgr crypto_algapi [last unloaded: deneme2]
[  455.022001]
[  455.022001] Pid: 3643, comm: insmod Not tainted (2.6.26.5 #9)
[  455.022001] EIP: 0060:[<c0145cfe>] EFLAGS: 00010202 CPU: 0
[  455.022001] EIP is at __ipipe_restore_root+0x1e/0x30
[  455.022001] EAX: 00000000 EBX: f74586c0 ECX: c0326c96 EDX: c0491b9c
[  455.022001] ESI: 00000000 EDI: c0491b20 EBP: 000000c0 ESP: f7d37870
[  455.022001]  DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 0068
[  455.022001] Process insmod (pid: 3643, ti=f7d36000 task=f7f2aa20  
task.ti=f7512000)<0>
[  455.022001] I-pipe domain Linux
[  455.022001] Stack: c0182795 00000000 00000000 000004d0 00000200  
00000000 0000003d 000004d0
[  455.022001]        c0491b20 c0326c96 00000000 f7c3ea00 7fffffff  
0000000a 000004d0 c0322c08
[  455.022001]        ffffffff 0000003d 00000000 00000000 f74fa700  
00000000 00000000 f74fa700
[  455.022001] Call Trace:
[  455.022001]  [<c0182795>] kmem_cache_alloc+0x55/0xd0
[  455.022001]  [<c0326c96>] __alloc_skb+0x36/0x120
[  455.022001]  [<c0322c08>] sock_alloc_send_skb+0x168/0x1b0
[  455.022001]  [<c0348611>] ip_append_data+0x711/0x970
[  455.022001]  [<c0349540>] ip_generic_getfrag+0x0/0xb0
[  455.022001]  [<c0364730>] udp_sendmsg+0x2f0/0x660
[  455.022001]  [<c036ab37>] inet_sendmsg+0x37/0x70
[  455.022001]  [<c032062e>] sock_sendmsg+0xbe/0xf0
[  455.022001]  [<c0150260>] xntimer_start_aperiodic+0x0/0x200
[  455.022001]  [<c012ef50>] autoremove_wake_function+0x0/0x50
[  455.022001]  [<c0150260>] xntimer_start_aperiodic+0x0/0x200
[  455.022001]  [<c014bc35>] xnpod_suspend_thread+0x1f5/0x200
[  455.022001]  [<c027e184>] vscnprintf+0x14/0x20
[  455.022001]  [<c011cc04>] printk+0xc4/0xe0
[  455.022001]  [<f890b180>] coordTask+0x0/0x104 [deneme2]
[  455.022001]  [<f890b238>] coordTask+0xb8/0x104 [deneme2]
[  455.022001]  [<c014c162>] xnarch_thread_redirect+0x32/0x50
[  455.022001]  [<f890b180>] coordTask+0x0/0x104 [deneme2]
[  455.022001]  =======================
[  455.022001] Code: 90 90 90 90 90 90 90 90 90 90 90 90 90 81 3d 20  
e8 45 c0 c0 0a 55 c0 75 12 85 c0 74 09 0f ba 2d c0 d4 45 c0 00 c3 e9  
a2 ff ff ff <0f> 0b eb fe 8d b4 26 00 00 00 00 8d bc 27 00 00 00 00 89  
c1 8b
[  455.022001] EIP: [<c0145cfe>] __ipipe_restore_root+0x1e/0x30 SS:ESP  
0068:f7d37870
[  455.022001] ---[ end trace 415d3c300348194e ]---

[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 2433 bytes --]

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

* Re: [Xenomai-help] sock_sendmsg() causes crash
  2008-10-28 17:41 [Xenomai-help] sock_sendmsg() causes crash Alphan Ulusoy
@ 2008-10-30  9:38 ` Jan Kiszka
  2008-10-30 20:09   ` Alphan Ulusoy
  0 siblings, 1 reply; 3+ messages in thread
From: Jan Kiszka @ 2008-10-30  9:38 UTC (permalink / raw)
  To: Alphan Ulusoy; +Cc: xenomai

Alphan Ulusoy wrote:
> Hi all,
> 
> I' am trying to send small UDP datagrams in a real-time system. I can't
> get a satisfactory performance when I send these packets from a
> userspace Xenomai task using sendto() call.
> 
> That's why I tried to code a small kernel module to make some
> measurements. However; whenever
>     • A xenomai task
>     • An alarm function
>     • A thread created with kthread_run() form a xenomai task
> that includes the sock_sendmsg() call runs, system crashes. However, if
> a write a regular kernel module, the it works just fine...
> 
> Below you can find the code and the crash dump.
> 
> Does anyone have any suggestions? Is there any other way that I can send
> a UDP packet from a kernel Xenomai task?

I think Philippe already suggested that you should start reading a bit
about the co-kernel model and its implications.

Also, you may want to look at RTnet if you have to send UDP packets
under RT constraints.

Jan

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


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

* Re: [Xenomai-help] sock_sendmsg() causes crash
  2008-10-30  9:38 ` Jan Kiszka
@ 2008-10-30 20:09   ` Alphan Ulusoy
  0 siblings, 0 replies; 3+ messages in thread
From: Alphan Ulusoy @ 2008-10-30 20:09 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai

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

As you said, Philippe already guided me in the right direction. I'll  
check RTnet for sure, however the chipset of my wireless card is 2561  
and uses the rt61 module from rt2x00 project. I'll try my best to port  
this code to RTnet. If I'm successful I'll definitely let you know.

Regards,

alphan

On Oct 30, 2008, at 11:38 AM, Jan Kiszka wrote:

> Alphan Ulusoy wrote:
>> Hi all,
>>
>> I' am trying to send small UDP datagrams in a real-time system. I  
>> can't
>> get a satisfactory performance when I send these packets from a
>> userspace Xenomai task using sendto() call.
>>
>> That's why I tried to code a small kernel module to make some
>> measurements. However; whenever
>>    • A xenomai task
>>    • An alarm function
>>    • A thread created with kthread_run() form a xenomai task
>> that includes the sock_sendmsg() call runs, system crashes.  
>> However, if
>> a write a regular kernel module, the it works just fine...
>>
>> Below you can find the code and the crash dump.
>>
>> Does anyone have any suggestions? Is there any other way that I can  
>> send
>> a UDP packet from a kernel Xenomai task?
>
> I think Philippe already suggested that you should start reading a bit
> about the co-kernel model and its implications.
>
> Also, you may want to look at RTnet if you have to send UDP packets
> under RT constraints.
>
> Jan
>
> -- 
> Siemens AG, Corporate Technology, CT SE 2
> Corporate Competence Center Embedded Linux
>


[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 2433 bytes --]

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

end of thread, other threads:[~2008-10-30 20:09 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-10-28 17:41 [Xenomai-help] sock_sendmsg() causes crash Alphan Ulusoy
2008-10-30  9:38 ` Jan Kiszka
2008-10-30 20:09   ` Alphan Ulusoy

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.