DPDK patches and discussions
 help / color / mirror / Atom feed
From: "Xu, Rosen" <rosen.xu@intel.com>
To: Jerin Jacob <jerin.jacob@caviumnetworks.com>
Cc: "dev@dpdk.org" <dev@dpdk.org>,
	"Dumitrescu, Cristian" <cristian.dumitrescu@intel.com>,
	"Lu, Wenzhuo" <wenzhuo.lu@intel.com>,
	"Singh, Jasvinder" <jasvinder.singh@intel.com>,
	"Yigit, Ferruh" <ferruh.yigit@intel.com>,
	"nithin.dabilpuram@cavium.com" <nithin.dabilpuram@cavium.com>
Subject: Re: [dpdk-dev] [RFC] ethdev: add tail drop API for traffic management
Date: Tue, 14 Aug 2018 06:45:12 +0000	[thread overview]
Message-ID: <0E78D399C70DA940A335608C6ED296D73A1CB17C@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <20180814060528.GA21200@jerin>



> -----Original Message-----
> From: Jerin Jacob [mailto:jerin.jacob@caviumnetworks.com]
> Sent: Tuesday, August 14, 2018 14:06
> To: Xu, Rosen <rosen.xu@intel.com>
> Cc: dev@dpdk.org; Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Lu,
> Wenzhuo <wenzhuo.lu@intel.com>; Singh, Jasvinder
> <jasvinder.singh@intel.com>; Yigit, Ferruh <ferruh.yigit@intel.com>;
> nithin.dabilpuram@cavium.com
> Subject: Re: [dpdk-dev] [RFC] ethdev: add tail drop API for traffic
> management
> 
> -----Original Message-----
> > Date: Mon, 13 Aug 2018 15:53:32 +0800
> > From: Rosen Xu <rosen.xu@intel.com>
> > To: dev@dpdk.org
> > CC: cristian.dumitrescu@intel.com, wenzhuo.lu@intel.com,
> > jasvinder.singh@intel.com, rosen.xu@intel.com, ferruh.yigit@intel.com
> > Subject: [dpdk-dev] [RFC] ethdev: add tail drop API for traffic
> > management
> > X-Mailer: git-send-email 1.8.3.1
> >
> >
> > This patch introduces new ethdev generic Tail Drop API for Traffic
> > Management, which is yet another standard congestion management
> > offload for Ethernet devices.
> >
> > Tail Drop is about packets dropping when they arrive on a congested
> > interface buffer. It's one mode of congestion management for hierarchy
> > leaf nodes.
> >
> > There are two configuration parameters for Tail Drop:
> > 1. Buffer Depth: determine the depth of receive fifo for packet RX.
> 
> If it is for Packet Rx, We should not add it in rte_tm, Right?

For cyber function perspective, it belongs to tm ingress, just like WRED, so it add it in rte_tm.

> Apart from tail drop, RED(random early detection) also found in some HW
> on RX side. How about creating generic Rx congestion management, which
> includes RED and Tail drop based on the capability.(In future some other
> scheme also)

It's a good idea, but the configuration is different between RED and Tail Drop,
especially for FPGA IP, so I added new.

