On Thursday 12 January 2006 06:19 am, kamal kc wrote: > --- kamal kc <[EMAIL PROTECTED]> wrote: > > > Queue a task to a taskqueue. Behind the scenes > > > > that > > > > > will invoke a swi_add if > > > you use the taskqueue_swi queue. However, given > > > that you want to do some > > > rather complicated work, you'd be better off > > > creating a dedicated taskqueue > > > thread and queueing tasks off to it I think. > > > > thanks for the suggestion on the taskqueue. i tried > > it > > > > on my dummy kernel module and got some output but i > > am not sure if i followed the correct steps to > > use the taskqueue. the only thing i found > > was the man pages and the taskqueue.h. > > > > here is the code: > > ----------------------- > > > > struct taskqueue_arguments > > { int a; > > int b; > > }; > > > > void taskqueue_function(void *,int); > > typedef void taskqueue_function_t(void *,int); > > > > /* taskqueue function */ > > void taskqueue_function(void *arguments,int int_arg) > > { > > struct taskqueue_arguments *arg; > > arg=(struct taskqueue_arguments *)arguments; > > printf("\ntakqueue_function was called the args > > are %d %d",arg->a,arg->b); > > return; > > } > > > > /* function implementing the syscall */ > > static int > > hello(struct thread *td, void *arg) > > { ......... > > struct task mytask; > > taskqueue_function_t *taskqueue_function_ptr; > > taskqueue_function_ptr=taskqueue_function; > > > > struct taskqueue_arguments arg_var; > > arg_var.a=10; > > arg_var.b=20; > > TASK_INIT(&mytask,50,taskqueue_function_ptr,&arg_var); > > > taskqueue_enqueue(taskqueue_swi, &mytask);
You can just use the name of the function w/o having to have an explicit function pointer var: TASK_INIT(&mytask, 50, taskqueue_functino, &arg_var); > > > > ........... > > } > > dear all , > > i run the above code and the kernel > would crash whenever i would do the syscall for few > number of times. the crashing process is > (swi6: task queue). the kernel crashes very soon > when i make the system call in a loop. > > i guess i didn't follow all the steps to use > the taskqueue .... > > i think some of you can help what did i > miss .... Are you calling TASK_INIT() while your task is still pending? Just init the task the first time, then call enqueue() to queue it up. You might want to call TASK_INIT() during the MOD_LOAD() event in your module handler for example. Be sure to call taskqueue_drain() during MOD_UNLOAD() to make sure your task has finished all the pending executes before your module is unloaded as well. -- John Baldwin <[EMAIL PROTECTED]> <>< http://www.FreeBSD.org/~jhb/ "Power Users Use the Power to Serve" = http://www.FreeBSD.org _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "[EMAIL PROTECTED]"