> /* > * Structure to store private data specific for VF instance. > */ > @@ -708,6 +718,10 @@ struct i40e_adapter { > struct rte_timecounter systime_tc; > struct rte_timecounter rx_tstamp_tc; > struct rte_timecounter tx_tstamp_tc; > + > + /* For VF reset */ > + volatile uint8_t reset_number; > + void *reset_store_data; > };
How to move it to i40_vf? Or it can be used for PF in future? > + > +static int > +i40evf_store_before_reset(struct rte_eth_dev *dev) { > + struct i40e_adapter *adapter = > + I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); > + struct i40e_vf_reset_store *store_data; > + struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data- > >dev_private); > + > + adapter->reset_store_data = rte_zmalloc("i40evf_store_reset", > + sizeof(struct i40e_vf_reset_store), 0); > + if (adapter->reset_store_data == NULL) { > + PMD_INIT_LOG(ERR, "Failed to allocate %ld bytes needed to" > + " to store data when reset vf", > + sizeof(struct i40e_vf_reset_store)); > + return -ENOMEM; > + } i40evf_store_before_reset is allocated when reset happens. Don't forget to free it when reset is done. Otherwise memory leak. The same as below mac_addrs. > + store_data = > + (struct i40e_vf_reset_store *)adapter->reset_store_data; > + store_data->mac_addrs = rte_zmalloc("i40evf_mac_store_reset", > + ETHER_ADDR_LEN * I40E_NUM_MACADDR_MAX, 0); > + if (store_data->mac_addrs == NULL) { > + PMD_INIT_LOG(ERR, "Failed to allocate %d bytes needed to" > + " to store MAC addresses when reset vf", > + ETHER_ADDR_LEN * > I40E_NUM_MACADDR_MAX); > + } > + > + memcpy(store_data->mac_addrs, dev->data->mac_addrs, > + ETHER_ADDR_LEN * I40E_NUM_MACADDR_MAX); > + > + store_data->promisc_unicast_enabled = vf->promisc_unicast_enabled; > + store_data->promisc_multicast_enabled = vf- > >promisc_multicast_enabled; > + > + store_data->vlan_num = vf->vsi.vlan_num; > + memcpy(store_data->vfta, vf->vsi.vfta, > + sizeof(uint32_t) * I40E_VFTA_SIZE); > + > + store_data->mac_num = vf->vsi.mac_num; > + > + return 0; > +} > +static int > +i40evf_handle_vf_reset(struct rte_eth_dev *dev) { > + struct i40e_adapter *adapter = > + I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); > + > + if (!dev->data->dev_started) > + return 0; > + I think even the dev is not started, we also need to reset it. Because the VF need to reconnect with PF. > + adapter->reset_number = 1; > + i40e_vf_reset_dev(dev); > + adapter->reset_number = 0; > + How to name the reset_number to resetting?