From: Long Li <longli@microsoft.com>
To: Stephen Hemminger <stephen@networkplumber.org>,
Ferruh Yigit <ferruh.yigit@amd.com>
Cc: "longli@linuxonhyperv.com" <longli@linuxonhyperv.com>,
Thomas Monjalon <thomas@monjalon.net>,
Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>,
Jerin Jacob Kollanukkaran <jerinj@marvell.com>,
David Marchand <david.marchand@redhat.com>,
"dev@dpdk.org" <dev@dpdk.org>,
Ajay Sharma <sharmaajay@microsoft.com>,
"stable@dpdk.org" <stable@dpdk.org>,
Luca Boccassi <bluca@debian.org>,
Qi Z Zhang <qi.z.zhang@intel.com>,
Ajit Khaparde <ajit.khaparde@broadcom.com>,
Bruce Richardson <bruce.richardson@intel.com>,
Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>,
Olivier Matz <olivier.matz@6wind.com>,
Honnappa Nagarahalli <Honnappa.Nagarahalli@arm.com>
Subject: RE: [PATCH] net/mana: use RTE_LOG_DP for logs on datapath
Date: Fri, 3 Mar 2023 02:16:42 +0000 [thread overview]
Message-ID: <PH7PR21MB326371786C14F5C10EDF51BCCEB39@PH7PR21MB3263.namprd21.prod.outlook.com> (raw)
In-Reply-To: <20230224095120.32c25481@hermes.local>
> Subject: Re: [PATCH] net/mana: use RTE_LOG_DP for logs on datapath
>
> On Thu, 23 Feb 2023 10:09:17 -0800
> Stephen Hemminger <stephen@networkplumber.org> wrote:
>
> > On Thu, 23 Feb 2023 14:07:25 +0000
> > Ferruh Yigit <ferruh.yigit@amd.com> wrote:
> >
> > > Overall I am not sure if anyone is interested in driver datapath
> > > logs other than driver developers themselves.
> > >
> > > For datapath logging I think there are two concerns,
> > > 1) It should not eat *any* cycles unless explicitly enabled
> > > 2) Capability of enable/disable them because of massive amount of
> > > log it can generate
> > >
> > >
> > > Currently there are two existing approaches for driver datapath logging:
> > > i) Controlled by 'RTE_ETHDEV_DEBUG_RX/TX' compile time flag,
> > > when enabled 'rte_log()' is used with Rx/Tx specific log type.
> > > ii) 'RTE_LOG_DP' ', compile time control per logtype via
> > > 'RTE_LOG_DP_LEVEL',
> > > when enabled 'rte_log()' is used with PMD logtype.
> > >
> > >
> > > In (ii), need to re-compile code when you need to increase the log
> > > verbosity, and it leaks to production code as mentioned above.
> > >
> > > For (i), developer compiles once enabling debug, later can fine
> > > grain log level dynamically. This is more DPDK developer focused approach.
> > >
> > >
> > > [1]
> > > According above, what do you think to retire 'RTE_LOG_DP', (at least
> > > within ethdev datapath), and chose (i) as preferred datapath logging?
> >
> > I agree, the current tx/rx logging is a mess.
> > Each driver is different, each driver has to have something to enable
> > it; and it really isn't useful beyond the driver developer.
> >
> > Using tracing seems like a much better option. Could we agree on a
> > common set of trace points for drivers and fix all drivers to use the same
> thing.
> > Probably will cause some upset among driver developers:
> > "where did my nice printf's go, now I have to learn tracing"
> > but DPDK has a good facility here, lets use it.
> >
> > My proposal would be:
> > - agree on common set of trace points
> > - apply to all drivers
> > - remove RTE_LOG_DP()
> > - remove per driver RX/TX options
> > - side effect, more uses of RTE_LOGTYPE_PMD go away.
>
> Here is an example of using tracepoints instead.
> Compile tested for example only.
>
> Note: using tracepoints it is possible to keep some of the tracepoints even if
> fastpath is not enabled. Things like running out of Tx or Mbuf is not something
> that is perf critical; but would be good for application to see.
Thank you for the example.
I sent another patch converting data path logs (mana) to trace points.
Long
>
>
> ---
> drivers/net/ixgbe/ixgbe_ethdev.c | 7 --
> drivers/net/ixgbe/ixgbe_logs.h | 18 -----
> drivers/net/ixgbe/ixgbe_rxtx.c | 95 +++++++-------------------
> drivers/net/ixgbe/ixgbe_trace.h | 110
> +++++++++++++++++++++++++++++++
> 4 files changed, 133 insertions(+), 97 deletions(-) create mode 100644
> drivers/net/ixgbe/ixgbe_trace.h
>
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c
> b/drivers/net/ixgbe/ixgbe_ethdev.c
> index 88118bc30560..07f8ccdd97cb 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> @@ -8317,10 +8317,3 @@
> RTE_PMD_REGISTER_PARAM_STRING(net_ixgbe_vf,
>
> RTE_LOG_REGISTER_SUFFIX(ixgbe_logtype_init, init, NOTICE);
> RTE_LOG_REGISTER_SUFFIX(ixgbe_logtype_driver, driver, NOTICE);
> -
> -#ifdef RTE_ETHDEV_DEBUG_RX
> -RTE_LOG_REGISTER_SUFFIX(ixgbe_logtype_rx, rx, DEBUG); -#endif -#ifdef
> RTE_ETHDEV_DEBUG_TX -RTE_LOG_REGISTER_SUFFIX(ixgbe_logtype_tx, tx,
> DEBUG); -#endif diff --git a/drivers/net/ixgbe/ixgbe_logs.h
> b/drivers/net/ixgbe/ixgbe_logs.h index 00ef797ca103..f70fa1fd4afd 100644
> --- a/drivers/net/ixgbe/ixgbe_logs.h
> +++ b/drivers/net/ixgbe/ixgbe_logs.h
> @@ -12,24 +12,6 @@ extern int ixgbe_logtype_init;
>
> #define PMD_INIT_FUNC_TRACE() PMD_INIT_LOG(DEBUG, " >>")
>
> -#ifdef RTE_ETHDEV_DEBUG_RX
> -extern int ixgbe_logtype_rx;
> -#define PMD_RX_LOG(level, fmt, args...) \
> - rte_log(RTE_LOG_ ## level, ixgbe_logtype_rx, \
> - "%s(): " fmt "\n", __func__, ## args)
> -#else
> -#define PMD_RX_LOG(level, fmt, args...) do { } while (0) -#endif
> -
> -#ifdef RTE_ETHDEV_DEBUG_TX
> -extern int ixgbe_logtype_tx;
> -#define PMD_TX_LOG(level, fmt, args...) \
> - rte_log(RTE_LOG_ ## level, ixgbe_logtype_tx, \
> - "%s(): " fmt "\n", __func__, ## args)
> -#else
> -#define PMD_TX_LOG(level, fmt, args...) do { } while (0) -#endif
> -
> extern int ixgbe_logtype_driver;
> #define PMD_DRV_LOG_RAW(level, fmt, args...) \
> rte_log(RTE_LOG_ ## level, ixgbe_logtype_driver, "%s(): " fmt, \ diff --
> git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c index
> c9d6ca9efea4..f9f0ffebee8e 100644
> --- a/drivers/net/ixgbe/ixgbe_rxtx.c
> +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
> @@ -46,6 +46,7 @@
> #include <rte_vect.h>
>
> #include "ixgbe_logs.h"
> +#include "ixgbe_trace.h"
> #include "base/ixgbe_api.h"
> #include "base/ixgbe_vf.h"
> #include "ixgbe_ethdev.h"
> @@ -581,11 +582,8 @@ ixgbe_xmit_cleanup(struct ixgbe_tx_queue *txq)
> desc_to_clean_to = sw_ring[desc_to_clean_to].last_id;
> status = txr[desc_to_clean_to].wb.status;
> if (!(status & rte_cpu_to_le_32(IXGBE_TXD_STAT_DD))) {
> - PMD_TX_LOG(DEBUG,
> - "TX descriptor %4u is not done"
> - "(port=%d queue=%d)",
> - desc_to_clean_to,
> - txq->port_id, txq->queue_id);
> + ixgbe_trace_tx_not_done(txq->port_id, txq->queue_id,
> +desc_to_clean_to);
> +
> /* Failed to clean any descriptors, better luck next time */
> return -(1);
> }
> @@ -598,11 +596,8 @@ ixgbe_xmit_cleanup(struct ixgbe_tx_queue *txq)
> nb_tx_to_clean = (uint16_t)(desc_to_clean_to -
> last_desc_cleaned);
>
> - PMD_TX_LOG(DEBUG,
> - "Cleaning %4u TX descriptors: %4u to %4u "
> - "(port=%d queue=%d)",
> - nb_tx_to_clean, last_desc_cleaned, desc_to_clean_to,
> - txq->port_id, txq->queue_id);
> + ixgbe_trace_tx_done(txq->port_id, txq->queue_id,
> + nb_tx_to_clean, last_desc_cleaned,
> desc_to_clean_to);
>
> /*
> * The last descriptor to clean is done, so that means all the @@ -
> 734,26 +729,14 @@ ixgbe_xmit_pkts(void *tx_queue, struct rte_mbuf
> **tx_pkts,
> if (tx_last >= txq->nb_tx_desc)
> tx_last = (uint16_t) (tx_last - txq->nb_tx_desc);
>
> - PMD_TX_LOG(DEBUG, "port_id=%u queue_id=%u pktlen=%u"
> - " tx_first=%u tx_last=%u",
> - (unsigned) txq->port_id,
> - (unsigned) txq->queue_id,
> - (unsigned) pkt_len,
> - (unsigned) tx_id,
> - (unsigned) tx_last);
> -
> + ixgbe_trace_tx(txq->port_id, txq->queue_id, pkt_len, tx_id,
> tx_last);
> /*
> * Make sure there are enough TX descriptors available to
> * transmit the entire packet.
> * nb_used better be less than or equal to txq->tx_rs_thresh
> */
> if (nb_used > txq->nb_tx_free) {
> - PMD_TX_LOG(DEBUG,
> - "Not enough free TX descriptors "
> - "nb_used=%4u nb_free=%4u "
> - "(port=%d queue=%d)",
> - nb_used, txq->nb_tx_free,
> - txq->port_id, txq->queue_id);
> + ixgbe_trace_tx_full(txq->port_id, txq->queue_id,
> nb_used,
> +txq->nb_tx_free);
>
> if (ixgbe_xmit_cleanup(txq) != 0) {
> /* Could not clean any descriptors */ @@ -
> 764,17 +747,8 @@ ixgbe_xmit_pkts(void *tx_queue, struct rte_mbuf
> **tx_pkts,
>
> /* nb_used better be <= txq->tx_rs_thresh */
> if (unlikely(nb_used > txq->tx_rs_thresh)) {
> - PMD_TX_LOG(DEBUG,
> - "The number of descriptors needed
> to "
> - "transmit the packet exceeds the "
> - "RS bit threshold. This will impact "
> - "performance."
> - "nb_used=%4u nb_free=%4u "
> - "tx_rs_thresh=%4u. "
> - "(port=%d queue=%d)",
> - nb_used, txq->nb_tx_free,
> - txq->tx_rs_thresh,
> - txq->port_id, txq->queue_id);
> + ixgbe_trace_tx_thresh(txq->port_id, txq-
> >queue_id,
> + nb_used, txq->nb_tx_free,
> txq->tx_rs_thresh);
> /*
> * Loop here until there are enough TX
> * descriptors or until the ring cannot be @@ -
> 918,10 +892,7 @@ ixgbe_xmit_pkts(void *tx_queue, struct rte_mbuf
> **tx_pkts,
>
> /* Set RS bit only on threshold packets' last descriptor */
> if (txq->nb_tx_used >= txq->tx_rs_thresh) {
> - PMD_TX_LOG(DEBUG,
> - "Setting RS bit on TXD id="
> - "%4u (port=%d queue=%d)",
> - tx_last, txq->port_id, txq->queue_id);
> + ixgbe_trace_tx_rs(txq->port_id, txq->queue_id,
> tx_last);
>
> cmd_type_len |= IXGBE_TXD_CMD_RS;
>
> @@ -944,9 +915,7 @@ ixgbe_xmit_pkts(void *tx_queue, struct rte_mbuf
> **tx_pkts,
> /*
> * Set the Transmit Descriptor Tail (TDT)
> */
> - PMD_TX_LOG(DEBUG, "port_id=%u queue_id=%u tx_tail=%u
> nb_tx=%u",
> - (unsigned) txq->port_id, (unsigned) txq->queue_id,
> - (unsigned) tx_id, (unsigned) nb_tx);
> + ixgbe_trace_tx_tail(txq->port_id, txq->queue_id, tx_id, nb_tx);
> IXGBE_PCI_REG_WC_WRITE_RELAXED(txq->tdt_reg_addr, tx_id);
> txq->tx_tail = tx_id;
>
> @@ -1717,9 +1686,7 @@ rx_recv_pkts(void *rx_queue, struct rte_mbuf
> **rx_pkts,
> if (ixgbe_rx_alloc_bufs(rxq, true) != 0) {
> int i, j;
>
> - PMD_RX_LOG(DEBUG, "RX mbuf alloc failed
> port_id=%u "
> - "queue_id=%u", (unsigned) rxq->port_id,
> - (unsigned) rxq->queue_id);
> + ixgbe_trace_rx_mbuf_alloc_failed(rxq->port_id, rxq-
> >queue_id);
>
> rte_eth_devices[rxq->port_id].data-
> >rx_mbuf_alloc_failed +=
> rxq->rx_free_thresh;
> @@ -1851,17 +1818,12 @@ ixgbe_recv_pkts(void *rx_queue, struct
> rte_mbuf **rx_pkts,
> * to happen by sending specific "back-pressure" flow control
> * frames to its peer(s).
> */
> - PMD_RX_LOG(DEBUG, "port_id=%u queue_id=%u rx_id=%u "
> - "ext_err_stat=0x%08x pkt_len=%u",
> - (unsigned) rxq->port_id, (unsigned) rxq->queue_id,
> - (unsigned) rx_id, (unsigned) staterr,
> - (unsigned) rte_le_to_cpu_16(rxd.wb.upper.length));
> + ixgbe_trace_rx(rxq->port_id, rxq->queue_id, rx_id,
> + staterr, rte_le_to_cpu_16(rxd.wb.upper.length));
>
> nmb = rte_mbuf_raw_alloc(rxq->mb_pool);
> if (nmb == NULL) {
> - PMD_RX_LOG(DEBUG, "RX mbuf alloc failed
> port_id=%u "
> - "queue_id=%u", (unsigned) rxq->port_id,
> - (unsigned) rxq->queue_id);
> + ixgbe_trace_rx_mbuf_alloc_failed(rxq->port_id, rxq-
> >queue_id);
> rte_eth_devices[rxq->port_id].data-
> >rx_mbuf_alloc_failed++;
> break;
> }
> @@ -1959,11 +1921,9 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf
> **rx_pkts,
> */
> nb_hold = (uint16_t) (nb_hold + rxq->nb_rx_hold);
> if (nb_hold > rxq->rx_free_thresh) {
> - PMD_RX_LOG(DEBUG, "port_id=%u queue_id=%u rx_tail=%u
> "
> - "nb_hold=%u nb_rx=%u",
> - (unsigned) rxq->port_id, (unsigned) rxq->queue_id,
> - (unsigned) rx_id, (unsigned) nb_hold,
> - (unsigned) nb_rx);
> + ixgbe_trace_rx_post(rxq->port_id, rxq->queue_id,
> + rx_id, nb_hold, nb_rx);
> +
> rx_id = (uint16_t) ((rx_id == 0) ?
> (rxq->nb_rx_desc - 1) : (rx_id - 1));
> IXGBE_PCI_REG_WC_WRITE(rxq->rdt_reg_addr, rx_id); @@ -
> 2124,17 +2084,13 @@ ixgbe_recv_pkts_lro(void *rx_queue, struct rte_mbuf
> **rx_pkts, uint16_t nb_pkts,
>
> rxd = *rxdp;
>
> - PMD_RX_LOG(DEBUG, "port_id=%u queue_id=%u rx_id=%u "
> - "staterr=0x%x data_len=%u",
> - rxq->port_id, rxq->queue_id, rx_id, staterr,
> - rte_le_to_cpu_16(rxd.wb.upper.length));
> + ixgbe_trace_rx(rxq->port_id, rxq->queue_id, rx_id, staterr,
> + rte_le_to_cpu_16(rxd.wb.upper.length));
>
> if (!bulk_alloc) {
> nmb = rte_mbuf_raw_alloc(rxq->mb_pool);
> if (nmb == NULL) {
> - PMD_RX_LOG(DEBUG, "RX mbuf alloc failed "
> - "port_id=%u queue_id=%u",
> - rxq->port_id, rxq->queue_id);
> + ixgbe_trace_rx_mbuf_alloc_failed(rxq-
> >port_id, rxq->queue_id);
>
> rte_eth_devices[rxq->port_id].data->
>
> rx_mbuf_alloc_failed++;
> @@ -2150,10 +2106,7 @@ ixgbe_recv_pkts_lro(void *rx_queue, struct
> rte_mbuf **rx_pkts, uint16_t nb_pkts,
> next_rdt);
> nb_hold -= rxq->rx_free_thresh;
> } else {
> - PMD_RX_LOG(DEBUG, "RX bulk alloc failed "
> - "port_id=%u queue_id=%u",
> - rxq->port_id, rxq->queue_id);
> -
> + ixgbe_trace_rx_mbuf_alloc_failed(rxq-
> >port_id, rxq->queue_id);
> rte_eth_devices[rxq->port_id].data->
>
> rx_mbuf_alloc_failed++;
> break;
> @@ -2307,9 +2260,7 @@ ixgbe_recv_pkts_lro(void *rx_queue, struct
> rte_mbuf **rx_pkts, uint16_t nb_pkts,
> * hardware point of view...
> */
> if (!bulk_alloc && nb_hold > rxq->rx_free_thresh) {
> - PMD_RX_LOG(DEBUG, "port_id=%u queue_id=%u rx_tail=%u
> "
> - "nb_hold=%u nb_rx=%u",
> - rxq->port_id, rxq->queue_id, rx_id, nb_hold, nb_rx);
> + ixgbe_trace_rx_post(rxq->port_id, rxq->queue_id, rx_id,
> nb_hold,
> +nb_rx);
>
> rte_wmb();
> IXGBE_PCI_REG_WC_WRITE_RELAXED(rxq->rdt_reg_addr,
> prev_id); diff --git a/drivers/net/ixgbe/ixgbe_trace.h
> b/drivers/net/ixgbe/ixgbe_trace.h new file mode 100644 index
> 000000000000..f260edd6fe3a
> --- /dev/null
> +++ b/drivers/net/ixgbe/ixgbe_trace.h
> @@ -0,0 +1,110 @@
> +/* SPDX-License-Identifier: BSD-3-Clause */
> +
> +#ifndef _IXGBE_TRACE_H_
> +#define _IXGBE_TRACE_H_
> +
> +#include <rte_trace_point.h>
> +
> +RTE_TRACE_POINT(
> + ixgbe_trace_rx_mbuf_alloc_failed,
> + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id),
> + rte_trace_point_emit_u16(port_id);
> + rte_trace_point_emit_u16(rx_queue_id);
> +);
> +
> +RTE_TRACE_POINT_FP(
> + ixgbe_trace_rx,
> + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
> + uint16_t rx_id, uint32_t staterr, uint16_t len),
> + rte_trace_point_emit_u16(port_id);
> + rte_trace_point_emit_u16(rx_queue_id);
> + rte_trace_point_emit_u16(rx_id);
> + rte_trace_point_emit_u32(staterr);
> + rte_trace_point_emit_u16(len);
> +);
> +
> +RTE_TRACE_POINT_FP(
> + ixgbe_trace_rx_post,
> + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
> + uint16_t rx_id, uint16_t nb_hold, uint16_t nb_rx),
> + rte_trace_point_emit_u16(port_id);
> + rte_trace_point_emit_u16(rx_queue_id);
> + rte_trace_point_emit_u16(rx_id);
> + rte_trace_point_emit_u16(nb_hold);
> + rte_trace_point_emit_u16(nb_rx);
> +);
> +
> +RTE_TRACE_POINT_FP(
> + ixgbe_trace_tx_done,
> + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id,
> + uint16_t nb_to_clean, uint16_t last_desc_cleaned,
> + uint16_t desc_to_clean),
> + rte_trace_point_emit_u16(port_id);
> + rte_trace_point_emit_u16(tx_queue_id);
> + rte_trace_point_emit_u16(nb_to_clean);
> + rte_trace_point_emit_u16(last_desc_cleaned);
> + rte_trace_point_emit_u16(desc_to_clean);
> +);
> +
> +RTE_TRACE_POINT_FP(
> + ixgbe_trace_tx_not_done,
> + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id,
> + uint16_t desc_to_clean),
> + rte_trace_point_emit_u16(port_id);
> + rte_trace_point_emit_u16(tx_queue_id);
> + rte_trace_point_emit_u16(desc_to_clean);
> +);
> +
> +RTE_TRACE_POINT_FP(
> + ixgbe_trace_tx,
> + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id,
> + uint16_t pktlen, uint16_t tx_first, uint16_t tx_last),
> + rte_trace_point_emit_u16(port_id);
> + rte_trace_point_emit_u16(tx_queue_id);
> + rte_trace_point_emit_u16(pktlen);
> + rte_trace_point_emit_u16(tx_first);
> + rte_trace_point_emit_u16(tx_last);
> +);
> +
> +RTE_TRACE_POINT(
> + ixgbe_trace_tx_full,
> + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id,
> + uint16_t nb_used, uint16_t nb_free),
> + rte_trace_point_emit_u16(port_id);
> + rte_trace_point_emit_u16(tx_queue_id);
> + rte_trace_point_emit_u16(nb_used);
> + rte_trace_point_emit_u16(nb_free);
> +);
> +
> +RTE_TRACE_POINT(
> + ixgbe_trace_tx_thresh,
> + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id,
> + uint16_t nb_used, uint16_t nb_free,
> + uint16_t tx_rs_thresh),
> + rte_trace_point_emit_u16(port_id);
> + rte_trace_point_emit_u16(tx_queue_id);
> + rte_trace_point_emit_u16(nb_used);
> + rte_trace_point_emit_u16(nb_free);
> + rte_trace_point_emit_u16(tx_rs_thresh);
> +);
> +
> +RTE_TRACE_POINT_FP(
> + ixgbe_trace_tx_rs,
> + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id,
> + uint16_t txd_id),
> + rte_trace_point_emit_u16(port_id);
> + rte_trace_point_emit_u16(tx_queue_id);
> + rte_trace_point_emit_u16(txd_id);
> +);
> +
> +RTE_TRACE_POINT_FP(
> + ixgbe_trace_tx_tail,
> + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id,
> + uint16_t tx_tail, uint16_t nb_tx),
> + rte_trace_point_emit_u16(port_id);
> + rte_trace_point_emit_u16(tx_queue_id);
> + rte_trace_point_emit_u16(tx_tail);
> + rte_trace_point_emit_u16(nb_tx);
> +);
> +
> +#endif /* _IXGBE_LOGS_H_ */
> --
> 2.39.1
>
>
next prev parent reply other threads:[~2023-03-03 2:16 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-21 20:42 longli
2023-02-23 14:07 ` Ferruh Yigit
2023-02-23 18:09 ` Stephen Hemminger
2023-02-24 17:51 ` Stephen Hemminger
2023-03-03 2:16 ` Long Li [this message]
2023-03-03 13:54 ` Ferruh Yigit
2023-03-03 19:04 ` Long Li
2023-03-04 1:15 ` Ferruh Yigit
2023-04-28 1:29 ` Long Li
2023-04-28 10:23 ` Ferruh Yigit
2023-04-28 17:52 ` Long Li
2023-03-04 0:16 ` Stephen Hemminger
2023-05-02 15:45 ` Ferruh Yigit
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=PH7PR21MB326371786C14F5C10EDF51BCCEB39@PH7PR21MB3263.namprd21.prod.outlook.com \
--to=longli@microsoft.com \
--cc=Honnappa.Nagarahalli@arm.com \
--cc=ajit.khaparde@broadcom.com \
--cc=andrew.rybchenko@oktetlabs.ru \
--cc=bluca@debian.org \
--cc=bruce.richardson@intel.com \
--cc=david.marchand@redhat.com \
--cc=dev@dpdk.org \
--cc=ferruh.yigit@amd.com \
--cc=jerinj@marvell.com \
--cc=konstantin.v.ananyev@yandex.ru \
--cc=longli@linuxonhyperv.com \
--cc=olivier.matz@6wind.com \
--cc=qi.z.zhang@intel.com \
--cc=sharmaajay@microsoft.com \
--cc=stable@dpdk.org \
--cc=stephen@networkplumber.org \
--cc=thomas@monjalon.net \
/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).