>> Extended eventdev queue QoS attributes to support weight and affinity. >> If queues are of same priority, events from the queue with highest >> weight will be scheduled first. Affinity indicates the number of times, >> the subsequent schedule calls from an event port will use the same event >> queue. Schedule call selects another queue if current queue goes empty >> or schedule count reaches affinity count. >> >> To avoid ABI break, weight and affinity attributes are not yet added to >> queue config structure and relies on PMD for managing it. New eventdev >> op queue_attr_get can be used to get it from the PMD. > >Have you considered using a PMD-specific command line parameter as a >stop-gap until you can extend the config struct? > >> Signed-off-by: Shijith Thotton <sthot...@marvell.com> >> --- >> lib/eventdev/eventdev_pmd.h | 22 ++++++++++++++++++++ >> lib/eventdev/rte_eventdev.c | 12 +++++++++++ >> lib/eventdev/rte_eventdev.h | 41 +++++++++++++++++++++++++++++++++- >--- >> 3 files changed, 71 insertions(+), 4 deletions(-) >> >> diff --git a/lib/eventdev/eventdev_pmd.h b/lib/eventdev/eventdev_pmd.h >> index 6182749503..f19df98a7a 100644 >> --- a/lib/eventdev/eventdev_pmd.h >> +++ b/lib/eventdev/eventdev_pmd.h >> @@ -341,6 +341,26 @@ typedef int (*eventdev_queue_setup_t)(struct >rte_eventdev *dev, >> typedef void (*eventdev_queue_release_t)(struct rte_eventdev *dev, >> uint8_t queue_id); >> >> +/** >> + * Get an event queue attribute at runtime. >> + * >> + * @param dev >> + * Event device pointer >> + * @param queue_id >> + * Event queue index >> + * @param attr_id >> + * Event queue attribute id >> + * @param[out] attr_value >> + * Event queue attribute value >> + * >> + * @return >> + * - 0: Success. >> + * - <0: Error code on failure. >> + */ >> +typedef int (*eventdev_queue_attr_get_t)(struct rte_eventdev *dev, >> + uint8_t queue_id, uint32_t attr_id, >> + uint32_t *attr_value); >> + >> /** >> * Set an event queue attribute at runtime. >> * >> @@ -1231,6 +1251,8 @@ struct eventdev_ops { >> /**< Set up an event queue. */ >> eventdev_queue_release_t queue_release; >> /**< Release an event queue. */ >> + eventdev_queue_attr_get_t queue_attr_get; >> + /**< Get an event queue attribute. */ >> eventdev_queue_attr_set_t queue_attr_set; >> /**< Set an event queue attribute. */ >> >> diff --git a/lib/eventdev/rte_eventdev.c b/lib/eventdev/rte_eventdev.c >> index 13c8af877e..37f0e54bf3 100644 >> --- a/lib/eventdev/rte_eventdev.c >> +++ b/lib/eventdev/rte_eventdev.c >> @@ -838,6 +838,18 @@ rte_event_queue_attr_get(uint8_t dev_id, uint8_t >queue_id, uint32_t attr_id, >> >> *attr_value = conf->schedule_type; >> break; >> + case RTE_EVENT_QUEUE_ATTR_WEIGHT: >> + *attr_value = RTE_EVENT_QUEUE_WEIGHT_LOWEST; >> + if (dev->dev_ops->queue_attr_get) >> + return (*dev->dev_ops->queue_attr_get)( >> + dev, queue_id, attr_id, attr_value); >> + break; >> + case RTE_EVENT_QUEUE_ATTR_AFFINITY: >> + *attr_value = RTE_EVENT_QUEUE_AFFINITY_LOWEST; >> + if (dev->dev_ops->queue_attr_get) >> + return (*dev->dev_ops->queue_attr_get)( >> + dev, queue_id, attr_id, attr_value); >> + break; >> default: >> return -EINVAL; >> }; >> diff --git a/lib/eventdev/rte_eventdev.h b/lib/eventdev/rte_eventdev.h >> index 19710cd0c5..fa16fc5dcb 100644 >> --- a/lib/eventdev/rte_eventdev.h >> +++ b/lib/eventdev/rte_eventdev.h >> @@ -222,8 +222,14 @@ struct rte_event; >> >> /* Event device capability bitmap flags */ >> #define RTE_EVENT_DEV_CAP_QUEUE_QOS (1ULL << 0) >> -/**< Event scheduling prioritization is based on the priority associated >> with >> - * each event queue. >> +/**< Event scheduling prioritization is based on the priority and weight >> + * associated with each event queue. Events from a queue with highest >> priority >> + * is scheduled first. If the queues are of same priority, a queue with >> highest >> + * weight is selected. Subsequent schedules from an event port could see >events >> + * from the same event queue if the queue is configured with an affinity >> count. >> + * Affinity count of a queue indicates the number of times, the subsequent >> + * schedule calls from an event port should use the same queue if the queue >> is >> + * non-empty. > >Is this specifying something else than WRR scheduling for equal-priority >queues? >
It is WRR for equal-priority queues. I will update the text as follows. Please check. /**< Event scheduling prioritization is based on the priority and weight * associated with each event queue. Events from a queue with highest priority * is scheduled first. If the queues are of same priority, weight of the queues * are used to select a queue in a weighted round robin fashion. Subsequent * dequeue calls from an event port could see events from the same event queue * if the queue is configured with an affinity count. Affinity count of a queue * indicates the number of subsequent dequeue calls from an event port which * should use the same queue if the queue is non-empty. >What is a schedule call? I must say I don't understand this description. Schedule call indicates a dequeue call. I have updated the text to avoid confusion. >Is affinity the per-port batch size from the queue that is "next in >line" for an opportunity to be scheduled to a port? > Not exactly batch size. It is the number of subsequent dequeue calls which should use the same queue. So the subsequent dequeue calls could return a max of affinity * batch_size number of events from the same queue. >> * >> * @see rte_event_queue_setup(), rte_event_queue_attr_set() >> */ >> @@ -331,6 +337,26 @@ struct rte_event; >> * @see rte_event_port_link() >> */ >> >> +/* Event queue scheduling weights */ >> +#define RTE_EVENT_QUEUE_WEIGHT_HIGHEST 255 >> +/**< Highest weight of an event queue >> + * @see rte_event_queue_attr_get(), rte_event_queue_attr_set() >> + */ >> +#define RTE_EVENT_QUEUE_WEIGHT_LOWEST 0 >> +/**< Lowest weight of an event queue >> + * @see rte_event_queue_attr_get(), rte_event_queue_attr_set() >> + */ >> + >> +/* Event queue scheduling affinity */ >> +#define RTE_EVENT_QUEUE_AFFINITY_HIGHEST 255 >> +/**< Highest scheduling affinity of an event queue >> + * @see rte_event_queue_attr_get(), rte_event_queue_attr_set() >> + */ >> +#define RTE_EVENT_QUEUE_AFFINITY_LOWEST 0 >> +/**< Lowest scheduling affinity of an event queue >> + * @see rte_event_queue_attr_get(), rte_event_queue_attr_set() >> + */ >> + >> /** >> * Get the total number of event devices that have been successfully >> * initialised. >> @@ -684,11 +710,18 @@ rte_event_queue_setup(uint8_t dev_id, uint8_t >queue_id, >> * The schedule type of the queue. >> */ >> #define RTE_EVENT_QUEUE_ATTR_SCHEDULE_TYPE 4 >> - >> +/** >> + * The weight of the queue. >> + */ >> +#define RTE_EVENT_QUEUE_ATTR_WEIGHT 5 >> +/** >> + * Affinity of the queue. >> + */ >> +#define RTE_EVENT_QUEUE_ATTR_AFFINITY 6 >> /** >> * Maximum supported attribute ID. >> */ >> -#define RTE_EVENT_QUEUE_ATTR_MAX >RTE_EVENT_QUEUE_ATTR_SCHEDULE_TYPE >> +#define RTE_EVENT_QUEUE_ATTR_MAX RTE_EVENT_QUEUE_ATTR_AFFINITY >> > >> /** >> * Get an attribute from a queue.