rescheduling tasks using swi_add()
John Baldwin
jhb at freebsd.org
Thu Jan 12 11:26:20 PST 2006
On Thursday 12 January 2006 06:19 am, kamal kc wrote:
> --- kamal kc <kamal_ckk at yahoo.com> 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 <jhb at FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve" = http://www.FreeBSD.org
More information about the freebsd-hackers
mailing list