[dpdk-dev] [PATCH V4 8/9] app/testpmd: show example to handle hot unplug
Matan Azrad
matan at mellanox.com
Sun Jul 1 09:46:54 CEST 2018
Hi Jeff
A good advance, thank you, but as I said in previous version, this patch inserts a bug and the next one fixes it.
Patch 9 should be before patch 8 while this patch just add 1 more option for EAL hotplug.
Please see 1 more comment below.
From: Jeff Guo
> Use testpmd for example, to show how an application smoothly handle failure
> when device being hot unplug. If app have enabled the device event monitor
> and register the hot plug event’s callback before running, once app detect the
> removal event, the callback would be called. It will first stop the packet
> forwarding, then stop the port, close the port, and finally detach the port to
> remove the device out from the device lists.
>
> Signed-off-by: Jeff Guo <jia.guo at intel.com>
> ---
> v4->v3:
> remove some unused code
> ---
> app/test-pmd/testpmd.c | 13 +++++++++----
> 1 file changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
> 24c1998..42ed196 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -2196,6 +2196,9 @@ static void
> eth_dev_event_callback(char *device_name, enum rte_dev_event_type type,
> __rte_unused void *arg)
> {
> + uint16_t port_id;
> + int ret;
> +
> if (type >= RTE_DEV_EVENT_MAX) {
> fprintf(stderr, "%s called upon invalid event %d\n",
> __func__, type);
> @@ -2206,9 +2209,12 @@ eth_dev_event_callback(char *device_name, enum
> rte_dev_event_type type,
> case RTE_DEV_EVENT_REMOVE:
> RTE_LOG(ERR, EAL, "The device: %s has been removed!\n",
> device_name);
> - /* TODO: After finish failure handle, begin to stop
> - * packet forward, stop port, close port, detach port.
> - */
> + ret = rte_eth_dev_get_port_by_name(device_name, &port_id);
As you probably know, 1 rte_device may be associated to more than one ethdev ports, so the ethdev port name can be different from rte_device name.
Looks like we need a new ethdev API to get all the ports associated to one rte_device.
> + if (ret) {
> + printf("can not get port by device %s!\n",
> device_name);
> + return;
> + }
> + rmv_event_callback((void *)(intptr_t)port_id);
> break;
> case RTE_DEV_EVENT_ADD:
> RTE_LOG(ERR, EAL, "The device: %s has been added!\n", @@ -
> 2736,7 +2742,6 @@ main(int argc, char** argv)
> return -1;
> }
> eth_dev_event_callback_register();
> -
> }
>
> if (start_port(RTE_PORT_ALL) != 0)
> --
> 2.7.4
More information about the dev
mailing list