We should not be storing rte_eth_dev pointers in shared memory, because rte_eth_dev pointers are process local. To address that, remove the pointer from iavf_info, replace it with `rte_eth_devices`-based lookup, and rework the call paths to either use that lookup, or not require ethdev pointer in the first place.
Signed-off-by: Anatoly Burakov <[email protected]> --- drivers/net/intel/iavf/iavf.h | 9 ++++++-- drivers/net/intel/iavf/iavf_ethdev.c | 13 ++++++------ drivers/net/intel/iavf/iavf_ipsec_crypto.c | 24 +++++++++++----------- drivers/net/intel/iavf/iavf_ipsec_crypto.h | 4 ++-- drivers/net/intel/iavf/iavf_vchnl.c | 7 ++++--- 5 files changed, 31 insertions(+), 26 deletions(-) diff --git a/drivers/net/intel/iavf/iavf.h b/drivers/net/intel/iavf/iavf.h index c40b97444b5..1f277eeee29 100644 --- a/drivers/net/intel/iavf/iavf.h +++ b/drivers/net/intel/iavf/iavf.h @@ -7,6 +7,7 @@ #include <sys/queue.h> +#include <ethdev_driver.h> #include <rte_kvargs.h> #include <rte_tm_driver.h> @@ -293,8 +294,6 @@ struct iavf_info { struct iavf_qtc_map *qtc_map; struct iavf_tm_conf tm_conf; - struct rte_eth_dev *eth_dev; - RTE_ATOMIC(bool)in_reset_recovery; bool reset_pending; bool pf_reset_in_progress; @@ -408,6 +407,12 @@ struct iavf_adapter { uint16_t tpid; /* VLAN tag identifier */ }; +static inline struct rte_eth_dev * +iavf_get_eth_dev(struct iavf_adapter *adapter) +{ + return &rte_eth_devices[adapter->dev_data->port_id]; +} + /* IAVF_DEV_PRIVATE_TO */ #define IAVF_DEV_PRIVATE_TO_ADAPTER(adapter) \ ((struct iavf_adapter *)adapter) diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c index 6cf12ec34f1..76c51e7c25b 100644 --- a/drivers/net/intel/iavf/iavf_ethdev.c +++ b/drivers/net/intel/iavf/iavf_ethdev.c @@ -326,6 +326,7 @@ static void iavf_dev_watchdog(void *cb_arg) { struct iavf_adapter *adapter = cb_arg; + struct rte_eth_dev *dev = iavf_get_eth_dev(adapter); struct iavf_hw *hw = IAVF_DEV_PRIVATE_TO_HW(adapter); int vfr_inprogress = 0, rc = 0; @@ -339,7 +340,7 @@ iavf_dev_watchdog(void *cb_arg) if (!vfr_inprogress) { PMD_DRV_LOG(INFO, "VF \"%s\" reset has completed", - adapter->vf.eth_dev->data->name); + dev->data->name); adapter->vf.vf_reset = false; iavf_set_no_poll(adapter, false); } @@ -350,14 +351,14 @@ iavf_dev_watchdog(void *cb_arg) if (vfr_inprogress) { PMD_DRV_LOG(INFO, "VF \"%s\" reset event detected by watchdog", - adapter->vf.eth_dev->data->name); + dev->data->name); /* enter reset state with VFLR event */ adapter->vf.vf_reset = true; iavf_set_no_poll(adapter, false); adapter->vf.link_up = false; - iavf_dev_event_post(adapter->vf.eth_dev, RTE_ETH_EVENT_INTR_RESET, + iavf_dev_event_post(dev, RTE_ETH_EVENT_INTR_RESET, NULL, 0); } } @@ -365,11 +366,11 @@ iavf_dev_watchdog(void *cb_arg) if (adapter->devargs.watchdog_period) { /* re-alarm watchdog */ rc = rte_eal_alarm_set(adapter->devargs.watchdog_period, - &iavf_dev_watchdog, cb_arg); + &iavf_dev_watchdog, dev); if (rc) PMD_DRV_LOG(ERR, "Failed \"%s\" to reset device watchdog alarm", - adapter->vf.eth_dev->data->name); + dev->data->name); } } @@ -2674,8 +2675,6 @@ iavf_init_vf(struct rte_eth_dev *dev) struct iavf_hw *hw = IAVF_DEV_PRIVATE_TO_HW(dev->data->dev_private); struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); - vf->eth_dev = dev; - err = iavf_parse_devargs(dev); if (err) { PMD_INIT_LOG(ERR, "Failed to parse devargs"); diff --git a/drivers/net/intel/iavf/iavf_ipsec_crypto.c b/drivers/net/intel/iavf/iavf_ipsec_crypto.c index cd13e14ae74..8056c889cb1 100644 --- a/drivers/net/intel/iavf/iavf_ipsec_crypto.c +++ b/drivers/net/intel/iavf/iavf_ipsec_crypto.c @@ -689,11 +689,9 @@ iavf_ipsec_crypto_session_create(void *device, * returns: 1 if valid */ uint32_t -iavf_ipsec_crypto_action_valid(struct rte_eth_dev *ethdev, +iavf_ipsec_crypto_action_valid(struct iavf_adapter *adapter, const struct rte_security_session *session, uint32_t spi) { - struct iavf_adapter *adapter = - IAVF_DEV_PRIVATE_TO_ADAPTER(ethdev->data->dev_private); const struct iavf_security_session *sess = (const void *)session->driver_priv_data; /* verify we have a valid session and that it belong to this adapter */ @@ -1502,24 +1500,25 @@ static struct rte_security_ops iavf_ipsec_crypto_ops = { int iavf_security_ctx_create(struct iavf_adapter *adapter) { + struct rte_eth_dev *dev = iavf_get_eth_dev(adapter); struct rte_security_ctx *sctx; sctx = rte_malloc("security_ctx", sizeof(struct rte_security_ctx), 0); if (sctx == NULL) return -ENOMEM; - sctx->device = adapter->vf.eth_dev; + sctx->device = dev; sctx->ops = &iavf_ipsec_crypto_ops; sctx->sess_cnt = 0; - adapter->vf.eth_dev->security_ctx = sctx; + dev->security_ctx = sctx; if (adapter->security_ctx == NULL) { adapter->security_ctx = rte_malloc("iavf_security_ctx", sizeof(struct iavf_security_ctx), 0); if (adapter->security_ctx == NULL) { - rte_free(adapter->vf.eth_dev->security_ctx); - adapter->vf.eth_dev->security_ctx = NULL; + rte_free(dev->security_ctx); + dev->security_ctx = NULL; return -ENOMEM; } } @@ -1565,7 +1564,8 @@ iavf_security_get_pkt_md_offset(struct iavf_adapter *adapter) int iavf_security_ctx_destroy(struct iavf_adapter *adapter) { - struct rte_security_ctx *sctx = adapter->vf.eth_dev->security_ctx; + struct rte_eth_dev *dev = iavf_get_eth_dev(adapter); + struct rte_security_ctx *sctx = dev->security_ctx; struct iavf_security_ctx *iavf_sctx = adapter->security_ctx; if (iavf_sctx == NULL) @@ -1578,7 +1578,7 @@ iavf_security_ctx_destroy(struct iavf_adapter *adapter) rte_free(sctx); adapter->security_ctx = NULL; - adapter->vf.eth_dev->security_ctx = NULL; + dev->security_ctx = NULL; return 0; } @@ -1748,7 +1748,7 @@ parse_udp_item(const struct rte_flow_item_udp *item, struct rte_udp_hdr *udp) } static struct iavf_ipsec_flow_item * -iavf_ipsec_flow_item_parse(struct rte_eth_dev *ethdev, +iavf_ipsec_flow_item_parse(struct iavf_adapter *adapter, const struct rte_flow_item pattern[], const struct rte_security_session *session, uint32_t type) @@ -1819,7 +1819,7 @@ iavf_ipsec_flow_item_parse(struct rte_eth_dev *ethdev, goto flow_cleanup; } - if (!iavf_ipsec_crypto_action_valid(ethdev, session, + if (!iavf_ipsec_crypto_action_valid(adapter, session, ipsec_flow->spi)) goto flow_cleanup; @@ -1972,7 +1972,7 @@ iavf_ipsec_flow_parse(struct iavf_adapter *ad, const struct rte_security_session *session = parsed_actions.actions[0]->conf; uint32_t type = (uint64_t)(item->meta); - fi = iavf_ipsec_flow_item_parse(ad->vf.eth_dev, pattern, session, type); + fi = iavf_ipsec_flow_item_parse(ad, pattern, session, type); } rte_free(item); diff --git a/drivers/net/intel/iavf/iavf_ipsec_crypto.h b/drivers/net/intel/iavf/iavf_ipsec_crypto.h index 795b75a624d..3d4b1da127a 100644 --- a/drivers/net/intel/iavf/iavf_ipsec_crypto.h +++ b/drivers/net/intel/iavf/iavf_ipsec_crypto.h @@ -127,13 +127,13 @@ int iavf_security_get_pkt_md_offset(struct iavf_adapter *adapter); /** * Destroy security context */ -int iavf_security_ctx_destroy(struct iavf_adapter *adapterv); +int iavf_security_ctx_destroy(struct iavf_adapter *adapter); /** * Verify that the inline IPsec Crypto action is valid for this device */ uint32_t -iavf_ipsec_crypto_action_valid(struct rte_eth_dev *ethdev, +iavf_ipsec_crypto_action_valid(struct iavf_adapter *adapter, const struct rte_security_session *session, uint32_t spi); /** diff --git a/drivers/net/intel/iavf/iavf_vchnl.c b/drivers/net/intel/iavf/iavf_vchnl.c index 57488512f43..26dae423a48 100644 --- a/drivers/net/intel/iavf/iavf_vchnl.c +++ b/drivers/net/intel/iavf/iavf_vchnl.c @@ -314,13 +314,14 @@ iavf_read_msg_from_pf(struct iavf_adapter *adapter, uint16_t buf_len, opcode, vf->cmd_retval); if (opcode == VIRTCHNL_OP_EVENT) { + struct rte_eth_dev *dev = iavf_get_eth_dev(adapter); struct virtchnl_pf_event *vpe = (struct virtchnl_pf_event *)event.msg_buf; result = IAVF_MSG_SYS; switch (vpe->event) { case VIRTCHNL_EVENT_LINK_CHANGE: - iavf_handle_link_change_event(vf->eth_dev, vpe); + iavf_handle_link_change_event(dev, vpe); break; case VIRTCHNL_EVENT_RESET_IMPENDING: /* @@ -335,8 +336,8 @@ iavf_read_msg_from_pf(struct iavf_adapter *adapter, uint16_t buf_len, iavf_set_no_poll(adapter, false); iavf_dev_watchdog_enable(adapter); if (adapter->devargs.no_poll_on_link_down) - iavf_dev_tx_drain(vf->eth_dev); - iavf_dev_event_post(vf->eth_dev, + iavf_dev_tx_drain(dev); + iavf_dev_event_post(dev, RTE_ETH_EVENT_INTR_RESET, NULL, 0); } -- 2.52.0

