Re: [PATCH bpf-next v9 3/5] net: stmmac: Add launch time support to XDP ZC

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Feb 06, 2025 at 02:04:06PM +0800, Song Yoong Siang wrote:
> Enable launch time (Time-Based Scheduling) support for XDP zero copy via
> the XDP Tx metadata framework.
> 
> This patch has been tested with tools/testing/selftests/bpf/xdp_hw_metadata
> on Intel Tiger Lake platform. Below are the test steps and result.
> 
> Test 1: Send a single packet with the launch time set to 1 s in the future.
> 
> Test steps:
> 1. On the DUT, start the xdp_hw_metadata selftest application:
>    $ sudo ./xdp_hw_metadata enp0s30f4 -l 1000000000 -L 1
> 
> 2. On the Link Partner, send a UDP packet with VLAN priority 1 to port 9091
>    of the DUT.
> 
> Result:
> When the launch time is set to 1 s in the future, the delta between the
> launch time and the transmit hardware timestamp is 16.963 us, as shown in
> printout of the xdp_hw_metadata application below.
>   0x55b5864717a8: rx_desc[4]->addr=88100 addr=88100 comp_addr=88100 EoP
>   No rx_hash, err=-95
>   HW RX-time:   1734579065767717328 (sec:1734579065.7677)
>                 delta to User RX-time sec:0.0004 (375.624 usec)
>   XDP RX-time:   1734579065768004454 (sec:1734579065.7680)
>                  delta to User RX-time sec:0.0001 (88.498 usec)
>   No rx_vlan_tci or rx_vlan_proto, err=-95
>   0x55b5864717a8: ping-pong with csum=5619 (want 0000)
>                   csum_start=34 csum_offset=6
>   HW RX-time:   1734579065767717328 (sec:1734579065.7677)
>                 delta to HW Launch-time sec:1.0000 (1000000.000 usec)
>   0x55b5864717a8: complete tx idx=4 addr=4018
>   HW Launch-time:   1734579066767717328 (sec:1734579066.7677)
>                     delta to HW TX-complete-time sec:0.0000 (16.963 usec)
>   HW TX-complete-time:   1734579066767734291 (sec:1734579066.7677)
>                          delta to User TX-complete-time sec:0.0001
>                          (130.408 usec)
>   XDP RX-time:   1734579065768004454 (sec:1734579065.7680)
>                  delta to User TX-complete-time sec:0.9999
>                 (999860.245 usec)
>   HW RX-time:   1734579065767717328 (sec:1734579065.7677)
>                 delta to HW TX-complete-time sec:1.0000 (1000016.963 usec)
>   0x55b5864717a8: complete rx idx=132 addr=88100
> 
> Test 2: Send 1000 packets with a 10 ms interval and the launch time set to
>         500 us in the future.
> 
> Test steps:
> 1. On the DUT, start the xdp_hw_metadata selftest application:
>    $ sudo chrt -f 99 ./xdp_hw_metadata enp0s30f4 -l 500000 -L 1 > \
>      /dev/shm/result.log
> 
> 2. On the Link Partner, send 1000 UDP packets with a 10 ms interval and
>    VLAN priority 1 to port 9091 of the DUT.
> 
> Result:
> When the launch time is set to 500 us in the future, the average delta
> between the launch time and the transmit hardware timestamp is 13.854 us,
> as shown in the analysis of /dev/shm/result.log below. The XDP launch time
> works correctly in sending 1000 packets continuously.
>   Min delta: 08.410 us
>   Avr delta: 13.854 us
>   Max delta: 17.076 us
>   Total packets forwarded: 1000
> 
> Reviewed-by: Choong Yong Liang <yong.liang.choong@xxxxxxxxxxxxxxx>
> Signed-off-by: Song Yoong Siang <yoong.siang.song@xxxxxxxxx>

Sorry haven't looked here in previous review approaches :/

> ---
>  drivers/net/ethernet/stmicro/stmmac/stmmac.h      |  2 ++
>  drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 13 +++++++++++++
>  2 files changed, 15 insertions(+)
> 
> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
> index f05cae103d83..925d8b97a42b 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
> @@ -106,6 +106,8 @@ struct stmmac_metadata_request {
>  	struct stmmac_priv *priv;
>  	struct dma_desc *tx_desc;
>  	bool *set_ic;
> +	struct dma_edesc *edesc;
> +	int tbs;

wanted to comment you're introducing holes here but set_ic is a ptr:)

>  };
>  
>  struct stmmac_xsk_tx_complete {
> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> index d04543e5697b..5e5d24924ce7 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> @@ -2514,9 +2514,20 @@ static u64 stmmac_xsk_fill_timestamp(void *_priv)
>  	return 0;
>  }
>  
> +static void stmmac_xsk_request_launch_time(u64 launch_time, void *_priv)
> +{
> +	struct stmmac_metadata_request *meta_req = _priv;
> +	struct timespec64 ts = ns_to_timespec64(launch_time);

nit: Apply reverse christmas tree rule here (order the variable
definitions from longest to shortest), but it's not a showstopper I
guess...

> +
> +	if (meta_req->tbs & STMMAC_TBS_EN)
> +		stmmac_set_desc_tbs(meta_req->priv, meta_req->edesc, ts.tv_sec,
> +				    ts.tv_nsec);
> +}
> +
>  static const struct xsk_tx_metadata_ops stmmac_xsk_tx_metadata_ops = {
>  	.tmo_request_timestamp		= stmmac_xsk_request_timestamp,
>  	.tmo_fill_timestamp		= stmmac_xsk_fill_timestamp,
> +	.tmo_request_launch_time	= stmmac_xsk_request_launch_time,
>  };
>  
>  static bool stmmac_xdp_xmit_zc(struct stmmac_priv *priv, u32 queue, u32 budget)
> @@ -2600,6 +2611,8 @@ static bool stmmac_xdp_xmit_zc(struct stmmac_priv *priv, u32 queue, u32 budget)
>  		meta_req.priv = priv;
>  		meta_req.tx_desc = tx_desc;
>  		meta_req.set_ic = &set_ic;
> +		meta_req.tbs = tx_q->tbs;
> +		meta_req.edesc = &tx_q->dma_entx[entry];
>  		xsk_tx_metadata_request(meta, &stmmac_xsk_tx_metadata_ops,
>  					&meta_req);
>  		if (set_ic) {
> -- 
> 2.34.1
> 




[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux