I agree.  It's not clear from these definitions how or why packets are
spread to input queues or gathered from output queues.  What is the use
case behind these APIs?  It seems we can either do a direct send or recv to
a single pktio queue, which gives the same behavior as today's direct
send/recv calls, or else a non-specific send/recv where the actual queues
being used are unspecified.  Given this ambiguity, it's also not clear how
or when an application would know that it should send or recv to a specific
queue (or indeed, what that queue represents) for a given pktio.

Given that an odp_pktio_t represents a logical interface, which may be tied
to a NUMA zone, it would seem to be simpler and more direct to simply have
multiple pktio objects than a single pktio object with a collection of
queues.

There's also the larger question of why do we want to encourage
applications to continue using polling rather than scheduling and the TM
for their I/O needs?  Something to discuss.

On Fri, Nov 6, 2015 at 11:53 AM, Bala Manoharan <[email protected]>
wrote:

> Hi Petri,
>
> Why don't we add this hash parameter to CoS so that when the packet
> arrives to a CoS it can be distributed based on the hash algorithm to
> a number of queues. Also if a system does not support Classification
> this hashing can be attached to the default CoS and in systems
> supporting Classification this input hashing attached to the default
> CoS will be applied when none of the PMR rules are matching the input
> packet so the classification PMR rules will take a higher priority
> than direct packet receive which I believe is the expected behavior.
>
> Also regarding the APIs for attaching multiple output queues to pktio
> interface I believe we should be able to get this behaviour using the
> proposed TM APIs if not we should modify the TM API to support this
> feature.
> I think configuring a TM system with a single hierarchy level should
> be enough to solve this issue.
>
> Regards,
> Bala
>
> On 6 November 2015 at 18:03, Petri Savolainen
> <[email protected]> wrote:
> > Added input queue configuration parameters and functions
> > to setup multiple input queue and hashing. Added also
> > odp_pktio_input_queues to query the number of queues
> > and queue handles. Direct receive does not use queue
> > handles, but indexes.
> >
> > Signed-off-by: Petri Savolainen <[email protected]>
> > ---
> >  include/odp/api/packet_io.h | 88
> +++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 88 insertions(+)
> >
> > diff --git a/include/odp/api/packet_io.h b/include/odp/api/packet_io.h
> > index 264fa75..bb0e67c 100644
> > --- a/include/odp/api/packet_io.h
> > +++ b/include/odp/api/packet_io.h
> > @@ -19,6 +19,7 @@ extern "C" {
> >  #endif
> >
> >  #include <odp/api/packet_io_stats.h>
> > +#include <odp/api/queue.h>
> >
> >  /** @defgroup odp_packet_io ODP PACKET IO
> >   *  Operations on a packet Input/Output interface.
> > @@ -85,6 +86,43 @@ typedef enum odp_pktio_output_mode_t {
> >  } odp_pktio_output_mode_t;
> >
> >  /**
> > + * Packet input hash protocols
> > + *
> > + * The list of protocol header field combinations, which are included
> into
> > + * packet input hash calculation.
> > + */
> > +typedef enum odp_pktin_hash_proto_t {
> > +       /** IPv4 addresses and UDP port numbers, non-fragmented packets
> */
> > +       ODP_PKTIN_HASH_IPV4_UDP = 0,
> > +       /** IPv4 addresses and TCP port numbers, non-fragmented packets
> */
> > +       ODP_PKTIN_HASH_IPV4_TCP
> > +} odp_pktin_hash_proto_t;
> > +
> > +/**
> > + * Packet input queue parameters
> > + */
> > +typedef struct odp_pktio_input_queue_param_t {
> > +       /** Enable lock-free receive operation per queue
> > +         * 0: Receive is multi-thread safe, 1: Receive is lock-free */
> > +       odp_bool_t lock_free;
> > +
> > +       /** Select protocol fields used for hashing */
> > +       odp_pktin_hash_proto_t hash_proto;
> > +
> > +       /** Number of input queues to be created. More than one input
> queue
> > +         * require input hashing. Hash_proto is ignore when num_queues
> is one.
> > +         * The value must be between 1 and interface capability. Queue
> type is
> > +         * defined by the input mode. */
> > +       unsigned num_queues;
> > +
> > +       /** Queue parameters for creating input queues in
> ODP_PKTIN_MODE_POLL
> > +         * or ODP_PKTIN_MODE_SCHED modes. Scheduler parameters are
> considered
> > +         * only in ODP_PKTIN_MODE_SCHED mode. */
> > +       odp_queue_param_t queue_param;
> > +
> > +} odp_pktio_input_queue_param_t;
> > +
> > +/**
> >   * Packet IO parameters
> >   *
> >   * In minimum, user must select input and output modes. Use 0 for
> defaults.
> > @@ -158,6 +196,47 @@ odp_pktio_t odp_pktio_open(const char *dev,
> odp_pool_t pool,
> >  int odp_pktio_capability(odp_pktio_t pktio, odp_pktio_capability_t
> *capa);
> >
> >  /**
> > + * Configure packet input queues
> > + *
> > + * Setup a number of packet input queues and configure those. The
> maximum number
> > + * of queues is platform dependent and can be queried with
> > + * odp_pktio_capability(). Queue handles for input queues can be
> requested with
> > + * odp_pktio_input_queues() after this call. All requested queues are
> setup on
> > + * success, no queues are setup on failure.
> > + *
> > + * @param pktio    Packet IO handle
> > + * @param param    Packet input queue configuration parameters
> > + *
> > + * @retval 0 on success
> > + * @retval <0 on failure
> > + *
> > + * @see odp_pktio_capability(), odp_pktio_input_queues()
> > + */
> > +int odp_pktio_input_queues_config(odp_pktio_t pktio,
> > +                                 const odp_pktio_input_queue_param_t
> *param);
> > +
> > +/**
> > + * Packet input queues
> > + *
> > + * Returns the number of input queues configured for the interface.
> Outputs also
> > + * up to 'num' queue handles created for ODP_PKTIN_MODE_POLL and
> > + * ODP_PKTIN_MODE_SCHED modes. If return value is larger than 'num',
> there are
> > + * more queues than the function was allowed to output handles.
> > + *
> > + * Depending on the input mode, packets (or events) from these queues
> are
> > + * received using odp_pktio_recv_queue(), odp_queue_deq(),
> odp_schedule(), etc
> > + * calls.
> > + *
> > + * @param      pktio    Packet IO handle
> > + * @param[out] queues   Points to an array of queue handles for output
> > + * @param      num      Maximum number of queue handles to output
> > + *
> > + * @return Number of packet input queues
> > + * @retval <0 on failure
> > + */
> > +int odp_pktio_input_queues(odp_pktio_t pktio, odp_queue_t queues[], int
> num);
> > +
> > +/**
> >   * Start packet receive and transmit
> >   *
> >   * Activate packet receive and transmit on a previously opened or
> stopped
> > @@ -411,6 +490,15 @@ uint64_t odp_pktio_to_u64(odp_pktio_t pktio);
> >  void odp_pktio_param_init(odp_pktio_param_t *param);
> >
> >  /**
> > + * Initialize packet input queue parameters
> > + *
> > + * Initialize an odp_pktio_input_queue_param_t to its default values.
> > + *
> > + * @param param   Input queue parameter structure to be initialized
> > + */
> > +void odp_pktio_input_queue_param_init(odp_pktio_input_queue_param_t
> *param);
> > +
> > +/**
> >   * Print pktio info to the console
> >   *
> >   * Print implementation-defined pktio debug information to the console.
> > --
> > 2.6.2
> >
> > _______________________________________________
> > lng-odp mailing list
> > [email protected]
> > https://lists.linaro.org/mailman/listinfo/lng-odp
> _______________________________________________
> lng-odp mailing list
> [email protected]
> https://lists.linaro.org/mailman/listinfo/lng-odp
>
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to