[PATCH 2/2] net/sfc: provide cached dev info to use in secondary process

Ivan Malov <[email protected]>
Newsgroups org.dpdk.dev
Message-ID <[email protected]>
Secondary process support in the 'test-pmd' application now requires that
the driver expose the 'dev_infos_get' method within that context. Use the
cached dev info from the primary process in order to meet the requirement.

Signed-off-by: Ivan Malov <[email protected]>
Reviewed-by: Viacheslav Galaktionov <[email protected]>
---
 drivers/net/sfc/sfc.h        |  7 +++++++
 drivers/net/sfc/sfc_ethdev.c | 29 +++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index 629578549f..9fcc8c9044 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -156,6 +156,13 @@ struct sfc_adapter_shared {
 	unsigned int			nb_repr_txq;
 
 	struct sfc_nic_dma_info		nic_dma_info;
+
+	/*
+	 * Snapshot of the 'sfc_dev_infos_get' output created by the primary
+	 * process attach path for the secondary process to use in its own
+	 * implementation of the 'dev_infos_get' method.
+	 */
+	struct rte_eth_dev_info		dev_info_cache;
 };
 
 /* Adapter process private data */
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 13619b4b9a..aa0e92b004 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -3163,7 +3163,22 @@ sfc_eth_dev_clear_ops(struct rte_eth_dev *dev)
 	sa->priv.dp_rx = NULL;
 }
 
+static int
+sfc_dev_infos_get_secondary(struct rte_eth_dev *dev,
+			    struct rte_eth_dev_info *dev_info)
+{
+	*dev_info = sfc_adapter_shared_by_eth_dev(dev)->dev_info_cache;
+
+	/*
+	 * The cache holds a stale primary-process device pointer;
+	 * restore the process-local one passed in by the caller.
+	 */
+	dev_info->device = dev->device;
+	return 0;
+}
+
 static const struct eth_dev_ops sfc_eth_dev_secondary_ops = {
+	.dev_infos_get			= sfc_dev_infos_get_secondary,
 	.dev_supported_ptypes_get	= sfc_dev_supported_ptypes_get,
 	.reta_query			= sfc_dev_rss_reta_query,
 	.rss_hash_conf_get		= sfc_dev_rss_hash_conf_get,
@@ -3443,6 +3458,20 @@ sfc_eth_dev_init(struct rte_eth_dev *dev, void *init_params)
 
 	sa->link_ev_need_poll = encp->enc_link_ev_need_poll;
 
+	/*
+	 * Pre-populate the dev info cache for the secondary process.
+	 * All prerequisites (probe, attach) are met at this point.
+	 * The 'sfc_dev_infos_get' helper always returns 0.
+	 *
+	 * Care to initialise the switch info and reset the device
+	 * pointer as it is going to be stale in the context of
+	 * the secondary process and it will have to fix it.
+	 */
+	sas->dev_info_cache.switch_info.domain_id =
+		RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID;
+	(void)sfc_dev_infos_get(dev, &sas->dev_info_cache);
+	sas->dev_info_cache.device = NULL;
+
 	sfc_adapter_unlock(sa);
 
 	sfc_log_init(sa, "done");
-- 
2.47.3
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.