Hi Jerin,


Here are some comments on the libeventdev RFC.

These are collated thoughts after discussions with you & others to understand 
the concepts and rationale for the current proposal.



1. Concept of flow queues. This is better abstracted as flow ids and not as 
flow queues which implies there is a queueing structure per flow. A s/w 
implementation can do atomic load balancing on multiple flow ids more 
efficiently than maintaining each event in a specific flow queue.



2. Scheduling group. A scheduling group is more a steam of events, so an event 
queue might be a better abstraction.



3. An event queue should support the concept of max active atomic flows 
(maximum number of active flows this queue can track at any given time) and max 
active ordered sequences (maximum number of outstanding events waiting to be 
egress reordered by this queue). This allows a scheduler implementation to 
dimension/partition its resources among event queues.



4. An event queue should support concept of a single consumer. In an 
application, a stream of events may need to be brought together to a single 
core for some stages of processing, e.g. for TX at the end of the pipeline to 
avoid NIC reordering of the packets. Having a 'single consumer' event queue for 
that stage allows the intensive scheduling logic to be short circuited and can 
improve throughput for s/w implementations.



5. Instead of tying eventdev access to an lcore, a higher level of abstraction 
called event port is needed which is the application i/f to the eventdev. Event 
ports are connected to event queues and is the object the application uses to 
dequeue and enqueue events. There can be more than one event port per lcore 
allowing multiple lightweight threads to have their own i/f into eventdev, if 
the implementation supports it. An event port abstraction also encapsulates 
dequeue depth and enqueue depth for a scheduler implementations which can 
schedule multiple events at a time and output events that can be buffered.



6. An event should support priority. Per event priority is useful for 
segregating high priority (control messages) traffic from low priority within 
the same flow. This needs to be part of the event definition for 
implementations which support it.



7. Event port to event queue servicing priority. This allows two event ports to 
connect to the same event queue with different priorities. For implementations 
which support it, this allows a worker core to participate in two different 
workflows with different priorities (workflow 1 needing 3.5 cores, workflow 2 
needing 2.5 cores, and so on).



8. Define the workflow as schedule/dequeue/enqueue. An implementation is free 
to define schedule as NOOP. A distributed s/w scheduler can use this to 
schedule events; also a centralized s/w scheduler can make this a NOOP on 
non-scheduler cores.



9. The schedule_from_group API does not fit the workflow.



10. The ctxt_update/ctxt_wait breaks the normal workflow. If the normal 
workflow is a dequeue -> do work based on event type -> enqueue,  a pin_event 
argument to enqueue (where the pinned event is returned through the normal 
dequeue) allows application workflow to remain the same whether or not an 
implementation supports it.



11. Burst dequeue/enqueue needed.



12. Definition of a closed/open system - where open system is memory backed and 
closed system eventdev has limited capacity. In such systems, it is also useful 
to denote per event port how many packets can be active in the system. This can 
serve as a threshold for ethdev like devices so they don't overwhelm core to 
core events.



13. There should be sort of device capabilities definition to address different 
implementations.




vnr
---

Reply via email to