Re: [RTnet-developers] Kernel module for smc91111
Brought to you by:
bet-frogger,
kiszka
|
From: Hinko K. <hin...@i-...> - 2011-09-20 06:54:48
|
On 09/16/2011 10:04 AM, Jan Kiszka wrote:
> On 2011-09-16 09:33, Hinko Kocevar wrote:
>> On 09/16/2011 08:32 AM, Jan Kiszka wrote:
>>> On 2011-09-14 12:18, Hinko Kocevar wrote:
>> [ 36.443975] BUG: sleeping function called from invalid context at
>> arch/arm/mm/fault.c:312
>> [ 36.452177] in_atomic(): 0, irqs_disabled(): 128, pid: 192, name: sh
>> [ 36.458539] Backtrace:
>> [ 36.461050] [<c0022a88>] (dump_backtrace+0x0/0x118) from [<c0022bd4>]
>> (dump_stack+0x18/0x1c)
>> [ 36.469510] r7:c3d5fca0 r6:c3d7b960 r5:c3d7b994 r4:c3dc6000
>> [ 36.475242] [<c0022bbc>] (dump_stack+0x0/0x1c) from [<c002cb20>]
>> (__might_sleep+0xd8/0xfc)
>> [ 36.483558] [<c002ca48>] (__might_sleep+0x0/0xfc) from [<c002603c>]
>> (do_page_fault+0x124/0x294)
>> [ 36.492276] r4:00000000
>> [ 36.494865] [<c0025f18>] (do_page_fault+0x0/0x294) from [<c001e320>]
>> (do_DataAbort+0x40/0x134)
>> [ 36.503520] [<c001e2e0>] (do_DataAbort+0x0/0x134) from [<c001ef84>]
>> (ret_from_exception+0x0/0x40)
>> [ 36.512412] Exception stack(0xc3dc7fb0 to 0xc3dc7ff8)
>> [ 36.517490] 7fa0: 40018350
>> 00000000 00000000 000000c0
>> [ 36.525709] 7fc0: 40017f68 00000000 000000c0 00000000 000000ce
>> ffffffff 4017b000 becc20f4
>> [ 36.533917] 7fe0: 40018350 becc20a8 400f54f8 400d090c 60000010 ffffffff
>> [ 36.540549] r8:000000ce r7:00000000 r6:000000c0 r5:00000000 r4:ffffffff
Caught that one!
It was in my drivers hard_start_xmit() routine, where a macro made a
call to local_irq_save()/local_irq_restore(). Another mistake was when
setting the skb->xmit_stamp in the same function..
Now I can get past the above issue and stumbled across another .. This
time it happens when trying to rtping 127.0.0.1.
I've added some debugging in icmp.c:
rtdm_printk("%s: skb->h.icmph->un.echo.id == cmd->args.ping.id: %d
== %d\n", __FUNCTION__, skb->h.icmph->un.echo.id , cmd->args.ping.id);
rtdm_printk("%s: ntohs(skb->h.icmph->un.echo.sequence) ==
cmd->args.ping.sequence: %d == %d\n", __FUNCTION__,
ntohs(skb->h.icmph->un.echo.sequence), cmd->args.ping.sequence);
rtdm_printk("%s: skb->len == cmd->args.ping.msg_size: %d == %d\n",
__FUNCTION__, skb->len, cmd->args.ping.msg_size);
rtdm_printk("%s: skb->len >= sizeof(nanosecs_abs_t): %d >= %d\n",
__FUNCTION__, skb->len, sizeof(nanosecs_abs_t));
rtdm_printk("%s: cmd->args.ping.rtt = %lld\n", __FUNCTION__,
rtdm_clock_read() - *((nanosecs_abs_t *)skb->data));
just before:
if ((skb->h.icmph->un.echo.id == cmd->args.ping.id) &&
(ntohs(skb->h.icmph->un.echo.sequence) ==
cmd->args.ping.sequence) &&
skb->len == cmd->args.ping.msg_size) {
if (skb->len >= sizeof(nanosecs_abs_t))
cmd->args.ping.rtt =
rtdm_clock_read() - *((nanosecs_abs_t *)skb->data);
rtpc_complete_call(call, sizeof(struct icmphdr) + skb->len);
} else
rtpc_complete_call(call, 0);
This is the output I get on the console:
root@xcep:~# /usr/local/rtnet/sbin/rtping 127.0.0.1
Real-time PING 127.0.0.1 56(84) bytes of data.
[ 285.365729] rt_icmp_send_echo: pre rt_icmp_send_request()
[ 285.374080] rt_icmp_send_request: pre rt_ip_build_xmit()
[ 285.379452] rt_ip_build_xmit: pre rtdev_xmit()
[ 285.383906] rtdev_xmit: pre rtdev->start_xmit()
[ 285.388462] rt_icmp_rcv:
[ 285.390998] rt_icmp_rcv: pre icmpHdr->type 8
[ 285.395276] rt_icmp_echo_request:
[ 285.398679] rt_icmp_send_reply:
[ 285.401910] rt_icmp_send_reply: pre rt_ip_build_xmit()
[ 285.407074] rt_ip_build_xmit: pre rtdev_xmit()
[ 285.411554] rtdev_xmit: pre rtdev->start_xmit()
[ 285.416118] rt_icmp_rcv:
[ 285.418653] rt_icmp_rcv: pre icmpHdr->type 0
[ 285.422941] rt_icmp_echo_reply:
[ 285.426172] rt_icmp_echo_reply: pre rtpc_get_priv()
[ 285.431059] rt_icmp_echo_reply: port rtpc_get_priv()
[ 285.436035] rt_icmp_echo_reply: skb->h.icmph->un.echo.id ==
cmd->args.ping.id: 58826 == 58826
[ 285.444596] rt_icmp_echo_reply: ntohs(skb->h.icmph->un.echo.sequence)
== cmd->args.ping.sequence: 1 == 1
[ 285.454107] rt_icmp_echo_reply: skb->len == cmd->args.ping.msg_size:
56 == 56
[ 285.461260] rt_icmp_echo_reply: skb->len >= sizeof(nanosecs_abs_t):
56 >= 8
[ 285.468241] Xenomai: suspending kernel thread bf011030 ('rtnet-rtpc')
at 0xbf01e4ec after exception #0x8
The last debug line is not printed, what make to conclude that I'm
hitting some issue in rtdm_clock_read().
As I pointed out before I'm running this on PXA255 based CPU, this time
on 2.6.37.6 and latest Xenomai v2.6.0-rc3. I used this Xenomai
configuration options:
[sbox-itech-sf-armel-kek: ~/xxx] >
./xenomai-2.6.0-rc3/scripts/prepare-kernel.sh
--linux=/home/hinko/xxx/linux-2.6.37.6
[sbox-itech-sf-armel-kek: ~/xxx/xenomai-2.6.0-rc3] > ./configure
CFLAGS="-march=armv4t" LDFLAGS="-march=armv4t" --enable-debug
--prefix=/home/hinko/xxx/out
Should I consider using '--enable-arm-tsc' switch, maybe?
Thank you!
--
Hinko Kocevar
Technical support software engineer
Instrumentation Technologies d.d.
Velika pot 22, SI-5250 Solkan - Slovenia
T:+386 5 3352600, F:+386 5 3352601
mailto: hin...@i-...
http://www.i-tech.si - When your users demand stability
|