DPDK patches and discussions
 help / color / mirror / Atom feed
From: Ajit Khaparde <ajit.khaparde@broadcom.com>
To: Andrey Vesnovaty <andreyv@nvidia.com>
Cc: NBU-Contact-Thomas Monjalon <thomas@monjalon.net>,
	Ori Kam <orika@nvidia.com>,
	Slava Ovsiienko <viacheslavo@nvidia.com>,
	"jerinj@marvell.com" <jerinj@marvell.com>,
	 Andrew Rybchenko <arybchenko@solarflare.com>,
	dpdk-dev <dev@dpdk.org>,  "jer@marvell.com" <jer@marvell.com>,
	Jerin Jacob <jerinjacobk@gmail.com>,
	 Ferruh Yigit <ferruh.yigit@intel.com>,
	Stephen Hemminger <stephen@networkplumber.org>,
	 Bruce Richardson <bruce.richardson@intel.com>,
	Ori Kam <orika@mellanox.com>,
	 Viacheslav Ovsiienko <viacheslavo@mellanox.com>,
	 "andrey.vesnovaty@gmail.com" <andrey.vesnovaty@gmail.com>,
	Ray Kinsella <mdr@ashroe.eu>,
	 Neil Horman <nhorman@tuxdriver.com>,
	Thomas Monjalon <tmonjalon@nvidia.com>,
	 Samik Gupta <samik.gupta@broadcom.com>
Subject: Re: [dpdk-dev] [PATCH v2 1/6] ethdev: add flow shared action API
Date: Tue, 15 Sep 2020 08:49:07 -0700
Message-ID: <CACZ4nhsHedmi-02WiXFJUqAww9iKFK5r+VChJ0-t0oKuBCa5ow@mail.gmail.com> (raw)
In-Reply-To: <MWHPR1201MB25257988BEBB99B2845CA913DB200@MWHPR1201MB2525.namprd12.prod.outlook.com>

On Tue, Sep 15, 2020 at 4:51 AM Andrey Vesnovaty <andreyv@nvidia.com> wrote:

