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.)
>
> 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
>>> [email protected]
>>> http://mail.opensolaris.org/mailman/listinfo/opensolaris-code
>>>
>>
>
_______________________________________________
opensolaris-code mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code