• Song Yoong Siang's avatar
    igc: Add Tx hardware timestamp request for AF_XDP zero-copy packet · 15fd021b
    Song Yoong Siang authored
    This patch adds support to per-packet Tx hardware timestamp request to
    AF_XDP zero-copy packet via XDP Tx metadata framework. Please note that
    user needs to enable Tx HW timestamp capability via igc_ioctl() with
    SIOCSHWTSTAMP cmd before sending xsk Tx hardware timestamp request.
    
    Same as implementation in RX timestamp XDP hints kfunc metadata, Timer 0
    (adjustable clock) is used in xsk Tx hardware timestamp. i225/i226 have
    four sets of timestamping registers. *skb and *xsk_tx_buffer pointers
    are used to indicate whether the timestamping register is already occupied.
    
    Furthermore, a boolean variable named xsk_pending_ts is used to hold the
    transmit completion until the tx hardware timestamp is ready. This is
    because, for i225/i226, the timestamp notification event comes some time
    after the transmit completion event. The driver will retrigger hardware irq
    to clean the packet after retrieve the tx hardware timestamp.
    
    Besides, xsk_meta is added into struct igc_tx_timestamp_request as a hook
    to the metadata location of the transmit packet. When the Tx timestamp
    interrupt is fired, the interrupt handler will copy the value of Tx hwts
    into metadata location via xsk_tx_metadata_complete().
    
    This patch is tested with tools/testing/selftests/bpf/xdp_hw_metadata
    on Intel ADL-S platform. Below are the test steps and results.
    
    Test Step 1: Run xdp_hw_metadata app
     ./xdp_hw_metadata <iface> > /dev/shm/result.log
    
    Test Step 2: Enable Tx hardware timestamp
     hwstamp_ctl -i <iface> -t 1 -r 1
    
    Test Step 3: Run ptp4l and phc2sys for time synchronization
    
    Test Step 4: Generate UDP packets with 1ms interval for 10s
     trafgen --dev <iface> '{eth(da=<addr>), udp(dp=9091)}' -t 1ms -n 10000
    
    Test Step 5: Rerun Step 1-3 with 10s iperf3 as background traffic
    
    Test Step 6: Rerun Step 1-4 with 10s iperf3 as background traffic
    
    Based on iperf3 results below, the impact of holding tx completion to
    throughput is not observable.
    
    Result of last UDP packet (no. 10000) in Step 4:
    poll: 1 (0) skip=99 fail=0 redir=10000
    xsk_ring_cons__peek: 1
    0x5640a37972d0: rx_desc[9999]->addr=f2110 addr=f2110 comp_addr=f2110 EoP
    rx_hash: 0x2049BE1D with RSS type:0x1
    HW RX-time:   1679819246792971268 (sec:1679819246.7930) delta to User RX-time sec:0.0000 (14.990 usec)
    XDP RX-time:   1679819246792981987 (sec:1679819246.7930) delta to User RX-time sec:0.0000 (4.271 usec)
    No rx_vlan_tci or rx_vlan_proto, err=-95
    0x5640a37972d0: ping-pong with csum=ab19 (want 315b) csum_start=34 csum_offset=6
    0x5640a37972d0: complete tx idx=9999 addr=f010
    HW TX-complete-time:   1679819246793036971 (sec:1679819246.7930) delta to User TX-complete-time sec:0.0001 (77.656 usec)
    XDP RX-time:   1679819246792981987 (sec:1679819246.7930) delta to User TX-complete-time sec:0.0001 (132.640 usec)
    HW RX-time:   1679819246792971268 (sec:1679819246.7930) delta to HW TX-complete-time sec:0.0001 (65.703 usec)
    0x5640a37972d0: complete rx idx=10127 addr=f2110
    
    Result of iperf3 without tx hwts request in step 5:
    [ ID] Interval           Transfer     Bitrate         Retr
    [  5]   0.00-10.00  sec  2.74 GBytes  2.36 Gbits/sec    0             sender
    [  5]   0.00-10.05  sec  2.74 GBytes  2.34 Gbits/sec                  receiver
    
    Result of iperf3 running parallel with trafgen command in step 6:
    [ ID] Interval           Transfer     Bitrate         Retr
    [  5]   0.00-10.00  sec  2.74 GBytes  2.36 Gbits/sec    0             sender
    [  5]   0.00-10.04  sec  2.74 GBytes  2.34 Gbits/sec                  receiver
    Co-developed-by: default avatarLai Peter Jun Ann <jun.ann.lai@intel.com>
    Signed-off-by: default avatarLai Peter Jun Ann <jun.ann.lai@intel.com>
    Signed-off-by: default avatarSong Yoong Siang <yoong.siang.song@intel.com>
    Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Acked-by: default avatarVinicius Costa Gomes <vinicius.gomes@intel.com>
    Tested-by: default avatarNaama Meir <naamax.meir@linux.intel.com>
    Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
    Link: https://lore.kernel.org/r/20240424210256.3440903-1-anthony.l.nguyen@intel.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    15fd021b
igc_main.c 191 KB