> From: Jerin Jacob [mailto:jerin.ja...@caviumnetworks.com] > Sent: Monday, March 27, 2017 8:45 AM > To: Van Haaren, Harry <harry.van.haa...@intel.com> > Cc: dev@dpdk.org; Richardson, Bruce <bruce.richard...@intel.com> > Subject: Re: [PATCH v5 06/20] event/sw: add support for event queues > > On Fri, Mar 24, 2017 at 04:53:01PM +0000, Harry van Haaren wrote: > > From: Bruce Richardson <bruce.richard...@intel.com> > > > > Add in the data structures for the event queues, and the eventdev > > functions to create and destroy those queues. > > > > Signed-off-by: Bruce Richardson <bruce.richard...@intel.com> > > Signed-off-by: Harry van Haaren <harry.van.haa...@intel.com> > > ---
<snip> > > +static int32_t > > +qid_init(struct sw_evdev *sw, unsigned int idx, int type, > > + const struct rte_event_queue_conf *queue_conf) > > +{ > > + unsigned int i; > > + int dev_id = sw->data->dev_id; > > + int socket_id = sw->data->socket_id; > > + char buf[IQ_RING_NAMESIZE]; > > + struct sw_qid *qid = &sw->qids[idx]; > > + > > + for (i = 0; i < SW_IQS_MAX; i++) { > > Just for my understanding, Are 4(SW_IQS_MAX) iq rings created to address > different priority for each enqueue operation? What is the significance of > 4(SW_IQS_MAX) here? Yes each IQ represents a priority level. There is a compile-time define (SW_IQS_MAX) which allows setting the number of internal-queues at each queue stage. The default number of priorities is currently 4. > > +static int > > +sw_queue_setup(struct rte_eventdev *dev, uint8_t queue_id, > > + const struct rte_event_queue_conf *conf) > > +{ > > + int type; > > + > > + switch (conf->event_queue_cfg) { > > + case RTE_EVENT_QUEUE_CFG_SINGLE_LINK: > > + type = SW_SCHED_TYPE_DIRECT; > > + break; > > event_queue_cfg is a bitmap. It is valid to have > RTE_EVENT_QUEUE_CFG_SINGLE_LINK | RTE_EVENT_QUEUE_CFG_ATOMIC_ONLY. > i.e An atomic schedule type queue and it has only one port linked to > dequeue the events. > So in the above context, The switch case is not correct. i.e > it goes to the default condition. Right? > Is this intentional? > > If I understand it correctly, Based on the use case(grouped based event > pipelining), you have shared in > the documentation patch. RTE_EVENT_QUEUE_CFG_SINGLE_LINK used for last > stage(last queue). One option is if SW PMD cannot support > RTE_EVENT_QUEUE_CFG_SINGLE_LINK | RTE_EVENT_QUEUE_CFG_ATOMIC_ONLY mode > then even tough application sets the RTE_EVENT_QUEUE_CFG_SINGLE_LINK | > RTE_EVENT_QUEUE_CFG_ATOMIC_ONLY, driver can ignore > RTE_EVENT_QUEUE_CFG_ATOMIC_ONLY. But I am not sure the case where > application sets RTE_EVENT_QUEUE_CFG_SINGLE_LINK in the middle of the > pipeline. > > Thoughts? I don't like the idea of the SW PMD ignoring flags for queues - the PMD has no idea if the queue is the final or middle of the pipeline as it's the applications usage which defines that. Does anybody have a need for a queue to be both Atomic *and* Single-link? I understand the current API doesn't prohibit it, but I don't see the actual use-case in which that may be useful. Atomic implies load-balancing is occurring, single link implies there is only one consuming core. Those seem like opposites to me? Unless anybody sees value in queue's having both, I suggest we update the documentation to specify that a queue is either load balanced, or single-link, and that setting both flags will result in -ENOTSUP being returned. (This check can be added to EventDev layer if consistent for all PMDs). Counter-thoughts? > > + case RTE_EVENT_QUEUE_CFG_ATOMIC_ONLY: > > + type = RTE_SCHED_TYPE_ATOMIC; > > + break; > > + case RTE_EVENT_QUEUE_CFG_ORDERED_ONLY: > > + type = RTE_SCHED_TYPE_ORDERED; > > + break; > > + case RTE_EVENT_QUEUE_CFG_PARALLEL_ONLY: > > + type = RTE_SCHED_TYPE_PARALLEL; > > + break; > > + case RTE_EVENT_QUEUE_CFG_ALL_TYPES: > > + SW_LOG_ERR("QUEUE_CFG_ALL_TYPES not supported\n"); > > + return -ENOTSUP; > > + default: > > + SW_LOG_ERR("Unknown queue type %d requested\n", > > + conf->event_queue_cfg); > > + return -EINVAL; > > + } > > + > > + struct sw_evdev *sw = sw_pmd_priv(dev); > > + return qid_init(sw, queue_id, type, conf); > > +}