Hi Jeff,

> -----Original Message-----
> From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Jeff Guo
> Sent: Thursday, May 3, 2018 11:49 AM
> To: step...@networkplumber.org; Richardson, Bruce
> <bruce.richard...@intel.com>; Yigit, Ferruh <ferruh.yi...@intel.com>;
> Ananyev, Konstantin <konstantin.anan...@intel.com>;
> gaetan.ri...@6wind.com; Wu, Jingjing <jingjing...@intel.com>;
> tho...@monjalon.net; mo...@mellanox.com; ma...@mellanox.com; Van
> Haaren, Harry <harry.van.haa...@intel.com>; Tan, Jianfeng
> <jianfeng....@intel.com>
> Cc: jblu...@infradead.org; shreyansh.j...@nxp.com; dev@dpdk.org; Guo,
> Jia <jia....@intel.com>; Zhang, Helin <helin.zh...@intel.com>
> Subject: [dpdk-dev] [PATCH V21 4/4] app/testpmd: show example to handle
> hot unplug
> 
> Use testpmd for example, to show how an application smoothly handle
> failure when device being hot unplug. Once app detect the removal event,
> the callback would be called, it first stop the packet forwarding, then stop 
> the
> port, close the port and finally detach the port.
> 
> Signed-off-by: Jeff Guo <jia....@intel.com>
> ---
> v21->v20:
> fix attach port issue, let it work for multiple device case.
> combind rmv callback to only one.
> ---
>  app/test-pmd/testpmd.c | 27 ++++++++++++++++++---------
>  1 file changed, 18 insertions(+), 9 deletions(-)
> 
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
> db23f23..a1ff8f3 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -1908,9 +1908,10 @@ eth_dev_event_callback_unregister(void)
>  void
>  attach_port(char *identifier)
>  {
> -     portid_t pi = 0;
>       unsigned int socket_id;
> 
> +     portid_t pi = rte_eth_dev_count_avail();
> +
>       printf("Attaching a new port...\n");
> 
>       if (identifier == NULL) {
> @@ -2071,12 +2072,14 @@ rmv_event_callback(void *arg)
>       RTE_ETH_VALID_PORTID_OR_RET(port_id);
>       dev = &rte_eth_devices[port_id];
> 
> +     if (dev->state == RTE_ETH_DEV_UNUSED)
> +             return;
> +
> +     printf("removing device %s\n", dev->device->name);
> +     stop_packet_forwarding();
>       stop_port(port_id);
>       close_port(port_id);
> -     printf("removing device %s\n", dev->device->name);
> -     if (rte_eal_dev_detach(dev->device))
> -             TESTPMD_LOG(ERR, "Failed to detach device %s\n",
> -                     dev->device->name);
> +     detach_port(port_id);
>  }
> 
>  /* This function is used by the interrupt thread */ @@ -2131,19 +2134,26
> @@ 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);
>               fflush(stderr);
>       }
> 
> +     ret = rte_eth_dev_get_port_by_name(device_name, &port_id);
> +     if (ret) {
> +             printf("can not get port by device %s!\n", device_name);
> +             return;
> +     }
> +
>       switch (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.
> -              */
> +             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",
> @@ -2666,7 +2676,6 @@ main(int argc, char** argv)
>                       return -1;
>               }
>               eth_dev_event_callback_register();
> -
>       }
> 
>       if (start_port(RTE_PORT_ALL) != 0)
> --
> 2.7.4

This patch fails to apply to dpdk 18.08-rc0 and needs to be rebased.

Regards,

Bernard.

Reply via email to