From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by dpdk.org (Postfix) with ESMTP id A8AE94C96 for ; Wed, 19 Sep 2018 17:34:48 +0200 (CEST) X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Sep 2018 08:34:47 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.53,394,1531810800"; d="scan'208";a="75622425" Received: from yexl-server.sh.intel.com (HELO localhost) ([10.67.110.207]) by orsmga006.jf.intel.com with ESMTP; 19 Sep 2018 08:34:36 -0700 Date: Thu, 20 Sep 2018 06:23:03 +0800 From: Ye Xiaolong To: "Wang, Xiao W" Cc: "dev@dpdk.org" , Maxime Coquelin , "Bie, Tiwei" , "Wang, Zhihong" , Rami Rosen , "Wang, Haiyue" Message-ID: <20180919222303.GC42303@intel.com> References: <20180913180658.20562-1-xiaolong.ye@intel.com> <20180913180658.20562-2-xiaolong.ye@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.9.4 (2018-02-28) Subject: Re: [dpdk-dev] [PATCH v2 2/2] examples/vdpa: introduce a new sample for vDPA X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Sep 2018 15:34:49 -0000 On 09/19, Wang, Xiao W wrote: >Hi Xiaolong, > [snip] >> +.. note:: >> + We need to bind VFIO-pci to VFs before running vdpa sample. > >Replace "VFIO-pci" with "vfio-pci". Got it. > >> + >> + * modprobe vfio-pci >> + * ./usertools/dpdk-devbind.py -b vfio-pci 06:00.2 06:00.3 >> + >> +Then we can create 2 vdpa ports in interactive cmdline. >> + >> +.. code-block:: console >> + >> + vdpa> list >> + device id device address >> + 0 0000:06:00.2 >> + 1 0000:06:00.3 > >Could we show out also the device's features and supported queue number? Sure, it's a good suggestion. [snip] > >> + ret = rte_vhost_driver_unregister(socket_path); >> + if (ret != 0) >> + RTE_LOG(ERR, USER1, >> + "Fail to unregister vhost driver for %s.\n", >> + socket_path); >> +} >> + >> +static void >> +vdpa_sample_quit(void) >> +{ >> + int i; >> + for (i = 0; i < RTE_MIN(MAX_VDPA_SAMPLE_PORTS, dev_total); i++) { > >Double " ". Sorry, not quite understand what's your meaning here. > >> + if (vports[i].ifname[0] != '\0') >> + close_vdpa(&vports[i]); >> + } >> +} >> + >> +static void >> +signal_handler(int signum) >> +{ >> + if (signum == SIGINT || signum == SIGTERM) { >> + printf("\nSignal %d received, preparing to exit...\n", signum); >> + vdpa_sample_quit(); >> + exit(0); >> + } >> +} >> + >> +/* interactive cmds */ >> + >> +/* *** Help command with introduction. *** */ >> +struct cmd_help_result { >> + cmdline_fixed_string_t help; >> +}; >> + >> +static void cmd_help_parsed(__attribute__((unused)) void *parsed_result, >> + struct cmdline *cl, >> + __attribute__((unused)) void *data) >> +{ >> + cmdline_printf( >> + cl, >> + "\n" >> + "The following commands are currently available:\n\n" >> + "Control:\n" >> + " help : Show interactive instructions.\n" >> + " list : list all available vdpa devices.\n" >> + " create : create a new vdpa >> port.\n" >> + " quit : exit vdpa sample app.\n" >> + ); >> +} >> + >> +cmdline_parse_token_string_t cmd_help_help = >> + TOKEN_STRING_INITIALIZER(struct cmd_help_result, help, "help"); >> + >> +cmdline_parse_inst_t cmd_help = { >> + .f = cmd_help_parsed, >> + .data = NULL, >> + .help_str = "show help", >> + .tokens = { >> + (void *)&cmd_help_help, >> + NULL, >> + }, >> +}; >> + >> +/* *** List all available vdpa devices *** */ >> +struct cmd_list_result { >> + cmdline_fixed_string_t action; >> +}; >> + >> +static void cmd_list_vdpa_devices_parsed( >> + __attribute__((unused)) void *parsed_result, >> + struct cmdline *cl, >> + __attribute__((unused)) void *data) >> +{ >> + int did; >> + struct rte_vdpa_device *vdev; >> + struct rte_pci_addr addr; >> + >> + cmdline_printf(cl, "device id\tdevice address\n"); >> + for (did = 0; did < dev_total; did++) { >> + vdev = rte_vdpa_get_device(did); >> + if (!vdev) >> + continue; >> + addr = vdev->addr.pci_addr; >> + cmdline_printf(cl, "%d\t\t"PCI_PRI_FMT"\n", did, addr.domain, >> + addr.bus, addr.devid, addr.function); >> + } >> +} >> + >> +cmdline_parse_token_string_t cmd_action_list = >> + TOKEN_STRING_INITIALIZER(struct cmd_list_result, action, "list"); >> + >> +cmdline_parse_inst_t cmd_list_vdpa_devices = { >> + .f = cmd_list_vdpa_devices_parsed, /* function to call */ >> + .data = NULL, /* 2nd arg of func */ >> + .help_str = "list all available vdpa devices", >> + .tokens = { /* token list, NULL terminated */ >> + (void *)&cmd_action_list, >> + NULL, >> + }, >> +}; >> + >> +/* *** Create new vdpa port *** */ >> +struct cmd_create_result { >> + cmdline_fixed_string_t action; >> + cmdline_fixed_string_t socket_path; >> + cmdline_fixed_string_t bdf; >> +}; >> + >> +static void cmd_create_vdpa_port_parsed(void *parsed_result, >> + struct cmdline *cl, >> + __attribute__((unused)) void *data) >> +{ >> + int did; >> + struct cmd_create_result *res = parsed_result; >> + struct rte_vdpa_dev_addr addr; >> + >> + strncpy(vports[devcnt].ifname, res->socket_path, MAX_PATH_LEN); >> + if (eal_parse_pci_DomBDF(res->bdf, &addr.pci_addr) != 0) { > >this is a deprecated API, use rte_pci_addr_parse. Will update. > >> + cmdline_printf(cl, "Unable to parse the given bdf.\n"); >> + return; >> + } >> + addr.type = PCI_ADDR; >> + did = rte_vdpa_find_device_id(&addr); >> + if (did < 0) { >> + cmdline_printf(cl, "Unable to find vdpa devide id.\n"); >> + return; >> + } >> + >> + vports[devcnt].did = did; >> + start_vdpa(&vports[devcnt]); >> + devcnt++; >> +} >> + >> +cmdline_parse_token_string_t cmd_action_create = >> + TOKEN_STRING_INITIALIZER(struct cmd_create_result, action, >> "create"); >> +cmdline_parse_token_string_t cmd_socket_path = >> + TOKEN_STRING_INITIALIZER(struct cmd_create_result, socket_path, >> NULL); >> +cmdline_parse_token_string_t cmd_bdf = >> + TOKEN_STRING_INITIALIZER(struct cmd_create_result, bdf, NULL); >> + >> +cmdline_parse_inst_t cmd_create_vdpa_port = { >> + .f = cmd_create_vdpa_port_parsed, /* function to call */ >> + .data = NULL, /* 2nd arg of func */ >> + .help_str = "create a new vdpa port", >> + .tokens = { /* token list, NULL terminated */ >> + (void *)&cmd_action_create, >> + (void *)&cmd_socket_path, >> + (void *)&cmd_bdf, >> + NULL, >> + }, >> +}; >> + >> +/* *** QUIT *** */ >> +struct cmd_quit_result { >> + cmdline_fixed_string_t quit; >> +}; >> + >> +static void cmd_quit_parsed(__attribute__((unused)) void *parsed_result, >> + struct cmdline *cl, >> + __attribute__((unused)) void *data) >> +{ >> + vdpa_sample_quit(); >> + cmdline_quit(cl); >> +} >> + >> +cmdline_parse_token_string_t cmd_quit_quit = >> + TOKEN_STRING_INITIALIZER(struct cmd_quit_result, quit, "quit"); >> + >> +cmdline_parse_inst_t cmd_quit = { >> + .f = cmd_quit_parsed, >> + .data = NULL, >> + .help_str = "quit: exit application", >> + .tokens = { >> + (void *)&cmd_quit_quit, >> + NULL, >> + }, >> +}; >> +cmdline_parse_ctx_t main_ctx[] = { >> + (cmdline_parse_inst_t *)&cmd_help, >> + (cmdline_parse_inst_t *)&cmd_list_vdpa_devices, >> + (cmdline_parse_inst_t *)&cmd_create_vdpa_port, >> + (cmdline_parse_inst_t *)&cmd_quit, >> + NULL, >> +}; >> + >> +int >> +main(int argc, char *argv[]) >> +{ >> + char ch; >> + int i; >> + int ret; >> + struct cmdline *cl; >> + >> + ret = rte_eal_init(argc, argv); >> + if (ret < 0) >> + rte_exit(EXIT_FAILURE, "eal init failed\n"); >> + argc -= ret; >> + argv += ret; >> + >> + signal(SIGINT, signal_handler); >> + signal(SIGTERM, signal_handler); >> + >> + data_init(); > >data_init first, then set signal handler, otherwise the signal handler may use some uninitialized variable. > Nice catch, will fix it. Thanks, Xiaolong >> + >> + ret = parse_args(argc, argv); >> + if (ret < 0) >> + rte_exit(EXIT_FAILURE, "invalid argument\n"); >> + >> + if (interactive == 1) { >> + cl = cmdline_stdin_new(main_ctx, "vdpa> "); >> + if (cl == NULL) >> + rte_panic("Cannot create cmdline instance\n"); >> + cmdline_interact(cl); >> + cmdline_stdin_exit(cl); >> + } else { >> + for (i = 0; i < RTE_MIN(MAX_VDPA_SAMPLE_PORTS, >> dev_total); > >double " " > >BRs, >Xiao