Hi Guo From: Jeff Guo > This patch aim to enable hotplug detect in i40e pmd driver. Firstly it set the > flags RTE_PCI_DRV_INTR_RMV in drv_flags to announce the hotplug ability, > and then use rte_dev_event_callback_register to register the hotplug event > callback to eal. When eal detect the hotplug event, it will call the callback > to > process it, if the event is hotplug remove, it will trigger the > RTE_ETH_EVENT_INTR_RMV event into ethdev callback to let app process > the hotplug for the ethdev. > > This is an example for other driver, that if any driver support hotplug > feature > could be use this way to enable hotplug detect. > > Signed-off-by: Jeff Guo <jia....@intel.com> > --- > v2->v1: > no v1, add hotplug detect in ixgbe for new. > --- > drivers/net/i40e/i40e_ethdev.c | 46 > +++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 45 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c > index 13c5d32..ad4231f 100644 > --- a/drivers/net/i40e/i40e_ethdev.c > +++ b/drivers/net/i40e/i40e_ethdev.c > @@ -688,7 +688,7 @@ static int eth_i40e_pci_remove(struct rte_pci_device > *pci_dev) static struct rte_pci_driver rte_i40e_pmd = { > .id_table = pci_id_i40e_map, > .drv_flags = RTE_PCI_DRV_NEED_MAPPING | > RTE_PCI_DRV_INTR_LSC | > - RTE_PCI_DRV_IOVA_AS_VA, > + RTE_PCI_DRV_IOVA_AS_VA | RTE_PCI_DRV_INTR_RMV, > .probe = eth_i40e_pci_probe, > .remove = eth_i40e_pci_remove, > }; > @@ -1183,6 +1183,47 @@ i40e_aq_debug_write_global_register(struct > i40e_hw *hw, > return i40e_aq_debug_write_register(hw, reg_addr, reg_val, > cmd_details); } > > +static void > +eth_dev_event_callback(char *device_name, enum rte_dev_event_type > type, > + __rte_unused void *arg) > +{ > + uint32_t pid; > + > + if (type >= RTE_DEV_EVENT_MAX) { > + fprintf(stderr, "%s called upon invalid event %d\n", > + __func__, type); > + fflush(stderr); > + } > + > + switch (type) { > + case RTE_DEV_EVENT_REMOVE: > + PMD_DRV_LOG(INFO, "The device: %s has been > removed!\n", > + device_name); > + > + if (!device_name) > + return; > + > + for (pid = 0; pid < RTE_MAX_ETHPORTS; pid++) { > + if (rte_eth_devices[pid].device) { > + if (!strcmp(device_name, > + rte_eth_devices[pid].device->name)) {
You just need to compare this PMD ethdev ports device names to the current EAL removed device name. You should not raise RMV events for other PMD ports. > + _rte_eth_dev_callback_process( > + &rte_eth_devices[pid], > + RTE_ETH_EVENT_INTR_RMV, > NULL); > + continue; > + } > + } > + } > + break; > + case RTE_DEV_EVENT_ADD: > + RTE_LOG(INFO, EAL, "The device: %s has been added!\n", > + device_name); > + break; > + default: > + break; > + } > +} > + > static int > eth_i40e_dev_init(struct rte_eth_dev *dev, void *init_params > __rte_unused) { @@ -1442,6 +1483,9 @@ eth_i40e_dev_init(struct > rte_eth_dev *dev, void *init_params __rte_unused) > rte_intr_callback_register(intr_handle, > i40e_dev_interrupt_handler, dev); > > + /* register the device event callback */ > + rte_dev_event_callback_register(NULL, eth_dev_event_callback, > NULL); > + > /* configure and enable device interrupt */ > i40e_pf_config_irq0(hw, TRUE); > i40e_pf_enable_irq0(hw); > -- > 2.7.4