From: Jerin Jacob <jerinjacobk@gmail.com>
To: pbhagavatula@marvell.com
Cc: jerinj@marvell.com, Shijith Thotton <sthotton@marvell.com>,
Nithin Dabilpuram <ndabilpuram@marvell.com>,
Kiran Kumar K <kirankumark@marvell.com>,
Sunil Kumar Kori <skori@marvell.com>,
Satha Rao <skoteshwar@marvell.com>,
dev@dpdk.org
Subject: Re: [PATCH] event/cnxk: add WQE stashing support
Date: Mon, 27 Feb 2023 22:00:35 +0530 [thread overview]
Message-ID: <CALBAE1Mw4FPBLwsUxPdmtq0afCEHfRauP9k9ZbkBJdSJUCOyVA@mail.gmail.com> (raw)
In-Reply-To: <20230221092402.1446-1-pbhagavatula@marvell.com>
On Tue, Feb 21, 2023 at 2:54 PM <pbhagavatula@marvell.com> wrote:
>
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
> CN10K supports stashing the scheduled WQE carried by `rte_event` to the
> cores L2 Dcache.The number of cache lines to be stashed and the offset
> is configurable per HWGRP i.e. event queue.
>
> By default, stashing is enabled on queues which have been connected to
> Rx adapter. Stashing improves performance by upto 6% based on the
> workload. Both MBUF and NIX_RX_WQE_HDR + NIX_RX_PARSE_S are stashed.
>
> Add device arguments to support configuring WQE stashing.
> The dictionary format for device arguments is as follows
> `[Qx|stash_offset|stash_length]` here the stash offset can be a
> negative integer.
>
> For stashing mbuf on queue 0 and mbuf + headroom on queue 1
> -a 0002:1e:00.0,stash="[0|-1|1][1|-1|2]"
>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
Applied to dpdk-next-net-eventdev/for-main. Thanks
> ---
> doc/guides/eventdevs/cnxk.rst | 14 ++++++
> drivers/common/cnxk/roc_api.h | 3 ++
> drivers/common/cnxk/roc_features.h | 13 ++++++
> drivers/common/cnxk/roc_mbox.h | 10 +++++
> drivers/common/cnxk/roc_model.h | 6 +++
> drivers/common/cnxk/roc_sso.c | 49 ++++++++++++++++++++-
> drivers/common/cnxk/roc_sso.h | 11 ++++-
> drivers/common/cnxk/version.map | 1 +
> drivers/event/cnxk/cn10k_eventdev.c | 30 +++++++++++++
> drivers/event/cnxk/cn10k_eventdev.h | 3 ++
> drivers/event/cnxk/cnxk_eventdev.c | 66 ++++++++++++++++++++++++++---
> drivers/event/cnxk/cnxk_eventdev.h | 11 ++++-
> 12 files changed, 207 insertions(+), 10 deletions(-)
> create mode 100644 drivers/common/cnxk/roc_features.h
>
> diff --git a/doc/guides/eventdevs/cnxk.rst b/doc/guides/eventdevs/cnxk.rst
> index a91c947c10..c3c0bfd7b5 100644
> --- a/doc/guides/eventdevs/cnxk.rst
> +++ b/doc/guides/eventdevs/cnxk.rst
> @@ -102,6 +102,20 @@ Runtime Config Options
>
> -a 0002:0e:00.0,qos=[1-50-50]
>
> +- ``CN10K WQE stashing support``
> +
> + CN10K supports stashing the scheduled WQE carried by `rte_event` to the
> + cores L2 Dcache. The number of cache lines to be stashed and the offset
> + is configurable per HWGRP i.e. event queue. The dictionary format is as
> + follows `[Qx|stash_offset|stash_length]` here the stash offset can be
> + a negative integer.
> + By default stashing is not enabled.
> +
> + For example::
> +
> + For stashing mbuf on queue 0 and mbuf + headroom on queue 1
> + -a 0002:0e:00.0,stash="[0|-1|1][1|-1|2]"
> +
> - ``Force Rx Back pressure``
>
> Force Rx back pressure when same mempool is used across ethernet device
> diff --git a/drivers/common/cnxk/roc_api.h b/drivers/common/cnxk/roc_api.h
> index 9d7f5417c2..993a2f7a68 100644
> --- a/drivers/common/cnxk/roc_api.h
> +++ b/drivers/common/cnxk/roc_api.h
> @@ -47,6 +47,9 @@
> /* HW Errata */
> #include "roc_errata.h"
>
> +/* HW Features */
> +#include "roc_features.h"
> +
> /* Mbox */
> #include "roc_mbox.h"
>
> diff --git a/drivers/common/cnxk/roc_features.h b/drivers/common/cnxk/roc_features.h
> new file mode 100644
> index 0000000000..f3948af45e
> --- /dev/null
> +++ b/drivers/common/cnxk/roc_features.h
> @@ -0,0 +1,13 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(C) 2022 Marvell.
> + */
> +#ifndef _ROC_FEATURES_H_
> +#define _ROC_FEATURES_H_
> +
> +static inline bool
> +roc_feature_sso_has_stash(void)
> +{
> + return (roc_model_is_cn103xx() | roc_model_is_cn10ka_b0()) ? true : false;
> +}
> +
> +#endif
> diff --git a/drivers/common/cnxk/roc_mbox.h b/drivers/common/cnxk/roc_mbox.h
> index a6091a98c1..af3c10b0b0 100644
> --- a/drivers/common/cnxk/roc_mbox.h
> +++ b/drivers/common/cnxk/roc_mbox.h
> @@ -127,6 +127,8 @@ struct mbox_msghdr {
> M(SSO_CONFIG_LSW, 0x612, ssow_config_lsw, ssow_config_lsw, msg_rsp) \
> M(SSO_HWS_CHNG_MSHIP, 0x613, ssow_chng_mship, ssow_chng_mship, \
> msg_rsp) \
> + M(SSO_GRP_STASH_CONFIG, 0x614, sso_grp_stash_config, \
> + sso_grp_stash_cfg, msg_rsp) \
> /* TIM mbox IDs (range 0x800 - 0x9FF) */ \
> M(TIM_LF_ALLOC, 0x800, tim_lf_alloc, tim_lf_alloc_req, \
> tim_lf_alloc_rsp) \
> @@ -1374,6 +1376,14 @@ struct sso_grp_qos_cfg {
> uint16_t __io iaq_thr;
> };
>
> +struct sso_grp_stash_cfg {
> + struct mbox_msghdr hdr;
> + uint16_t __io grp;
> + uint8_t __io ena;
> + uint8_t __io offset : 4;
> + uint8_t __io num_linesm1 : 4;
> +};
> +
> struct sso_grp_stats {
> struct mbox_msghdr hdr;
> uint16_t __io grp;
> diff --git a/drivers/common/cnxk/roc_model.h b/drivers/common/cnxk/roc_model.h
> index 081c03915c..ba0fe577c0 100644
> --- a/drivers/common/cnxk/roc_model.h
> +++ b/drivers/common/cnxk/roc_model.h
> @@ -244,6 +244,12 @@ roc_model_is_cn10kb(void)
> return roc_model->flag & ROC_MODEL_CN103xx;
> }
>
> +static inline uint64_t
> +roc_model_is_cn103xx(void)
> +{
> + return roc_model->flag & ROC_MODEL_CN103xx;
> +}
> +
> static inline bool
> roc_env_is_hw(void)
> {
> diff --git a/drivers/common/cnxk/roc_sso.c b/drivers/common/cnxk/roc_sso.c
> index 9e466f09ef..4a6a5080f7 100644
> --- a/drivers/common/cnxk/roc_sso.c
> +++ b/drivers/common/cnxk/roc_sso.c
> @@ -414,8 +414,7 @@ roc_sso_hwgrp_hws_link_status(struct roc_sso *roc_sso, uint8_t hws,
> }
>
> int
> -roc_sso_hwgrp_qos_config(struct roc_sso *roc_sso, struct roc_sso_hwgrp_qos *qos,
> - uint8_t nb_qos)
> +roc_sso_hwgrp_qos_config(struct roc_sso *roc_sso, struct roc_sso_hwgrp_qos *qos, uint16_t nb_qos)
> {
> struct sso *sso = roc_sso_to_sso_priv(roc_sso);
> struct dev *dev = &sso->dev;
> @@ -423,6 +422,9 @@ roc_sso_hwgrp_qos_config(struct roc_sso *roc_sso, struct roc_sso_hwgrp_qos *qos,
> struct mbox *mbox;
> int i, rc;
>
> + if (!nb_qos)
> + return 0;
> +
> mbox = mbox_get(dev->mbox);
> for (i = 0; i < nb_qos; i++) {
> uint8_t iaq_prcnt = qos[i].iaq_prcnt;
> @@ -748,6 +750,49 @@ sso_update_msix_vec_count(struct roc_sso *roc_sso, uint16_t sso_vec_cnt)
> return rc;
> }
>
> +int
> +roc_sso_hwgrp_stash_config(struct roc_sso *roc_sso, struct roc_sso_hwgrp_stash *stash,
> + uint16_t nb_stash)
> +{
> + struct sso *sso = roc_sso_to_sso_priv(roc_sso);
> + struct sso_grp_stash_cfg *req;
> + struct dev *dev = &sso->dev;
> + struct mbox *mbox;
> + int i, rc;
> +
> + if (!nb_stash)
> + return 0;
> +
> + mbox = mbox_get(dev->mbox);
> + for (i = 0; i < nb_stash; i++) {
> + req = mbox_alloc_msg_sso_grp_stash_config(mbox);
> + if (req == NULL) {
> + rc = mbox_process(mbox);
> + if (rc) {
> + rc = -EIO;
> + goto fail;
> + }
> +
> + req = mbox_alloc_msg_sso_grp_stash_config(mbox);
> + if (req == NULL) {
> + rc = -ENOSPC;
> + goto fail;
> + }
> + }
> + req->ena = true;
> + req->grp = stash[i].hwgrp;
> + req->offset = stash[i].stash_offset;
> + req->num_linesm1 = stash[i].stash_count - 1;
> + }
> +
> + rc = mbox_process(mbox);
> + if (rc)
> + rc = -EIO;
> +fail:
> + mbox_put(mbox);
> + return rc;
> +}
> +
> int
> roc_sso_rsrc_init(struct roc_sso *roc_sso, uint8_t nb_hws, uint16_t nb_hwgrp, uint16_t nb_tim_lfs)
> {
> diff --git a/drivers/common/cnxk/roc_sso.h b/drivers/common/cnxk/roc_sso.h
> index 4699908c25..e67797b046 100644
> --- a/drivers/common/cnxk/roc_sso.h
> +++ b/drivers/common/cnxk/roc_sso.h
> @@ -14,6 +14,12 @@ struct roc_sso_hwgrp_qos {
> uint8_t taq_prcnt;
> };
>
> +struct roc_sso_hwgrp_stash {
> + uint16_t hwgrp;
> + uint8_t stash_offset;
> + uint8_t stash_count;
> +};
> +
> struct roc_sso_hws_stats {
> uint64_t arbitration;
> };
> @@ -66,7 +72,7 @@ int __roc_api roc_sso_rsrc_init(struct roc_sso *roc_sso, uint8_t nb_hws, uint16_
> void __roc_api roc_sso_rsrc_fini(struct roc_sso *roc_sso);
> int __roc_api roc_sso_hwgrp_qos_config(struct roc_sso *roc_sso,
> struct roc_sso_hwgrp_qos *qos,
> - uint8_t nb_qos);
> + uint16_t nb_qos);
> int __roc_api roc_sso_hwgrp_alloc_xaq(struct roc_sso *roc_sso,
> uint32_t npa_aura_id, uint16_t hwgrps);
> int __roc_api roc_sso_hwgrp_release_xaq(struct roc_sso *roc_sso,
> @@ -88,6 +94,9 @@ int __roc_api roc_sso_hwgrp_init_xaq_aura(struct roc_sso *roc_sso,
> uint32_t nb_xae);
> int __roc_api roc_sso_hwgrp_free_xaq_aura(struct roc_sso *roc_sso,
> uint16_t nb_hwgrp);
> +int __roc_api roc_sso_hwgrp_stash_config(struct roc_sso *roc_sso,
> + struct roc_sso_hwgrp_stash *stash,
> + uint16_t nb_stash);
>
> /* Debug */
> void __roc_api roc_sso_dump(struct roc_sso *roc_sso, uint8_t nb_hws,
> diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
> index 5d2b75fb5a..381bbb0b6c 100644
> --- a/drivers/common/cnxk/version.map
> +++ b/drivers/common/cnxk/version.map
> @@ -379,6 +379,7 @@ INTERNAL {
> roc_sso_hwgrp_qos_config;
> roc_sso_hwgrp_release_xaq;
> roc_sso_hwgrp_set_priority;
> + roc_sso_hwgrp_stash_config;
> roc_sso_hwgrp_stats_get;
> roc_sso_hws_base_get;
> roc_sso_hws_link;
> diff --git a/drivers/event/cnxk/cn10k_eventdev.c b/drivers/event/cnxk/cn10k_eventdev.c
> index 8e74edff55..a9d2e5463f 100644
> --- a/drivers/event/cnxk/cn10k_eventdev.c
> +++ b/drivers/event/cnxk/cn10k_eventdev.c
> @@ -786,6 +786,24 @@ cn10k_sso_port_unlink(struct rte_eventdev *event_dev, void *port,
> return (int)nb_unlinks;
> }
>
> +static void
> +cn10k_sso_configure_queue_stash(struct rte_eventdev *event_dev)
> +{
> + struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
> + struct roc_sso_hwgrp_stash stash[dev->stash_cnt];
> + int i, rc;
> +
> + plt_sso_dbg();
> + for (i = 0; i < dev->stash_cnt; i++) {
> + stash[i].hwgrp = dev->stash_parse_data[i].queue;
> + stash[i].stash_offset = dev->stash_parse_data[i].stash_offset;
> + stash[i].stash_count = dev->stash_parse_data[i].stash_length;
> + }
> + rc = roc_sso_hwgrp_stash_config(&dev->sso, stash, dev->stash_cnt);
> + if (rc < 0)
> + plt_warn("failed to configure HWGRP WQE stashing rc = %d", rc);
> +}
> +
> static int
> cn10k_sso_start(struct rte_eventdev *event_dev)
> {
> @@ -795,6 +813,7 @@ cn10k_sso_start(struct rte_eventdev *event_dev)
> if (rc < 0)
> return rc;
>
> + cn10k_sso_configure_queue_stash(event_dev);
> rc = cnxk_sso_start(event_dev, cn10k_sso_hws_reset,
> cn10k_sso_hws_flush_events);
> if (rc < 0)
> @@ -866,6 +885,8 @@ cn10k_sso_rx_adapter_queue_add(
> int32_t rx_queue_id,
> const struct rte_event_eth_rx_adapter_queue_conf *queue_conf)
> {
> + struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
> + struct roc_sso_hwgrp_stash stash;
> struct cn10k_eth_rxq *rxq;
> uint64_t meta_aura;
> void *lookup_mem;
> @@ -884,6 +905,14 @@ cn10k_sso_rx_adapter_queue_add(
> meta_aura = rxq->meta_aura;
> cn10k_sso_set_priv_mem(event_dev, lookup_mem, meta_aura);
> cn10k_sso_fp_fns_set((struct rte_eventdev *)(uintptr_t)event_dev);
> + if (roc_feature_sso_has_stash()) {
> + stash.hwgrp = queue_conf->ev.queue_id;
> + stash.stash_offset = CN10K_SSO_DEFAULT_STASH_OFFSET;
> + stash.stash_count = CN10K_SSO_DEFAULT_STASH_LENGTH;
> + rc = roc_sso_hwgrp_stash_config(&dev->sso, &stash, 1);
> + if (rc < 0)
> + plt_warn("failed to configure HWGRP WQE stashing rc = %d", rc);
> + }
>
> return 0;
> }
> @@ -1226,6 +1255,7 @@ RTE_PMD_REGISTER_PARAM_STRING(event_cn10k, CNXK_SSO_XAE_CNT "=<int>"
> CNXK_SSO_GGRP_QOS "=<string>"
> CNXK_SSO_FORCE_BP "=1"
> CN10K_SSO_GW_MODE "=<int>"
> + CN10K_SSO_STASH "=<string>"
> CNXK_TIM_DISABLE_NPA "=1"
> CNXK_TIM_CHNK_SLOTS "=<int>"
> CNXK_TIM_RINGS_LMT "=<int>"
> diff --git a/drivers/event/cnxk/cn10k_eventdev.h b/drivers/event/cnxk/cn10k_eventdev.h
> index 5fb6f0a6f2..aaa01d1ec1 100644
> --- a/drivers/event/cnxk/cn10k_eventdev.h
> +++ b/drivers/event/cnxk/cn10k_eventdev.h
> @@ -5,6 +5,9 @@
> #ifndef __CN10K_EVENTDEV_H__
> #define __CN10K_EVENTDEV_H__
>
> +#define CN10K_SSO_DEFAULT_STASH_OFFSET -1
> +#define CN10K_SSO_DEFAULT_STASH_LENGTH 2
> +
> struct cn10k_sso_hws {
> uint64_t base;
> uint64_t gw_rdata;
> diff --git a/drivers/event/cnxk/cnxk_eventdev.c b/drivers/event/cnxk/cnxk_eventdev.c
> index 11bcd792ba..5f1fa1e96d 100644
> --- a/drivers/event/cnxk/cnxk_eventdev.c
> +++ b/drivers/event/cnxk/cnxk_eventdev.c
> @@ -459,6 +459,8 @@ cnxk_sso_close(struct rte_eventdev *event_dev, cnxk_sso_unlink_t unlink_fn)
> return 0;
> }
>
> +typedef void (*param_parse_t)(char *value, void *opaque);
> +
> static void
> parse_queue_param(char *value, void *opaque)
> {
> @@ -496,7 +498,44 @@ parse_queue_param(char *value, void *opaque)
> }
>
> static void
> -parse_qos_list(const char *value, void *opaque)
> +parse_stash_param(char *value, void *opaque)
> +{
> + struct cnxk_sso_stash queue_stash = {0};
> + struct cnxk_sso_evdev *dev = opaque;
> + struct cnxk_sso_stash *old_ptr;
> + char *tok = strtok(value, "|");
> + uint16_t *val;
> +
> + if (!strlen(value))
> + return;
> +
> + val = (uint16_t *)&queue_stash;
> + while (tok != NULL) {
> + *val = atoi(tok);
> + tok = strtok(NULL, "|");
> + val++;
> + }
> +
> + if (val != (&queue_stash.stash_length + 1)) {
> + plt_err("Invalid QoS parameter expected [Qx|stash_offset|stash_length]");
> + return;
> + }
> +
> + dev->stash_cnt++;
> + old_ptr = dev->stash_parse_data;
> + dev->stash_parse_data =
> + rte_realloc(dev->stash_parse_data,
> + sizeof(struct cnxk_sso_stash) * dev->stash_cnt, 0);
> + if (dev->stash_parse_data == NULL) {
> + dev->stash_parse_data = old_ptr;
> + dev->stash_cnt--;
> + return;
> + }
> + dev->stash_parse_data[dev->stash_cnt - 1] = queue_stash;
> +}
> +
> +static void
> +parse_list(const char *value, void *opaque, param_parse_t fn)
> {
> char *s = strdup(value);
> char *start = NULL;
> @@ -511,7 +550,7 @@ parse_qos_list(const char *value, void *opaque)
>
> if (start && start < end) {
> *end = 0;
> - parse_queue_param(start + 1, opaque);
> + fn(start + 1, opaque);
> s = end;
> start = end;
> }
> @@ -522,14 +561,27 @@ parse_qos_list(const char *value, void *opaque)
> }
>
> static int
> -parse_sso_kvargs_dict(const char *key, const char *value, void *opaque)
> +parse_sso_kvargs_qos_dict(const char *key, const char *value, void *opaque)
> {
> RTE_SET_USED(key);
>
> /* Dict format [Qx-TAQ-IAQ][Qz-TAQ-IAQ] use '-' cause ',' isn't allowed.
> * Everything is expressed in percentages, 0 represents default.
> */
> - parse_qos_list(value, opaque);
> + parse_list(value, opaque, parse_queue_param);
> +
> + return 0;
> +}
> +
> +static int
> +parse_sso_kvargs_stash_dict(const char *key, const char *value, void *opaque)
> +{
> + RTE_SET_USED(key);
> +
> + /* Dict format [Qx|<stash_offset>|<stash_length>] use '|' cause ','
> + * isn't allowed.
> + */
> + parse_list(value, opaque, parse_stash_param);
>
> return 0;
> }
> @@ -548,14 +600,16 @@ cnxk_sso_parse_devargs(struct cnxk_sso_evdev *dev, struct rte_devargs *devargs)
>
> rte_kvargs_process(kvlist, CNXK_SSO_XAE_CNT, &parse_kvargs_value,
> &dev->xae_cnt);
> - rte_kvargs_process(kvlist, CNXK_SSO_GGRP_QOS, &parse_sso_kvargs_dict,
> - dev);
> + rte_kvargs_process(kvlist, CNXK_SSO_GGRP_QOS,
> + &parse_sso_kvargs_qos_dict, dev);
> rte_kvargs_process(kvlist, CNXK_SSO_FORCE_BP, &parse_kvargs_flag,
> &dev->force_ena_bp);
> rte_kvargs_process(kvlist, CN9K_SSO_SINGLE_WS, &parse_kvargs_flag,
> &single_ws);
> rte_kvargs_process(kvlist, CN10K_SSO_GW_MODE, &parse_kvargs_flag,
> &dev->gw_mode);
> + rte_kvargs_process(kvlist, CN10K_SSO_STASH,
> + &parse_sso_kvargs_stash_dict, dev);
> dev->dual_ws = !single_ws;
> rte_kvargs_free(kvlist);
> }
> diff --git a/drivers/event/cnxk/cnxk_eventdev.h b/drivers/event/cnxk/cnxk_eventdev.h
> index d93fdcda25..c7cbd722ab 100644
> --- a/drivers/event/cnxk/cnxk_eventdev.h
> +++ b/drivers/event/cnxk/cnxk_eventdev.h
> @@ -31,6 +31,7 @@
> #define CNXK_SSO_FORCE_BP "force_rx_bp"
> #define CN9K_SSO_SINGLE_WS "single_ws"
> #define CN10K_SSO_GW_MODE "gw_mode"
> +#define CN10K_SSO_STASH "stash"
>
> #define NSEC2USEC(__ns) ((__ns) / 1E3)
> #define USEC2NSEC(__us) ((__us)*1E3)
> @@ -70,6 +71,12 @@ struct cnxk_sso_qos {
> uint16_t iaq_prcnt;
> };
>
> +struct cnxk_sso_stash {
> + uint16_t queue;
> + uint16_t stash_offset;
> + uint16_t stash_length;
> +};
> +
> struct cnxk_sso_evdev {
> struct roc_sso sso;
> uint8_t max_event_queues;
> @@ -103,13 +110,15 @@ struct cnxk_sso_evdev {
> struct cnxk_timesync_info *tstamp[RTE_MAX_ETHPORTS];
> /* Dev args */
> uint32_t xae_cnt;
> - uint8_t qos_queue_cnt;
> + uint16_t qos_queue_cnt;
> struct cnxk_sso_qos *qos_parse_data;
> uint8_t force_ena_bp;
> /* CN9K */
> uint8_t dual_ws;
> /* CN10K */
> uint8_t gw_mode;
> + uint16_t stash_cnt;
> + struct cnxk_sso_stash *stash_parse_data;
> /* Crypto adapter */
> uint8_t is_ca_internal_port;
> } __rte_cache_aligned;
> --
> 2.25.1
>
prev parent reply other threads:[~2023-02-27 16:31 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-21 9:24 pbhagavatula
2023-02-22 5:38 ` [PATCH v2] " pbhagavatula
2023-02-27 16:30 ` Jerin Jacob [this message]
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=CALBAE1Mw4FPBLwsUxPdmtq0afCEHfRauP9k9ZbkBJdSJUCOyVA@mail.gmail.com \
--to=jerinjacobk@gmail.com \
--cc=dev@dpdk.org \
--cc=jerinj@marvell.com \
--cc=kirankumark@marvell.com \
--cc=ndabilpuram@marvell.com \
--cc=pbhagavatula@marvell.com \
--cc=skori@marvell.com \
--cc=skoteshwar@marvell.com \
--cc=sthotton@marvell.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).