From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id DE583A0545; Fri, 27 May 2022 18:27:29 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 355A14282A; Fri, 27 May 2022 18:27:24 +0200 (CEST) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by mails.dpdk.org (Postfix) with ESMTP id E24D140E78 for ; Fri, 27 May 2022 18:27:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1653668841; x=1685204841; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=zX4uj8IGsM/mMGH7s39KFkLVPV+vOetK1nqRMTZDP6I=; b=Oi0GwyUQE15r+SZ/KlEb6pwoBxo0f19N+iem9m9ILLFtbFbPza1Y/i+f Rck/xjQONw2gZzeSuTjzuU7UWBoFhwLlXKmVm4plHD9LZdXur5fADGA56 DJqu6YntZ6vsSODo8uWgVp222sjcEvJbF7G2RL14HdvnCRzftSabyNmv2 MMGTUBoLbyQO5IQs/DYmOPZo1pUnxwznbaIgqL2t0ayA/rDENC4PPzL8t IFZyHYzttzCMNoUn4OeTUPfPsSlYcwk1i73F1YXez44M/JOQL8OQT0DHe sIE0VAFRv4uxENZEIYgA+HFODqj2BttZp4/j8Tcz51kpsQTq7RGJdId/7 g==; X-IronPort-AV: E=McAfee;i="6400,9594,10360"; a="272091276" X-IronPort-AV: E=Sophos;i="5.91,256,1647327600"; d="scan'208";a="272091276" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 May 2022 09:27:16 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.91,256,1647327600"; d="scan'208";a="705192878" Received: from silpixa00401385.ir.intel.com (HELO silpixa00401385.ger.corp.intel.com) ([10.237.222.171]) by orsmga004.jf.intel.com with ESMTP; 27 May 2022 09:27:15 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Maxime Coquelin , Chenbo Xia , Bruce Richardson Subject: [PATCH 2/2] doc/howto: add code example to virtio-user exception path doc Date: Fri, 27 May 2022 17:26:59 +0100 Message-Id: <20220527162659.129022-2-bruce.richardson@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220527162659.129022-1-bruce.richardson@intel.com> References: <20220527162659.129022-1-bruce.richardson@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The HOWTO guide for using virtio-user as an exception path to the kernel only provided an example of how testpmd may be used for that purpose. However, a real application wanting to use virtio-user as exception path would likely want to create such devices from code within the app itself. Therefore, we update the doc with instructions and a code snippet showing how this may be done. Signed-off-by: Bruce Richardson --- .../howto/virtio_user_as_exceptional_path.rst | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/doc/guides/howto/virtio_user_as_exceptional_path.rst b/doc/guides/howto/virtio_user_as_exceptional_path.rst index 0709eeff10..f4bd909458 100644 --- a/doc/guides/howto/virtio_user_as_exceptional_path.rst +++ b/doc/guides/howto/virtio_user_as_exceptional_path.rst @@ -157,3 +157,58 @@ For example: /path/to/dpdk-testpmd --vdev=virtio_user0,path=/dev/vhost-net,queues=2,queue_size=1024 -- \ -i --tx-offloads=0x002c --enable-lro --txq=2 --rxq=2 --txd=1024 --rxd=1024 + +Creating Virtio-User Ports within an Application +------------------------------------------------ + +To use virtio-user ports within an application, +it is not necessary to explicitly initialize those ports using EAL arguments at startup. +Instead, one can use the generic EAL API +`rte_eal_hotplug_add `_ +function to create a new instance at startup. +For example, to create a basic virtio-user port, the following code could be used: + +.. code-block:: C + + rte_eal_hotplug_add("vdev", "virtio_user0", "path=/dev/vhost-net"); + +A fuller code example is shown below, where a virtio-user port, and hence kernel netdev, +is created for each NIC port discovered by DPDK. +Each virtio-user port is given the MAC address of its matching physical port +(assuming app was run without vdev args on commandline, so all ports auto-discovered are HW ones). +These new virtio-user netdevs will appear in the kernel port listings as ``virtio_user0``, +``virtio_user1``, etc., +based on the names passed in as ``iface=`` via the ``portargs`` parameter. + +.. code-block:: C + + nb_ports = rte_eth_dev_count_avail(); + + /* Create a vhost_user port for each physical port */ + unsigned port_count = 0; + RTE_ETH_FOREACH_DEV(portid) { + char portname[32]; + char portargs[256]; + struct rte_ether_addr addr = {0}; + + /* don't create virtio_user ports for other virtio_user ports */ + if (++port_count > nb_ports) + break; + + /* get mac address of physical port to use as mac of virtio_user port */ + rte_eth_macaddr_get(portid, &addr); + + /* set the name and arguments */ + snprintf(portname, sizeof(portname), "virtio_user%u", portid); + snprintf(portargs, sizeof(portargs), + "path=/dev/vhost-net,queues=1,queue_size=%u,iface=%s,mac=" RTE_ETHER_ADDR_PRT_FMT, + RX_RING_SIZE, portname, RTE_ETHER_ADDR_BYTES(&addr)); + + /* add the vdev for virtio_user */ + if (rte_eal_hotplug_add("vdev", portname, portargs) < 0) + rte_exit(EXIT_FAILURE, "Cannot create paired port for port %u\n", portid); + + } + +Once these virtio-user ports have been created in the loop, all ports, both physical and virtual, +may be initialized and used as normal in the application. -- 2.34.1