Hi I require RTNet for a project I am working on.
Because of the previously reported rtcfg issue one of my RTNet nodes
does net run start up correctly as the master.
So I have spent some time in order to trace the issue in the code to find a
solution, and have come up with a question and possible corrections on
the existing code.

I have used Xenomai-3.0 rc5 as my code base.
The symptoms on my system is that when running the RTNet script and
setting up the system as
a master the whole system locks up completely. I have traced this to
the line in the RTNet script
where the master is setup -> $RTCFG rteth0 server
Then it traced the lockup to
kernel/drivers/net/stack/rtcfg/rtcfg_event.c:151
This is in function rtcfg_main_state_off() where the rtdm_task_init()
is called. This thread creation
call completely locks up the system.

I checked all the parameters in the call, and one parameter that was
incorrect was the pointer to function  void rtcfg_timer(int ifindex)
in kernel/drivers/net/stack/rtcfg/rtcfg_timer.c:35.
According to the declaration of rtdm_task_init() its parameter
task_proc is of type rtdm_task_proc_t which is declared as typedef
void(* rtdm_task_proc_t) (void *arg). So I assume the correct function
declaration in rtcfg_timer.c should rather be void rtcfg_timer(void *arg).

Changing this in the code didn't correct the problem. But then I had a
look in the documentation and it specifies that rtdm_task_init()
should be called in secondary mode only. I have placed a
rtdm_in_rt_context() call before the rtdm_task_init() call and it
reports that the context that the
thread is running in just before calling the rtdm_task_init() is primary mode.
My question is would this cause a lockup if you are trying to call
rtdm_task_init() in primary mode?
All the other parameters to the function seems fine, and I see no
memory pointer or other issues that will cause this behavior.

I also found another issue in the code through my tracing process.
kernel/drivers/net/stack/rtnet_rtpc.c:94 - 99. If the kmalloc fails
and returns a NULL.
The cleanup handler is called as part of the exit process. But the
pointer used to call that cleanup
code is NULL because of the failed kmalloc. So when the if() condition
is tested to see if the cleanup handler exists, it will probably cause
a segmentation fault.

Regards
Michael

_______________________________________________
Xenomai mailing list
[email protected]
http://xenomai.org/mailman/listinfo/xenomai

Reply via email to