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 >