[v5,1/4] ethdev: Add eal device event handler APIs
Checks
Commit Message
Implement a couple of eal device event handler install/uninstall APIs
in ethdev. Each ethdev install the handler in PMDs, so each callback
corresponding with one port, and process the eal device event for specific
port. If PMDs install the handler when initial device, it could have
chance to manage the eal device event, such as register device event
callback, then monitor and process the hotplug event.
Signed-off-by: Jeff Guo <jia.guo@intel.com>
Reviewed-by: Qi Zhang <qi.z.zhang@intel.com>
---
v5->v4:
refine some code style and typo
---
doc/guides/rel_notes/release_18_08.rst | 12 +++++++
lib/librte_ethdev/rte_ethdev.c | 59 ++++++++++++++++++++++++++++++++
lib/librte_ethdev/rte_ethdev_driver.h | 32 +++++++++++++++++
lib/librte_ethdev/rte_ethdev_version.map | 2 ++
4 files changed, 105 insertions(+)
@@ -46,6 +46,18 @@ New Features
Flow API support has been added to CXGBE Poll Mode Driver to offload
flows to Chelsio T5/T6 NICs.
+* **Added eal device event process helper in ethdev.**
+
+ Implement a couple of eal device event handler install/uninstall APIs in
+ ethdev, these helper could let PMDs have chance to manage the eal device
+ event, such as register device event callback, then monitor and process
+ hotplug event.
+
+ * ``rte_eth_dev_event_handler_install`` for PMDs use to install the device
+ event handler.
+ * ``rte_eth_dev_event_handler_uninstall`` for PMDs use to uninstall the device
+ event handler.
+
API Changes
-----------
@@ -4518,6 +4518,65 @@ rte_eth_devargs_parse(const char *dargs, struct rte_eth_devargs *eth_da)
return result;
}
+static void __rte_experimental
+eth_dev_event_callback(char *device_name, enum rte_dev_event_type type,
+ void *arg)
+{
+ struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)arg;
+
+ switch (type) {
+ case RTE_DEV_EVENT_REMOVE:
+ ethdev_log(INFO, "The device %s has been removed!\n",
+ device_name);
+
+ if (!device_name || !eth_dev)
+ return;
+
+ if (!(eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_RMV))
+ return;
+
+ if (!strcmp(device_name, eth_dev->device->name))
+ _rte_eth_dev_callback_process(eth_dev,
+ RTE_ETH_EVENT_INTR_RMV,
+ NULL);
+ break;
+ case RTE_DEV_EVENT_ADD:
+ ethdev_log(INFO, "The device %s has been added!\n",
+ device_name);
+ break;
+ default:
+ break;
+ }
+}
+
+int __rte_experimental
+rte_eth_dev_event_handler_install(struct rte_eth_dev *eth_dev)
+{
+ int result = 0;
+
+ result = rte_dev_event_callback_register(eth_dev->device->name,
+ eth_dev_event_callback, eth_dev);
+ if (result)
+ ethdev_log(ERR, "device event callback register failed for "
+ "device %s!\n", eth_dev->device->name);
+
+ return result;
+}
+
+int __rte_experimental
+rte_eth_dev_event_handler_uninstall(struct rte_eth_dev *eth_dev)
+{
+ int result = 0;
+
+ result = rte_dev_event_callback_unregister(eth_dev->device->name,
+ eth_dev_event_callback, eth_dev);
+ if (result)
+ ethdev_log(ERR, "device event callback unregister failed for"
+ " device %s!\n", eth_dev->device->name);
+
+ return result;
+}
+
RTE_INIT(ethdev_init_log);
static void
ethdev_init_log(void)
@@ -82,6 +82,38 @@ int rte_eth_dev_release_port(struct rte_eth_dev *eth_dev);
void _rte_eth_dev_reset(struct rte_eth_dev *dev);
/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Implement a helper to install the device event handler for the specific
+ * ether device.
+ *
+ * @param dev
+ * Pointer to struct rte_eth_dev.
+ *
+ * @return
+ * - 0 on success, negative on error
+ */
+int __rte_experimental
+rte_eth_dev_event_handler_install(struct rte_eth_dev *dev);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Implement a helper to uninstall the device event handler for the specific
+ * ether device.
+ *
+ * @param dev
+ * Pointer to struct rte_eth_dev.
+ *
+ * @return
+ * - 0 on success, negative on error
+ */
+int __rte_experimental
+rte_eth_dev_event_handler_uninstall(struct rte_eth_dev *dev);
+
+/**
* @internal Executes all the user application registered callbacks for
* the specific device. It is for DPDK internal user only. User
* application should not call it directly.
@@ -220,6 +220,8 @@ EXPERIMENTAL {
rte_eth_dev_count_total;
rte_eth_dev_create;
rte_eth_dev_destroy;
+ rte_eth_dev_event_handler_install;
+ rte_eth_dev_event_handler_uninstall;
rte_eth_dev_get_module_eeprom;
rte_eth_dev_get_module_info;
rte_eth_dev_is_removed;