Re: SMP driver core lock real-time driver
Doug Renton <[email protected]> Mon, 20 Nov 2017 21:40:39 -0500
| Newsgroups | gmane.linux.real-time.rtai |
|---|---|
| Message-ID | <[email protected]> |
I cut and pasted a kernel module, and made it do busy work, until the
kernel decided it had found a bug. While the busy work was going on,
everything seemed fine, could not tell one core was busy.
Everything seems to run fine with one core doing my made up task, until
eventually the kernel decides it has found a bug.
With the loops at something reasonable like 999, everything runs fine
and my task ends. Once turned up to 999999, the kernel eventually gives
my module the boot. Looks like this could be tricky. I still can't see
why we cant just simplify everything and dedicate one/two core(s) to
RTAI, and busy wait.
[ 189.566739] Timer module installing
[ 189.566743] Starting timer to fire in 200ms (4294939693)
[ 189.763714] my_timer_callback called (4294939743).
[ 216.060934] NMI watchdog: BUG: soft lockup - CPU#1 stuck for 23s!
[swapper/1:0]
[ 216.060945] Modules linked in: hello_2(O) Bla Bla Bla...
/*
* hello-2.c - Demonstrating the module_init() and module_exit() macros.
* This is preferred over using init_module() and cleanup_module().
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#include <linux/init.h> /* Needed for the macros */
#include <linux/timer.h>
MODULE_LICENSE("GPL");
static struct timer_list my_timer;
void my_timer_callback( unsigned long data )
{
int delay = 0;
int delay2;
int delay3;
int delay4;
volatile int glob_test;
glob_test = 1000000;
printk( "my_timer_callback called (%ld).\n", jiffies );
for ( delay4 = 0; delay4 < 99; delay4 += 1)
{
for ( delay3 = 0; delay3 < 99; delay3 += 1)
{
for ( delay2 = 0; delay2 < 99; delay2 += 1)
{
//printk( "my_timer_callback loop %d.\n",delay2);
for( delay = 0; delay < 99; delay += 1)
{
if (delay > glob_test) { printk("What??\n");}
}
}
}
}
printk( "my_timer_callback done.\n" );
}
static int __init hello_2_init(void)
{
int ret;
printk("Timer module installing\n");
// my_timer.function, my_timer.data
setup_timer( &my_timer, my_timer_callback, 0 );
printk( "Starting timer to fire in 200ms (%ld)\n", jiffies );
ret = mod_timer( &my_timer, jiffies + msecs_to_jiffies(200) );
if (ret) printk("Error in mod_timer\n");
return 0;
}
static void __exit hello_2_exit(void)
{
// printk(KERN_INFO "Goodbye, world 2\n");
int ret;
ret = del_timer( &my_timer );
if (ret) printk("The timer is still in use...\n");
printk("Timer module uninstalling\n");
}
module_init(hello_2_init);
module_exit(hello_2_exit);
_______________________________________________
Rtai mailing list
[email protected]
https://mail.rtai.org/cgi-bin/mailman/listinfo/rtai