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

Reply via email to