All of lore.kernel.org
 help / color / mirror / Atom feed
From: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
To: Song Yoong Siang <yoong.siang.song@intel.com>
Cc: "David S . Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Simon Horman <horms@kernel.org>,
	Willem de Bruijn <willemb@google.com>,
	Florian Bezdeka <florian.bezdeka@siemens.com>,
	"Donald Hunter" <donald.hunter@gmail.com>,
	Jonathan Corbet <corbet@lwn.net>,
	"Bjorn Topel" <bjorn@kernel.org>,
	Magnus Karlsson <magnus.karlsson@intel.com>,
	Jonathan Lemon <jonathan.lemon@gmail.com>,
	Andrew Lunn <andrew+netdev@lunn.ch>,
	Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Jesper Dangaard Brouer <hawk@kernel.org>,
	"John Fastabend" <john.fastabend@gmail.com>,
	Joe Damato <jdamato@fastly.com>,
	Stanislav Fomichev <sdf@fomichev.me>,
	Xuan Zhuo <xuanzhuo@linux.alibaba.com>,
	Mina Almasry <almasrymina@google.com>,
	Daniel Jurgens <danielj@nvidia.com>,
	Andrii Nakryiko <andrii@kernel.org>,
	Eduard Zingerman <eddyz87@gmail.com>,
	Mykola Lysenko <mykolal@fb.com>,
	Martin KaFai Lau <martin.lau@linux.dev>,
	Song Liu <song@kernel.org>,
	Yonghong Song <yonghong.song@linux.dev>,
	KP Singh <kpsingh@kernel.org>, Hao Luo <haoluo@google.com>,
	Jiri Olsa <jolsa@kernel.org>, Shuah Khan <shuah@kernel.org>,
	Alexandre Torgue <alexandre.torgue@foss.st.com>,
	Jose Abreu <joabreu@synopsys.com>,
	"Maxime Coquelin" <mcoquelin.stm32@gmail.com>,
	Tony Nguyen <anthony.l.nguyen@intel.com>,
	Przemek Kitszel <przemyslaw.kitszel@intel.com>,
	Faizal Rahim <faizal.abdul.rahim@linux.intel.com>,
	Choong Yong Liang <yong.liang.choong@linux.intel.com>,
	Bouska Zdenek <zdenek.bouska@siemens.com>,
	<netdev@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<linux-doc@vger.kernel.org>, <bpf@vger.kernel.org>,
	<linux-kselftest@vger.kernel.org>,
	<linux-stm32@st-md-mailman.stormreply.com>,
	<linux-arm-kernel@lists.infradead.org>,
	<intel-wired-lan@lists.osuosl.org>, <xdp-hints@xdp-project.net>
Subject: Re: [PATCH bpf-next v9 4/5] igc: Refactor empty frame insertion for launch time support
Date: Thu, 6 Feb 2025 20:23:11 +0100	[thread overview]
Message-ID: <Z6UMHy++k9+x68Tr@boxer> (raw)
In-Reply-To: <20250206060408.808325-5-yoong.siang.song@intel.com>

On Thu, Feb 06, 2025 at 02:04:07PM +0800, Song Yoong Siang wrote:
> Refactor the code for inserting an empty frame into a new function
> igc_insert_empty_frame(). This change extracts the logic for inserting
> an empty packet from igc_xmit_frame_ring() into a separate function,
> allowing it to be reused in future implementations, such as the XDP
> zero copy transmit function.
> 
> Remove the igc_desc_unused() checking in igc_init_tx_empty_descriptor()
> because the number of descriptors needed is guaranteed.
> 
> Ensure that skb allocation and DMA mapping work for the empty frame,
> before proceeding to fill in igc_tx_buffer info, context descriptor,
> and data descriptor.
> 
> Rate limit the error messages for skb allocation and DMA mapping failures.
> 
> Update the comment to indicate that the 2 descriptors needed by the empty
> frame are already taken into consideration in igc_xmit_frame_ring().
> 
> Handle the case where the insertion of an empty frame fails and explain
> the reason behind this handling.
> 
> Signed-off-by: Song Yoong Siang <yoong.siang.song@intel.com>

Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>

with one nit below.

