> 
> +static int
> +eth_dev_event_callback_register(portid_t port_id)
> +{
> +     int diag;
> +     char *device_name;
> +
> +     /* if port id equal -1, unregister all device event callbacks */
> +     if (port_id == (portid_t)HOT_PLUG_FOR_ALL_DEVICE) {
> +             device_name = NULL;
> +     } else {
> +             device_name = strdup(rte_eth_devices[port_id].device->name);
> +             if (!device_name) {
> +                     free(device_name);
If device_name is NULL, no memory allocated, why free?

> +                     return -1;
> +             }
> +     }
> +     /* register the dev_event callback */
> +     diag = rte_dev_event_callback_register(device_name,
> +             eth_dev_event_callback, (void *)(intptr_t)port_id);
> +     if (diag) {
> +             printf("Failed to setup dev_event callback\n");
> +             return -1;
> +     }
> +
> +     free(device_name);
> +     return 0;
> +}
> +
> +
> +static int
> +eth_dev_event_callback_unregister(portid_t port_id)
> +{
> +     int diag;
> +     char *device_name;
> +
> +     /* if port id equal -1, unregister all device event callbacks */
> +     if (port_id == (portid_t)HOT_PLUG_FOR_ALL_DEVICE) {
> +             device_name = NULL;
> +     } else {
> +             device_name = strdup(rte_eth_devices[port_id].device->name);
> +             if (!device_name) {
> +                     free(device_name);
Same as above.

> +                     return -1;
> +             }
> +     }
> +
> +     /* unregister the dev_event callback */
> +     diag = rte_dev_event_callback_unregister(device_name,
> +             eth_dev_event_callback, (void *)(intptr_t)port_id);
> +     if (diag) {
> +             printf("Failed to setup dev_event callback\n");
> +             return -1;
> +     }
> +
> +     free(device_name);
> +     return 0;
> +}
> +
>  void
>  attach_port(char *identifier)
>  {
> @@ -1869,6 +1941,8 @@ attach_port(char *identifier)
>       if (rte_eth_dev_attach(identifier, &pi))
>               return;
> 
> +     eth_dev_event_callback_register(pi);
> +
>       socket_id = (unsigned)rte_eth_dev_socket_id(pi);
>       /* if socket_id is invalid, set to 0 */
>       if (check_socket_id(socket_id) < 0)
> @@ -1880,6 +1954,12 @@ attach_port(char *identifier)
> 
>       ports[pi].port_status = RTE_PORT_STOPPED;
> 
> +     if (hot_plug) {
> +             hotplug_list_add(rte_eth_devices[pi].device,
> +                              rte_eth_devices[pi].data->kdrv);
> +             eth_dev_event_callback_register(pi);
> +     }
> +
>       printf("Port %d is attached. Now total ports is %d\n", pi, nb_ports);
>       printf("Done\n");
>  }
> @@ -1906,6 +1986,12 @@ detach_port(portid_t port_id)
> 
>       nb_ports = rte_eth_dev_count();
> 
> +     if (hot_plug) {
> +             hotplug_list_add(rte_eth_devices[port_id].device,
> +                              rte_eth_devices[port_id].data->kdrv);
> +             eth_dev_event_callback_register(port_id);
> +     }
> +
>       printf("Port '%s' is detached. Now total ports is %d\n",
>                       name, nb_ports);
>       printf("Done\n");
> @@ -1916,6 +2002,7 @@ void
>  pmd_test_exit(void)
>  {
>       portid_t pt_id;
> +     int ret;
> 
>       if (test_done == 0)
>               stop_packet_forwarding();
> @@ -1929,6 +2016,19 @@ pmd_test_exit(void)
>                       close_port(pt_id);
>               }
>       }
> +

Need to check if hot_plug is enabled?

> +     ret = rte_dev_event_monitor_stop();
> +     if (ret) {
> +             RTE_LOG(ERR, EAL, "fail to stop device event monitor.");
> +             return;
> +     }
> +
> +     ret = eth_dev_event_callback_unregister(HOT_PLUG_FOR_ALL_DEVICE);
> +     if (ret) {
> +             RTE_LOG(ERR, EAL, "fail to unregister all event callbacks.");
> +             return;
> +     }


<...>

> +static void
> +add_dev_event_callback(void *arg)
> +{
> +     char *dev_name = (char *)arg;
> +
> +     rte_eal_alarm_cancel(add_dev_event_callback, arg);
> +
> +     if (!in_hotplug_list(dev_name))

Remove "!" in the check

> +             return;
> +
> +     RTE_LOG(ERR, EAL, "add device: %s\n", dev_name);
It is not ERR, please make the log aligned with remove device.

> +     attach_port(dev_name);
> +}
> +

<...>
> +
> +/* This function is used by the interrupt thread */
> +static int
> +eth_dev_event_callback(char *device_name, enum rte_dev_event_type type,
> +                          void *arg)
> +{
> +     static const char * const event_desc[] = {
> +             [RTE_DEV_EVENT_ADD] = "add",
> +             [RTE_DEV_EVENT_REMOVE] = "remove",
> +     };
> +     char *dev_name = malloc(strlen(device_name) + 1);
> +
> +     strcpy(dev_name, device_name);
Why not use strdup as above?

> +     if (type >= RTE_DEV_EVENT_MAX) {
> +             fprintf(stderr, "%s called upon invalid event %d\n",
> +                     __func__, type);
> +             fflush(stderr);
> +     } else if (event_print_mask & (UINT32_C(1) << type)) {
> +             printf("%s event\n",
> +                     event_desc[type]);
> +             fflush(stdout);
> +     }
> +
> +     switch (type) {
> +     case RTE_DEV_EVENT_REMOVE:
> +             if (rte_eal_alarm_set(100000,
> +                     rmv_dev_event_callback, arg))
> +                     fprintf(stderr,
> +                             "Could not set up deferred device removal\n");
> +             break;
> +     case RTE_DEV_EVENT_ADD:
> +             if (rte_eal_alarm_set(100000,
> +                     add_dev_event_callback, dev_name))
> +                     fprintf(stderr,
> +                             "Could not set up deferred device add\n");
> +             break;
> +     default:
> +             break;
> +     }
> +     return 0;
Always 0, even alarm set fails?


Thanks
Jingjing

Reply via email to