Skip site navigation (1)Skip section navigation (2)
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>