From patchwork Thu Jun 25 19:01:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vivien Didelot X-Patchwork-Id: 72442 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id D36D6A0350; Tue, 30 Jun 2020 09:32:56 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A98521BED2; Tue, 30 Jun 2020 09:32:32 +0200 (CEST) Received: from mail-qk1-f193.google.com (mail-qk1-f193.google.com [209.85.222.193]) by dpdk.org (Postfix) with ESMTP id 676973B5 for ; Thu, 25 Jun 2020 21:01:29 +0200 (CEST) Received: by mail-qk1-f193.google.com with SMTP id q198so6472716qka.2 for ; Thu, 25 Jun 2020 12:01:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=55g/mvmHJ0l/KM3Ims9yy+nq4bRxnNhDnYTRmvmPZTo=; b=pnrkK4tiKo/Jm+nEeuYUXIyIPVwnUaxXLDTccudg6ijCGVDU5dPTwd1TeWddpGLI6z l0b/j5b1LH0ht8C4aRlmuACs5Ve3FwCYQjeD1p34DSoVhih5/9mHWHXFnQ/mzN80yNfa Om4zBHS0oIx6GIdyRia7zJlURgMA/Tol7tquAaGmJa256jOS9GhIVsqqsTJlNdnM97Cx looFCkhxsk97xQjrsYTOXITARZ4TZoN7VayspJoJIcYEfRpD1DcPENFowrh6q2xL7rKS 7wL0WN3SQqJ5hmRxAInKJe/aOFP+qZnLaPwKz8+rd38RnvlLqcZgOXYRHKI2Ck69WyRW O0Kw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=55g/mvmHJ0l/KM3Ims9yy+nq4bRxnNhDnYTRmvmPZTo=; b=AZihZ9OyOG2ZseAOWP14eBJE6rJYzsdV7PREFFIAjY0R5EFpuCRlhXohMvJW77+gXK DvUmvAJ0xeBKa6Eap096LJVFf3ujCo2NlANgmh23BPVS2wJpY8mXfRJ0HowIcJAVSJXo d46VFbsg3P97D4tXN1WVJ1MAgpa9pA9mJdY+cpTPVmgFc3cNPEiRrbnwy6p2fhhW+NWQ sx2FZy7dPQb5wTHY+o7+88IeR3Xq8w9GK67fPcj8G6umyP1FxDr1bz4kts7GIs1U8J5M 7jfGCnspq4XAmkJuZGqEs8h6mZNtcglJ1Dtc5TzR5DAuBge9TSBPPQNOS1UDjOwUy0P3 Dj7g== X-Gm-Message-State: AOAM5304GaZ5iBd80UNHgMPgnBSEWZ+waw6x7C46JAwTqbdMRpXFQSS3 xGVBKglGyi6ORnJOVFq5RVNHkA8+ X-Google-Smtp-Source: ABdhPJwQXRER90786QHcyilGuKNM8CWLa7JhJ+d5SLUEbpfH6+gYRVVY64SoRa1D6tWFNvyU4ONdPQ== X-Received: by 2002:a37:6589:: with SMTP id z131mr24336727qkb.235.1593111688410; Thu, 25 Jun 2020 12:01:28 -0700 (PDT) Received: from localhost (modemcable249.105-163-184.mc.videotron.ca. [184.163.105.249]) by smtp.gmail.com with ESMTPSA id w65sm6930640qtd.86.2020.06.25.12.01.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2020 12:01:27 -0700 (PDT) From: Vivien Didelot To: dev@dpdk.org Cc: Patrick Keroulas , Olivier Matz , Ferruh Yigit Date: Thu, 25 Jun 2020 15:01:17 -0400 Message-Id: <20200625190119.265739-2-vivien.didelot@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200625190119.265739-1-vivien.didelot@gmail.com> References: <20200625190119.265739-1-vivien.didelot@gmail.com> MIME-Version: 1.0 X-Mailman-Approved-At: Tue, 30 Jun 2020 09:32:26 +0200 Subject: [dpdk-dev] [RFC PATCH 1/3] net/mlx5: add timestamp-to-ns converter from libibverbs X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Patrick Keroulas While some devices update their own clock info to provide current time, mlx5dv part of libibverbs already handles this and also converts any raw counter cycle to nanoseconds. Signed-off-by: Patrick Keroulas --- drivers/common/mlx5/linux/mlx5_glue.c | 16 +++++++++++++ drivers/common/mlx5/linux/mlx5_glue.h | 4 ++++ drivers/net/mlx5/linux/mlx5_ethdev_os.c | 30 +++++++++++++++++++++++++ drivers/net/mlx5/linux/mlx5_os.c | 1 + drivers/net/mlx5/mlx5.h | 1 + 5 files changed, 52 insertions(+) diff --git a/drivers/common/mlx5/linux/mlx5_glue.c b/drivers/common/mlx5/linux/mlx5_glue.c index c91ee33bb..cac24015b 100644 --- a/drivers/common/mlx5/linux/mlx5_glue.c +++ b/drivers/common/mlx5/linux/mlx5_glue.c @@ -80,6 +80,20 @@ mlx5_glue_query_rt_values_ex(struct ibv_context *context, return ibv_query_rt_values_ex(context, values); } +static int +mlx5_glue_get_clock_info(struct ibv_context *context, + struct mlx5dv_clock_info *clock_info) +{ + return mlx5dv_get_clock_info(context, clock_info); +} + +static uint64_t +mlx5_glue_mlx5dv_ts_to_ns(struct mlx5dv_clock_info *clock_info, + uint64_t device_timestamp) +{ + return mlx5dv_ts_to_ns(clock_info, device_timestamp); +} + static int mlx5_glue_query_port(struct ibv_context *context, uint8_t port_num, struct ibv_port_attr *port_attr) @@ -1207,6 +1221,8 @@ const struct mlx5_glue *mlx5_glue = &(const struct mlx5_glue) { .query_device = mlx5_glue_query_device, .query_device_ex = mlx5_glue_query_device_ex, .query_rt_values_ex = mlx5_glue_query_rt_values_ex, + .get_clock_info = mlx5_glue_get_clock_info, + .convert_ts_to_ns = mlx5_glue_mlx5dv_ts_to_ns, .query_port = mlx5_glue_query_port, .create_comp_channel = mlx5_glue_create_comp_channel, .destroy_comp_channel = mlx5_glue_destroy_comp_channel, diff --git a/drivers/common/mlx5/linux/mlx5_glue.h b/drivers/common/mlx5/linux/mlx5_glue.h index 5d238a40a..8d05e7398 100644 --- a/drivers/common/mlx5/linux/mlx5_glue.h +++ b/drivers/common/mlx5/linux/mlx5_glue.h @@ -123,6 +123,10 @@ struct mlx5_glue { struct ibv_port_attr *port_attr); struct ibv_comp_channel *(*create_comp_channel) (struct ibv_context *context); + int (*get_clock_info)(struct ibv_context *context, + struct mlx5dv_clock_info *clock_info); + uint64_t (*convert_ts_to_ns)(struct mlx5dv_clock_info *clock_info, + uint64_t device_timestamp); int (*destroy_comp_channel)(struct ibv_comp_channel *channel); struct ibv_cq *(*create_cq)(struct ibv_context *context, int cqe, void *cq_context, diff --git a/drivers/net/mlx5/linux/mlx5_ethdev_os.c b/drivers/net/mlx5/linux/mlx5_ethdev_os.c index ab47cb531..86bec111b 100644 --- a/drivers/net/mlx5/linux/mlx5_ethdev_os.c +++ b/drivers/net/mlx5/linux/mlx5_ethdev_os.c @@ -355,6 +355,36 @@ mlx5_set_flags(struct rte_eth_dev *dev, unsigned int keep, unsigned int flags) return mlx5_ifreq(dev, SIOCSIFFLAGS, &request); } +/** + * Convert raw clock counter to nanoseconds + * + * @param dev + * Pointer to Ethernet device structure. + * @param[in&out] timestamp + * Pointer to the timestamp to be converted. + * + * @return + * 0 if the clock has correctly been read + * The value of errno in case of error + */ +int +mlx5_convert_ts_to_ns(struct rte_eth_dev *dev, uint64_t *timestamp) +{ + struct mlx5_priv *priv = dev->data->dev_private; + struct ibv_context *ctx = priv->sh->ctx; + struct mlx5dv_clock_info clock_info; + + int err = mlx5_glue->get_clock_info(ctx, &clock_info); + if (err != 0) { + DRV_LOG(WARNING, "Could not get the clock info!"); + return err; + } + + *timestamp = mlx5_glue->convert_ts_to_ns(&clock_info, *timestamp); + + return err; +} + /** * Get device current raw clock counter * diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c index 3792371c3..914e58f52 100644 --- a/drivers/net/mlx5/linux/mlx5_os.c +++ b/drivers/net/mlx5/linux/mlx5_os.c @@ -2408,6 +2408,7 @@ const struct eth_dev_ops mlx5_os_dev_sec_ops = { .xstats_get_names = mlx5_xstats_get_names, .fw_version_get = mlx5_fw_version_get, .dev_infos_get = mlx5_dev_infos_get, + .convert_ts_to_ns = mlx5_convert_ts_to_ns, .rx_descriptor_status = mlx5_rx_descriptor_status, .tx_descriptor_status = mlx5_tx_descriptor_status, .rxq_info_get = mlx5_rxq_info_get, diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 5bd5acd9d..dc469f7d9 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -738,6 +738,7 @@ int mlx5_get_mtu(struct rte_eth_dev *dev, uint16_t *mtu); int mlx5_set_flags(struct rte_eth_dev *dev, unsigned int keep, unsigned int flags); int mlx5_set_mtu(struct rte_eth_dev *dev, uint16_t mtu); +int mlx5_convert_ts_to_ns(struct rte_eth_dev *dev, uint64_t *timestamp); int mlx5_read_clock(struct rte_eth_dev *dev, uint64_t *clock); int mlx5_link_update(struct rte_eth_dev *dev, int wait_to_complete); int mlx5_force_link_status_change(struct rte_eth_dev *dev, int status); From patchwork Thu Jun 25 19:01:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vivien Didelot X-Patchwork-Id: 72443 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 011E1A0350; Tue, 30 Jun 2020 09:33:10 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id EB5C71BEDC; Tue, 30 Jun 2020 09:32:33 +0200 (CEST) Received: from mail-qv1-f68.google.com (mail-qv1-f68.google.com [209.85.219.68]) by dpdk.org (Postfix) with ESMTP id E40763B5 for ; Thu, 25 Jun 2020 21:01:30 +0200 (CEST) Received: by mail-qv1-f68.google.com with SMTP id cv17so3328881qvb.13 for ; Thu, 25 Jun 2020 12:01:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=DXUG4xVVLrkw+bc3lVuxZwZqDvE6Hgl7O/IbgNAR5iA=; b=bdg/1L5nmMliQ1exlHKgeGI1Htd1iQaPJCfK8CC5auN3MRL7me2P2frOagKEwbGvCt 7VePaOuu5HO27xyiSX4mRe5pBh/Q1y+X0+4YmkKqTQGCg2ltm9Zl5EFa9arJzSJRJiZm Qjejh2eXzEYVenqkLQ+sIVn49QWwx5O2SSEblhsBUqyky9XXLC6MdkWoibetUSbGCWit 341N8Q/JQtv8O2xcxJtpe0WGqp9lrx6woFVaDe6en7gXlSbK2+FUOUTXBYewYd0PyWHo i8njP3rBMScrlf5lUevADMOLrD/jLr344SC573ig62/xCiyQqOWeI/iuP94nIqUnvrZI i8Aw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=DXUG4xVVLrkw+bc3lVuxZwZqDvE6Hgl7O/IbgNAR5iA=; b=fcGOdKAlcXxBSFG1EXVP8Zbg2X6RKSzteiFtpwTif/19RvDAK3LdLVUiHe9WKM4pdt 7oCj43G+ti7dLsgAYF0Xe1oslSFZQ1L8pryMyWBbmbIqqBeBYnUxieWUI3KQ5YNaMlJx txfW+CIKWtEhgUz60ccQHRfgSCyJ80220lJwTYDep+lWOKnN2xgcavTVOqJ5mMaE/FdG 8qHUl6uMuMicB7Syn9SA62XzprNxFoDWmua6cqNou1Q5arWElZiqMO52MoyFTFPfDNKZ tvTv+gyGi0Pilnr69S/hIMjXtrjQZ7mQ2nIPPV/BoRdWzGNWd5FITuR18V06OcxCvPYC rHWQ== X-Gm-Message-State: AOAM533RUDPy6fnk34SgaoYjWL35FATEeMq8Ll4p8xYB6sopLXgtKra6 j/UIQRFJfjsR9fg9j7fy0OUeb3RU X-Google-Smtp-Source: ABdhPJxWUIRxtTP1TQ4ByG7qaKF2+VWKAD+StDbtSZT3t69/A1indG539RcSJXOpZF38bbl1ad7+Qw== X-Received: by 2002:a0c:c602:: with SMTP id v2mr27270213qvi.220.1593111689834; Thu, 25 Jun 2020 12:01:29 -0700 (PDT) Received: from localhost (modemcable249.105-163-184.mc.videotron.ca. [184.163.105.249]) by smtp.gmail.com with ESMTPSA id c2sm6565123qkl.58.2020.06.25.12.01.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2020 12:01:29 -0700 (PDT) From: Vivien Didelot To: dev@dpdk.org Cc: Patrick Keroulas , Olivier Matz , Ferruh Yigit Date: Thu, 25 Jun 2020 15:01:18 -0400 Message-Id: <20200625190119.265739-3-vivien.didelot@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200625190119.265739-1-vivien.didelot@gmail.com> References: <20200625190119.265739-1-vivien.didelot@gmail.com> MIME-Version: 1.0 X-Mailman-Approved-At: Tue, 30 Jun 2020 09:32:26 +0200 Subject: [dpdk-dev] [RFC PATCH 2/3] ethdev: add API to convert raw timestamps to nsec X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Patrick Keroulas Existing ethdev functions can read/write time from/to device but they're all related to timesync and none of them can translate a raw counter in real time unit which is useful in a pdump application. A new API is required because the conversion is derived from dev clock info. Signed-off-by: Patrick Keroulas --- lib/librte_ethdev/rte_ethdev.c | 12 ++++++++++++ lib/librte_ethdev/rte_ethdev.h | 17 +++++++++++++++++ lib/librte_ethdev/rte_ethdev_core.h | 5 +++++ lib/librte_ethdev/rte_ethdev_version.map | 2 ++ lib/librte_mbuf/rte_mbuf_core.h | 3 ++- lib/librte_pdump/rte_pdump.c | 14 +++++++++++++- 6 files changed, 51 insertions(+), 2 deletions(-) diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index 8e10a6fc3..822fa6d5a 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -4810,6 +4810,18 @@ rte_eth_timesync_write_time(uint16_t port_id, const struct timespec *timestamp) timestamp)); } +int +rte_eth_convert_ts_to_ns(uint16_t port_id, uint64_t *timestamp) +{ + struct rte_eth_dev *dev; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); + dev = &rte_eth_devices[port_id]; + + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->convert_ts_to_ns, -ENOTSUP); + return eth_err(port_id, (*dev->dev_ops->convert_ts_to_ns)(dev, timestamp)); +} + int rte_eth_read_clock(uint16_t port_id, uint64_t *clock) { diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h index a49242bcd..2d4d0bc7d 100644 --- a/lib/librte_ethdev/rte_ethdev.h +++ b/lib/librte_ethdev/rte_ethdev.h @@ -4103,6 +4103,23 @@ int rte_eth_timesync_read_time(uint16_t port_id, struct timespec *time); */ int rte_eth_timesync_write_time(uint16_t port_id, const struct timespec *time); +/** + * Convert a raw clock counter to nanoseconds from device clock + * + * @param port_id + * The port identifier of the Ethernet device. + * @param[in&out] timestamp + * Pointer to the timestamp to be converted. + * + * @return + * - 0: Success. + * - -ENODEV: The port ID is invalid. + * - -ENOTSUP: The function is not supported by the Ethernet driver. + */ +__rte_experimental +int +rte_eth_convert_ts_to_ns(uint16_t port_id, uint64_t *timestamp); + /** * @warning * @b EXPERIMENTAL: this API may change without prior notice. diff --git a/lib/librte_ethdev/rte_ethdev_core.h b/lib/librte_ethdev/rte_ethdev_core.h index 32407dd41..255b41b67 100644 --- a/lib/librte_ethdev/rte_ethdev_core.h +++ b/lib/librte_ethdev/rte_ethdev_core.h @@ -464,6 +464,10 @@ typedef int (*eth_timesync_write_time)(struct rte_eth_dev *dev, const struct timespec *timestamp); /**< @internal Function used to get time from the device clock */ +typedef int (*eth_convert_ts_to_ns)(struct rte_eth_dev *dev, + uint64_t *timestamp); +/**< @internal Function used to convert timestamp from device clock */ + typedef int (*eth_read_clock)(struct rte_eth_dev *dev, uint64_t *timestamp); /**< @internal Function used to get the current value of the device clock. */ @@ -730,6 +734,7 @@ struct eth_dev_ops { eth_timesync_read_time timesync_read_time; /** Get the device clock time. */ eth_timesync_write_time timesync_write_time; /** Set the device clock time. */ + eth_convert_ts_to_ns convert_ts_to_ns; eth_read_clock read_clock; eth_xstats_get_by_id_t xstats_get_by_id; diff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev/rte_ethdev_version.map index 715505604..754c05630 100644 --- a/lib/librte_ethdev/rte_ethdev_version.map +++ b/lib/librte_ethdev/rte_ethdev_version.map @@ -241,4 +241,6 @@ EXPERIMENTAL { __rte_ethdev_trace_rx_burst; __rte_ethdev_trace_tx_burst; rte_flow_get_aged_flows; + + rte_eth_convert_ts_to_ns; }; diff --git a/lib/librte_mbuf/rte_mbuf_core.h b/lib/librte_mbuf/rte_mbuf_core.h index 16600f171..470616fb2 100644 --- a/lib/librte_mbuf/rte_mbuf_core.h +++ b/lib/librte_mbuf/rte_mbuf_core.h @@ -595,7 +595,8 @@ struct rte_mbuf { /** Valid if PKT_RX_TIMESTAMP is set. The unit and time reference * are not normalized but are always the same for a given port. * Some devices allow to query rte_eth_read_clock that will return the - * current device timestamp. + * current device timestamp or rte_eth_ts_to_ns that will convert raw + * counter to nanoseconds. */ uint64_t timestamp; diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index f96709f95..03d9ba484 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -100,12 +100,24 @@ pdump_copy(struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params) } } +static inline void +pdump_ts_to_ns(uint16_t port_id, struct rte_mbuf **pkts, uint16_t nb_pkts) +{ + unsigned int i; + + for (i = 0; i < nb_pkts; i++) { + if (pkts[i]->ol_flags & PKT_RX_TIMESTAMP) + rte_eth_convert_ts_to_ns(port_id, &pkts[i]->timestamp); + } +} + static uint16_t -pdump_rx(uint16_t port __rte_unused, uint16_t qidx __rte_unused, +pdump_rx(uint16_t port_id, uint16_t qidx __rte_unused, struct rte_mbuf **pkts, uint16_t nb_pkts, uint16_t max_pkts __rte_unused, void *user_params) { + pdump_ts_to_ns(port_id, pkts, nb_pkts); pdump_copy(pkts, nb_pkts, user_params); return nb_pkts; } From patchwork Thu Jun 25 19:01:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vivien Didelot X-Patchwork-Id: 72444 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 5F3C3A0350; Tue, 30 Jun 2020 09:33:22 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 21E481BEE4; Tue, 30 Jun 2020 09:32:35 +0200 (CEST) Received: from mail-qk1-f196.google.com (mail-qk1-f196.google.com [209.85.222.196]) by dpdk.org (Postfix) with ESMTP id 6FEFDF04 for ; Thu, 25 Jun 2020 21:01:32 +0200 (CEST) Received: by mail-qk1-f196.google.com with SMTP id 80so6455885qko.7 for ; Thu, 25 Jun 2020 12:01:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=n34eLvA5LQ9ISBDVlil26EmLV5fYWq7NX82LY5DrHYY=; b=N7bNS1Ky763MlMW18p5nvW3CA50hgoZiHtlD3YVRFZKHYZkb+6G8FuAAUlfl0Iplmv 62PgFAVAAnuvzE/W1S8ynYbxmlbxnSuMJ4rxsbq9fUVkv7CbD2ZcSedF7C0Xy2YR5ZnG 2+SSdZ8IFOItB/rj7enz8SWBd9iRZyJNjM6c0dW4OBpLS1OzhJ+bxvsSiAvtkWfe+iqG Uph9CO/9Rr16xrzuRbL9qbAb9vTdCkQbXirYdsQJ2PWxeslH5NbC6jHMZbhZCjz79yZZ CALwybNj46rpVFiM3Dmgqjp1n0kd9IW6/5Rf3ZllTpdTzOU85PcDUu4sLDmjbg7/V7cv GsMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=n34eLvA5LQ9ISBDVlil26EmLV5fYWq7NX82LY5DrHYY=; b=q910iMOkXJqX21dINtkhFC+1OekwqIVoh+4aLiugbs1PBzWDpNPkNcPhfjxnmj0Pzx 7t351YZXAKz9HeTNO9e8vXjIVvMI5arl+MJqXWZRhvl5aQ/5CL+9AMamZILdvSjBvZ0c yU6+pb6uI4/sU7i17Gk2wXgX0q418uqvZWdRVagsAPyNACzO8Zl7PBvPnrC8hJ+9V1Da NtUfRs4/0bmrxLeTIMxn3GOVwaf6xhicELTd0IW3DY0miIwhxkU+//sKkb9Jr1abeTGm gE9v3LF4poCxkB7fRUVmTVVL+derKsNsPq5oMfhqw3H5psdIkdQl6kzniE523s3Zf4Yv XLrQ== X-Gm-Message-State: AOAM533pqqcIszBFmOEW8NGQU1uTdmhOdXUKWq2KXB+gEY9i3IHL1GMd f9pglVGopvc+xEhBSDuE++QiBQDr X-Google-Smtp-Source: ABdhPJywNBq+G5612S4Ho30s4+RkNYT16xDTLPUIHTmocg1WNPSMf6qnuoHmhrRJh9tKYcVQSaYUwA== X-Received: by 2002:a37:b401:: with SMTP id d1mr32913904qkf.206.1593111691525; Thu, 25 Jun 2020 12:01:31 -0700 (PDT) Received: from localhost (modemcable249.105-163-184.mc.videotron.ca. [184.163.105.249]) by smtp.gmail.com with ESMTPSA id n63sm6556276qkn.104.2020.06.25.12.01.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2020 12:01:30 -0700 (PDT) From: Vivien Didelot To: dev@dpdk.org Cc: Vivien Didelot , Olivier Matz , Ferruh Yigit , Patrick Keroulas Date: Thu, 25 Jun 2020 15:01:19 -0400 Message-Id: <20200625190119.265739-4-vivien.didelot@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200625190119.265739-1-vivien.didelot@gmail.com> References: <20200625190119.265739-1-vivien.didelot@gmail.com> MIME-Version: 1.0 X-Mailman-Approved-At: Tue, 30 Jun 2020 09:32:26 +0200 Subject: [dpdk-dev] [RFC PATCH 3/3] net/pcap: support hardware Tx timestamps X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" When hardware timestamping is enabled on Rx path, system time should no longer be used to calculate the timestamps when dumping packets. Instead, use the value stored by the driver in mbuf->timestamp and assume it is already converted to nanoseconds (otherwise the application may edit the packet headers itself afterwards). Signed-off-by: Vivien Didelot Signed-off-by: Patrick Keroulas --- doc/guides/rel_notes/release_20_08.rst | 1 + drivers/net/pcap/rte_eth_pcap.c | 30 +++++++++++++++----------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst index a67015519..cd1ca987f 100644 --- a/doc/guides/rel_notes/release_20_08.rst +++ b/doc/guides/rel_notes/release_20_08.rst @@ -61,6 +61,7 @@ New Features Updated PCAP driver with new features and improvements, including: * Support software Tx nanosecond timestamps precision. + * Support hardware Tx timestamps. * **Updated Mellanox mlx5 driver.** diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c index 13a3d0ac7..3d80b699b 100644 --- a/drivers/net/pcap/rte_eth_pcap.c +++ b/drivers/net/pcap/rte_eth_pcap.c @@ -290,19 +290,23 @@ eth_null_rx(void *queue __rte_unused, #define NSEC_PER_SEC 1000000000L static inline void -calculate_timestamp(struct timeval *ts) { - uint64_t cycles; - struct timeval cur_time; +calculate_timestamp(const struct rte_mbuf *mbuf, struct timeval *ts) { + if (mbuf->ol_flags & PKT_RX_TIMESTAMP) { + ts->tv_sec = mbuf->timestamp / NSEC_PER_SEC; + ts->tv_usec = mbuf->timestamp % NSEC_PER_SEC; + } else { + uint64_t cycles = rte_get_timer_cycles() - start_cycles; + struct timeval cur_time = { + .tv_sec = cycles / hz, + .tv_usec = (cycles % hz) * NSEC_PER_SEC / hz, + }; - cycles = rte_get_timer_cycles() - start_cycles; - cur_time.tv_sec = cycles / hz; - cur_time.tv_usec = (cycles % hz) * NSEC_PER_SEC / hz; - - ts->tv_sec = start_time.tv_sec + cur_time.tv_sec; - ts->tv_usec = start_time.tv_usec + cur_time.tv_usec; - if (ts->tv_usec >= NSEC_PER_SEC) { - ts->tv_usec -= NSEC_PER_SEC; - ts->tv_sec += 1; + ts->tv_sec = start_time.tv_sec + cur_time.tv_sec; + ts->tv_usec = start_time.tv_usec + cur_time.tv_usec; + if (ts->tv_usec >= NSEC_PER_SEC) { + ts->tv_usec -= NSEC_PER_SEC; + ts->tv_sec += 1; + } } } @@ -339,7 +343,7 @@ eth_pcap_tx_dumper(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) caplen = sizeof(temp_data); } - calculate_timestamp(&header.ts); + calculate_timestamp(mbuf, &header.ts); header.len = len; header.caplen = caplen; /* rte_pktmbuf_read() returns a pointer to the data directly