> Hi Ajit, PSB.
>
> Thanks,
> Andrey
>
> > -----Original Message-----
> > From: Ajit Khaparde <ajit.khaparde@broadcom.com>
> > Sent: Saturday, September 12, 2020 5:18 AM
> > To: Andrey Vesnovaty <andreyv@mellanox.com>
> > Cc: dpdk-dev <dev@dpdk.org>; jer@marvell.com; Jerin Jacob
> > <jerinjacobk@gmail.com>; NBU-Contact-Thomas Monjalon
> > <thomas@monjalon.net>; Ferruh Yigit <ferruh.yigit@intel.com>; Stephen
> > Hemminger <stephen@networkplumber.org>; Bruce Richardson
> > <bruce.richardson@intel.com>; Ori Kam <orika@mellanox.com>; Viacheslav
> > Ovsiienko <viacheslavo@mellanox.com>; andrey.vesnovaty@gmail.com; Ray
> > Kinsella <mdr@ashroe.eu>; Neil Horman <nhorman@tuxdriver.com>; Andrew
> > Rybchenko <arybchenko@solarflare.com>
> > Subject: Re: [dpdk-dev] [PATCH v2 1/6] ethdev: add flow shared action API
> >
> >
> >
> > On Wed, Jul 8, 2020 at 2:40 PM Andrey Vesnovaty <andreyv@mellanox.com
> > <mailto:andreyv@mellanox.com> > wrote:
> >
> >
> >       From: Andrey Vesnovaty <andrey.vesnovaty@gmail.com
> > <mailto:andrey.vesnovaty@gmail.com> >
> >
> >       This commit introduces extension of DPDK flow action API enabling
> >       sharing of single rte_flow_action in multiple flows. The API
> intended for
> >       PMDs where multiple HW offloaded flows can reuse the same HW
> >       essence/object representing flow action and modification of such an
> >       essence/object effects all the rules using it.
> >
> >       Motivation and example
> >       ===
> >       Adding or removing one or more queues to RSS used by multiple flow
> > rules
> >       imposes per rule toll for current DPDK flow API; the scenario
> requires
> >       for each flow sharing cloned RSS action:
> >       - call `rte_flow_destroy()`
> >       - call `rte_flow_create()` with modified RSS action
> >
> >       API for sharing action and its in-place update benefits:
> >       - reduce the overhead of multiple RSS flow rules reconfiguration
> >       - optimize resource utilization by sharing action across of
> multiple
> >         flows
> >
> >       Change description
> >       ===
> >
> >       Shared action
> >       ===
> >       In order to represent flow action shared by multiple flows new
> action
> >       type RTE_FLOW_ACTION_TYPE_SHARED is introduced (see `enum
> >       rte_flow_action_type`).
> >       Actually the introduced API decouples action from any specific
> flow and
> >       enables sharing of single action by its handle across multiple
> flows.
> >
> >       Shared action create/use/destroy
> >       ===
> >       Shared action may be reused by some or none flow rules at any given
> >       moment, i.e. shared action reside outside of the context of any
> flow.
> >       Shared action represent HW resources/objects used for action
> > offloading
> >       implementation.
> >       API for shared action create (see
> `rte_flow_shared_action_create()`):
> >       - should allocate HW resources and make related initializations
> required
> >         for shared action implementation.
> >       - make necessary preparations to maintain shared access to
> >         the action resources, configuration and state.
> >       API for shared action destroy (see
> `rte_flow_shared_action_destroy()`)
> >       should release HW resources and make related cleanups required for
> > shared
> >       action implementation.
> >
> >       In order to share some flow action reuse the handle of type
> >       `struct rte_flow_shared_action` returned by
> >       rte_flow_shared_action_create() as a `conf` field of
> >       `struct rte_flow_action` (see "example" section).
> >
> >       If some shared action not used by any flow rule all resources
> allocated
> >       by the shared action can be released by
> > rte_flow_shared_action_destroy()
> >       (see "example" section). The shared action handle passed as
> argument
> > to
> >       destroy API should not be used any further i.e. result of the
> usage is
> >       undefined.
> >
> >       Shared action re-configuration
> >       ===
> >       Shared action behavior defined by its configuration can be updated
> via
> >       rte_flow_shared_action_update() (see "example" section). The shared
> >       action update operation modifies HW related resources/objects
> > allocated
> >       on the action creation. The number of operations performed by the
> > update
> >       operation should not be dependent on number of flows sharing the
> > related
> >       action. On return of shared action update API action behavior
> should be
> >       according to updated configuration for all flows sharing the
> action.
> >
> >       Shared action query
> >       ===
> >       Provide separate API to query shared action sate (see
> >       rte_flow_shared_action_update()). Taking a counter as an example:
> > query
> >       returns value aggregating all counter increments across all flow
> rules
> >       sharing the counter.
> >
> >       PMD support
> >       ===
> >       The support of introduced API is pure PMD specific design and
> >       responsibility for each action type (see struct rte_flow_ops).
> >
> >       testpmd
> >       ===
> >       In order to utilize introduced API testpmd cli may implement
> following
> >       extension
> >       create/update/destroy/query shared action accordingly
> >
> >       flow shared_action create {port_id} [index] {action}
> >       flow shared_action update {port_id} {index} {action}
> >       flow shared_action destroy {port_id} {index}
> >       flow shared_action query {port_id} {index}
> >
> >       testpmd example
> >       ===
> >
> >       configure rss to queues 1 & 2
> >
> >       testpmd> flow shared_action create 0 100 rss 1 2
> >
> >       create flow rule utilizing shared action
> >
> >       testpmd> flow create 0 ingress \
> >           pattern eth dst is 0c:42:a1:15:fd:ac / ipv6 / tcp / end \
> >         actions shared 100 end / end
> >
> >       add 2 more queues
> >
> >       testpmd> flow shared_action modify 0 100 rss 1 2 3 4
> >
> >       example
> >       ===
> >
> >       struct rte_flow_action actions[2];
> >       struct rte_flow_action action;
> >       /* skipped: initialize action */
> >       struct rte_flow_shared_action *handle =
> > rte_flow_shared_action_create(
> >                                               port_id, &action, &error);
> >       actions[0].type = RTE_FLOW_ACTION_TYPE_SHARED;
> >       actions[0].conf = handle;
> >       actions[1].type = RTE_FLOW_ACTION_TYPE_END;
> >       /* skipped: init attr0 & pattern0 args */
> >       struct rte_flow *flow0 = rte_flow_create(port_id, &attr0, pattern0,
> >                                               actions, error);
> >       /* create more rules reusing shared action */
> >       struct rte_flow *flow1 = rte_flow_create(port_id, &attr1, pattern1,
> >                                               actions, error);
> >       /* skipped: for flows 2 till N */
> >       struct rte_flow *flowN = rte_flow_create(port_id, &attrN, patternN,
> >                                               actions, error);
> >       /* update shared action */
> >       struct rte_flow_action updated_action;
> >       /*
> >        * skipped: initialize updated_action according to desired action
> >        * configuration change
> >        */
> >       rte_flow_shared_action_update(port_id, handle, &updated_action,
> > error);
> >       /*
> >        * from now on all flows 1 till N will act according to
> configuration of
> >        * updated_action
> >        */
> >       /* skipped: destroy all flows 1 till N */
> >       rte_flow_shared_action_destroy(port_id, handle, error);
> >
> >       Signed-off-by: Andrey Vesnovaty <andreyv@mellanox.com
> > <mailto:andreyv@mellanox.com> >
> >       ---
> >        lib/librte_ethdev/rte_ethdev_version.map |   6 +
> >        lib/librte_ethdev/rte_flow.c             |  81 +++++++++++++
> >        lib/librte_ethdev/rte_flow.h             | 148
> ++++++++++++++++++++++-
> >        lib/librte_ethdev/rte_flow_driver.h      |  22 ++++
> >        4 files changed, 256 insertions(+), 1 deletion(-)
> >
> >       diff --git a/lib/librte_ethdev/rte_ethdev_version.map
> > b/lib/librte_ethdev/rte_ethdev_version.map
> >       index 7155056045..119d84976a 100644
> >       --- a/lib/librte_ethdev/rte_ethdev_version.map
> >       +++ b/lib/librte_ethdev/rte_ethdev_version.map
> >       @@ -241,4 +241,10 @@ EXPERIMENTAL {
> >               __rte_ethdev_trace_rx_burst;
> >               __rte_ethdev_trace_tx_burst;
> >               rte_flow_get_aged_flows;
> >       +
> >       +       # added in 20.08
> >       +       rte_flow_shared_action_create;
> >       +       rte_flow_shared_action_destroy;
> >       +       rte_flow_shared_action_update;
> >       +       rte_flow_shared_action_query;
> >        };
> >       diff --git a/lib/librte_ethdev/rte_flow.c
> b/lib/librte_ethdev/rte_flow.c
> >       index 1685be5f73..0ac4d31a13 100644
> >       --- a/lib/librte_ethdev/rte_flow.c
> >       +++ b/lib/librte_ethdev/rte_flow.c
> >       @@ -1250,3 +1250,84 @@ rte_flow_get_aged_flows(uint16_t port_id,
> > void **contexts,
> >                                         RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> >                                         NULL, rte_strerror(ENOTSUP));
> >        }
> >       +
> >       +struct rte_flow_shared_action *
> >       +rte_flow_shared_action_create(uint16_t port_id,
> >       +                             const struct rte_flow_action *action,
> >
> >
> > It will be good to have an attributes argument here.
> > Some hardware devices may have ingress and egress resource pools.
> > So a 'direction' attribute can help share the resource effectively.
>
> I understand the idea of HW ingress/egress resource separation.
> Unfortunately on shared action creation it's not defined if it will be used
> in ingress or egress flow or both.
> Is the suggestion is to restrict usage of shared action to single
> direction?
>
In a way, it is more to add flexibility to this proposal.
Specifying the direction explicitly is better than PMD parsing the actions
and determining if it is for ingress or egress.

If hardware does not have specific pools for either ingress or egress,
the PMD can ignore the attribute.
So it will be upto the PMD and the underlying hardware to use the
direction attribute - if necessary.


> >
> >
> >
> >       +                             struct rte_flow_error *error)
> >       +{
> >       +       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
> >       +       struct rte_flow_shared_action *shared_action;
> >       +       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id,
> error);
> >       +
> >       +       if (unlikely(!ops))
> >       +               return NULL;
> >       +       if (likely(!!ops->shared_action_create)) {
> >       +               shared_action = ops->shared_action_create(dev,
> action,
> > error);
> >       +               if (shared_action == NULL)
> >       +                       flow_err(port_id, -rte_errno, error);
> >       +               return shared_action;
> >       +       }
> >       +       rte_flow_error_set(error, ENOSYS,
> > RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> >       +                          NULL, rte_strerror(ENOSYS));
> >       +       return NULL;
> >       +}
> >       +
> >       +int
> >       +rte_flow_shared_action_destroy(uint16_t port_id,
> >       +                             struct rte_flow_shared_action
> *action,
> >       +                             struct rte_flow_error *error)
> >       +{
> >       +       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
> >       +       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id,
> error);
> >       +
> >       +       if (unlikely(!ops))
> >       +               return -rte_errno;
> >       +       if (likely(!!ops->shared_action_destroy))
> >       +               return flow_err(port_id,
> >       +                               ops->shared_action_destroy(dev,
> action, error),
> >       +                               error);
> >       +       return rte_flow_error_set(error, ENOSYS,
> >       +                                 RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> >       +                                 NULL, rte_strerror(ENOSYS));
> >       +}
> >       +
> >       +int
> >       +rte_flow_shared_action_update(uint16_t port_id,
> >       +                             struct rte_flow_shared_action
> *action,
> >       +                             const struct rte_flow_action *update,
> >       +                             struct rte_flow_error *error)
> >       +{
> >       +       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
> >       +       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id,
> error);
> >       +
> >       +       if (unlikely(!ops))
> >       +               return -rte_errno;
> >       +       if (likely(!!ops->shared_action_update))
> >       +               return flow_err(port_id,
> ops->shared_action_update(dev,
> > action,
> >       +                               update, error),
> >       +                       error);
> >       +       return rte_flow_error_set(error, ENOSYS,
> >       +                                 RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> >       +                                 NULL, rte_strerror(ENOSYS));
> >       +}
> >       +
> >       +int
> >       +rte_flow_shared_action_query(uint16_t port_id,
> >       +                            const struct rte_flow_shared_action
> *action,
> >       +                            void *data,
> >       +                            struct rte_flow_error *error)
> >       +{
> >       +       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
> >       +       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id,
> error);
> >       +
> >       +       if (unlikely(!ops))
> >       +               return -rte_errno;
> >       +       if (likely(!!ops->shared_action_query))
> >       +               return flow_err(port_id,
> ops->shared_action_query(dev,
> > action,
> >       +                               data, error),
> >       +                       error);
> >       +       return rte_flow_error_set(error, ENOSYS,
> >       +                                 RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> >       +                                 NULL, rte_strerror(ENOSYS));
> >       +}
> >       diff --git a/lib/librte_ethdev/rte_flow.h
> b/lib/librte_ethdev/rte_flow.h
> >       index b0e4199192..257456b14a 100644
> >       --- a/lib/librte_ethdev/rte_flow.h
> >       +++ b/lib/librte_ethdev/rte_flow.h
> >       @@ -1681,7 +1681,8 @@ enum rte_flow_action_type {
> >               /**
> >                * Enables counters for this flow rule.
> >                *
> >       -        * These counters can be retrieved and reset through
> > rte_flow_query(),
> >       +        * These counters can be retrieved and reset through
> > rte_flow_query() or
> >       +        * rte_flow_shared_action_query() if the action provided
> via
> > handle,
> >                * see struct rte_flow_query_count.
> >                *
> >                * See struct rte_flow_action_count.
> >       @@ -2099,6 +2100,14 @@ enum rte_flow_action_type {
> >                * see enum RTE_ETH_EVENT_FLOW_AGED
> >                */
> >               RTE_FLOW_ACTION_TYPE_AGE,
> >       +
> >       +       /**
> >       +        * Describes action shared a cross multiple flow rules.
> >       +        *
> >       +        * Enables multiple rules reference the same action by
> handle (see
> >       +        * struct rte_flow_shared_action).
> >       +        */
> >       +       RTE_FLOW_ACTION_TYPE_SHARED,
> >        };
> >
> >        /**
> >       @@ -2660,6 +2669,20 @@ struct rte_flow_action_set_dscp {
> >               uint8_t dscp;
> >        };
> >
> >       +
> >       +/**
> >       + * RTE_FLOW_ACTION_TYPE_SHARED
> >       + *
> >       + * Opaque type returned after successfully creating a shared
> action.
> >       + *
> >       + * This handle can be used to manage and query the related action:
> >       + * - share it a cross multiple flow rules
> >       + * - update action configuration
> >       + * - query action data
> >       + * - destroy action
> >       + */
> >       +struct rte_flow_shared_action;
> >       +
> >        /* Mbuf dynamic field offset for metadata. */
> >        extern int32_t rte_flow_dynf_metadata_offs;
> >
> >       @@ -3324,6 +3347,129 @@ int
> >        rte_flow_get_aged_flows(uint16_t port_id, void **contexts,
> >                               uint32_t nb_contexts, struct
> rte_flow_error *error);
> >
> >       +/**
> >       + * @warning
> >       + * @b EXPERIMENTAL: this API may change without prior notice.
> >       + *
> >       + * Create shared action for reuse in multiple flow rules.
> >       + *
> >       + * @param[in] port_id
> >       + *    The port identifier of the Ethernet device.
> >       + * @param[in] action
> >       + *   Action configuration for shared action creation.
> >       + * @param[out] error
> >       + *   Perform verbose error reporting if not NULL. PMDs initialize
> this
> >       + *   structure in case of error only.
> >       + * @return
> >       + *   A valid handle in case of success, NULL otherwise and
> rte_errno is
> > set
> >       + *   to one of the error codes defined:
> >       + *   - (ENOSYS) if underlying device does not support this
> functionality.
> >       + *   - (EIO) if underlying device is removed.
> >       + *   - (EINVAL) if *action* invalid.
> >       + *   - (ENOTSUP) if *action* valid but unsupported.
> >       + */
> >       +__rte_experimental
> >       +struct rte_flow_shared_action *
> >       +rte_flow_shared_action_create(uint16_t port_id,
> >       +                             const struct rte_flow_action *action,
> >       +                             struct rte_flow_error *error);
> >       +
> >       +/**
> >       + * @warning
> >       + * @b EXPERIMENTAL: this API may change without prior notice.
> >       + *
> >       + * Destroys the shared action by handle.
> >       + *
> >       + * @param[in] port_id
> >       + *    The port identifier of the Ethernet device.
> >       + * @param[in] action
> >       + *   Handle for the shared action to be destroyed.
> >       + * @param[out] error
> >       + *   Perform verbose error reporting if not NULL. PMDs initialize
> this
> >       + *   structure in case of error only.
> >       + * @return
> >       + *   - (0) if success.
> >       + *   - (-ENOSYS) if underlying device does not support this
> functionality.
> >       + *   - (-EIO) if underlying device is removed.
> >       + *   - (-ENOENT) if action pointed by *action* handle was not
> found.
> >       + *   - (-ETOOMANYREFS) if action pointed by *action* handle still
> used
> > by one or
> >       + *     more rules
> >       + *   rte_errno is also set.
> >       + */
> >       +__rte_experimental
> >       +int
> >       +rte_flow_shared_action_destroy(uint16_t port_id,
> >       +                             struct rte_flow_shared_action
> *action,
> >       +                             struct rte_flow_error *error);
> >       +
> >       +/**
> >       + * @warning
> >       + * @b EXPERIMENTAL: this API may change without prior notice.
> >       + *
> >       + * Updates inplace the shared action configuration pointed by
> *action*
> > handle
> >       + * with the configuration provided as *update* argument.
> >       + * The update of the shared action configuration effects all flow
> rules
> > reusing
> >       + * the action via handle.
> >       + *
> >       + * @param[in] port_id
> >       + *    The port identifier of the Ethernet device.
> >       + * @param[in] action
> >       + *   Handle for the shared action to be updated.
> >       + * @param[in] update
> >       + *   Action specification used to modify the action pointed by
> handle.
> >       + *   *update* should be of same type with the action pointed by
> the
> > *action*
> >       + *   handle argument, otherwise considered as invalid.
> >       + * @param[out] error
> >       + *   Perform verbose error reporting if not NULL. PMDs initialize
> this
> >       + *   structure in case of error only.
> >       + * @return
> >       + *   - (0) if success.
> >       + *   - (-ENOSYS) if underlying device does not support this
> functionality.
> >       + *   - (-EIO) if underlying device is removed.
> >       + *   - (-EINVAL) if *update* invalid.
> >       + *   - (-ENOTSUP) if *update* valid but unsupported.
> >       + *   - (-ENOENT) if action pointed by *ctx* was not found.
> >       + *   rte_errno is also set.
> >       + */
> >       +__rte_experimental
> >       +int
> >       +rte_flow_shared_action_update(uint16_t port_id,
> >       +                             struct rte_flow_shared_action
> *action,
> >       +                             const struct rte_flow_action *update,
> >       +                             struct rte_flow_error *error);
> >       +
> >       +/**
> >       + * @warning
> >       + * @b EXPERIMENTAL: this API may change without prior notice.
> >       + *
> >       + * Query the shared action by handle.
> >       + *
> >       + * This function allows retrieving action-specific data such as
> counters.
> >       + * Data is gathered by special action which may be
> present/referenced
> > in
> >       + * more than one flow rule definition.
> >       + *
> >       + * \see RTE_FLOW_ACTION_TYPE_COUNT
> >       + *
> >       + * @param port_id
> >       + *   Port identifier of Ethernet device.
> >       + * @param[in] action
> >       + *   Handle for the shared action to query.
> >       + * @param[in, out] data
> >       + *   Pointer to storage for the associated query data type.
> >       + * @param[out] error
> >       + *   Perform verbose error reporting if not NULL. PMDs initialize
> this
> >       + *   structure in case of error only.
> >       + *
> >       + * @return
> >       + *   0 on success, a negative errno value otherwise and rte_errno
> is set.
> >       + */
> >       +__rte_experimental
> >       +int
> >       +rte_flow_shared_action_query(uint16_t port_id,
> >       +                            const struct rte_flow_shared_action
> *action,
> >       +                            void *data,
> >       +                            struct rte_flow_error *error);
> >       +
> >        #ifdef __cplusplus
> >        }
> >        #endif
> >       diff --git a/lib/librte_ethdev/rte_flow_driver.h
> > b/lib/librte_ethdev/rte_flow_driver.h
> >       index 881cc469b7..a2cae1b53c 100644
> >       --- a/lib/librte_ethdev/rte_flow_driver.h
> >       +++ b/lib/librte_ethdev/rte_flow_driver.h
> >       @@ -107,6 +107,28 @@ struct rte_flow_ops {
> >                        void **context,
> >                        uint32_t nb_contexts,
> >                        struct rte_flow_error *err);
> >       +       /** See rte_flow_shared_action_create() */
> >       +       struct rte_flow_shared_action *(*shared_action_create)
> >       +               (struct rte_eth_dev *dev,
> >       +               const struct rte_flow_action *action,
> >       +               struct rte_flow_error *error);
> >       +       /** See rte_flow_shared_action_destroy() */
> >       +       int (*shared_action_destroy)
> >       +               (struct rte_eth_dev *dev,
> >       +                struct rte_flow_shared_action *shared_action,
> >       +                struct rte_flow_error *error);
> >       +       /** See rte_flow_shared_action_update() */
> >       +       int (*shared_action_update)
> >       +               (struct rte_eth_dev *dev,
> >       +                struct rte_flow_shared_action *shared_action,
> >       +                const struct rte_flow_action *update,
> >       +                struct rte_flow_error *error);
> >       +       /** See rte_flow_shared_action_query() */
> >       +       int (*shared_action_query)
> >       +               (struct rte_eth_dev *dev,
> >       +                const struct rte_flow_shared_action
> *shared_action,
> >       +                void *data,
> >       +                struct rte_flow_error *error);
> >        };
> >
> >        /**
> >       --
> >       2.26.2
> >
> >
>
>

  reply	other threads:[~2020-09-15 15:49 UTC|newest]

Thread overview: 106+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-02 12:05 [dpdk-dev] [PATCH] " Andrey Vesnovaty
2020-07-03 15:02 ` Jerin Jacob
2020-07-03 15:21   ` Thomas Monjalon
2020-07-04  9:54     ` Andrey Vesnovaty
2020-07-04 10:10   ` Andrey Vesnovaty
2020-07-04 12:33     ` Jerin Jacob
2020-07-05 10:26       ` Ori Kam
2020-07-06  9:00         ` Jerin Jacob
2020-07-06 12:28           ` Ori Kam
2020-07-06 13:32             ` Andrey Vesnovaty
2020-07-07  2:30               ` Jerin Jacob
2020-07-07  6:21                 ` Ori Kam
2020-07-07 15:21                   ` Ferruh Yigit
2020-07-07 17:24                     ` Ori Kam
2020-07-07 17:52                       ` Ferruh Yigit
2020-07-07 19:38                   ` Jerin Jacob
2020-07-07 21:03                     ` Ori Kam
2020-07-08  9:25                       ` Jerin Jacob
2020-07-08  9:47                         ` Ori Kam
2020-07-08 11:00                           ` Jerin Jacob
2020-07-08 11:50                             ` Thomas Monjalon
2020-07-08 12:18                             ` Ori Kam
     [not found]                               ` <20200708204015.24429-2-andreyv@mellanox.com>
2020-07-13  8:04                                 ` [dpdk-dev] [PATCH v2 1/6] ethdev: " Kinsella, Ray
2020-07-13 10:16                                   ` Andrew Rybchenko
2020-07-15  8:54                                   ` Andrew Rybchenko
2020-07-15  9:00                                     ` Andrew Rybchenko
2020-09-15 11:30                                     ` Andrey Vesnovaty
     [not found]                               ` <20200708204015.24429-3-andreyv@mellanox.com>
2020-07-13  8:06                                 ` [dpdk-dev] [PATCH v2 2/6] common/mlx5: modify advanced Rx object via DevX Kinsella, Ray
2020-07-08 21:39 ` [dpdk-dev] [PATCH v2 0/6] add flow shared action API + PMD Andrey Vesnovaty
2020-07-08 21:39   ` [dpdk-dev] [PATCH v2 1/6] ethdev: add flow shared action API Andrey Vesnovaty
2020-09-12  2:18     ` Ajit Khaparde
2020-09-15 11:50       ` Andrey Vesnovaty
2020-09-15 15:49         ` Ajit Khaparde [this message]
2020-09-16 15:52           ` Andrey Vesnovaty
2020-09-16 19:20             ` Ajit Khaparde
2020-09-17 15:33               ` Andrew Rybchenko
2020-09-17 16:02                 ` Ori Kam
2020-09-24 19:25                   ` Ajit Khaparde
2020-09-26 11:09                     ` Andrey Vesnovaty
2020-10-03 22:06                       ` [dpdk-dev] [PATCH v3 00/10] RTE flow shared action Andrey Vesnovaty
2020-10-03 22:06                         ` [dpdk-dev] [PATCH v3 01/10] ethdev: add flow shared action API Andrey Vesnovaty
2020-10-04 11:10                           ` Ori Kam
2020-10-06 10:22                             ` Andrey Vesnovaty
2020-10-04 17:00                           ` Stephen Hemminger
2020-10-04 17:01                             ` Stephen Hemminger
2020-10-03 22:06                         ` [dpdk-dev] [PATCH v3 02/10] ethdev: add conf arg to shared action icreate API Andrey Vesnovaty
2020-10-04 11:11                           ` Ori Kam
2020-10-06 10:28                             ` Andrey Vesnovaty
2020-10-03 22:06                         ` [dpdk-dev] [PATCH v3 03/10] common/mlx5: modify advanced Rx object via DevX Andrey Vesnovaty
2020-10-03 22:06                         ` [dpdk-dev] [PATCH v3 04/10] net/mlx5: modify hash Rx queue objects Andrey Vesnovaty
2020-10-03 22:06                         ` [dpdk-dev] [PATCH v3 05/10] net/mlx5: shared action PMD Andrey Vesnovaty
2020-10-03 22:06                         ` [dpdk-dev] [PATCH v3 06/10] net/mlx5: shared action PMD create conf arg Andrey Vesnovaty
2020-10-03 22:06                         ` [dpdk-dev] [PATCH v3 07/10] net/mlx5: driver support for shared action Andrey Vesnovaty
2020-10-03 22:06                         ` [dpdk-dev] [PATCH v3 08/10] net/mlx5: shared action create conf drv support Andrey Vesnovaty
2020-10-03 22:06                         ` [dpdk-dev] [PATCH v3 09/10] examples/flow_filtering: utilize shared RSS action Andrey Vesnovaty
2020-10-04 11:21                           ` Ori Kam
2020-10-06 10:34                             ` Andrey Vesnovaty
2020-10-03 22:06                         ` [dpdk-dev] [PATCH v3 10/10] app/testpmd: support shared action Andrey Vesnovaty
2020-10-04 11:28                           ` Ori Kam
2020-10-04 12:04                             ` Ori Kam
2020-10-06 10:36                               ` Andrey Vesnovaty
2020-10-04 11:14                         ` [dpdk-dev] [PATCH v3 00/10] RTE flow " Ori Kam
2020-10-06 10:28                           ` Andrey Vesnovaty
2020-07-08 21:39   ` [dpdk-dev] [PATCH v2 2/6] common/mlx5: modify advanced Rx object via DevX Andrey Vesnovaty
2020-07-08 21:39   ` [dpdk-dev] [PATCH v2 3/6] net/mlx5: modify hash Rx queue objects Andrey Vesnovaty
2020-07-08 21:39   ` [dpdk-dev] [PATCH v2 4/6] net/mlx5: shared action PMD Andrey Vesnovaty
2020-07-08 21:39   ` [dpdk-dev] [PATCH v2 5/6] net/mlx5: driver support for shared action Andrey Vesnovaty
2020-07-08 21:39   ` [dpdk-dev] [PATCH v2 6/6] examples/flow_filtering: utilize shared RSS action Andrey Vesnovaty
2020-07-09  4:44     ` Jerin Jacob
2020-07-09  6:08       ` Ori Kam
2020-07-09 12:25         ` Andrey Vesnovaty
2020-07-09 12:39           ` Thomas Monjalon
2020-07-09  4:39   ` [dpdk-dev] [PATCH v2 0/6] add flow shared action API + PMD Jerin Jacob
2020-10-06 20:08 ` [dpdk-dev] [PATCH v4 0/2] RTE flow shared action Andrey Vesnovaty
2020-10-06 20:08   ` [dpdk-dev] [PATCH v4 1/2] ethdev: add flow shared action API Andrey Vesnovaty
2020-10-07  6:27     ` Ori Kam
2020-10-06 20:08   ` [dpdk-dev] [PATCH v4 2/2] app/testpmd: support shared action Andrey Vesnovaty
2020-10-07  6:30     ` Ori Kam
2020-10-07 12:56 ` [dpdk-dev] [PATCH v5 0/2] RTE flow " Andrey Vesnovaty
2020-10-07 12:56   ` [dpdk-dev] [PATCH v5 1/2] ethdev: add flow shared action API Andrey Vesnovaty
2020-10-07 13:01     ` Ori Kam
2020-10-07 21:23     ` Ajit Khaparde
2020-10-08  7:28       ` Andrey Vesnovaty
2020-10-07 12:56   ` [dpdk-dev] [PATCH v5 2/2] app/testpmd: support shared action Andrey Vesnovaty
2020-10-07 18:36 ` [dpdk-dev] [PATCH v6 0/2] RTE flow " Andrey Vesnovaty
2020-10-07 18:36   ` [dpdk-dev] [PATCH v6 1/2] ethdev: add flow shared action API Andrey Vesnovaty
2020-10-07 18:36   ` [dpdk-dev] [PATCH v6 2/2] app/testpmd: support shared action Andrey Vesnovaty
2020-10-07 20:01     ` Ajit Khaparde
2020-10-08 10:58       ` Andrey Vesnovaty
2020-10-08 11:51 ` [dpdk-dev] [PATCH v7 0/2] RTE flow " Andrey Vesnovaty
2020-10-08 11:51   ` [dpdk-dev] [PATCH v7 1/2] ethdev: add flow shared action API Andrey Vesnovaty
2020-10-08 22:30     ` Ajit Khaparde
2020-10-14 11:47       ` Andrey Vesnovaty
2020-10-12 14:19     ` Andrew Rybchenko
2020-10-13 20:06       ` Andrey Vesnovaty
2020-10-14  6:49         ` Andrew Rybchenko
2020-10-14  7:22           ` Thomas Monjalon
2020-10-14 11:43             ` Andrey Vesnovaty
2020-10-14 11:42           ` Andrey Vesnovaty
2020-10-08 11:51   ` [dpdk-dev] [PATCH v7 2/2] app/testpmd: support shared action Andrey Vesnovaty
2020-10-08 23:54     ` Ajit Khaparde
2020-10-14 11:40 ` [dpdk-dev] [PATCH v8 0/2] RTE flow " Andrey Vesnovaty
2020-10-14 11:40   ` [dpdk-dev] [PATCH v8 1/2] ethdev: add shared actions to flow API Andrey Vesnovaty
2020-10-14 11:44     ` Andrew Rybchenko
2020-10-14 16:17       ` Ferruh Yigit
2020-10-14 11:40   ` [dpdk-dev] [PATCH v8 2/2] app/testpmd: support shared action Andrey Vesnovaty

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CACZ4nhsHedmi-02WiXFJUqAww9iKFK5r+VChJ0-t0oKuBCa5ow@mail.gmail.com \
    --to=ajit.khaparde@broadcom.com \
    --cc=andrey.vesnovaty@gmail.com \
    --cc=andreyv@nvidia.com \
    --cc=arybchenko@solarflare.com \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=jer@marvell.com \
    --cc=jerinj@marvell.com \
    --cc=jerinjacobk@gmail.com \
    --cc=mdr@ashroe.eu \
    --cc=nhorman@tuxdriver.com \
    --cc=orika@mellanox.com \
    --cc=orika@nvidia.com \
    --cc=samik.gupta@broadcom.com \
    --cc=stephen@networkplumber.org \
    --cc=thomas@monjalon.net \
    --cc=tmonjalon@nvidia.com \
    --cc=viacheslavo@mellanox.com \
    --cc=viacheslavo@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

DPDK patches and discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://inbox.dpdk.org/dev/0 dev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dev dev/ https://inbox.dpdk.org/dev \
		dev@dpdk.org
	public-inbox-index dev

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.dev


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git