> -----Original Message----- > From: Guo, Jia > Sent: Tuesday, April 3, 2018 6:34 PM > To: step...@networkplumber.org; Richardson, Bruce; Yigit, Ferruh; > Ananyev, Konstantin; gaetan.ri...@6wind.com; Wu, Jingjing; > tho...@monjalon.net; mo...@mellanox.com; Van Haaren, Harry; Tan, > Jianfeng > Cc: jblu...@infradead.org; shreyansh.j...@nxp.com; dev@dpdk.org; Guo, > Jia; Zhang, Helin > Subject: [PATCH V18 4/4] app/testpmd: enable device hotplug monitoring > > Use testpmd for example, to show how an application use device event
s/use/uses > APIs to monitor the hotplug events, including both hot removal event > and hot insertion event. > > The process is that, testpmd first enable hotplug by below commands, > > E.g. ./build/app/testpmd -c 0x3 --n 4 -- -i --hot-plug > > then testpmd start the device event monitor by call the new API s/start/starts s/call/calling > (rte_dev_event_monitor_start) and register the user's callback by call > the API (rte_dev_event_callback_register), when device being hotplug > insertion or hotplug removal, the device event monitor detects the event > and call user's callbacks, user could process the event in the callback > accordingly. > > This patch only shows the event monitoring, device attach/detach would > not be involved here, will add from other hotplug patch set. > > Signed-off-by: Jeff Guo <jia....@intel.com> Some typos and a trivial suggestion. Feel free to carry my Reviewed-by: Jianfeng Tan <jianfeng....@intel.com> in the next version. > --- > v18->v17: > remove hotplug policy and detach/attach process from testpmd, let it > focus on the device event monitoring which the patch set introduced. > --- > app/test-pmd/parameters.c | 5 +- > app/test-pmd/testpmd.c | 112 > +++++++++++++++++++++++++++++++++- > app/test-pmd/testpmd.h | 2 + > doc/guides/testpmd_app_ug/run_app.rst | 4 ++ > 4 files changed, 121 insertions(+), 2 deletions(-) > > diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c > index 97d22b8..558cd40 100644 > --- a/app/test-pmd/parameters.c > +++ b/app/test-pmd/parameters.c > @@ -186,6 +186,7 @@ usage(char* progname) > printf(" --flow-isolate-all: " > "requests flow API isolated mode on all ports at initialization > time.\n"); > printf(" --tx-offloads=0xXXXXXXXX: hexadecimal bitmask of TX > queue offloads\n"); > + printf(" --hot-plug: enable hot plug for device.\n"); > } > > #ifdef RTE_LIBRTE_CMDLINE > @@ -621,6 +622,7 @@ launch_args_parse(int argc, char** argv) > { "print-event", 1, 0, 0 }, > { "mask-event", 1, 0, 0 }, > { "tx-offloads", 1, 0, 0 }, > + { "hot-plug", 0, 0, 0 }, > { 0, 0, 0, 0 }, > }; > > @@ -1102,7 +1104,8 @@ launch_args_parse(int argc, char** argv) > rte_exit(EXIT_FAILURE, > "invalid mask-event > argument\n"); > } > - > + if (!strcmp(lgopts[opt_idx].name, "hot-plug")) > + hot_plug = 1; > break; > case 'h': > usage(argv[0]); > diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c > index 4c0e258..2faeb90 100644 > --- a/app/test-pmd/testpmd.c > +++ b/app/test-pmd/testpmd.c > @@ -12,6 +12,7 @@ > #include <sys/mman.h> > #include <sys/types.h> > #include <errno.h> > +#include <stdbool.h> > > #include <sys/queue.h> > #include <sys/stat.h> > @@ -284,6 +285,8 @@ uint8_t lsc_interrupt = 1; /* enabled by default */ > */ > uint8_t rmv_interrupt = 1; /* enabled by default */ > > +uint8_t hot_plug = 0; /**< hotplug disabled by default. */ > + > /* > * Display or mask ether events > * Default to all events except VF_MBOX > @@ -391,6 +394,12 @@ static void check_all_ports_link_status(uint32_t > port_mask); > static int eth_event_callback(portid_t port_id, > enum rte_eth_event_type type, > void *param, void *ret_param); > +static int eth_dev_event_callback(char *device_name, > + enum rte_dev_event_type type, > + void *param); > +static int eth_dev_event_callback_register(void); > +static int eth_dev_event_callback_unregister(void); > + > > /* > * Check if all the ports are started. > @@ -1853,6 +1862,39 @@ reset_port(portid_t pid) > printf("Done\n"); > } > > +static int > +eth_dev_event_callback_register(void) > +{ > + int diag; > + > + /* register the device event callback */ > + diag = rte_dev_event_callback_register(NULL, > + eth_dev_event_callback, NULL); > + if (diag) { > + printf("Failed to setup dev_event callback\n"); > + return -1; > + } > + > + return 0; > +} > + > + > +static int > +eth_dev_event_callback_unregister(void) > +{ > + int diag; > + > + /* unregister the device event callback */ > + diag = rte_dev_event_callback_unregister(NULL, > + eth_dev_event_callback, NULL); > + if (diag) { > + printf("Failed to setup dev_event callback\n"); > + return -1; > + } > + > + return 0; > +} > + > void > attach_port(char *identifier) > { > @@ -1916,6 +1958,7 @@ void > pmd_test_exit(void) > { > portid_t pt_id; > + int ret; > > if (test_done == 0) > stop_packet_forwarding(); > @@ -1929,6 +1972,18 @@ pmd_test_exit(void) > close_port(pt_id); > } > } > + > + if (hot_plug) { > + ret = rte_dev_event_monitor_stop(); > + if (ret) > + RTE_LOG(ERR, EAL, > + "fail to stop device event monitor."); > + > + ret = eth_dev_event_callback_unregister(); > + if (ret) > + RTE_LOG(ERR, EAL, > + "fail to unregister all event callbacks."); > + } > printf("\nBye...\n"); > } > > @@ -2059,6 +2114,48 @@ eth_event_callback(portid_t port_id, enum > rte_eth_event_type type, void *param, > return 0; > } > > +/* This function is used by the interrupt thread */ > +static int > +eth_dev_event_callback(char *device_name, enum rte_dev_event_type > type, > + __rte_unused void *arg) > +{ > + int ret = 0; >From here > + static const char * const event_desc[] = { > + [RTE_DEV_EVENT_ADD] = "add", > + [RTE_DEV_EVENT_REMOVE] = "remove", > + }; > + > + 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); > + } to here, these check are not necessary. > + > + 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. > + */ > + break; > + case RTE_DEV_EVENT_ADD: > + RTE_LOG(ERR, EAL, "The device: %s has been added!\n", > + device_name); > + /* TODO: After finish kernel driver binding, > + * begin to attach port. > + */ > + break; > + default: > + break; > + } > + return ret; > +} > + > static int > set_tx_queue_stats_mapping_registers(portid_t port_id, struct rte_port > *port) > { > @@ -2474,8 +2571,9 @@ signal_handler(int signum) > int > main(int argc, char** argv) > { > - int diag; > + int diag; > portid_t port_id; > + int ret; > > signal(SIGINT, signal_handler); > signal(SIGTERM, signal_handler); > @@ -2543,6 +2641,18 @@ main(int argc, char** argv) > nb_rxq, nb_txq); > > init_config(); > + > + if (hot_plug) { > + /* enable hot plug monitoring */ > + ret = rte_dev_event_monitor_start(); > + if (ret) { > + rte_errno = EINVAL; > + return -1; > + } > + eth_dev_event_callback_register(); > + > + } > + > if (start_port(RTE_PORT_ALL) != 0) > rte_exit(EXIT_FAILURE, "Start ports failed\n"); > > diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h > index 153abea..8fde68d 100644 > --- a/app/test-pmd/testpmd.h > +++ b/app/test-pmd/testpmd.h > @@ -319,6 +319,8 @@ extern volatile int test_done; /* stop packet > forwarding when set to 1. */ > extern uint8_t lsc_interrupt; /**< disabled by "--no-lsc-interrupt" parameter > */ > extern uint8_t rmv_interrupt; /**< disabled by "--no-rmv-interrupt" > parameter */ > extern uint32_t event_print_mask; > +extern uint8_t hot_plug; /**< enable by "--hot-plug" parameter */ > + > /**< set by "--print-event xxxx" and "--mask-event xxxx parameters */ > > #ifdef RTE_LIBRTE_IXGBE_BYPASS > diff --git a/doc/guides/testpmd_app_ug/run_app.rst > b/doc/guides/testpmd_app_ug/run_app.rst > index 1fd5395..d0ced36 100644 > --- a/doc/guides/testpmd_app_ug/run_app.rst > +++ b/doc/guides/testpmd_app_ug/run_app.rst > @@ -479,3 +479,7 @@ The commandline options are: > > Set the hexadecimal bitmask of TX queue offloads. > The default value is 0. > + > +* ``--hot-plug`` > + > + Enable device event monitor machenism for hotplug. s/machenism/mechanism > -- > 2.7.4