On 5/1/2020 7:51 AM, Matan Azrad wrote: > Hi Ferruh > > From: Ferruh Yigit >> On 4/30/2020 4:53 PM, Bill Zhou wrote: >>> Currently, there is no way to check the aging event or to get the >>> current aged flows in testpmd, this patch include those implements, it's >> included: >>> - Registering aging event when the testpmd application start, add new >>> command to control if the event expose to the applications. If it's be >>> set, when new flow be checked age out, there will be one-line output log. >>> - Add new command to list all aged flows, meanwhile, we can set >> parameter >>> to destroy it. >>> >>> Signed-off-by: Bill Zhou <do...@mellanox.com> >>> --- >>> v2: Update the way of registering aging event, add new command to >>> control if the event need be print or not. Update the output of the >>> delete aged flow command format. >> >> <...> >> >>> @@ -19387,6 +19394,44 @@ cmdline_parse_inst_t cmd_showport_macs = >> { >>> }, >>> }; >>> >>> +/* Enable/Disable flow aging event log */ struct >>> +cmd_set_aged_flow_event_log_result { >>> + cmdline_fixed_string_t set; >>> + cmdline_fixed_string_t keyword; >>> + cmdline_fixed_string_t enable; >>> +}; >>> +cmdline_parse_token_string_t cmd_set_aged_flow_event_log_set = >>> + TOKEN_STRING_INITIALIZER(struct >> cmd_set_aged_flow_event_log_result, >>> + set, "set"); >>> +cmdline_parse_token_string_t cmd_set_aged_flow_event_log_keyword >> = >>> + TOKEN_STRING_INITIALIZER(struct >> cmd_set_aged_flow_event_log_result, >>> + keyword, "aged_flow_event_log"); >>> +cmdline_parse_token_string_t cmd_set_aged_flow_event_log_enable = >>> + TOKEN_STRING_INITIALIZER(struct >> cmd_set_aged_flow_event_log_result, >>> + enable, "on#off"); >>> + >>> +static void >>> +cmd_set_aged_flow_event_log_parsed(void *parsed_result, >>> + __rte_unused struct cmdline *cl, >>> + __rte_unused void *data) >>> +{ >>> + struct cmd_set_aged_flow_event_log_result *res = parsed_result; >>> + int enable = (strcmp(res->enable, "on") == 0) ? 1 : 0; >>> + update_aging_event_log_status(enable); >>> +} >>> + >>> +cmdline_parse_inst_t cmd_set_aged_flow_event_log = { >>> + .f = cmd_set_aged_flow_event_log_parsed, >>> + .data = NULL, >>> + .help_str = "set aged_flow_event_log on|off", >> >> What do you think "set aged_flow_verbose on|off" to be more similar to >> existing verbose command? > > Please see my comments below regard it. > >> <...> >> >>> --- a/app/test-pmd/testpmd.c >>> +++ b/app/test-pmd/testpmd.c >>> @@ -3068,6 +3068,21 @@ rmv_port_callback(void *arg) >>> start_packet_forwarding(0); >>> } >>> >>> +static int aged_flow_event_enable; >> >> Other global config values are at the beginning of the file, with a comment >> on >> them, can you do same with variable? > > +1 > >>> +void update_aging_event_log_status(int enable) { >>> + aged_flow_event_enable = enable; >>> +} >>> + >>> +int aging_event_output(uint16_t portid) >> >> This can be a 'static' function. > > +1 > >>> +{ >>> + if (aged_flow_event_enable) { >>> + printf("port %u RTE_ETH_EVENT_FLOW_AGED triggered\n", >> portid); >>> + fflush(stdout); >>> + } >>> + return 0; >>> +} >>> + >>> /* This function is used by the interrupt thread */ static int >>> eth_event_callback(portid_t port_id, enum rte_eth_event_type type, >>> void *param, @@ -3098,6 +3113,8 @@ eth_event_callback(portid_t >> port_id, enum rte_eth_event_type type, void *param, >>> rmv_port_callback, (void >> *)(intptr_t)port_id)) >>> fprintf(stderr, "Could not set up deferred device >> removal\n"); >>> break; >>> + case RTE_ETH_EVENT_FLOW_AGED: >>> + aging_event_output(port_id); >> >> Can't this provide more information than port_id, like flow id etc, what >> event_process function provides? can we print it too? >> And what is the intended usage in real application, when flow aged event >> occurred, should application destroy the flow? So it should know the flow, >> right? > > Probably Yes Ferruh, I will add details, maybe it will be clearer: > > As described well in rte_flow_get_aged_flows API description, there are 2 > suggested options for the application: > > 1. To call rte_flow_get_aged_flows from the AGED event callback in order to > get the aged flow contexts of the triggered port. > 2. To call rte_flow_get_aged_flows in any time application wants.
I see, for the testpmd implementation what do you think getting the aged flow list and print them in event callback, this can be good as sample of the intended usage? > > It is probably depends in the way the application wants to synchronize flow > APIs calls. > > The application just gets the information of the aged-out flows context from > the above API and can do any flow operation for it, and yes, the most > expected case is to destroy the flows. > > Bill added 2 testpmd commands: > > 1. To use rte_flow_get_aged_flows and to print a list of all the aged-out > flows (with option to destroy them directly by the command). > 2. A Boolean to indicate the application whether to notify the testpmd user > about new aged-out flows(by print). > > By this way, the testpmd user can use the 2 approaches with minimum testpmd > flow management change. > > So, the Boolean var is more like "trigger testpmd user notification", not > like regular verbose options. As you already know, event always registered and callback always called, this command only defines to print a log in the callback or not, so I believe 'verbose' suits here, main concern is there are many testpmd commands and it is hard to remember them (usage is not intuitive, I had need to check source code to find a command many times), trying to make them as consistent as possible to help usage. But I think as see your concern, "set aged_flow_verbose on|off" command can be confused as if changing "flow aged #" command verbosity level. What do you think about a more generic "set event_verbose on|off" command, which can control to logging for all event handlers, but right now only for aged events? > > Matan > > > > >> >> <...> >> >>> --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst >>> +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst >>> @@ -1062,6 +1062,21 @@ Where: >>> >>> Check the NIC Datasheet for hardware limits. >>> >>> +aged flow event log set >>> +~~~~~~~~~~~~~~~~~~~~~~~ >>> + >>> +Currently, the flow aging event is registered when the testpmd >>> +application start, if new flow be checked age out, there will be one >>> +output log for it. But some applications do not interest this event, use >>> this >> command can set if the event expose to the applications:: >>> + >>> + testpmd> set aged_flow_event_log (on|off) >>> + >>> +For examine:: >>> + >>> + testpmd> set aged_flow_event_log on >>> + testpmd> port 0 RTE_ETH_EVENT_FLOW_AGED triggered >>> + testpmd> set aged_flow_event_log off >>> + >> >> This can be moved below the "set verbose" command since they are in >> similar group.