net/i40e: fix multi-process shared data
authorDapeng Yu <dapengx.yu@intel.com>
Mon, 21 Jun 2021 07:23:53 +0000 (15:23 +0800)
committerQi Zhang <qi.z.zhang@intel.com>
Tue, 6 Jul 2021 02:59:01 +0000 (04:59 +0200)
The rte_eth_devices array is not in share memory, it should not be
referenced by i40e_adapter which is shared by primary and secondary.
Any process set i40e_adapter->eth_dev will corrupt another process's
context.

The patch removed the field "eth_dev" from i40e_adapter.
Now, when the data paths try to access the rte_eth_dev_data instance,
they should replace adapter->eth_dev->data with adapter->pf.dev_data.

Fixes: 4861cde46116 ("i40e: new poll mode driver")
Cc: stable@dpdk.org
Signed-off-by: Dapeng Yu <dapengx.yu@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
drivers/net/i40e/i40e_ethdev.c
drivers/net/i40e/i40e_ethdev.h
drivers/net/i40e/i40e_fdir.c
drivers/net/i40e/i40e_flow.c
drivers/net/i40e/i40e_hash.c
drivers/net/i40e/i40e_rxtx.c
drivers/net/i40e/i40e_vf_representor.c

index df716c1..5b0a7f2 100644 (file)
@@ -732,10 +732,11 @@ i40e_write_global_rx_ctl(struct i40e_hw *hw, uint32_t reg_addr,
                         uint32_t reg_val)
 {
        uint32_t ori_reg_val;
-       struct rte_eth_dev *dev;
+       struct rte_eth_dev_data *dev_data =
+               ((struct i40e_adapter *)hw->back)->pf.dev_data;
+       struct rte_eth_dev *dev = &rte_eth_devices[dev_data->port_id];
 
        ori_reg_val = i40e_read_rx_ctl(hw, reg_addr);
-       dev = ((struct i40e_adapter *)hw->back)->eth_dev;
        i40e_write_rx_ctl(hw, reg_addr, reg_val);
        if (ori_reg_val != reg_val)
                PMD_DRV_LOG(WARNING,
@@ -1326,7 +1327,9 @@ i40e_aq_debug_write_global_register(struct i40e_hw *hw,
                                    struct i40e_asq_cmd_details *cmd_details)
 {
        uint64_t ori_reg_val;
-       struct rte_eth_dev *dev;
+       struct rte_eth_dev_data *dev_data =
+               ((struct i40e_adapter *)hw->back)->pf.dev_data;
+       struct rte_eth_dev *dev = &rte_eth_devices[dev_data->port_id];
        int ret;
 
        ret = i40e_aq_debug_read_register(hw, reg_addr, &ori_reg_val, NULL);
@@ -1336,7 +1339,6 @@ i40e_aq_debug_write_global_register(struct i40e_hw *hw,
                            reg_addr);
                return -EIO;
        }
-       dev = ((struct i40e_adapter *)hw->back)->eth_dev;
 
        if (ori_reg_val != reg_val)
                PMD_DRV_LOG(WARNING,
@@ -1455,7 +1457,6 @@ eth_i40e_dev_init(struct rte_eth_dev *dev, void *init_params __rte_unused)
        dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
 
        pf->adapter = I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
-       pf->adapter->eth_dev = dev;
        pf->dev_data = dev->data;
 
        hw->back = I40E_PF_TO_ADAPTER(pf);
@@ -1982,7 +1983,7 @@ err:
 void
 i40e_vsi_queues_unbind_intr(struct i40e_vsi *vsi)
 {
-       struct rte_eth_dev *dev = vsi->adapter->eth_dev;
+       struct rte_eth_dev *dev = I40E_VSI_TO_ETH_DEV(vsi);
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        struct i40e_hw *hw = I40E_VSI_TO_HW(vsi);
@@ -2098,7 +2099,7 @@ __vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t msix_vect,
 int
 i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx)
 {
-       struct rte_eth_dev *dev = vsi->adapter->eth_dev;
+       struct rte_eth_dev *dev = I40E_VSI_TO_ETH_DEV(vsi);
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        struct i40e_hw *hw = I40E_VSI_TO_HW(vsi);
@@ -2174,7 +2175,7 @@ i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx)
 void
 i40e_vsi_enable_queues_intr(struct i40e_vsi *vsi)
 {
-       struct rte_eth_dev *dev = vsi->adapter->eth_dev;
+       struct rte_eth_dev *dev = I40E_VSI_TO_ETH_DEV(vsi);
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        struct i40e_hw *hw = I40E_VSI_TO_HW(vsi);
@@ -2201,7 +2202,7 @@ i40e_vsi_enable_queues_intr(struct i40e_vsi *vsi)
 void
 i40e_vsi_disable_queues_intr(struct i40e_vsi *vsi)
 {
-       struct rte_eth_dev *dev = vsi->adapter->eth_dev;
+       struct rte_eth_dev *dev = I40E_VSI_TO_ETH_DEV(vsi);
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        struct i40e_hw *hw = I40E_VSI_TO_HW(vsi);
@@ -6416,8 +6417,7 @@ i40e_dev_tx_init(struct i40e_pf *pf)
                        break;
        }
        if (ret == I40E_SUCCESS)
-               i40e_set_tx_function(container_of(pf, struct i40e_adapter, pf)
-                                    ->eth_dev);
+               i40e_set_tx_function(&rte_eth_devices[pf->dev_data->port_id]);
 
        return ret;
 }
@@ -6445,8 +6445,7 @@ i40e_dev_rx_init(struct i40e_pf *pf)
                }
        }
        if (ret == I40E_SUCCESS)
-               i40e_set_rx_function(container_of(pf, struct i40e_adapter, pf)
-                                    ->eth_dev);
+               i40e_set_rx_function(&rte_eth_devices[pf->dev_data->port_id]);
 
        return ret;
 }
