rescheduling tasks using swi_add()

kamal kc kamal_ckk at yahoo.com
Thu Jan 12 22:45:14 PST 2006



--- John Baldwin <jhb at freebsd.org> wrote:

> 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 ....

the problem is solved i guess. 

now i used the structure :

 struct taskqueue_struct
   { struct task mytask;
     int a; 
     int b;
   }

  everytime i call TASK_INIT() i allocate memory for
  the taskqueue_struct. 

  and in the handler function deallocate the struct 
   taskqueue_struct. 
  this allowed me to do memory safe operation i guess
!!

> 
> 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.

yes , i will do these things. now i will try to make a
separate 
taskqueue thread for the job like you said before. i
am 
looking at the kthread and other stuffs. i am more
optimistic 
now than ever..

i am enjoying these stuffs ..

thanks,
kamal






 



__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 


More information about the freebsd-hackers mailing list