[v2,2/3] net/i40e: enable hotplug detect in i40e

Message ID 1531119413-17298-3-git-send-email-jia.guo@intel.com (mailing list archive)
State Superseded, archived
Headers
Series Enable eal hotplug event detect for i40e/ixgbe |

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation success Compilation OK

Commit Message

Guo, Jia July 9, 2018, 6:56 a.m. UTC
  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.guo@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(-)
  

Comments

Matan Azrad July 9, 2018, 7:47 a.m. UTC | #1
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.guo@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
  
Guo, Jia July 9, 2018, 8:54 a.m. UTC | #2
hi, matan


On 7/9/2018 3:47 PM, Matan Azrad wrote:
> 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.guo@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.

make sense here. thanks matan.

>> +					_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
  

Patch

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)) {
+					_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);