Kernel Thread priority in FreeBSD

Ray Kinsella raykinsella78 at gmail.com
Fri Dec 5 07:09:58 PST 2008


Hi all,

I am reposting this from the performance list, as it might be a better forum
for the question.

I have a problem trying to influence kernel thread scheduling in FreeBSD.
There are three threads I am interested the priority of:-

 a. Enqueue Thread:
 - Enqueues data in a circular buffer

 b. Interrupt Handler:
- Signals that data in the circular buffer has been processed and in ready
for removal
- Queues an entry on a task queue so the data is removed from the circular
buffer asynchronousily
- Data is processed by a pci card

 c. Task Queue Thread:
- Dequeues request from a task queue.
- Dequeues data from the circular buffer.

*Objective:

*I want to prioritise the *Enqueue Thread, *such that it will always
executes until the circular buffer is exhausted of space.
I want the *Task Queue Thread* to have the lowest priority such that it only
runs when the *Enqueue Thread* has no work to do.

*Observed behaviour:

*I set the *Enqueue Thread, *to have a priority of PRI_MAX_KERN (0)
I set the *Task Queue Thread,* to have a priority of PRI_MIN_KERN (64)

In the main I see the following scheduling:-

...
*Enqueue Thread, *Enqueues serveral requests on the circular buffer
*Interrupt Handler*, Interrupts the *Enqueue Thread, *puts requests on a
taskqueue for async processing.
*Task Queue Thread, *Dequeues the request from a taskqueue and the data from
the circular buffer
*Enqueue Thread, *Enqueues serveral requests on the circular buffer
*Interrupt Handler*, Interrupts the *Enqueue Thread**, *puts requests on a
taskqueue for async processing.
*Task Queue Thread, *Dequeues the request from a taskqueue and the data from
the circular buffer
..

No matter what I do with thread priorities, the *Task Queue Thread *always
follows the *Interrupt Handler.
*
*Ideal behaviour*

Ideally I would get the following behaviour, were *Enqueue Thread *will
always run instead
of *Task Queue Thread *thread while it has work to do.

*Enqueue Thread, *Enqueues serveral requests on the circular buffer
*Interrupt Handler*, Interrupts the *Enqueue Thread, *puts requests on a
taskqueue for async processing.
*Enqueue Thread, *Enqueues serveral requests on the circular buffer
*Interrupt Handler*, Interrupts the *Enqueue Thread**, *puts requests on a
taskqueue for async processing.
*Enqueue Thread, *Enqueues serveral requests on the circular buffer
*Interrupt Handler*, Interrupts the *Enqueue Thread**, *puts requests on a
taskqueue for async processing.
*Enqueue Thread, *yields timeslices as the circular buffer is maxed out
*Task Queue Thread, *Dequeues the request from a taskqueue and the data from
the circular buffer
*Task Queue Thread, *Dequeues the request from a taskqueue and the data from
the circular buffer
*Task Queue Thread, *Dequeues the request from a taskqueue and the data from
the circular buffer

Any idea's how to encourage the scheduler to adopt this behaviour ?

Thanks

Ray Kinsella

*


*


More information about the freebsd-drivers mailing list