Message ID | 20250106135658.9734-1-yoong.siang.song@intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | xsk: TX metadata Launch Time support | expand |
On 01/06, Song Yoong Siang wrote: > Enable launch time (Time-Based Scheduling) support to XDP zero copy via XDP > Tx metadata framework. > > This patch is tested with tools/testing/selftests/bpf/xdp_hw_metadata on > Intel Tiger Lake platform. Below are the test steps and result. > > Test Steps: > 1. Add mqprio qdisc: > $ sudo tc qdisc add dev enp0s30f4 handle 8001: parent root mqprio num_tc > 4 map 0 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 queues 1@0 1@1 1@2 1@3 hw 0 > > 2. Enable launch time hardware offload on hardware queue 1: > $ sudo tc qdisc replace dev enp0s30f4 parent 8001:2 etf offload clockid > CLOCK_TAI delta 500000 > > 3. Add an ingress qdisc: > $ sudo tc qdisc add dev enp0s30f4 ingress > > 4. Add a flower filter to route incoming packet with VLAN priority 1 into > hardware queue 1: > $ sudo tc filter add dev enp0s30f4 parent ffff: protocol 802.1Q flower > vlan_prio 1 hw_tc 1 > > 5. Enable VLAN tag stripping: > $ sudo ethtool -K enp0s30f4 rxvlan on > > 6. Start xdp_hw_metadata selftest application: > $ sudo ./xdp_hw_metadata enp0s30f4 -l 1000000000 > > 7. Send an UDP packet with VLAN priority 1 to port 9091 of DUT. Tangential: I wonder whether we can add the setup steps to the xdp_hw_metadata tool? It is useful to have one command to run that takes care of all the details. Same way it already enables HW tstamping.. Or, if not the full setup, some kind of detection we can signal to the user that some things might be missing?
On Wednesday, January 8, 2025 1:08 AM, Stanislav Fomichev <stfomichev@gmail.com> wrote: >On 01/06, Song Yoong Siang wrote: >> Enable launch time (Time-Based Scheduling) support to XDP zero copy via XDP >> Tx metadata framework. >> >> This patch is tested with tools/testing/selftests/bpf/xdp_hw_metadata on >> Intel Tiger Lake platform. Below are the test steps and result. >> >> Test Steps: >> 1. Add mqprio qdisc: >> $ sudo tc qdisc add dev enp0s30f4 handle 8001: parent root mqprio num_tc >> 4 map 0 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 queues 1@0 1@1 1@2 1@3 hw 0 >> >> 2. Enable launch time hardware offload on hardware queue 1: >> $ sudo tc qdisc replace dev enp0s30f4 parent 8001:2 etf offload clockid >> CLOCK_TAI delta 500000 >> >> 3. Add an ingress qdisc: >> $ sudo tc qdisc add dev enp0s30f4 ingress >> >> 4. Add a flower filter to route incoming packet with VLAN priority 1 into >> hardware queue 1: >> $ sudo tc filter add dev enp0s30f4 parent ffff: protocol 802.1Q flower >> vlan_prio 1 hw_tc 1 >> >> 5. Enable VLAN tag stripping: >> $ sudo ethtool -K enp0s30f4 rxvlan on >> >> 6. Start xdp_hw_metadata selftest application: >> $ sudo ./xdp_hw_metadata enp0s30f4 -l 1000000000 >> >> 7. Send an UDP packet with VLAN priority 1 to port 9091 of DUT. > >Tangential: I wonder whether we can add the setup steps to the >xdp_hw_metadata tool? It is useful to have one command to run that >takes care of all the details. Same way it already enables HW >tstamping.. > >Or, if not the full setup, some kind of detection we can signal to the >user that some things might be missing? Sure. I can try to add the setup steps into xdp_hw_metadata by using ioctl() function. However, there are some device specific command, like the number of queue, their priority, how they route the incoming packet, etc. I will try to find out a common way that can work for most of the devices, at least work for both igc and stmmac. Thanks & Regards Siang
On 01/09, Song, Yoong Siang wrote: > On Wednesday, January 8, 2025 1:08 AM, Stanislav Fomichev <stfomichev@gmail.com> wrote: > >On 01/06, Song Yoong Siang wrote: > >> Enable launch time (Time-Based Scheduling) support to XDP zero copy via XDP > >> Tx metadata framework. > >> > >> This patch is tested with tools/testing/selftests/bpf/xdp_hw_metadata on > >> Intel Tiger Lake platform. Below are the test steps and result. > >> > >> Test Steps: > >> 1. Add mqprio qdisc: > >> $ sudo tc qdisc add dev enp0s30f4 handle 8001: parent root mqprio num_tc > >> 4 map 0 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 queues 1@0 1@1 1@2 1@3 hw 0 > >> > >> 2. Enable launch time hardware offload on hardware queue 1: > >> $ sudo tc qdisc replace dev enp0s30f4 parent 8001:2 etf offload clockid > >> CLOCK_TAI delta 500000 > >> > >> 3. Add an ingress qdisc: > >> $ sudo tc qdisc add dev enp0s30f4 ingress > >> > >> 4. Add a flower filter to route incoming packet with VLAN priority 1 into > >> hardware queue 1: > >> $ sudo tc filter add dev enp0s30f4 parent ffff: protocol 802.1Q flower > >> vlan_prio 1 hw_tc 1 > >> > >> 5. Enable VLAN tag stripping: > >> $ sudo ethtool -K enp0s30f4 rxvlan on > >> > >> 6. Start xdp_hw_metadata selftest application: > >> $ sudo ./xdp_hw_metadata enp0s30f4 -l 1000000000 > >> > >> 7. Send an UDP packet with VLAN priority 1 to port 9091 of DUT. > > > >Tangential: I wonder whether we can add the setup steps to the > >xdp_hw_metadata tool? It is useful to have one command to run that > >takes care of all the details. Same way it already enables HW > >tstamping.. > > > >Or, if not the full setup, some kind of detection we can signal to the > >user that some things might be missing? > > Sure. I can try to add the setup steps into xdp_hw_metadata > by using ioctl() function. However, there are some device specific > command, like the number of queue, their priority, > how they route the incoming packet, etc. I will try to find out > a common way that can work for most of the devices, > at least work for both igc and stmmac. We can query the number of queues (and everything else you need) in the tool, similar to what we do in testing/selftests/drivers/net/hw/ncdevmem.c, take a look. But if it's too complicated, maybe at least print these commands on startup and tell the user to run them. The reason I'm asking is that I hope that we eventually can run this tool from (automatic) testing/selftests/drivers/net/hw testsuite to make sure the metadata stuff keeps working.
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h index 1d86439b8a14..c80462d42989 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; }; 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 c81ea8cdfe6e..3a083e3684ed 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -2445,9 +2445,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); + + 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) @@ -2531,6 +2542,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) {
Enable launch time (Time-Based Scheduling) support to XDP zero copy via XDP Tx metadata framework. This patch is tested with tools/testing/selftests/bpf/xdp_hw_metadata on Intel Tiger Lake platform. Below are the test steps and result. Test Steps: 1. Add mqprio qdisc: $ sudo tc qdisc add dev enp0s30f4 handle 8001: parent root mqprio num_tc 4 map 0 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 queues 1@0 1@1 1@2 1@3 hw 0 2. Enable launch time hardware offload on hardware queue 1: $ sudo tc qdisc replace dev enp0s30f4 parent 8001:2 etf offload clockid CLOCK_TAI delta 500000 3. Add an ingress qdisc: $ sudo tc qdisc add dev enp0s30f4 ingress 4. Add a flower filter to route incoming packet with VLAN priority 1 into hardware queue 1: $ sudo tc filter add dev enp0s30f4 parent ffff: protocol 802.1Q flower vlan_prio 1 hw_tc 1 5. Enable VLAN tag stripping: $ sudo ethtool -K enp0s30f4 rxvlan on 6. Start xdp_hw_metadata selftest application: $ sudo ./xdp_hw_metadata enp0s30f4 -l 1000000000 7. Send an UDP packet with VLAN priority 1 to port 9091 of DUT. When launch time is set to 1s in the future, the delta between launch time and transmit hardware timestamp is equal to 16.963us, as shown in result 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 Signed-off-by: Song Yoong Siang <yoong.siang.song@intel.com> --- drivers/net/ethernet/stmicro/stmmac/stmmac.h | 2 ++ drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 13 +++++++++++++ 2 files changed, 15 insertions(+)