> 
> 
> > 2. Drop Threshold: water line of receive fifo to judge whether the
> >    current received packet dropped or enqueue.
> >
> > Signed-off-by: Rosen Xu <rosen.xu@intel.com>
> > ---
> >  lib/librte_ethdev/rte_tm.c        |  42 ++++++++++
> >  lib/librte_ethdev/rte_tm.h        | 172
> ++++++++++++++++++++++++++++++++++++++
> >  lib/librte_ethdev/rte_tm_driver.h |  35 ++++++++
> >  3 files changed, 249 insertions(+)
> >
> > diff --git a/lib/librte_ethdev/rte_tm.c b/lib/librte_ethdev/rte_tm.c
> > index 9709454..89a7dec 100644
> > --- a/lib/librte_ethdev/rte_tm.c
> > +++ b/lib/librte_ethdev/rte_tm.c
> > @@ -168,6 +168,48 @@ int rte_tm_shared_wred_context_delete(uint16_t
> port_id,
> >                 shared_wred_context_id, error);  }
> >
> > +/* Add Tail Drop profile */
> > +int rte_tm_tdrop_profile_add(uint16_t port_id,
> > +       uint32_t tdrop_profile_id,
> > +       struct rte_tm_tdrop_params *profile,
> > +       struct rte_tm_error *error)
> > +{
> > +       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
> > +       return RTE_TM_FUNC(port_id, tdrop_profile_add)(dev,
> > +               tdrop_profile_id, profile, error); }
> > +
> > +/* Delete Tail Drop profile */
> > +int rte_tm_tdrop_profile_delete(uint16_t port_id,
> > +       uint32_t tdrop_profile_id,
> > +       struct rte_tm_error *error)
> > +{
> > +       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
> > +       return RTE_TM_FUNC(port_id, tdrop_profile_delete)(dev,
> > +               tdrop_profile_id, error); }
> > +
> > +/* Add/update shared Tail Drop context */ int
> > +rte_tm_shared_tdrop_context_add_update(uint16_t port_id,
> > +       uint32_t shared_tdrop_context_id,
> > +       uint32_t tdrop_profile_id,
> > +       struct rte_tm_error *error)
> > +{
> > +       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
> > +       return RTE_TM_FUNC(port_id,
> shared_tdrop_context_add_update)(dev,
> > +               shared_tdrop_context_id, tdrop_profile_id, error); }
> > +
> > +/* Delete shared Tail Drop context */ int
> > +rte_tm_shared_tdrop_context_delete(uint16_t port_id,
> > +       uint32_t shared_tdrop_context_id,
> > +       struct rte_tm_error *error)
> > +{
> > +       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
> > +       return RTE_TM_FUNC(port_id, shared_tdrop_context_delete)(dev,
> > +               shared_tdrop_context_id, error); }
> > +
> >  /* Add shaper profile */
> >  int rte_tm_shaper_profile_add(uint16_t port_id,
> >         uint32_t shaper_profile_id,
> > diff --git a/lib/librte_ethdev/rte_tm.h b/lib/librte_ethdev/rte_tm.h
> > index 955f02f..91b087d 100644
> > --- a/lib/librte_ethdev/rte_tm.h
> > +++ b/lib/librte_ethdev/rte_tm.h
> > @@ -93,6 +93,15 @@
> >  #define RTE_TM_WRED_PROFILE_ID_NONE                  UINT32_MAX
> >
> >  /**
> > + * Invalid TDROP profile ID.
> > + *
> > + * @see struct rte_tm_node_params
> > + * @see rte_tm_node_add()
> > + * @see rte_tm_node_tdrop_context_update()
> > + */
> > +#define RTE_TM_TDROP_PROFILE_ID_NONE                  UINT32_MAX
> > +
> > +/**
> >   *Invalid shaper profile ID.
> >   *
> >   * @see struct rte_tm_node_params
> > @@ -871,6 +880,37 @@ struct rte_tm_wred_params {  };
> >
> >  /**
> > + * Tail Drop (TDROP) profile
> > + *
> > + * Multiple TDROP contexts can share the same TDROP profile. Each
> > +leaf node with
> > + * TDROP enabled as its congestion management mode has zero or one
> > +private TDROP
> > + * context (only one leaf node using it) and/or zero, one or several
> > +shared
> > + * TDROP contexts (multiple leaf nodes use the same TDROP context). A
> > +private
> > + * TDROP context is used to perform congestion management for a
> > +single leaf
> > + * node, while a shared TDROP context is used to perform congestion
> > +management
> > + * for a group of leaf nodes.
> > + *
> > + * @see struct rte_tm_capabilities::cman_tdrop_packet_mode_supported
> > + * @see struct rte_tm_capabilities::cman_tdrop_byte_mode_supported
> > + */
> > +struct rte_tm_tdrop_params {
> > +       /** Committed queue length (in bytes) */
> > +       uint64_t committed_length;
> > +
> > +       /** Peak queue length (in bytes) */
> > +       uint64_t peak_length;
> > +
> > +       /** Drop threshold of queue */
> > +       uint64_t drop_th;
> > +
> > +       /** When non-zero, the *drop_th* threshold is specified
> > +        * in packets (TDROP packet mode). When zero, the *drop_th*
> > +        * threshold is specified in bytes (TDROP byte mode)
> > +        */
> > +       int packet_mode;
> > +};
> > +
> > +/**
> >   * Token bucket
> >   */
> >  struct rte_tm_token_bucket {
> > @@ -1000,6 +1040,32 @@ struct rte_tm_node_params {
> >                                  */
> >                                 uint32_t n_shared_wred_contexts;
> >                         } wred;
> > +
> > +                       /** TDROP parameters (only valid when *cman* is set to
> > +                        * TDROP).
> > +                        */
> > +                       struct {
> > +                               /** TDROP profile for private TDROP context. The
> > +                                * absence of a private TDROP context for the
> > +                                * current leaf node is indicated by value
> > +                                * RTE_TM_TDROP_PROFILE_ID_NONE.
> > +                                */
> > +                               uint32_t tdrop_profile_id;
> > +
> > +                               /** User allocated array of shared TDROP context
> > +                                * IDs. When set to NULL, it indicates that the
> > +                                * current leaf node should not currently be
> > +                                * part of any shared TDROP contexts.
> > +                                */
> > +                               uint32_t *shared_tdrop_context_id;
> > +
> > +                               /** Number of elements in the
> > +                                * *shared_tdrop_context_id* array. Only valid
> > +                                * when *shared_tdrop_context_id* is non-NULL,
> > +                                * in which case it should be non-zero.
> > +                                */
> > +                               uint32_t n_shared_tdrop_contexts;
> > +                       } tdrop;
> >                 } leaf;
> >         };
> >
> > @@ -1028,6 +1094,8 @@ enum rte_tm_error_type {
> >         RTE_TM_ERROR_TYPE_WRED_PROFILE_YELLOW,
> >         RTE_TM_ERROR_TYPE_WRED_PROFILE_RED,
> >         RTE_TM_ERROR_TYPE_WRED_PROFILE_ID,
> > +       RTE_TM_ERROR_TYPE_TDROP_PROFILE,
> > +       RTE_TM_ERROR_TYPE_TDROP_PROFILE_ID,
> >         RTE_TM_ERROR_TYPE_SHARED_WRED_CONTEXT_ID,
> >         RTE_TM_ERROR_TYPE_SHAPER_PROFILE,
> >         RTE_TM_ERROR_TYPE_SHAPER_PROFILE_COMMITTED_RATE,
> > @@ -1279,6 +1347,110 @@ struct rte_tm_error {
> >         struct rte_tm_error *error);
> >
> >  /**
> > + * Traffic manager Tail Drop profile add
> > + *
> > + * Create a new Tail Drop profile with ID set to *tdrop_profile_id*.
> > + * The new profile is used to create one or several Tail Drop contexts.
> > + *
> > + * @param[in] port_id
> > + *   The port identifier of the Ethernet device.
> > + * @param[in] tdrop_profile_id
> > + *   Tail Drop profile ID for the new profile. Needs to be unused.
> > + * @param[in] profile
> > + *   Tail Drop profile parameters. Needs to be pre-allocated and valid.
> > + * @param[out] error
> > + *   Error details. Filled in only on error, when not NULL.
> > + * @return
> > + *   0 on success, non-zero error code otherwise.
> > + *
> > + * @see struct rte_tm_capabilities::cman_tdrop_context_n_max
> > + */
> > +int
> > +rte_tm_tdrop_profile_add(uint16_t port_id,
> > +       uint32_t tdrop_profile_id,
> > +       struct rte_tm_tdrop_params *profile,
> > +       struct rte_tm_error *error);
> > +
> > +/**
> > + * Traffic manager Tail Drop profile delete
> > + *
> > + * Delete an existing Tail Drop profile. This operation fails when
> > +there is
> > + * currently at least one user (i.e. Tail Drop context) of this Tail
> > +Drop
> > + * profile.
> > + *
> > + * @param[in] port_id
> > + *   The port identifier of the Ethernet device.
> > + * @param[in] tdrop_profile_id
> > + *   Tail Drop profile ID. Needs to be the valid.
> > + * @param[out] error
> > + *   Error details. Filled in only on error, when not NULL.
> > + * @return
> > + *   0 on success, non-zero error code otherwise.
> > + *
> > + * @see struct rte_tm_capabilities::cman_tdrop_context_n_max
> > + */
> > +int
> > +rte_tm_tdrop_profile_delete(uint16_t port_id,
> > +       uint32_t tdrop_profile_id,
> > +       struct rte_tm_error *error);
> > +
> > +/**
> > + * Traffic manager shared Tail Drop context add or update
> > + *
> > + * When *shared_tdrop_context_id* is invalid, a new Tail Drop context
> > +with
> > + * this ID is created by using the Tail Drop profile identified by
> > + * *tdrop_profile_id*.
> > + *
> > + * When *shared_tdrop_context_id* is valid, this Tail Drop context is
> > +no
> > + * longer using the profile previously assigned to it and is updated
> > +to
> > + * use the profile identified by *tdrop_profile_id*.
> > + *
> > + * A valid shared Tail Drop context can be assigned to several
> > +hierarchy
> > + * leaf nodes configured to use Tail Drop as the congestion management
> mode.
> > + *
> > + * @param[in] port_id
> > + *   The port identifier of the Ethernet device.
> > + * @param[in] shared_tdrop_context_id
> > + *   Shared Tail Drop context ID
> > + * @param[in] tdrop_profile_id
> > + *   Tail Drop profile ID. Needs to be the valid.
> > + * @param[out] error
> > + *   Error details. Filled in only on error, when not NULL.
> > + * @return
> > + *   0 on success, non-zero error code otherwise.
> > + *
> > + * @see struct rte_tm_capabilities::cman_tdrop_context_shared_n_max
> > + */
> > +int
> > +rte_tm_shared_tdrop_context_add_update(uint16_t port_id,
> > +       uint32_t shared_tdrop_context_id,
> > +       uint32_t tdrop_profile_id,
> > +       struct rte_tm_error *error);
> > +
> > +/**
> > + * Traffic manager shared Tail Drop context delete
> > + *
> > + * Delete an existing shared Tail Drop context. This operation fails
> > +when
> > + * there is currently at least one user (i.e. hierarchy leaf node) of
> > +this
> > + * shared Tail Drop context.
> > + *
> > + * @param[in] port_id
> > + *   The port identifier of the Ethernet device.
> > + * @param[in] shared_tdrop_context_id
> > + *   Shared Tail Drop context ID. Needs to be the valid.
> > + * @param[out] error
> > + *   Error details. Filled in only on error, when not NULL.
> > + * @return
> > + *   0 on success, non-zero error code otherwise.
> > + *
> > + * @see struct rte_tm_capabilities::cman_tdrop_context_shared_n_max
> > + */
> > +int
> > +rte_tm_shared_tdrop_context_delete(uint16_t port_id,
> > +       uint32_t shared_tdrop_context_id,
> > +       struct rte_tm_error *error);
> > +
> > +/**
> >   * Traffic manager shaper profile add
> >   *
> >   * Create a new shaper profile with ID set to *shaper_profile_id*.
> > The new diff --git a/lib/librte_ethdev/rte_tm_driver.h
> > b/lib/librte_ethdev/rte_tm_driver.h
> > index 90114ff..c0ca916 100644
> > --- a/lib/librte_ethdev/rte_tm_driver.h
> > +++ b/lib/librte_ethdev/rte_tm_driver.h
> > @@ -71,6 +71,30 @@ typedef int
> (*rte_tm_shared_wred_context_delete_t)(
> >         uint32_t shared_wred_context_id,
> >         struct rte_tm_error *error);
> >
> > +/** @internal Traffic manager TDROP profile add */ typedef int
> > +(*rte_tm_tdrop_profile_add_t)(struct rte_eth_dev *dev,
> > +       uint32_t tdrop_profile_id,
> > +       struct rte_tm_tdrop_params *profile,
> > +       struct rte_tm_error *error);
> > +
> > +/** @internal Traffic manager TDROP profile delete */ typedef int
> > +(*rte_tm_tdrop_profile_delete_t)(struct rte_eth_dev *dev,
> > +       uint32_t tdrop_profile_id,
> > +       struct rte_tm_error *error);
> > +
> > +/** @internal Traffic manager shared TDROP context add */ typedef int
> > +(*rte_tm_shared_tdrop_context_add_update_t)(
> > +       struct rte_eth_dev *dev,
> > +       uint32_t shared_tdrop_context_id,
> > +       uint32_t tdrop_profile_id,
> > +       struct rte_tm_error *error);
> > +
> > +/** @internal Traffic manager shared TDROP context delete */ typedef
> > +int (*rte_tm_shared_tdrop_context_delete_t)(
> > +       struct rte_eth_dev *dev,
> > +       uint32_t shared_tdrop_context_id,
> > +       struct rte_tm_error *error);
> > +
> >  /** @internal Traffic manager shaper profile add */  typedef int
> > (*rte_tm_shaper_profile_add_t)(struct rte_eth_dev *dev,
> >         uint32_t shaper_profile_id,
> > @@ -230,6 +254,17 @@ struct rte_tm_ops {
> >         rte_tm_shared_wred_context_delete_t
> >                 shared_wred_context_delete;
> >
> > +       /** Traffic manager TDROP profile add */
> > +       rte_tm_tdrop_profile_add_t tdrop_profile_add;
> > +       /** Traffic manager TDROP profile delete */
> > +       rte_tm_tdrop_profile_delete_t tdrop_profile_delete;
> > +       /** Traffic manager shared TDROP context add/update */
> > +       rte_tm_shared_tdrop_context_add_update_t
> > +               shared_tdrop_context_add_update;
> > +       /** Traffic manager shared TDROP context delete */
> > +       rte_tm_shared_tdrop_context_delete_t
> > +               shared_tdrop_context_delete;
> > +
> >         /** Traffic manager shaper profile add */
> >         rte_tm_shaper_profile_add_t shaper_profile_add;
> >         /** Traffic manager shaper profile delete */
> > --
> > 1.8.3.1
> >

  reply	other threads:[~2018-08-14  6:45 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-13  7:53 Rosen Xu
2018-08-13 19:23 ` Stephen Hemminger
2018-08-14  6:05 ` Jerin Jacob
2018-08-14  6:45   ` Xu, Rosen [this message]
2018-08-16  0:56     ` Xu, Rosen
2018-08-16  8:54     ` Dumitrescu, Cristian

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=0E78D399C70DA940A335608C6ED296D73A1CB17C@SHSMSX104.ccr.corp.intel.com \
    --to=rosen.xu@intel.com \
    --cc=cristian.dumitrescu@intel.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=jasvinder.singh@intel.com \
    --cc=jerin.jacob@caviumnetworks.com \
    --cc=nithin.dabilpuram@cavium.com \
    --cc=wenzhuo.lu@intel.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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).