Hi all,

I'm currently diving into the scheduler code from linux-generic to understand
 how it works and try to write an optimize version for our HW.

Maybe I missed something, but I think there is a big fairness issue there.

Let me sum up what I get. We will stick with only one priority to make it 
simpler.
We have QUEUES_PER_PRIO queues in the schduler that may contain commands.
Command are either:
 - Poll a pktio
 - Poll a queue
Both commands are pushed back to the queue if we didn't get all the pending 
packet/buffer from them and need to be polled back.

Threads that call schedule do a round robin scan of all schedule queues 
starting on the queue threadId % QUEUES_PER_PRIO, jumps to the next schedule 
queue if the first schedule commands produced nothing. And stop on the first 
schedule commands that produces packet.

Am I right up to that point?


Now let's assume I'm a user unaware of how this works. I have QUEUES_PER_PRIO 
at 4. And running ODP with worker 4 threads.
I have created a bunch of queues for my classification so each of the schedule 
queue as a 1 command to poll a queue in them.

For some reason I only want to call odp_schedule() from one thread.
Could be that the others are directly polling specific high priority queues.

When my thread enters odp_schedule, it starts with the schedule_queue = ( thId 
% 4). Let's say 0.
Schedule queue 0 also contains the schedule command for my pktio.

Now let's see what happens
schedule()
   check sched_queue 0
       got sched_cmd to poll pktio
        pktio_poll
            dispatch 1 packet to each of my queues (this traffic is really well 
balanced and regular ;) )
        re enqueue the sched_cmd
        continue
   check sched_queue 1
       got a sched_cmd to poll queue #1 ( which now has a packet)
       return packet, requeue sched_cmd

schedule()
  check sched_queue 0
      got sched_cmd to poll a queue #0 (which also has a packet)
       return packet, requeue sched_cmd

We are now in the exact same state as we were before the first call. Except 
queue #2 and #3 now have 1 packet pending.
This should keep going on until we run out of packet in the pool...


So here are a few questions now:
1) Did I completely miss something and it actually works?
2) Why do linux-generic needs multiple queues per prio? Is it to reduce 
contention on the sched_queue ?

Nicolas
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to