[dpdk-dev] [PATCH v5 06/20] event/sw: add support for event queues

Van Haaren, Harry harry.van.haaren at intel.com
Mon Mar 27 17:17:48 CEST 2017


> From: Jerin Jacob [mailto:jerin.jacob at caviumnetworks.com]
> Sent: Monday, March 27, 2017 8:45 AM
> To: Van Haaren, Harry <harry.van.haaren at intel.com>
> Cc: dev at dpdk.org; Richardson, Bruce <bruce.richardson at 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.richardson at 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.richardson at intel.com>
> > Signed-off-by: Harry van Haaren <harry.van.haaren at 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);
> > +}


More information about the dev mailing list