Snažím sa zastaviť vlákno jadra volanímkthread_stop () v rámci funkcie, ktorá bude volaná timer.When som načítať tento modul do jadra, kthread sa spustí a zastaví po zadanom čase spomenutom v časovači, ale jeho dávať nejakú chybovú správu v denníku.
Môže mi niekto pomôcť vyriešiť tento problém, pretože som nový programovania jadra vlákna.To je môj kód
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/timer.h>
#include <linux/kthread.h>
#include <linux/sched.h>
MODULE_LICENSE("GPL");
struct task_struct *task;
static struct timer_list my_timer;
int thread_function(void *data) {
printk(KERN_ALERT"IN THREAD FUNCTION");
while(!kthread_should_stop()){
schedule();
}
printk(KERN_ALERT"after schedulen");
return 1;
}
void my_timer_callback( unsigned long data ){
printk( "my_timer_callback called (%ld).n", jiffies );
printk(KERN_ALERT"THREAD STOPPEDn");
kthread_stop(task);
}
int init_module( void ){
int ret;
printk("Timer module installingn");
//my_timer.function, my_timer.data
setup_timer( &my_timer, my_timer_callback, 0 );
printk( "Starting timer to fire in 2000ms (%ld)n", jiffies );
ret = mod_timer( &my_timer, jiffies + msecs_to_jiffies(2000) );
if (ret) printk("Error in mod_timern");
printk(KERN_INFO"-------------------- THREAD START------------------------");
task = kthread_run(thread_function,NULL,"kerneltthread");
printk(KERN_ALERT"Kernel Thread Name: %sn",task->comm);
return 0;
}
void cleanup_module( void ){
int ret;
ret = del_timer( &my_timer );
if (ret) printk("The timer is still in use...n");
printk("Timer module uninstallingn");
return;
}
MODULE_LICENSE("GPL");
Toto je výstupná správa v denníku
Aug 5 16:35:31 brao kernel: Timer module installing
Aug 5 16:35:31 brao kernel: Starting timer to fire in 2000ms (4299209850)
Aug 5 16:35:31 brao kernel: -------------------- THREAD START------------------------
Aug 5 16:35:31 brao kernel: Kernel Thread Name: kerneltthread
Aug 5 16:35:31 brao kernel: IN THREAD FUNCTION
Aug 5 16:35:33 brao kernel: my_timer_callback called (4299211856).
Aug 5 16:35:33 brao kernel: THREAD STOPPED
Aug 5 16:35:33 brao kernel: BUG: scheduling while atomic: swapper/3/0/0x10000100
Aug 5 16:35:33 brao kernel: after schedule
odpovede:
1 pre odpoveď č. 1Funkcia časovača je vykonávaný v kontexte softirq, z toho dôvodu by nemal spať, Ale tvoje my_timer_callback
volá kthread_stop
funkcia, ktorá čaká kým nie je dokončená, to je spánok.
takže, scheduling while atomic
Chyba vzniká: Funkcia spí, kým by to nemalo robiť kvôli atómovému kontextu.