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