* [xdp-hints] [PATCH bpf-next 1/3] xsk: add launch time support to XDP Tx metadata
2023-11-30 16:20 [xdp-hints] [PATCH bpf-next 0/3] xsk: TX metadata launch time support Song Yoong Siang
@ 2023-11-30 16:20 ` Song Yoong Siang
2023-11-30 20:28 ` [xdp-hints] " Willem de Bruijn
2023-12-02 3:28 ` Jakub Kicinski
2023-11-30 16:20 ` [xdp-hints] [PATCH bpf-next 2/3] net: stmmac: Add launch time support to XDP ZC Song Yoong Siang
2023-11-30 16:20 ` [xdp-hints] [PATCH bpf-next 3/3] selftests/bpf: Add launch time to xdp_hw_metadata Song Yoong Siang
2 siblings, 2 replies; 8+ messages in thread
From: Song Yoong Siang @ 2023-11-30 16:20 UTC (permalink / raw)
To: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Jonathan Corbet, Bjorn Topel, Magnus Karlsson,
Maciej Fijalkowski, Jonathan Lemon, Alexei Starovoitov,
Daniel Borkmann, Jesper Dangaard Brouer, John Fastabend,
Stanislav Fomichev, Lorenzo Bianconi, Tariq Toukan,
Willem de Bruijn, Maxime Coquelin, Andrii Nakryiko,
Mykola Lysenko, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Hao Luo, Jiri Olsa, Shuah Khan, Alexandre Torgue,
Jose Abreu
Cc: netdev, linux-kernel, linux-doc, bpf, xdp-hints, linux-stm32,
linux-arm-kernel, linux-kselftest, Song Yoong Siang
This patch extends the XDP Tx metadata framework to include Time-Based
Scheduling (TBS) support where the NIC will schedule a packet for
transmission at a pre-determined time called launch time. The value of
launch time is communicated from user space to Ethernet driver via
launch_time field of struct xsk_tx_metadata.
Suggested-by: Stanislav Fomichev <sdf@google.com>
Signed-off-by: Song Yoong Siang <yoong.siang.song@intel.com>
---
Documentation/netlink/specs/netdev.yaml | 4 ++++
Documentation/networking/xsk-tx-metadata.rst | 5 +++++
include/net/xdp_sock.h | 10 ++++++++++
include/net/xdp_sock_drv.h | 1 +
include/uapi/linux/if_xdp.h | 9 +++++++++
include/uapi/linux/netdev.h | 3 +++
net/core/netdev-genl.c | 2 ++
net/xdp/xsk.c | 3 +++
tools/include/uapi/linux/if_xdp.h | 9 +++++++++
tools/include/uapi/linux/netdev.h | 3 +++
tools/net/ynl/generated/netdev-user.c | 1 +
11 files changed, 50 insertions(+)
diff --git a/Documentation/netlink/specs/netdev.yaml b/Documentation/netlink/specs/netdev.yaml
index 00439bcbd2e3..a602776bbfb4 100644
--- a/Documentation/netlink/specs/netdev.yaml
+++ b/Documentation/netlink/specs/netdev.yaml
@@ -66,6 +66,10 @@ definitions:
name: tx-checksum
doc:
L3 checksum HW offload is supported by the driver.
+ -
+ name: launch-time
+ doc:
+ HW Time-Based Scheduling (TBS) is supported by the driver.
attribute-sets:
-
diff --git a/Documentation/networking/xsk-tx-metadata.rst b/Documentation/networking/xsk-tx-metadata.rst
index 97ecfa480d00..e3a7486f47e2 100644
--- a/Documentation/networking/xsk-tx-metadata.rst
+++ b/Documentation/networking/xsk-tx-metadata.rst
@@ -44,6 +44,10 @@ The flags field enables the particular offload:
checksum. ``csum_start`` specifies byte offset of where the checksumming
should start and ``csum_offset`` specifies byte offset where the
device should store the computed checksum.
+- ``XDP_TXMD_FLAGS_LAUNCH_TIME``: requests HW Time-Based Scheduling (TBS)
+ offload to launch the packet at a pre-determined time. ``launch_time``
+ indicates the time which the NIC should schedule the packet for
+ transmission.
Besides the flags above, in order to trigger the offloads, the first
packet's ``struct xdp_desc`` descriptor should set ``XDP_TX_METADATA``
@@ -68,6 +72,7 @@ Refer to ``xsk-flags`` features bitmask in
- ``tx-timestamp``: device supports ``XDP_TXMD_FLAGS_TIMESTAMP``
- ``tx-checksum``: device supports ``XDP_TXMD_FLAGS_CHECKSUM``
+- ``launch-time``: device supports ``XDP_TXMD_FLAGS_LAUNCH_TIME``
See ``tools/net/ynl/samples/netdev.c`` on how to query this information.
diff --git a/include/net/xdp_sock.h b/include/net/xdp_sock.h
index 3cb4dc9bd70e..f3e274830816 100644
--- a/include/net/xdp_sock.h
+++ b/include/net/xdp_sock.h
@@ -110,11 +110,16 @@ struct xdp_sock {
* indicates position where checksumming should start.
* csum_offset indicates position where checksum should be stored.
*
+ * void (*tmo_request_launch_time)(u64 launch_time, void *priv)
+ * Called when AF_XDP frame requested HW Time-Based Scheduling (TBS) offload
+ * support. launch_time indicates the time which the NIC should schedule the
+ * packet for transmission.
*/
struct xsk_tx_metadata_ops {
void (*tmo_request_timestamp)(void *priv);
u64 (*tmo_fill_timestamp)(void *priv);
void (*tmo_request_checksum)(u16 csum_start, u16 csum_offset, void *priv);
+ void (*tmo_request_launch_time)(u64 launch_time, void *priv);
};
#ifdef CONFIG_XDP_SOCKETS
@@ -170,6 +175,11 @@ static inline void xsk_tx_metadata_request(const struct xsk_tx_metadata *meta,
if (meta->flags & XDP_TXMD_FLAGS_CHECKSUM)
ops->tmo_request_checksum(meta->request.csum_start,
meta->request.csum_offset, priv);
+
+ if (ops->tmo_request_launch_time)
+ if (meta->flags & XDP_TXMD_FLAGS_LAUNCH_TIME)
+ ops->tmo_request_launch_time(meta->request.launch_time,
+ priv);
}
/**
diff --git a/include/net/xdp_sock_drv.h b/include/net/xdp_sock_drv.h
index 81e02de3f453..5b88559e956b 100644
--- a/include/net/xdp_sock_drv.h
+++ b/include/net/xdp_sock_drv.h
@@ -168,6 +168,7 @@ static inline void *xsk_buff_raw_get_data(struct xsk_buff_pool *pool, u64 addr)
#define XDP_TXMD_FLAGS_VALID ( \
XDP_TXMD_FLAGS_TIMESTAMP | \
XDP_TXMD_FLAGS_CHECKSUM | \
+ XDP_TXMD_FLAGS_LAUNCH_TIME | \
0)
static inline bool xsk_buff_valid_tx_metadata(struct xsk_tx_metadata *meta)
diff --git a/include/uapi/linux/if_xdp.h b/include/uapi/linux/if_xdp.h
index d31698410410..623d34e03981 100644
--- a/include/uapi/linux/if_xdp.h
+++ b/include/uapi/linux/if_xdp.h
@@ -123,6 +123,12 @@ struct xdp_options {
*/
#define XDP_TXMD_FLAGS_CHECKSUM (1 << 1)
+/* Request HW Time-Based Scheduling (TBS) offload to launch the packet at a
+ * pre-determined time. The time which the NIC should schedule the packet for
+ * transmission is communicated via launch_time field of struct xsk_tx_metadata.
+ */
+#define XDP_TXMD_FLAGS_LAUNCH_TIME (1 << 2)
+
/* AF_XDP offloads request. 'request' union member is consumed by the driver
* when the packet is being transmitted. 'completion' union member is
* filled by the driver when the transmit completion arrives.
@@ -138,6 +144,9 @@ struct xsk_tx_metadata {
__u16 csum_start;
/* Offset from csum_start where checksum should be stored. */
__u16 csum_offset;
+
+ /* XDP_TXMD_FLAGS_LAUNCH_TIME */
+ __u64 launch_time;
} request;
struct {
diff --git a/include/uapi/linux/netdev.h b/include/uapi/linux/netdev.h
index 48d5477a668c..db8b8618b29a 100644
--- a/include/uapi/linux/netdev.h
+++ b/include/uapi/linux/netdev.h
@@ -59,10 +59,13 @@ enum netdev_xdp_rx_metadata {
* by the driver.
* @NETDEV_XSK_FLAGS_TX_CHECKSUM: L3 checksum HW offload is supported by the
* driver.
+ * @NETDEV_XSK_FLAGS_TX_LAUNCH_TIME: HW Time-Based Scheduling is supported by
+ * the driver.
*/
enum netdev_xsk_flags {
NETDEV_XSK_FLAGS_TX_TIMESTAMP = 1,
NETDEV_XSK_FLAGS_TX_CHECKSUM = 2,
+ NETDEV_XSK_FLAGS_TX_LAUNCH_TIME = 3,
/* private: */
NETDEV_XSK_FLAGS_MASK = 3,
diff --git a/net/core/netdev-genl.c b/net/core/netdev-genl.c
index 10f2124e9e23..d001323b1d72 100644
--- a/net/core/netdev-genl.c
+++ b/net/core/netdev-genl.c
@@ -33,6 +33,8 @@ XDP_METADATA_KFUNC_xxx
xsk_features |= NETDEV_XSK_FLAGS_TX_TIMESTAMP;
if (netdev->xsk_tx_metadata_ops->tmo_request_checksum)
xsk_features |= NETDEV_XSK_FLAGS_TX_CHECKSUM;
+ if (netdev->xsk_tx_metadata_ops->tmo_request_launch_time)
+ xsk_features |= NETDEV_XSK_FLAGS_TX_LAUNCH_TIME;
}
if (nla_put_u32(rsp, NETDEV_A_DEV_IFINDEX, netdev->ifindex) ||
diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c
index 281d49b4fca4..ad98ac6adb43 100644
--- a/net/xdp/xsk.c
+++ b/net/xdp/xsk.c
@@ -751,6 +751,9 @@ static struct sk_buff *xsk_build_skb(struct xdp_sock *xs,
goto free_err;
}
}
+
+ if (meta->flags & XDP_TXMD_FLAGS_LAUNCH_TIME)
+ skb->skb_mstamp_ns = meta->request.launch_time;
}
}
diff --git a/tools/include/uapi/linux/if_xdp.h b/tools/include/uapi/linux/if_xdp.h
index 638c606dfa74..80462125c5c3 100644
--- a/tools/include/uapi/linux/if_xdp.h
+++ b/tools/include/uapi/linux/if_xdp.h
@@ -123,6 +123,12 @@ struct xdp_options {
*/
#define XDP_TXMD_FLAGS_CHECKSUM (1 << 1)
+/* Request HW Time-Based Scheduling (TBS) offload to launch the packet at a
+ * pre-determined time. The time which the NIC should schedule the packet for
+ * transmission is communicated via launch_time field of struct xsk_tx_metadata.
+ */
+#define XDP_TXMD_FLAGS_LAUNCH_TIME (1 << 2)
+
/* AF_XDP offloads request. 'request' union member is consumed by the driver
* when the packet is being transmitted. 'completion' union member is
* filled by the driver when the transmit completion arrives.
@@ -138,6 +144,9 @@ struct xsk_tx_metadata {
__u16 csum_start;
/* Offset from csum_start where checksum should be stored. */
__u16 csum_offset;
+
+ /* XDP_TXMD_FLAGS_LAUNCH_TIME */
+ __u64 launch_time;
} request;
struct {
diff --git a/tools/include/uapi/linux/netdev.h b/tools/include/uapi/linux/netdev.h
index 48d5477a668c..db8b8618b29a 100644
--- a/tools/include/uapi/linux/netdev.h
+++ b/tools/include/uapi/linux/netdev.h
@@ -59,10 +59,13 @@ enum netdev_xdp_rx_metadata {
* by the driver.
* @NETDEV_XSK_FLAGS_TX_CHECKSUM: L3 checksum HW offload is supported by the
* driver.
+ * @NETDEV_XSK_FLAGS_TX_LAUNCH_TIME: HW Time-Based Scheduling is supported by
+ * the driver.
*/
enum netdev_xsk_flags {
NETDEV_XSK_FLAGS_TX_TIMESTAMP = 1,
NETDEV_XSK_FLAGS_TX_CHECKSUM = 2,
+ NETDEV_XSK_FLAGS_TX_LAUNCH_TIME = 3,
/* private: */
NETDEV_XSK_FLAGS_MASK = 3,
diff --git a/tools/net/ynl/generated/netdev-user.c b/tools/net/ynl/generated/netdev-user.c
index 6283d87dad37..bb4136d64f57 100644
--- a/tools/net/ynl/generated/netdev-user.c
+++ b/tools/net/ynl/generated/netdev-user.c
@@ -61,6 +61,7 @@ const char *netdev_xdp_rx_metadata_str(enum netdev_xdp_rx_metadata value)
static const char * const netdev_xsk_flags_strmap[] = {
[0] = "tx-timestamp",
[1] = "tx-checksum",
+ [2] = "launch-time"
};
const char *netdev_xsk_flags_str(enum netdev_xsk_flags value)
--
2.34.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [xdp-hints] Re: [PATCH bpf-next 1/3] xsk: add launch time support to XDP Tx metadata
2023-11-30 16:20 ` [xdp-hints] [PATCH bpf-next 1/3] xsk: add launch time support to XDP Tx metadata Song Yoong Siang
@ 2023-11-30 20:28 ` Willem de Bruijn
2023-12-01 0:02 ` Song, Yoong Siang
2023-12-02 3:28 ` Jakub Kicinski
1 sibling, 1 reply; 8+ messages in thread
From: Willem de Bruijn @ 2023-11-30 20:28 UTC (permalink / raw)
To: Song Yoong Siang, David S . Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Jonathan Corbet, Bjorn Topel, Magnus Karlsson,
Maciej Fijalkowski, Jonathan Lemon, Alexei Starovoitov,
Daniel Borkmann, Jesper Dangaard Brouer, John Fastabend,
Stanislav Fomichev, Lorenzo Bianconi, Tariq Toukan,
Willem de Bruijn, Maxime Coquelin, Andrii Nakryiko,
Mykola Lysenko, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Hao Luo, Jiri Olsa, Shuah Khan, Alexandre Torgue,
Jose Abreu
Cc: netdev, linux-kernel, linux-doc, bpf, xdp-hints, linux-stm32,
linux-arm-kernel, linux-kselftest, Song Yoong Siang
Song Yoong Siang wrote:
> This patch extends the XDP Tx metadata framework to include Time-Based
> Scheduling (TBS) support where the NIC will schedule a packet for
> transmission at a pre-determined time called launch time. The value of
> launch time is communicated from user space to Ethernet driver via
> launch_time field of struct xsk_tx_metadata.
>
> Suggested-by: Stanislav Fomichev <sdf@google.com>
> Signed-off-by: Song Yoong Siang <yoong.siang.song@intel.com>
> ---
> Documentation/netlink/specs/netdev.yaml | 4 ++++
> Documentation/networking/xsk-tx-metadata.rst | 5 +++++
> include/net/xdp_sock.h | 10 ++++++++++
> include/net/xdp_sock_drv.h | 1 +
> include/uapi/linux/if_xdp.h | 9 +++++++++
> include/uapi/linux/netdev.h | 3 +++
> net/core/netdev-genl.c | 2 ++
> net/xdp/xsk.c | 3 +++
> tools/include/uapi/linux/if_xdp.h | 9 +++++++++
> tools/include/uapi/linux/netdev.h | 3 +++
> tools/net/ynl/generated/netdev-user.c | 1 +
> 11 files changed, 50 insertions(+)
>
> diff --git a/Documentation/netlink/specs/netdev.yaml b/Documentation/netlink/specs/netdev.yaml
> index 00439bcbd2e3..a602776bbfb4 100644
> --- a/Documentation/netlink/specs/netdev.yaml
> +++ b/Documentation/netlink/specs/netdev.yaml
> @@ -66,6 +66,10 @@ definitions:
> name: tx-checksum
> doc:
> L3 checksum HW offload is supported by the driver.
> + -
> + name: launch-time
> + doc:
> + HW Time-Based Scheduling (TBS) is supported by the driver.
Can we avoid introducing another term? We already have too many:
launchtime, earliest delivery time (EDT), SO_TXTIME,
pacing offload, earliest txtime first (ETF).
^ permalink raw reply [flat|nested] 8+ messages in thread
* [xdp-hints] Re: [PATCH bpf-next 1/3] xsk: add launch time support to XDP Tx metadata
2023-11-30 20:28 ` [xdp-hints] " Willem de Bruijn
@ 2023-12-01 0:02 ` Song, Yoong Siang
0 siblings, 0 replies; 8+ messages in thread
From: Song, Yoong Siang @ 2023-12-01 0:02 UTC (permalink / raw)
To: Willem de Bruijn, David S . Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Jonathan Corbet, Bjorn Topel, Karlsson, Magnus,
Fijalkowski, Maciej, Jonathan Lemon, Alexei Starovoitov,
Daniel Borkmann, Jesper Dangaard Brouer, John Fastabend,
Stanislav Fomichev, Lorenzo Bianconi, Tariq Toukan,
Willem de Bruijn, Maxime Coquelin, Andrii Nakryiko,
Mykola Lysenko, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Hao Luo, Jiri Olsa, Shuah Khan, Alexandre Torgue,
Jose Abreu
Cc: netdev, linux-kernel, linux-doc, bpf, xdp-hints, linux-stm32,
linux-arm-kernel, linux-kselftest
On Friday, December 1, 2023 4:29 AM, Willem de Bruijn wrote:
>Song Yoong Siang wrote:
>> This patch extends the XDP Tx metadata framework to include Time-Based
>> Scheduling (TBS) support where the NIC will schedule a packet for
>> transmission at a pre-determined time called launch time. The value of
>> launch time is communicated from user space to Ethernet driver via
>> launch_time field of struct xsk_tx_metadata.
>>
>> Suggested-by: Stanislav Fomichev <sdf@google.com>
>> Signed-off-by: Song Yoong Siang <yoong.siang.song@intel.com>
>> ---
>> Documentation/netlink/specs/netdev.yaml | 4 ++++
>> Documentation/networking/xsk-tx-metadata.rst | 5 +++++
>> include/net/xdp_sock.h | 10 ++++++++++
>> include/net/xdp_sock_drv.h | 1 +
>> include/uapi/linux/if_xdp.h | 9 +++++++++
>> include/uapi/linux/netdev.h | 3 +++
>> net/core/netdev-genl.c | 2 ++
>> net/xdp/xsk.c | 3 +++
>> tools/include/uapi/linux/if_xdp.h | 9 +++++++++
>> tools/include/uapi/linux/netdev.h | 3 +++
>> tools/net/ynl/generated/netdev-user.c | 1 +
>> 11 files changed, 50 insertions(+)
>>
>> diff --git a/Documentation/netlink/specs/netdev.yaml
>b/Documentation/netlink/specs/netdev.yaml
>> index 00439bcbd2e3..a602776bbfb4 100644
>> --- a/Documentation/netlink/specs/netdev.yaml
>> +++ b/Documentation/netlink/specs/netdev.yaml
>> @@ -66,6 +66,10 @@ definitions:
>> name: tx-checksum
>> doc:
>> L3 checksum HW offload is supported by the driver.
>> + -
>> + name: launch-time
>> + doc:
>> + HW Time-Based Scheduling (TBS) is supported by the driver.
>
>Can we avoid introducing another term? We already have too many:
>launchtime, earliest delivery time (EDT), SO_TXTIME,
>pacing offload, earliest txtime first (ETF).
>
Sure. I will change TBS to ETF in my V2 so that it is aligned with etf command in tc application.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [xdp-hints] Re: [PATCH bpf-next 1/3] xsk: add launch time support to XDP Tx metadata
2023-11-30 16:20 ` [xdp-hints] [PATCH bpf-next 1/3] xsk: add launch time support to XDP Tx metadata Song Yoong Siang
2023-11-30 20:28 ` [xdp-hints] " Willem de Bruijn
@ 2023-12-02 3:28 ` Jakub Kicinski
2023-12-03 8:58 ` Song, Yoong Siang
1 sibling, 1 reply; 8+ messages in thread
From: Jakub Kicinski @ 2023-12-02 3:28 UTC (permalink / raw)
To: Song Yoong Siang
Cc: David S . Miller, Eric Dumazet, Paolo Abeni, Jonathan Corbet,
Bjorn Topel, Magnus Karlsson, Maciej Fijalkowski, Jonathan Lemon,
Alexei Starovoitov, Daniel Borkmann, Jesper Dangaard Brouer,
John Fastabend, Stanislav Fomichev, Lorenzo Bianconi,
Tariq Toukan, Willem de Bruijn, Maxime Coquelin, Andrii Nakryiko,
Mykola Lysenko, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Hao Luo, Jiri Olsa, Shuah Khan, Alexandre Torgue,
Jose Abreu, netdev, linux-kernel, linux-doc, bpf, xdp-hints,
linux-stm32, linux-arm-kernel, linux-kselftest
On Fri, 1 Dec 2023 00:20:26 +0800 Song Yoong Siang wrote:
> + name: launch-time
> + doc:
> + HW Time-Based Scheduling (TBS) is supported by the driver.
Does this mean fifo "gating" or HW can do reordering?
^ permalink raw reply [flat|nested] 8+ messages in thread
* [xdp-hints] Re: [PATCH bpf-next 1/3] xsk: add launch time support to XDP Tx metadata
2023-12-02 3:28 ` Jakub Kicinski
@ 2023-12-03 8:58 ` Song, Yoong Siang
0 siblings, 0 replies; 8+ messages in thread
From: Song, Yoong Siang @ 2023-12-03 8:58 UTC (permalink / raw)
To: Jakub Kicinski
Cc: David S . Miller, Eric Dumazet, Paolo Abeni, Jonathan Corbet,
Bjorn Topel, Karlsson, Magnus, Fijalkowski, Maciej,
Jonathan Lemon, Alexei Starovoitov, Daniel Borkmann,
Jesper Dangaard Brouer, John Fastabend, Stanislav Fomichev,
Lorenzo Bianconi, Tariq Toukan, Willem de Bruijn,
Maxime Coquelin, Andrii Nakryiko, Mykola Lysenko,
Martin KaFai Lau, Song Liu, Yonghong Song, KP Singh, Hao Luo,
Jiri Olsa, Shuah Khan, Alexandre Torgue, Jose Abreu, netdev,
linux-kernel, linux-doc, bpf, xdp-hints, linux-stm32,
linux-arm-kernel, linux-kselftest
On Saturday, December 2, 2023 11:29 AM, Jakub Kicinski wrote:
>On Fri, 1 Dec 2023 00:20:26 +0800 Song Yoong Siang wrote:
>> + name: launch-time
>> + doc:
>> + HW Time-Based Scheduling (TBS) is supported by the driver.
>
>Does this mean fifo "gating" or HW can do reordering?
Yes, HW will do reordering according to the value of launch time.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [xdp-hints] [PATCH bpf-next 2/3] net: stmmac: Add launch time support to XDP ZC
2023-11-30 16:20 [xdp-hints] [PATCH bpf-next 0/3] xsk: TX metadata launch time support Song Yoong Siang
2023-11-30 16:20 ` [xdp-hints] [PATCH bpf-next 1/3] xsk: add launch time support to XDP Tx metadata Song Yoong Siang
@ 2023-11-30 16:20 ` Song Yoong Siang
2023-11-30 16:20 ` [xdp-hints] [PATCH bpf-next 3/3] selftests/bpf: Add launch time to xdp_hw_metadata Song Yoong Siang
2 siblings, 0 replies; 8+ messages in thread
From: Song Yoong Siang @ 2023-11-30 16:20 UTC (permalink / raw)
To: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Jonathan Corbet, Bjorn Topel, Magnus Karlsson,
Maciej Fijalkowski, Jonathan Lemon, Alexei Starovoitov,
Daniel Borkmann, Jesper Dangaard Brouer, John Fastabend,
Stanislav Fomichev, Lorenzo Bianconi, Tariq Toukan,
Willem de Bruijn, Maxime Coquelin, Andrii Nakryiko,
Mykola Lysenko, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Hao Luo, Jiri Olsa, Shuah Khan, Alexandre Torgue,
Jose Abreu
Cc: netdev, linux-kernel, linux-doc, bpf, xdp-hints, linux-stm32,
linux-arm-kernel, linux-kselftest, Song Yoong Siang
This patch enables launch time support to XDP zero copy via XDP Tx
metadata framework.
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(+)
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
index 686c94c2e8a7..e8538af6e207 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
@@ -105,6 +105,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 c2ac88aaffed..c33517d3850a 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -2465,9 +2465,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) && launch_time > 0)
+ 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)
@@ -2545,6 +2556,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
^ permalink raw reply [flat|nested] 8+ messages in thread
* [xdp-hints] [PATCH bpf-next 3/3] selftests/bpf: Add launch time to xdp_hw_metadata
2023-11-30 16:20 [xdp-hints] [PATCH bpf-next 0/3] xsk: TX metadata launch time support Song Yoong Siang
2023-11-30 16:20 ` [xdp-hints] [PATCH bpf-next 1/3] xsk: add launch time support to XDP Tx metadata Song Yoong Siang
2023-11-30 16:20 ` [xdp-hints] [PATCH bpf-next 2/3] net: stmmac: Add launch time support to XDP ZC Song Yoong Siang
@ 2023-11-30 16:20 ` Song Yoong Siang
2 siblings, 0 replies; 8+ messages in thread
From: Song Yoong Siang @ 2023-11-30 16:20 UTC (permalink / raw)
To: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Jonathan Corbet, Bjorn Topel, Magnus Karlsson,
Maciej Fijalkowski, Jonathan Lemon, Alexei Starovoitov,
Daniel Borkmann, Jesper Dangaard Brouer, John Fastabend,
Stanislav Fomichev, Lorenzo Bianconi, Tariq Toukan,
Willem de Bruijn, Maxime Coquelin, Andrii Nakryiko,
Mykola Lysenko, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Hao Luo, Jiri Olsa, Shuah Khan, Alexandre Torgue,
Jose Abreu
Cc: netdev, linux-kernel, linux-doc, bpf, xdp-hints, linux-stm32,
linux-arm-kernel, linux-kselftest, Song Yoong Siang
This patch adds launch time support to xdp_hw_metadata. User can configure
the delta of HW launch time to HW RX-time by using "-l" argument.
This patch is tested with stmmac on Intel Tiger Lake platform. Refer to
result below, the delta between pre-determined launch time and actual
transmit time is around 24 us.
$ sudo ./xdp_hw_metadata enp0s30f4
...
xsk_ring_cons__peek: 1
0x55fcb80ce7a8: rx_desc[0]->addr=80100 addr=80100 comp_addr=80100 EoP
No rx_hash err=-95
HW RX-time: 1677764507059055964 (sec:1677764507.0591) delta to User RX-time sec:0.0002 (237.548 usec)
XDP RX-time: 1677764507059280741 (sec:1677764507.0593) delta to User RX-time sec:0.0000 (12.771 usec)
0x55fcb80ce7a8: ping-pong with csum=5619 (want 8626) csum_start=34 csum_offset=6
HW RX-time: 1677764507059055964 (sec:1677764507.0591) delta to HW Launch-time sec:1.0000 (1000000.000 usec)
0x55fcb80ce7a8: complete tx idx=0 addr=18
HW Launch-time: 1677764508059055964 (sec:1677764508.0591) delta to HW TX-complete-time sec:0.0000 (24.235 usec)
HW TX-complete-time: 1677764508059080199 (sec:1677764508.0591) delta to User TX-complete-time sec:0.0054 (5423.263 usec)
XDP RX-time: 1677764507059280741 (sec:1677764507.0593) delta to User TX-complete-time sec:1.0052 (1005222.721 usec)
HW RX-time: 1677764507059055964 (sec:1677764507.0591) delta to HW TX-complete-time sec:1.0000 (1000024.235 usec)
0x55fcb80ce7a8: complete rx idx=128 addr=80100
$ sudo ./xdp_hw_metadata enp0s30f4 -l 10000000
...
xsk_ring_cons__peek: 1
0x5626d54de7a8: rx_desc[0]->addr=80100 addr=80100 comp_addr=80100 EoP
No rx_hash err=-95
HW RX-time: 1677764655807717783 (sec:1677764655.8077) delta to User RX-time sec:0.0002 (240.571 usec)
XDP RX-time: 1677764655807942983 (sec:1677764655.8079) delta to User RX-time sec:0.0000 (15.371 usec)
0x5626d54de7a8: ping-pong with csum=5619 (want 8626) csum_start=34 csum_offset=6
HW RX-time: 1677764655807717783 (sec:1677764655.8077) delta to HW Launch-time sec:0.0100 (10000.000 usec)
0x5626d54de7a8: complete tx idx=0 addr=18
HW Launch-time: 1677764655817717783 (sec:1677764655.8177) delta to HW TX-complete-time sec:0.0000 (23.965 usec)
HW TX-complete-time: 1677764655817741748 (sec:1677764655.8177) delta to User TX-complete-time sec:0.0003 (291.792 usec)
XDP RX-time: 1677764655807942983 (sec:1677764655.8079) delta to User TX-complete-time sec:0.0101 (10090.557 usec)
HW RX-time: 1677764655807717783 (sec:1677764655.8077) delta to HW TX-complete-time sec:0.0100 (10023.965 usec)
0x5626d54de7a8: complete rx idx=128 addr=80100
Signed-off-by: Song Yoong Siang <yoong.siang.song@intel.com>
---
tools/testing/selftests/bpf/xdp_hw_metadata.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/bpf/xdp_hw_metadata.c b/tools/testing/selftests/bpf/xdp_hw_metadata.c
index 3291625ba4fb..ff1b2e5b0fce 100644
--- a/tools/testing/selftests/bpf/xdp_hw_metadata.c
+++ b/tools/testing/selftests/bpf/xdp_hw_metadata.c
@@ -13,6 +13,7 @@
* - UDP 9091 packets trigger TX reply
* - TX HW timestamp is requested and reported back upon completion
* - TX checksum is requested
+ * - HW launch time is set for transmission
*/
#include <test_progs.h>
@@ -61,6 +62,8 @@ int rxq;
bool skip_tx;
__u64 last_hw_rx_timestamp;
__u64 last_xdp_rx_timestamp;
+__u64 last_launch_time;
+__u64 launch_time_offset = 1000000000; /* 1 second */
void test__fail(void) { /* for network_helpers.c */ }
@@ -274,6 +277,8 @@ static bool complete_tx(struct xsk *xsk, clockid_t clock_id)
if (meta->completion.tx_timestamp) {
__u64 ref_tstamp = gettime(clock_id);
+ print_tstamp_delta("HW Launch-time", "HW TX-complete-time",
+ last_launch_time, meta->completion.tx_timestamp);
print_tstamp_delta("HW TX-complete-time", "User TX-complete-time",
meta->completion.tx_timestamp, ref_tstamp);
print_tstamp_delta("XDP RX-time", "User TX-complete-time",
@@ -371,6 +376,13 @@ static void ping_pong(struct xsk *xsk, void *rx_packet, clockid_t clock_id)
xsk, ntohs(udph->check), ntohs(want_csum),
meta->request.csum_start, meta->request.csum_offset);
+ /* Set launch time at launch_time_offset ns later than HW Rx-time */
+ meta->flags |= XDP_TXMD_FLAGS_LAUNCH_TIME;
+ last_launch_time = last_hw_rx_timestamp + launch_time_offset;
+ meta->request.launch_time = last_launch_time;
+ print_tstamp_delta("HW RX-time", "HW Launch-time",
+ last_hw_rx_timestamp, meta->request.launch_time);
+
memcpy(data, rx_packet, len); /* don't share umem chunk for simplicity */
tx_desc->options |= XDP_TX_METADATA;
tx_desc->len = len;
@@ -595,6 +607,7 @@ static void print_usage(void)
" -h Display this help and exit\n\n"
" -m Enable multi-buffer XDP for larger MTU\n"
" -r Don't generate AF_XDP reply (rx metadata only)\n"
+ " -l Delta of HW launch time to HW RX-time in ns (default: 1s)\n"
"Generate test packets on the other machine with:\n"
" echo -n xdp | nc -u -q1 <dst_ip> 9091\n";
@@ -605,7 +618,7 @@ static void read_args(int argc, char *argv[])
{
int opt;
- while ((opt = getopt(argc, argv, "chmr")) != -1) {
+ while ((opt = getopt(argc, argv, "chmrl:")) != -1) {
switch (opt) {
case 'c':
bind_flags &= ~XDP_USE_NEED_WAKEUP;
@@ -621,6 +634,9 @@ static void read_args(int argc, char *argv[])
case 'r':
skip_tx = true;
break;
+ case 'l':
+ launch_time_offset = atoll(optarg);
+ break;
case '?':
if (isprint(optopt))
fprintf(stderr, "Unknown option: -%c\n", optopt);
--
2.34.1
^ permalink raw reply [flat|nested] 8+ messages in thread