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

From: Maciej Fijalkowski
Date: Thu Feb 06 2025 - 14:09:20 EST


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
>