Date: Wed, 11 Jan 2006 08:45:59 -0800 (PST) From: kamal kc <kamal_ckk@yahoo.com> To: freebsd <freebsd-hackers@freebsd.org> Subject: Re: rescheduling tasks using swi_add() Message-ID: <20060111164559.5714.qmail@web30009.mail.mud.yahoo.com> In-Reply-To: <200601110903.18120.jhb@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
--- John Baldwin <jhb@freebsd.org> wrote: > > the man page discussed the swi_add() and > swi_sched() > > functions. > > > > what i don't understand is, how do i register my > > handler > > function ?? > > if i use the swi_add() for that purpose what > > do i use for the void *arg argument. > > > > and how can i dispatch control to the software > > interrupt handler ?? > > the swi_sched() uses only the cookie and the flags > > arguments. > > there is no way i can pass arguments to my handler > > function .. > > > > i guess most of you are familiar with this and can > > help me > > out ...... > > 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); ........... } did i do it correctly ??? thanks, kamal __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060111164559.5714.qmail>