> ---
>  drivers/net/ethernet/intel/igc/igc_main.c | 84 ++++++++++++++---------
>  1 file changed, 52 insertions(+), 32 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c
> index 84307bb7313e..3df608601a4b 100644
> --- a/drivers/net/ethernet/intel/igc/igc_main.c
> +++ b/drivers/net/ethernet/intel/igc/igc_main.c
> @@ -1092,7 +1092,9 @@ static int igc_init_empty_frame(struct igc_ring *ring,
>  
>  	dma = dma_map_single(ring->dev, skb->data, size, DMA_TO_DEVICE);
>  	if (dma_mapping_error(ring->dev, dma)) {
> -		netdev_err_once(ring->netdev, "Failed to map DMA for TX\n");
> +		if (net_ratelimit())
> +			netdev_err(ring->netdev,
> +				   "DMA mapping error for empty frame\n");

This is open-coded net_err_ratelimited(), no?

>  		return -ENOMEM;
>  	}
>  
> @@ -1108,20 +1110,12 @@ static int igc_init_empty_frame(struct igc_ring *ring,
>  	return 0;
>  }
>  
> -static int igc_init_tx_empty_descriptor(struct igc_ring *ring,
> -					struct sk_buff *skb,
> -					struct igc_tx_buffer *first)
> +static void igc_init_tx_empty_descriptor(struct igc_ring *ring,
> +					 struct sk_buff *skb,
> +					 struct igc_tx_buffer *first)
>  {
>  	union igc_adv_tx_desc *desc;
>  	u32 cmd_type, olinfo_status;
> -	int err;
> -
> -	if (!igc_desc_unused(ring))
> -		return -EBUSY;
> -
> -	err = igc_init_empty_frame(ring, first, skb);
> -	if (err)
> -		return err;
>  
>  	cmd_type = IGC_ADVTXD_DTYP_DATA | IGC_ADVTXD_DCMD_DEXT |
>  		   IGC_ADVTXD_DCMD_IFCS | IGC_TXD_DCMD |
> @@ -1140,8 +1134,6 @@ static int igc_init_tx_empty_descriptor(struct igc_ring *ring,
>  	ring->next_to_use++;
>  	if (ring->next_to_use == ring->count)
>  		ring->next_to_use = 0;
> -
> -	return 0;
>  }
>  
>  #define IGC_EMPTY_FRAME_SIZE 60
> @@ -1567,6 +1559,41 @@ static bool igc_request_tx_tstamp(struct igc_adapter *adapter, struct sk_buff *s
>  	return false;
>  }
>  
> +static int igc_insert_empty_frame(struct igc_ring *tx_ring)
> +{
> +	struct igc_tx_buffer *empty_info;
> +	struct sk_buff *empty_skb;
> +	void *data;
> +	int ret;
> +
> +	empty_info = &tx_ring->tx_buffer_info[tx_ring->next_to_use];
> +	empty_skb = alloc_skb(IGC_EMPTY_FRAME_SIZE, GFP_ATOMIC);
> +	if (unlikely(!empty_skb)) {
> +		if (net_ratelimit())
> +			netdev_err(tx_ring->netdev,
> +				   "skb alloc error for empty frame\n");

ditto

> +		return -ENOMEM;
> +	}
> +
> +	data = skb_put(empty_skb, IGC_EMPTY_FRAME_SIZE);
> +	memset(data, 0, IGC_EMPTY_FRAME_SIZE);
> +
> +	/* Prepare DMA mapping and Tx buffer information */
> +	ret = igc_init_empty_frame(tx_ring, empty_info, empty_skb);
> +	if (unlikely(ret)) {
> +		dev_kfree_skb_any(empty_skb);
> +		return ret;
> +	}
> +
> +	/* Prepare advanced context descriptor for empty packet */
> +	igc_tx_ctxtdesc(tx_ring, 0, false, 0, 0, 0);
> +
> +	/* Prepare advanced data descriptor for empty packet */
> +	igc_init_tx_empty_descriptor(tx_ring, empty_skb, empty_info);
> +
> +	return 0;
> +}
> +
>  static netdev_tx_t igc_xmit_frame_ring(struct sk_buff *skb,
>  				       struct igc_ring *tx_ring)
>  {
> @@ -1586,6 +1613,7 @@ static netdev_tx_t igc_xmit_frame_ring(struct sk_buff *skb,
>  	 *	+ 1 desc for skb_headlen/IGC_MAX_DATA_PER_TXD,
>  	 *	+ 2 desc gap to keep tail from touching head,
>  	 *	+ 1 desc for context descriptor,
> +	 *	+ 2 desc for inserting an empty packet for launch time,
>  	 * otherwise try next time
>  	 */
>  	for (f = 0; f < skb_shinfo(skb)->nr_frags; f++)
> @@ -1605,24 +1633,16 @@ static netdev_tx_t igc_xmit_frame_ring(struct sk_buff *skb,
>  	launch_time = igc_tx_launchtime(tx_ring, txtime, &first_flag, &insert_empty);
>  
>  	if (insert_empty) {
> -		struct igc_tx_buffer *empty_info;
> -		struct sk_buff *empty;
> -		void *data;
> -
> -		empty_info = &tx_ring->tx_buffer_info[tx_ring->next_to_use];
> -		empty = alloc_skb(IGC_EMPTY_FRAME_SIZE, GFP_ATOMIC);
> -		if (!empty)
> -			goto done;
> -
> -		data = skb_put(empty, IGC_EMPTY_FRAME_SIZE);
> -		memset(data, 0, IGC_EMPTY_FRAME_SIZE);
> -
> -		igc_tx_ctxtdesc(tx_ring, 0, false, 0, 0, 0);
> -
> -		if (igc_init_tx_empty_descriptor(tx_ring,
> -						 empty,
> -						 empty_info) < 0)
> -			dev_kfree_skb_any(empty);
> +		/* Reset the launch time if the required empty frame fails to
> +		 * be inserted. However, this packet is not dropped, so it
> +		 * "dirties" the current Qbv cycle. This ensures that the
> +		 * upcoming packet, which is scheduled in the next Qbv cycle,
> +		 * does not require an empty frame. This way, the launch time
> +		 * continues to function correctly despite the current failure
> +		 * to insert the empty frame.
> +		 */
> +		if (igc_insert_empty_frame(tx_ring))
> +			launch_time = 0;
>  	}
>  
>  done:
> -- 
> 2.34.1
> 

WARNING: multiple messages have this Message-ID (diff)
From: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
To: Song Yoong Siang <yoong.siang.song@intel.com>
Cc: "David S . Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Simon Horman <horms@kernel.org>,
	Willem de Bruijn <willemb@google.com>,
	Florian Bezdeka <florian.bezdeka@siemens.com>,
	"Donald Hunter" <donald.hunter@gmail.com>,
	Jonathan Corbet <corbet@lwn.net>,
	"Bjorn Topel" <bjorn@kernel.org>,
	Magnus Karlsson <magnus.karlsson@intel.com>,
	Jonathan Lemon <jonathan.lemon@gmail.com>,
	Andrew Lunn <andrew+netdev@lunn.ch>,
	Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Jesper Dangaard Brouer <hawk@kernel.org>,
	"John Fastabend" <john.fastabend@gmail.com>,
	Joe Damato <jdamato@fastly.com>,
	Stanislav Fomichev <sdf@fomichev.me>,
	Xuan Zhuo <xuanzhuo@linux.alibaba.com>,
	 Mina Almasry <almasrymina@google.com>,
	Daniel Jurgens <danielj@nvidia.com>,
	Andrii Nakryiko <andrii@kernel.org>,
	Eduard Zingerman <eddyz87@gmail.com>,
	Mykola Lysenko <mykolal@fb.com>,
	Martin KaFai Lau <martin.lau@linux.dev>,
	Song Liu <song@kernel.org>,
	Yonghong Song <yonghong.song@linux.dev>,
	KP Singh <kpsingh@kernel.org>, Hao Luo <haoluo@google.com>,
	Jiri Olsa <jolsa@kernel.org>, Shuah Khan <shuah@kernel.org>,
	Alexandre Torgue <alexandre.torgue@foss.st.com>,
	Jose Abreu <joabreu@synopsys.com>,
	"Maxime Coquelin" <mcoquelin.stm32@gmail.com>,
	Tony Nguyen <anthony.l.nguyen@intel.com>,
	Przemek Kitszel <przemyslaw.kitszel@intel.com>,
	 Faizal Rahim <faizal.abdul.rahim@linux.intel.com>,
	Choong Yong Liang <yong.liang.choong@linux.intel.com>,
	Bouska Zdenek <zdenek.bouska@siemens.com>,
	<netdev@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<linux-doc@vger.kernel.org>, <bpf@vger.kernel.org>,
	<linux-kselftest@vger.kernel.org>,
	<linux-stm32@st-md-mailman.stormreply.com>,
	<linux-arm-kernel@lists.infradead.org>,
	<intel-wired-lan@lists.osuosl.org>, <xdp-hints@xdp-project.net>
Subject: Re: [Intel-wired-lan] [PATCH bpf-next v9 4/5] igc: Refactor empty frame insertion for launch time support
Date: Thu, 6 Feb 2025 20:23:11 +0100	[thread overview]
Message-ID: <Z6UMHy++k9+x68Tr@boxer> (raw)
In-Reply-To: <20250206060408.808325-5-yoong.siang.song@intel.com>

On Thu, Feb 06, 2025 at 02:04:07PM +0800, Song Yoong Siang wrote:
> Refactor the code for inserting an empty frame into a new function
> igc_insert_empty_frame(). This change extracts the logic for inserting
> an empty packet from igc_xmit_frame_ring() into a separate function,
> allowing it to be reused in future implementations, such as the XDP
> zero copy transmit function.
> 
> Remove the igc_desc_unused() checking in igc_init_tx_empty_descriptor()
> because the number of descriptors needed is guaranteed.
> 
> Ensure that skb allocation and DMA mapping work for the empty frame,
> before proceeding to fill in igc_tx_buffer info, context descriptor,
> and data descriptor.
> 
> Rate limit the error messages for skb allocation and DMA mapping failures.
> 
> Update the comment to indicate that the 2 descriptors needed by the empty
> frame are already taken into consideration in igc_xmit_frame_ring().
> 
> Handle the case where the insertion of an empty frame fails and explain
> the reason behind this handling.
> 
> Signed-off-by: Song Yoong Siang <yoong.siang.song@intel.com>

Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>

with one nit below.

> ---
>  drivers/net/ethernet/intel/igc/igc_main.c | 84 ++++++++++++++---------
>  1 file changed, 52 insertions(+), 32 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c
> index 84307bb7313e..3df608601a4b 100644
> --- a/drivers/net/ethernet/intel/igc/igc_main.c
> +++ b/drivers/net/ethernet/intel/igc/igc_main.c
> @@ -1092,7 +1092,9 @@ static int igc_init_empty_frame(struct igc_ring *ring,
>  
>  	dma = dma_map_single(ring->dev, skb->data, size, DMA_TO_DEVICE);
>  	if (dma_mapping_error(ring->dev, dma)) {
> -		netdev_err_once(ring->netdev, "Failed to map DMA for TX\n");
> +		if (net_ratelimit())
> +			netdev_err(ring->netdev,
> +				   "DMA mapping error for empty frame\n");

This is open-coded net_err_ratelimited(), no?

>  		return -ENOMEM;
>  	}
>  
> @@ -1108,20 +1110,12 @@ static int igc_init_empty_frame(struct igc_ring *ring,
>  	return 0;
>  }
>  
> -static int igc_init_tx_empty_descriptor(struct igc_ring *ring,
> -					struct sk_buff *skb,
> -					struct igc_tx_buffer *first)
> +static void igc_init_tx_empty_descriptor(struct igc_ring *ring,
> +					 struct sk_buff *skb,
> +					 struct igc_tx_buffer *first)
>  {
>  	union igc_adv_tx_desc *desc;
>  	u32 cmd_type, olinfo_status;
> -	int err;
> -
> -	if (!igc_desc_unused(ring))
> -		return -EBUSY;
> -
> -	err = igc_init_empty_frame(ring, first, skb);
> -	if (err)
> -		return err;
>  
>  	cmd_type = IGC_ADVTXD_DTYP_DATA | IGC_ADVTXD_DCMD_DEXT |
>  		   IGC_ADVTXD_DCMD_IFCS | IGC_TXD_DCMD |
> @@ -1140,8 +1134,6 @@ static int igc_init_tx_empty_descriptor(struct igc_ring *ring,
>  	ring->next_to_use++;
>  	if (ring->next_to_use == ring->count)
>  		ring->next_to_use = 0;
> -
> -	return 0;
>  }
>  
>  #define IGC_EMPTY_FRAME_SIZE 60
> @@ -1567,6 +1559,41 @@ static bool igc_request_tx_tstamp(struct igc_adapter *adapter, struct sk_buff *s
>  	return false;
>  }
>  
> +static int igc_insert_empty_frame(struct igc_ring *tx_ring)
> +{
> +	struct igc_tx_buffer *empty_info;
> +	struct sk_buff *empty_skb;
> +	void *data;
> +	int ret;
> +
> +	empty_info = &tx_ring->tx_buffer_info[tx_ring->next_to_use];
> +	empty_skb = alloc_skb(IGC_EMPTY_FRAME_SIZE, GFP_ATOMIC);
> +	if (unlikely(!empty_skb)) {
> +		if (net_ratelimit())
> +			netdev_err(tx_ring->netdev,
> +				   "skb alloc error for empty frame\n");

ditto

> +		return -ENOMEM;
> +	}
> +
> +	data = skb_put(empty_skb, IGC_EMPTY_FRAME_SIZE);
> +	memset(data, 0, IGC_EMPTY_FRAME_SIZE);
> +
> +	/* Prepare DMA mapping and Tx buffer information */
> +	ret = igc_init_empty_frame(tx_ring, empty_info, empty_skb);
> +	if (unlikely(ret)) {
> +		dev_kfree_skb_any(empty_skb);
> +		return ret;
> +	}
> +
> +	/* Prepare advanced context descriptor for empty packet */
> +	igc_tx_ctxtdesc(tx_ring, 0, false, 0, 0, 0);
> +
> +	/* Prepare advanced data descriptor for empty packet */
> +	igc_init_tx_empty_descriptor(tx_ring, empty_skb, empty_info);
> +
> +	return 0;
> +}
> +
>  static netdev_tx_t igc_xmit_frame_ring(struct sk_buff *skb,
>  				       struct igc_ring *tx_ring)
>  {
> @@ -1586,6 +1613,7 @@ static netdev_tx_t igc_xmit_frame_ring(struct sk_buff *skb,
>  	 *	+ 1 desc for skb_headlen/IGC_MAX_DATA_PER_TXD,
>  	 *	+ 2 desc gap to keep tail from touching head,
>  	 *	+ 1 desc for context descriptor,
> +	 *	+ 2 desc for inserting an empty packet for launch time,
>  	 * otherwise try next time
>  	 */
>  	for (f = 0; f < skb_shinfo(skb)->nr_frags; f++)
> @@ -1605,24 +1633,16 @@ static netdev_tx_t igc_xmit_frame_ring(struct sk_buff *skb,
>  	launch_time = igc_tx_launchtime(tx_ring, txtime, &first_flag, &insert_empty);
>  
>  	if (insert_empty) {
> -		struct igc_tx_buffer *empty_info;
> -		struct sk_buff *empty;
> -		void *data;
> -
> -		empty_info = &tx_ring->tx_buffer_info[tx_ring->next_to_use];
> -		empty = alloc_skb(IGC_EMPTY_FRAME_SIZE, GFP_ATOMIC);
> -		if (!empty)
> -			goto done;
> -
> -		data = skb_put(empty, IGC_EMPTY_FRAME_SIZE);
> -		memset(data, 0, IGC_EMPTY_FRAME_SIZE);
> -
> -		igc_tx_ctxtdesc(tx_ring, 0, false, 0, 0, 0);
> -
> -		if (igc_init_tx_empty_descriptor(tx_ring,
> -						 empty,
> -						 empty_info) < 0)
> -			dev_kfree_skb_any(empty);
> +		/* Reset the launch time if the required empty frame fails to
> +		 * be inserted. However, this packet is not dropped, so it
> +		 * "dirties" the current Qbv cycle. This ensures that the
> +		 * upcoming packet, which is scheduled in the next Qbv cycle,
> +		 * does not require an empty frame. This way, the launch time
> +		 * continues to function correctly despite the current failure
> +		 * to insert the empty frame.
> +		 */
> +		if (igc_insert_empty_frame(tx_ring))
> +			launch_time = 0;
>  	}
>  
>  done:
> -- 
> 2.34.1
> 

  reply	other threads:[~2025-02-06 19:23 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-06  6:04 [PATCH bpf-next v9 0/5] xsk: TX metadata Launch Time support Song Yoong Siang
2025-02-06  6:04 ` [Intel-wired-lan] " Song Yoong Siang
2025-02-06  6:04 ` [PATCH bpf-next v9 1/5] xsk: Add launch time hardware offload support to XDP Tx metadata Song Yoong Siang
2025-02-06  6:04   ` [Intel-wired-lan] " Song Yoong Siang
2025-02-06  6:04 ` [PATCH bpf-next v9 2/5] selftests/bpf: Add launch time request to xdp_hw_metadata Song Yoong Siang
2025-02-06  6:04   ` [Intel-wired-lan] " Song Yoong Siang
2025-02-06  6:04 ` [PATCH bpf-next v9 3/5] net: stmmac: Add launch time support to XDP ZC Song Yoong Siang
2025-02-06  6:04   ` [Intel-wired-lan] " Song Yoong Siang
2025-02-06 19:08   ` Maciej Fijalkowski
2025-02-06 19:08     ` [Intel-wired-lan] " Maciej Fijalkowski
2025-02-06  6:04 ` [PATCH bpf-next v9 4/5] igc: Refactor empty frame insertion for launch time support Song Yoong Siang
2025-02-06  6:04   ` [Intel-wired-lan] " Song Yoong Siang
2025-02-06 19:23   ` Maciej Fijalkowski [this message]
2025-02-06 19:23     ` Maciej Fijalkowski
2025-02-06  6:04 ` [PATCH bpf-next v9 5/5] igc: Add launch time support to XDP ZC Song Yoong Siang
2025-02-06  6:04   ` [Intel-wired-lan] " Song Yoong Siang
2025-02-06 19:29   ` Maciej Fijalkowski
2025-02-06 19:29     ` [Intel-wired-lan] " Maciej Fijalkowski

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=Z6UMHy++k9+x68Tr@boxer \
    --to=maciej.fijalkowski@intel.com \
    --cc=alexandre.torgue@foss.st.com \
    --cc=almasrymina@google.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=andrii@kernel.org \
    --cc=anthony.l.nguyen@intel.com \
    --cc=ast@kernel.org \
    --cc=bjorn@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=corbet@lwn.net \
    --cc=daniel@iogearbox.net \
    --cc=danielj@nvidia.com \
    --cc=davem@davemloft.net \
    --cc=donald.hunter@gmail.com \
    --cc=eddyz87@gmail.com \
    --cc=edumazet@google.com \
    --cc=faizal.abdul.rahim@linux.intel.com \
    --cc=florian.bezdeka@siemens.com \
    --cc=haoluo@google.com \
    --cc=hawk@kernel.org \
    --cc=horms@kernel.org \
    --cc=intel-wired-lan@lists.osuosl.org \
    --cc=jdamato@fastly.com \
    --cc=joabreu@synopsys.com \
    --cc=john.fastabend@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=jonathan.lemon@gmail.com \
    --cc=kpsingh@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-stm32@st-md-mailman.stormreply.com \
    --cc=magnus.karlsson@intel.com \
    --cc=martin.lau@linux.dev \
    --cc=mcoquelin.stm32@gmail.com \
    --cc=mykolal@fb.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=przemyslaw.kitszel@intel.com \
    --cc=sdf@fomichev.me \
    --cc=shuah@kernel.org \
    --cc=song@kernel.org \
    --cc=willemb@google.com \
    --cc=xdp-hints@xdp-project.net \
    --cc=xuanzhuo@linux.alibaba.com \
    --cc=yong.liang.choong@linux.intel.com \
    --cc=yonghong.song@linux.dev \
    --cc=yoong.siang.song@intel.com \
    --cc=zdenek.bouska@siemens.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.