Implement the read_clock operation in eth_dev_ops. The function calls the AdminQ command to fetch the current NIC timestamp synchronously, updates the cached timestamp used for reconstruction, and returns the full 64-bit value.
Signed-off-by: Mark Blasko <[email protected]> Reviewed-by: Joshua Washington <[email protected]> Reviewed-by: Jasper Tran O'Leary <[email protected]> --- v3: - Add mutex lock to protect shared NIC timestamp memzone access. - Fix missing read_clock assignment to DQO queue ops table (accidental omission in v2). v2: - Scoped read_clock ethdev operation strictly to DQO queues. --- drivers/net/gve/gve_ethdev.c | 38 ++++++++++++++++++++++++++++++++++++ drivers/net/gve/gve_ethdev.h | 1 + 2 files changed, 39 insertions(+) diff --git a/drivers/net/gve/gve_ethdev.c b/drivers/net/gve/gve_ethdev.c index 5d4f1e4ae8..ec9f511a00 100644 --- a/drivers/net/gve/gve_ethdev.c +++ b/drivers/net/gve/gve_ethdev.c @@ -463,11 +463,13 @@ gve_read_nic_clock(void *arg) if (!priv || !priv->nic_ts_report_mz) return; + pthread_mutex_lock(&priv->nic_ts_lock); memset(priv->nic_ts_report, 0, sizeof(struct gve_nic_ts_report)); err = gve_adminq_report_nic_timestamp(priv, priv->nic_ts_report_mz->iova); if (err == 0) { ts = be64_to_cpu(priv->nic_ts_report->nic_timestamp); + pthread_mutex_unlock(&priv->nic_ts_lock); rte_atomic_store_explicit(&priv->last_read_nic_timestamp, ts, rte_memory_order_relaxed); PMD_DRV_LOG(DEBUG, "Fetched NIC Timestamp: %" PRIu64, ts); @@ -476,6 +478,7 @@ gve_read_nic_clock(void *arg) rte_atomic_store_explicit(&priv->nic_ts_stale, 0, rte_memory_order_release); } else { + pthread_mutex_unlock(&priv->nic_ts_lock); PMD_DRV_LOG(ERR, "Failed to read NIC clock, AQ err: %d", err); fails = rte_atomic_fetch_add_explicit(&priv->nic_ts_read_fails, 1, rte_memory_order_relaxed) + 1; @@ -699,6 +702,7 @@ gve_dev_close(struct rte_eth_dev *dev) gve_teardown_flow_subsystem(priv); pthread_mutex_destroy(&priv->flow_rule_lock); + pthread_mutex_destroy(&priv->nic_ts_lock); gve_free_queues(dev); gve_teardown_device_resources(priv); @@ -1271,6 +1275,38 @@ gve_flow_ops_get(struct rte_eth_dev *dev, const struct rte_flow_ops **ops) return 0; } +static int +gve_read_clock(struct rte_eth_dev *dev, uint64_t *clock) +{ + struct gve_priv *priv = dev->data->dev_private; + uint64_t ts; + int err; + + if (!priv->nic_timestamp_supported) + return -EOPNOTSUPP; + + if (!priv->nic_ts_report_mz) + return -EIO; + + pthread_mutex_lock(&priv->nic_ts_lock); + err = gve_adminq_report_nic_timestamp(priv, priv->nic_ts_report_mz->iova); + if (err != 0) { + pthread_mutex_unlock(&priv->nic_ts_lock); + return err; + } + + ts = be64_to_cpu(priv->nic_ts_report->nic_timestamp); + pthread_mutex_unlock(&priv->nic_ts_lock); + *clock = ts; + + /* Update the cached value */ + rte_atomic_store_explicit(&priv->last_read_nic_timestamp, ts, rte_memory_order_relaxed); + rte_atomic_store_explicit(&priv->nic_ts_read_fails, 0, rte_memory_order_relaxed); + rte_atomic_store_explicit(&priv->nic_ts_stale, 0, rte_memory_order_release); + + return 0; +} + static const struct eth_dev_ops gve_eth_dev_ops = { .dev_configure = gve_dev_configure, .dev_start = gve_dev_start, @@ -1325,6 +1361,7 @@ static const struct eth_dev_ops gve_eth_dev_ops_dqo = { .rss_hash_conf_get = gve_rss_hash_conf_get, .reta_update = gve_rss_reta_update, .reta_query = gve_rss_reta_query, + .read_clock = gve_read_clock, }; static int @@ -1643,6 +1680,7 @@ gve_dev_init(struct rte_eth_dev *eth_dev) pthread_mutexattr_init(&mutexattr); pthread_mutexattr_setpshared(&mutexattr, PTHREAD_PROCESS_SHARED); pthread_mutex_init(&priv->flow_rule_lock, &mutexattr); + pthread_mutex_init(&priv->nic_ts_lock, &mutexattr); pthread_mutexattr_destroy(&mutexattr); return 0; diff --git a/drivers/net/gve/gve_ethdev.h b/drivers/net/gve/gve_ethdev.h index 7e6f24e910..114531a481 100644 --- a/drivers/net/gve/gve_ethdev.h +++ b/drivers/net/gve/gve_ethdev.h @@ -365,6 +365,7 @@ struct gve_priv { bool nic_timestamp_supported; const struct rte_memzone *nic_ts_report_mz; struct gve_nic_ts_report *nic_ts_report; + pthread_mutex_t nic_ts_lock; RTE_ATOMIC(uint64_t) last_read_nic_timestamp; RTE_ATOMIC(uint32_t) nic_ts_read_fails; RTE_ATOMIC(uint8_t) nic_ts_stale; -- 2.54.0.1032.g2f8565e1d1-goog

