Just being curious. Why u suggest condvar over taskq_suspend/resume? Is there any pros/cons?
Thanks Joe On 15 Jul 2008, at 01:24, Garrett D'Amore wrote: > Joe Kuan wrote: >> >> On 14 Jul 2008, at 23:50, Garrett D'Amore wrote: >> >>> Joe Kuan wrote: >>>> Hi Garrett, >>>> >>>> Thank you for the quick response. The reason I need to kernelise >>>> the network application as it needs to process 1.3/1.4 millions >>>> packet >>>> per second. Do you think using the taskqueue api has any impact >>>> on the >>>> performance? In FreeBSD, we are hitting around 80% cpu usage. >>> >>> If you want to create a single thread, you can do it with a taskq >>> function that simply never routines. Its kind of ugly, but it will >>> work. (It might prevent suspend/resume, though.) >> >> Sorry, can you give me more clue/detail on how to do that? What do >> you >> mean >> by 'can do it with a taskq function that never routines'? Do u mean >> taskq_create? However, I >> still need to somehow attach my routine with the thread. Without >> using >> taskq_dispatch, >> how else can I possibly do it? > > Just do taskq_dispatch *once*. The task function can run forever. > >> >> To give you more information, >> my function is simply consumes all the packets inside a queue (if >> there is any) every millisecond. >> This function is waken up every ms. In FreeBSD, there are tsleep() >> and >> wakeup(). I basically stuck >> the wakup call inside some clock routine runs every ms. > > That actually sounds like a poor design, because it won't work with a > tickless kernel, and it kills power savings measures done on some > CPUs. > > You might want to think about possible alternatives, depending on the > problem you are trying to solve. > > -- Garrett >> >> Many thanks >> Joe >> >>>> >>>> Also my function for the network applications takes a mbuf* >>>> parameter and processes it. However, if I call ddi_taskq_dispatch >>>> for >>>> each incoming packet (mbuf), that will require quite a large pool. >>>> Will the task pool get exhausted? >>> >>> You don't have to do that. >>>> >>>> Alternatively, should I make the function as an infinite loop >>>> instead and pass on to taskq_dispatch only once, then relying on >>>> taskq_resume/suspend when packet is ready. Would this be better? >>> >>> You shouldn't use taskq_suspend/resume. You don't need to do >>> that. You >>> could use your own condvars to signal that. >>> >>> Actually, you probably want to have a logic that allows for the >>> function >>> to run "while there is work to do", and then don't bother to use >>> taskq_dispatch if the function can be shown to be "running". Then >>> if >>> function isn't already processing work, you can do taskq_dispatch(). >>> >>> -- Garrett >>>> >>>> Many thanks >>>> Joe >>>> >>>> On 14 Jul 2008, at 21:43, Garrett D'Amore wrote: >>>> >>>>> I'd try first to use a taskq -- ddi_taskq_create(9F) -- they are >>>>> documented, and should be stable. >>>>> >>>>> -- Garrett >>>>> >>>>> Joe Kuan wrote: >>>>>> Hi all, >>>>>> >>>>>> I have managed to kernelised our network application into >>>>>> FreeBSD >>>>>> and worked very well. Now, I start the same process on >>>>>> OpenSolaris. >>>>>> Although I have got the Solaris Internal book with me, it really >>>>>> explains how everything works together. What I need is some >>>>>> tutorial >>>>>> or example on how to use kernel functions >>>>>> >>>>>> On FreeBSD, I can do something like >>>>>> >>>>>> SYSINIT(foo, ..); >>>>>> >>>>>> void foo(void *bar) { >>>>>> >>>>>> ..... >>>>>> kthread_create(my_func, ....); >>>>>> } >>>>>> >>>>>> >>>>>> void my_func(void *arg) { >>>>>> >>>>>> while (1) { >>>>>> >>>>>> do something >>>>>> >>>>>> sleep until timeout or wakeup by another signal >>>>>> } >>>>>> } >>>>>> >>>>>> where SYSINIT is to dispatch kernel thread at startup >>>>>> >>>>>> Here is the link of man page of kthread_create, >>>>>> http://www.FreeBSD.org/cgi/man.cgi?query=kthread_create&apropos=0&sektion=0&manpath=FreeBSD+6.3-stable&format=html >>>>>> >>>>>> >>>>>> >>>>>> Here is the link of the info and showing how to use SYSINIT, >>>>>> http://www.freebsd.org/doc/en_US.ISO8859-1/books/arch-handbook/sysinit.html >>>>>> >>>>>> >>>>>> >>>>>> I would be appreciate if anyone can point me to any document/ >>>>>> source >>>>>> file/man pages/anything on the usage of creating a kernel thread >>>>>> using >>>>>> thread_create and also the equivalent mechanism of SYSINIT in >>>>>> OpenSolaris. >>>>>> >>>>>> Many many thanks in advance. >>>>>> Joe >>>>>> _______________________________________________ >>>>>> opensolaris-code mailing list >>>>>> opensolaris-code@opensolaris.org >>>>>> http://mail.opensolaris.org/mailman/listinfo/opensolaris-code >>>>>> >>>>> >>>> >>> >> > _______________________________________________ opensolaris-code mailing list opensolaris-code@opensolaris.org http://mail.opensolaris.org/mailman/listinfo/opensolaris-code