@@ -7885,7 +7884,7 @@ i40e_status_code i40e_replace_mpls_l1_filter(struct i40e_pf *pf)
        struct i40e_aqc_replace_cloud_filters_cmd  filter_replace;
        struct i40e_aqc_replace_cloud_filters_cmd_buf  filter_replace_buf;
        struct i40e_hw *hw = I40E_PF_TO_HW(pf);
-       struct rte_eth_dev *dev = ((struct i40e_adapter *)hw->back)->eth_dev;
+       struct rte_eth_dev *dev = &rte_eth_devices[pf->dev_data->port_id];
        enum i40e_status_code status = I40E_SUCCESS;
 
        if (pf->support_multi_driver) {
@@ -7946,7 +7945,7 @@ i40e_status_code i40e_replace_mpls_cloud_filter(struct i40e_pf *pf)
        struct i40e_aqc_replace_cloud_filters_cmd  filter_replace;
        struct i40e_aqc_replace_cloud_filters_cmd_buf  filter_replace_buf;
        struct i40e_hw *hw = I40E_PF_TO_HW(pf);
-       struct rte_eth_dev *dev = ((struct i40e_adapter *)hw->back)->eth_dev;
+       struct rte_eth_dev *dev = &rte_eth_devices[pf->dev_data->port_id];
        enum i40e_status_code status = I40E_SUCCESS;
 
        if (pf->support_multi_driver) {
@@ -8021,7 +8020,7 @@ i40e_replace_gtp_l1_filter(struct i40e_pf *pf)
        struct i40e_aqc_replace_cloud_filters_cmd  filter_replace;
        struct i40e_aqc_replace_cloud_filters_cmd_buf  filter_replace_buf;
        struct i40e_hw *hw = I40E_PF_TO_HW(pf);
-       struct rte_eth_dev *dev = ((struct i40e_adapter *)hw->back)->eth_dev;
+       struct rte_eth_dev *dev = &rte_eth_devices[pf->dev_data->port_id];
        enum i40e_status_code status = I40E_SUCCESS;
 
        if (pf->support_multi_driver) {
@@ -8109,7 +8108,7 @@ i40e_status_code i40e_replace_gtp_cloud_filter(struct i40e_pf *pf)
        struct i40e_aqc_replace_cloud_filters_cmd  filter_replace;
        struct i40e_aqc_replace_cloud_filters_cmd_buf  filter_replace_buf;
        struct i40e_hw *hw = I40E_PF_TO_HW(pf);
-       struct rte_eth_dev *dev = ((struct i40e_adapter *)hw->back)->eth_dev;
+       struct rte_eth_dev *dev = &rte_eth_devices[pf->dev_data->port_id];
        enum i40e_status_code status = I40E_SUCCESS;
 
        if (pf->support_multi_driver) {
@@ -8184,7 +8183,7 @@ i40e_replace_port_l1_filter(struct i40e_pf *pf,
        struct i40e_aqc_replace_cloud_filters_cmd  filter_replace;
        enum i40e_status_code status = I40E_SUCCESS;
        struct i40e_hw *hw = I40E_PF_TO_HW(pf);
-       struct rte_eth_dev *dev = ((struct i40e_adapter *)hw->back)->eth_dev;
+       struct rte_eth_dev *dev = &rte_eth_devices[pf->dev_data->port_id];
 
        if (pf->support_multi_driver) {
                PMD_DRV_LOG(ERR, "Replace l1 filter is not supported.");
@@ -8256,7 +8255,7 @@ i40e_replace_port_cloud_filter(struct i40e_pf *pf,
        struct i40e_aqc_replace_cloud_filters_cmd  filter_replace;
        enum i40e_status_code status = I40E_SUCCESS;
        struct i40e_hw *hw = I40E_PF_TO_HW(pf);
-       struct rte_eth_dev *dev = ((struct i40e_adapter *)hw->back)->eth_dev;
+       struct rte_eth_dev *dev = &rte_eth_devices[pf->dev_data->port_id];
 
        if (pf->support_multi_driver) {
                PMD_DRV_LOG(ERR, "Replace cloud filter is not supported.");
@@ -9583,9 +9582,10 @@ void
 i40e_check_write_global_reg(struct i40e_hw *hw, uint32_t addr, uint32_t val)
 {
        uint32_t reg = i40e_read_rx_ctl(hw, addr);
-       struct rte_eth_dev *dev;
+       struct rte_eth_dev_data *dev_data =
+               ((struct i40e_adapter *)hw->back)->pf.dev_data;
+       struct rte_eth_dev *dev = &rte_eth_devices[dev_data->port_id];
 
-       dev = ((struct i40e_adapter *)hw->back)->eth_dev;
        if (reg != val) {
                i40e_write_rx_ctl(hw, addr, val);
                PMD_DRV_LOG(WARNING,
@@ -12377,7 +12377,7 @@ i40e_cloud_filter_qinq_create(struct i40e_pf *pf)
        struct i40e_aqc_replace_cloud_filters_cmd  filter_replace;
        struct i40e_aqc_replace_cloud_filters_cmd_buf  filter_replace_buf;
        struct i40e_hw *hw = I40E_PF_TO_HW(pf);
-       struct rte_eth_dev *dev = ((struct i40e_adapter *)hw->back)->eth_dev;
+       struct rte_eth_dev *dev = &rte_eth_devices[pf->dev_data->port_id];
 
        if (pf->support_multi_driver) {
                PMD_DRV_LOG(ERR, "Replace cloud filter is not supported.");
index 585a0d8..cd6deab 100644 (file)
        do {                                                            \
                uint32_t ori_val;                                       \
                struct rte_eth_dev *dev;                                \
+               struct rte_eth_dev_data *dev_data;                      \
                ori_val = I40E_READ_REG((hw), (reg));                   \
-               dev = ((struct i40e_adapter *)hw->back)->eth_dev;       \
+               dev_data = ((struct i40e_adapter *)hw->back)->pf.dev_data; \
+               dev = &rte_eth_devices[dev_data->port_id];              \
                I40E_PCI_REG_WRITE(I40E_PCI_REG_ADDR((hw),              \
                                                     (reg)), (value));  \
                if (ori_val != value)                                   \
@@ -1285,7 +1287,6 @@ struct i40e_vf {
 struct i40e_adapter {
        /* Common for both PF and VF */
        struct i40e_hw hw;
-       struct rte_eth_dev *eth_dev;
 
        /* Specific for PF or VF */
        union {
@@ -1540,7 +1541,7 @@ i40e_get_vsi_from_adapter(struct i40e_adapter *adapter)
 #define I40E_VSI_TO_DEV_DATA(vsi) \
        (((struct i40e_vsi *)vsi)->adapter->pf.dev_data)
 #define I40E_VSI_TO_ETH_DEV(vsi) \
-       (((struct i40e_vsi *)vsi)->adapter->eth_dev)
+       (&rte_eth_devices[((struct i40e_vsi *)vsi)->adapter->pf.dev_data->port_id])
 
 /* I40E_PF_TO */
 #define I40E_PF_TO_HW(pf) \
index 6f73936..af075fd 100644 (file)
@@ -160,7 +160,7 @@ i40e_fdir_setup(struct i40e_pf *pf)
        int err = I40E_SUCCESS;
        char z_name[RTE_MEMZONE_NAMESIZE];
        const struct rte_memzone *mz = NULL;
-       struct rte_eth_dev *eth_dev = pf->adapter->eth_dev;
+       struct rte_eth_dev *eth_dev = &rte_eth_devices[pf->dev_data->port_id];
        uint16_t i;
 
        if ((pf->flags & I40E_FLAG_FDIR) == 0) {
@@ -284,7 +284,7 @@ i40e_fdir_teardown(struct i40e_pf *pf)
 {
        struct i40e_hw *hw = I40E_PF_TO_HW(pf);
        struct i40e_vsi *vsi;
-       struct rte_eth_dev *dev = pf->adapter->eth_dev;
+       struct rte_eth_dev *dev = &rte_eth_devices[pf->dev_data->port_id];
 
        vsi = pf->fdir.fdir_vsi;
        if (!vsi)
index ff8441b..3c1570b 100644 (file)
@@ -4897,7 +4897,7 @@ i40e_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error)
 static int
 i40e_flow_flush_fdir_filter(struct i40e_pf *pf)
 {
-       struct rte_eth_dev *dev = pf->adapter->eth_dev;
+       struct rte_eth_dev *dev = &rte_eth_devices[pf->dev_data->port_id];
        struct i40e_fdir_info *fdir_info = &pf->fdir;
        struct i40e_fdir_filter *fdir_filter;
        enum i40e_filter_pctype pctype;
index 8787a69..1fb8c9a 100644 (file)
@@ -732,7 +732,7 @@ i40e_hash_config_region(struct i40e_pf *pf,
                        const struct i40e_rte_flow_rss_conf *rss_conf)
 {
        struct i40e_hw *hw = &pf->adapter->hw;
-       struct rte_eth_dev *dev = pf->adapter->eth_dev;
+       struct rte_eth_dev *dev = &rte_eth_devices[pf->dev_data->port_id];
        struct i40e_queue_region_info *regions = pf->queue_region.region;
        uint32_t num = pf->queue_region.queue_region_number;
        uint32_t i, region_id_mask = 0;
@@ -1270,6 +1270,7 @@ i40e_hash_reset_conf(struct i40e_pf *pf,
                     struct i40e_rte_flow_rss_conf *rss_conf)
 {
        struct i40e_hw *hw = &pf->adapter->hw;
+       struct rte_eth_dev *dev;
        uint64_t inset;
        uint32_t idx;
        int ret;
@@ -1283,8 +1284,8 @@ i40e_hash_reset_conf(struct i40e_pf *pf,
        }
 
        if (rss_conf->misc_reset_flags & I40E_HASH_FLOW_RESET_FLAG_REGION) {
-               ret = i40e_flush_queue_region_all_conf(pf->adapter->eth_dev,
-                                                      hw, pf, 0);
+               dev = &rte_eth_devices[pf->dev_data->port_id];
+               ret = i40e_flush_queue_region_all_conf(dev, hw, pf, 0);
                if (ret)
                        return ret;
 
index ee19102..8d65f28 100644 (file)
@@ -3064,7 +3064,7 @@ i40e_fdir_setup_tx_resources(struct i40e_pf *pf)
                return I40E_ERR_BAD_PTR;
        }
 
-       dev = pf->adapter->eth_dev;
+       dev = &rte_eth_devices[pf->dev_data->port_id];
 
        /* Allocate the TX queue data structure. */
        txq = rte_zmalloc_socket("i40e fdir tx queue",
@@ -3122,7 +3122,7 @@ i40e_fdir_setup_rx_resources(struct i40e_pf *pf)
                return I40E_ERR_BAD_PTR;
        }
 
-       dev = pf->adapter->eth_dev;
+       dev = &rte_eth_devices[pf->dev_data->port_id];
 
        /* Allocate the RX queue data structure. */
        rxq = rte_zmalloc_socket("i40e fdir rx queue",
index 7ed47c1..0481b55 100644 (file)
@@ -19,15 +19,18 @@ i40e_vf_representor_link_update(struct rte_eth_dev *ethdev,
        int wait_to_complete)
 {
        struct i40e_vf_representor *representor = ethdev->data->dev_private;
+       struct rte_eth_dev *dev =
+               &rte_eth_devices[representor->adapter->pf.dev_data->port_id];
 
-       return i40e_dev_link_update(representor->adapter->eth_dev,
-               wait_to_complete);
+       return i40e_dev_link_update(dev, wait_to_complete);
 }
 static int
 i40e_vf_representor_dev_infos_get(struct rte_eth_dev *ethdev,
        struct rte_eth_dev_info *dev_info)
 {
        struct i40e_vf_representor *representor = ethdev->data->dev_private;
+       struct rte_eth_dev_data *pf_dev_data =
+               representor->adapter->pf.dev_data;
 
        /* get dev info for the vdev */
        dev_info->device = ethdev->device;
@@ -99,7 +102,7 @@ i40e_vf_representor_dev_infos_get(struct rte_eth_dev *ethdev,
        };
 
        dev_info->switch_info.name =
-               representor->adapter->eth_dev->device->name;
+               rte_eth_devices[pf_dev_data->port_id].device->name;
        dev_info->switch_info.domain_id = representor->switch_domain_id;
        dev_info->switch_info.port_id = representor->vf_id;
 
@@ -213,7 +216,7 @@ i40e_vf_representor_stats_get(struct rte_eth_dev *ethdev,
        int ret;
 
        ret = rte_pmd_i40e_get_vf_native_stats(
-               representor->adapter->eth_dev->data->port_id,
+               representor->adapter->pf.dev_data->port_id,
                representor->vf_id, &native_stats);
        if (ret == 0) {
                i40evf_stat_update_48(
@@ -273,7 +276,7 @@ i40e_vf_representor_stats_reset(struct rte_eth_dev *ethdev)
        struct i40e_vf_representor *representor = ethdev->data->dev_private;
 
        return rte_pmd_i40e_get_vf_native_stats(
-               representor->adapter->eth_dev->data->port_id,
+               representor->adapter->pf.dev_data->port_id,
                representor->vf_id, &representor->stats_offset);
 }
 
@@ -283,7 +286,7 @@ i40e_vf_representor_promiscuous_enable(struct rte_eth_dev *ethdev)
        struct i40e_vf_representor *representor = ethdev->data->dev_private;
 
        return rte_pmd_i40e_set_vf_unicast_promisc(
-               representor->adapter->eth_dev->data->port_id,
+               representor->adapter->pf.dev_data->port_id,
                representor->vf_id, 1);
 }
 
@@ -293,7 +296,7 @@ i40e_vf_representor_promiscuous_disable(struct rte_eth_dev *ethdev)
        struct i40e_vf_representor *representor = ethdev->data->dev_private;
 
        return rte_pmd_i40e_set_vf_unicast_promisc(
-               representor->adapter->eth_dev->data->port_id,
+               representor->adapter->pf.dev_data->port_id,
                representor->vf_id, 0);
 }
 
@@ -303,7 +306,7 @@ i40e_vf_representor_allmulticast_enable(struct rte_eth_dev *ethdev)
        struct i40e_vf_representor *representor = ethdev->data->dev_private;
 
        return rte_pmd_i40e_set_vf_multicast_promisc(
-               representor->adapter->eth_dev->data->port_id,
+               representor->adapter->pf.dev_data->port_id,
                representor->vf_id,  1);
 }
 
@@ -313,7 +316,7 @@ i40e_vf_representor_allmulticast_disable(struct rte_eth_dev *ethdev)
        struct i40e_vf_representor *representor = ethdev->data->dev_private;
 
        return rte_pmd_i40e_set_vf_multicast_promisc(
-               representor->adapter->eth_dev->data->port_id,
+               representor->adapter->pf.dev_data->port_id,
                representor->vf_id,  0);
 }
 
@@ -323,7 +326,7 @@ i40e_vf_representor_mac_addr_remove(struct rte_eth_dev *ethdev, uint32_t index)
        struct i40e_vf_representor *representor = ethdev->data->dev_private;
 
        rte_pmd_i40e_remove_vf_mac_addr(
-               representor->adapter->eth_dev->data->port_id,
+               representor->adapter->pf.dev_data->port_id,
                representor->vf_id, &ethdev->data->mac_addrs[index]);
 }
 
@@ -334,7 +337,7 @@ i40e_vf_representor_mac_addr_set(struct rte_eth_dev *ethdev,
        struct i40e_vf_representor *representor = ethdev->data->dev_private;
 
        return rte_pmd_i40e_set_vf_mac_addr(
-               representor->adapter->eth_dev->data->port_id,
+               representor->adapter->pf.dev_data->port_id,
                representor->vf_id, mac_addr);
 }
 
@@ -346,7 +349,7 @@ i40e_vf_representor_vlan_filter_set(struct rte_eth_dev *ethdev,
        uint64_t vf_mask = 1ULL << representor->vf_id;
 
        return rte_pmd_i40e_set_vf_vlan_filter(
-               representor->adapter->eth_dev->data->port_id,
+               representor->adapter->pf.dev_data->port_id,
                vlan_id, vf_mask, on);
 }
 
@@ -360,7 +363,7 @@ i40e_vf_representor_vlan_offload_set(struct rte_eth_dev *ethdev, int mask)
        struct i40e_pf *pf;
        uint32_t vfid;
 
-       pdev = representor->adapter->eth_dev;
+       pdev = &rte_eth_devices[representor->adapter->pf.dev_data->port_id];
        vfid = representor->vf_id;
 
        if (!is_i40e_supported(pdev)) {
@@ -410,7 +413,7 @@ i40e_vf_representor_vlan_strip_queue_set(struct rte_eth_dev *ethdev,
        struct i40e_vf_representor *representor = ethdev->data->dev_private;
 
        rte_pmd_i40e_set_vf_vlan_stripq(
-               representor->adapter->eth_dev->data->port_id,
+               representor->adapter->pf.dev_data->port_id,
                representor->vf_id, on);
 }
 
@@ -421,7 +424,7 @@ i40e_vf_representor_vlan_pvid_set(struct rte_eth_dev *ethdev, uint16_t vlan_id,
        struct i40e_vf_representor *representor = ethdev->data->dev_private;
 
        return rte_pmd_i40e_set_vf_vlan_insert(
-               representor->adapter->eth_dev->data->port_id,
+               representor->adapter->pf.dev_data->port_id,
                representor->vf_id, vlan_id);
 }
 
@@ -487,7 +490,7 @@ i40e_vf_representor_init(struct rte_eth_dev *ethdev, void *init_params)
                ((struct i40e_vf_representor *)init_params)->adapter;
 
        pf = I40E_DEV_PRIVATE_TO_PF(
-               representor->adapter->eth_dev->data->dev_private);
+               representor->adapter->pf.dev_data->dev_private);
 
        if (representor->vf_id >= pf->vf_num)
                return -ENODEV;
@@ -519,7 +522,7 @@ i40e_vf_representor_init(struct rte_eth_dev *ethdev, void *init_params)
        ethdev->data->mac_addrs = &vf->mac_addr;
 
        /* Link state. Inherited from PF */
-       link = &representor->adapter->eth_dev->data->dev_link;
+       link = &representor->adapter->pf.dev_data->dev_link;
 
        ethdev->data->dev_link.link_speed = link->link_speed;
        ethdev->data->dev_link.link_duplex = link->link_duplex;