Re: SMP driver core lock real-time driver
Asier <[email protected]> Tue, 21 Nov 2017 09:19:58 +0100
| Newsgroups | gmane.linux.real-time.rtai |
|---|---|
| Message-ID | <CAEqBYRMEhXc4syfO3sMAHs_ZcSQWb4ThcsZZF57x6_6ncf8FGQ@mail.gmail.com> |
*Hi Doug,* *maybe you could try to somehow tell Linux that the core is no longer available/online. Could you try one of the following alternatives?* *1- while the task is on the busy wait execute something like this: (where * is the desired cpu core)* *echo 0 > /sys/devices/system/cpu/cpu*/online* *2- Another alternative could be to call this function * *int cpu_down(unsigned int cpu);* *cheers,* *Asier.* On Tue, Nov 21, 2017 at 3:40 AM, Doug Renton <[email protected]> wrote: > > 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 > _______________________________________________ Rtai mailing list [email protected] https://mail.rtai.org/cgi-bin/mailman/listinfo/rtai