From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: passt.top; dkim=pass (2048-bit key; secure) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.a=rsa-sha256 header.s=202510 header.b=YAhevpo1; dkim-atps=neutral Received: from mail.ozlabs.org (gandalf.ozlabs.org [150.107.74.76]) by passt.top (Postfix) with ESMTPS id 356505A0274 for ; Wed, 26 Nov 2025 04:45:30 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202510; t=1764128727; bh=GtDDe6AMVBSuFabssOmJ2kEOPkCL0OltyLRdtmlwGdE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=YAhevpo16IbggyKiY9jADnWf8/uud1xss69Irp1ZUHXShhHL4UsAbOhli5JxDWDeD xd8cyMme3GtuZwm7IaOzMI+cgMbwdHUKg5Hb2avh7ntbu+lHliX3jxTpgVYChobb2Z MziZFQp/Lk0MLS53t11xpRc+Q+yUA9iHtKHxU9qxAt1NZnVXSgMO9X2kISiiiDEIsg OecJo7S08yci8mfn0V6/M8sVyICJetMLFi9u8qSsyp5LO8QK/ef6/JuPnbI71irsVc 11YsfEIxUUfCY2Zkb+dTzPyaXxxtiVgzM1n0SIAKlSgd1XC0ddLFIu9LYpPOxGHvEB eZc3ST0xns+fQ== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4dGQSR1QH6z4wGT; Wed, 26 Nov 2025 14:45:27 +1100 (AEDT) Date: Wed, 26 Nov 2025 14:45:22 +1100 From: David Gibson To: Laurent Vivier Subject: Re: [PATCH v2 6/6] test: Add multiqueue support to vhost-user test infrastructure Message-ID: References: <20251121165902.1014964-1-lvivier@redhat.com> <20251121165902.1014964-7-lvivier@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="2wLoCjLG0gt/mUHY" Content-Disposition: inline In-Reply-To: <20251121165902.1014964-7-lvivier@redhat.com> Message-ID-Hash: TKKHPPYYYG6QYINIPZ5XBJJGGHDTIAMY X-Message-ID-Hash: TKKHPPYYYG6QYINIPZ5XBJJGGHDTIAMY X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: passt-dev@passt.top X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: --2wLoCjLG0gt/mUHY Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Nov 21, 2025 at 05:59:02PM +0100, Laurent Vivier wrote: > With the recent addition of multiqueue support to passt's vhost-user > implementation, we need test coverage to validate the functionality. The > test infrastructure previously only tested single queue configurations. >=20 > Add a VHOST_USER_MQ environment variable to control the number of queue > pairs. When set to values greater than 1, the setup scripts pass > --max-qpairs to passt and configure QEMU's vhost-user netdev with the > corresponding queues=3D parameter. >=20 > The test suite now runs an additional set of tests with 8 queue pairs to > exercise the multiqueue paths across all protocols (TCP, UDP, ICMP) and > services (DHCP, NDP). Note that the guest kernel will only enable as many > queues as there are vCPUs. >=20 > Signed-off-by: Laurent Vivier > --- > test/lib/setup | 58 +++++++++++++++++++++++++++++++++++++++----------- > test/run | 23 ++++++++++++++++++++ > 2 files changed, 69 insertions(+), 12 deletions(-) >=20 > diff --git a/test/lib/setup b/test/lib/setup > index 5994598744a3..2af34d670473 100755 > --- a/test/lib/setup > +++ b/test/lib/setup > @@ -18,6 +18,8 @@ VCPUS=3D"$( [ $(nproc) -ge 8 ] && echo 6 || echo $(( $(= nproc) / 2 + 1 )) )" > MEM_KIB=3D"$(sed -n 's/MemTotal:[ ]*\([0-9]*\) kB/\1/p' /proc/meminfo)" > QEMU_ARCH=3D"$(uname -m)" > [ "${QEMU_ARCH}" =3D "i686" ] && QEMU_ARCH=3Di386 > +VHOST_USER=3D0 > +VHOST_USER_MQ=3D1 > =20 > # setup_build() - Set up pane layout for build tests > setup_build() { > @@ -45,7 +47,8 @@ setup_passt() { > [ ${PCAP} -eq 1 ] && __opts=3D"${__opts} -p ${LOGDIR}/passt.pcap" > [ ${DEBUG} -eq 1 ] && __opts=3D"${__opts} -d" > [ ${TRACE} -eq 1 ] && __opts=3D"${__opts} --trace" > - [ ${VHOST_USER} -eq 1 ] && __opts=3D"${__opts} --vhost-user" > + [ ${VHOST_USER} -eq 1 ] && __opts=3D"${__opts} --vhost-user" && \ > + [ ${VHOST_USER_MQ} -gt 1 ] && __opts=3D"${__opts} --max-qpairs ${VHOST_= USER_MQ}" > =20 > context_run passt "make clean" > context_run passt "make valgrind" > @@ -59,10 +62,18 @@ setup_passt() { > __vmem=3D"$(((${__vmem} + 500) / 1000))G" > __qemu_netdev=3D" \ > -chardev socket,id=3Dc,path=3D${STATESETUP}/passt.socket \ > - -netdev vhost-user,id=3Dv,chardev=3Dc \ > - -device virtio-net,netdev=3Dv \ > -object memory-backend-memfd,id=3Dm,share=3Don,size=3D${__vmem} \ > -numa node,memdev=3Dm" > + > + if [ ${VHOST_USER_MQ} -gt 1 ]; then > + __qemu_netdev=3D"${__qemu_netdev} \ > + -device virtio-net,netdev=3Dv,mq=3Dtrue \ > + -netdev vhost-user,id=3Dv,chardev=3Dc,queues=3D${VHOST_USER_MQ}" > + else > + __qemu_netdev=3D"${__qemu_netdev} \ > + -device virtio-net,netdev=3Dv \ > + -netdev vhost-user,id=3Dv,chardev=3Dc" Is there a diffence for qemu between omitting queues=3D and using queues=3D1? If not we can simplify this. For the passt option it's worth explicitly not-setting it for the single-queue case, so that we're exercising the command line option as well. But exercising qemu's options is not our concern, so we can use queues=3D1 if it means the same thing as omitting it entirely. Otherwise LGTM. > + fi > else > __qemu_netdev=3D"-device virtio-net-pci,netdev=3Ds \ > -netdev stream,id=3Ds,server=3Doff,addr.type=3Dunix,addr.path=3D${STA= TESETUP}/passt.socket" > @@ -155,7 +166,8 @@ setup_passt_in_ns() { > [ ${PCAP} -eq 1 ] && __opts=3D"${__opts} -p ${LOGDIR}/passt_in_pasta.pc= ap" > [ ${DEBUG} -eq 1 ] && __opts=3D"${__opts} -d" > [ ${TRACE} -eq 1 ] && __opts=3D"${__opts} --trace" > - [ ${VHOST_USER} -eq 1 ] && __opts=3D"${__opts} --vhost-user" > + [ ${VHOST_USER} -eq 1 ] && __opts=3D"${__opts} --vhost-user" && \ > + [ ${VHOST_USER_MQ} -gt 1 ] && __opts=3D"${__opts} --max-qpairs ${VHOST_= USER_MQ}" > =20 > if [ ${VALGRIND} -eq 1 ]; then > context_run passt "make clean" > @@ -173,10 +185,18 @@ setup_passt_in_ns() { > __vmem=3D"$(((${__vmem} + 500) / 1000))G" > __qemu_netdev=3D" \ > -chardev socket,id=3Dc,path=3D${STATESETUP}/passt.socket \ > - -netdev vhost-user,id=3Dv,chardev=3Dc \ > - -device virtio-net,netdev=3Dv \ > -object memory-backend-memfd,id=3Dm,share=3Don,size=3D${__vmem} \ > -numa node,memdev=3Dm" > + > + if [ ${VHOST_USER_MQ} -gt 1 ]; then > + __qemu_netdev=3D"${__qemu_netdev} \ > + -device virtio-net,netdev=3Dv,mq=3Dtrue \ > + -netdev vhost-user,id=3Dv,chardev=3Dc,queues=3D${VHOST_USER_MQ}" > + else > + __qemu_netdev=3D"${__qemu_netdev} \ > + -device virtio-net,netdev=3Dv \ > + -netdev vhost-user,id=3Dv,chardev=3Dc" > + fi > else > __qemu_netdev=3D"-device virtio-net-pci,netdev=3Ds \ > -netdev stream,id=3Ds,server=3Doff,addr.type=3Dunix,addr.path=3D${STA= TESETUP}/passt.socket" > @@ -241,7 +261,8 @@ setup_two_guests() { > [ ${PCAP} -eq 1 ] && __opts=3D"${__opts} -p ${LOGDIR}/passt_1.pcap" > [ ${DEBUG} -eq 1 ] && __opts=3D"${__opts} -d" > [ ${TRACE} -eq 1 ] && __opts=3D"${__opts} --trace" > - [ ${VHOST_USER} -eq 1 ] && __opts=3D"${__opts} --vhost-user" > + [ ${VHOST_USER} -eq 1 ] && __opts=3D"${__opts} --vhost-user" && \ > + [ ${VHOST_USER_MQ} -gt 1 ] && __opts=3D"${__opts} --max-qpairs ${VHOST_= USER_MQ}" > =20 > context_run_bg passt_1 "./passt -s ${STATESETUP}/passt_1.socket -P ${ST= ATESETUP}/passt_1.pid -f ${__opts} --fqdn fqdn1.passt.test -H hostname1 -t = 10001 -u 10001" > wait_for [ -f "${STATESETUP}/passt_1.pid" ] > @@ -250,7 +271,8 @@ setup_two_guests() { > [ ${PCAP} -eq 1 ] && __opts=3D"${__opts} -p ${LOGDIR}/passt_2.pcap" > [ ${DEBUG} -eq 1 ] && __opts=3D"${__opts} -d" > [ ${TRACE} -eq 1 ] && __opts=3D"${__opts} --trace" > - [ ${VHOST_USER} -eq 1 ] && __opts=3D"${__opts} --vhost-user" > + [ ${VHOST_USER} -eq 1 ] && __opts=3D"${__opts} --vhost-user" && \ > + [ ${VHOST_USER_MQ} -gt 1 ] && __opts=3D"${__opts} --max-qpairs ${VHOST_= USER_MQ}" > =20 > context_run_bg passt_2 "./passt -s ${STATESETUP}/passt_2.socket -P ${ST= ATESETUP}/passt_2.pid -f ${__opts} --hostname hostname2 --fqdn fqdn2 -t 100= 04 -u 10004" > wait_for [ -f "${STATESETUP}/passt_2.pid" ] > @@ -260,16 +282,28 @@ setup_two_guests() { > __vmem=3D"$(((${__vmem} + 500) / 1000))G" > __qemu_netdev1=3D" \ > -chardev socket,id=3Dc,path=3D${STATESETUP}/passt_1.socket \ > - -netdev vhost-user,id=3Dv,chardev=3Dc \ > - -device virtio-net,netdev=3Dv \ > -object memory-backend-memfd,id=3Dm,share=3Don,size=3D${__vmem} \ > -numa node,memdev=3Dm" > __qemu_netdev2=3D" \ > -chardev socket,id=3Dc,path=3D${STATESETUP}/passt_2.socket \ > - -netdev vhost-user,id=3Dv,chardev=3Dc \ > - -device virtio-net,netdev=3Dv \ > -object memory-backend-memfd,id=3Dm,share=3Don,size=3D${__vmem} \ > -numa node,memdev=3Dm" > + > + if [ ${VHOST_USER_MQ} -gt 1 ]; then > + __qemu_netdev1=3D"${__qemu_netdev1} \ > + -device virtio-net,netdev=3Dv,mq=3Dtrue \ > + -netdev vhost-user,id=3Dv,chardev=3Dc,queues=3D${VHOST_USER_MQ}" > + __qemu_netdev2=3D"${__qemu_netdev2} \ > + -device virtio-net,netdev=3Dv,mq=3Dtrue \ > + -netdev vhost-user,id=3Dv,chardev=3Dc,queues=3D${VHOST_USER_MQ}" > + else > + __qemu_netdev1=3D"${__qemu_netdev1} \ > + -device virtio-net,netdev=3Dv \ > + -netdev vhost-user,id=3Dv,chardev=3Dc" > + __qemu_netdev2=3D"${__qemu_netdev2} \ > + -device virtio-net,netdev=3Dv \ > + -netdev vhost-user,id=3Dv,chardev=3Dc" > + fi > else > __qemu_netdev1=3D"-device virtio-net-pci,netdev=3Ds \ > -netdev stream,id=3Ds,server=3Doff,addr.type=3Dunix,addr.path=3D${STA= TESETUP}/passt_1.socket" > diff --git a/test/run b/test/run > index f858e5586847..652cc12b1234 100755 > --- a/test/run > +++ b/test/run > @@ -190,6 +190,29 @@ run() { > test passt_vu_in_ns/shutdown > teardown passt_in_ns > =20 > + VHOST_USER=3D1 > + VHOST_USER_MQ=3D8 > + setup passt_in_ns > + test passt_vu/ndp > + test passt_vu_in_ns/dhcp > + test passt_vu_in_ns/icmp > + test passt_vu_in_ns/tcp > + test passt_vu_in_ns/udp > + test passt_vu_in_ns/shutdown > + teardown passt_in_ns > + > + setup two_guests > + test two_guests_vu/basic > + teardown two_guests > + > + setup passt_in_ns > + test passt_vu/ndp > + test passt_vu_in_ns/dhcp > + test perf/passt_vu_tcp > + test perf/passt_vu_udp > + test passt_vu_in_ns/shutdown > + teardown passt_in_ns > + > # TODO: Make those faster by at least pre-installing gcc and make on > # non-x86 images, then re-enable. > skip_distro() { > --=20 > 2.51.0 >=20 --=20 David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson --2wLoCjLG0gt/mUHY Content-Type: application/pgp-signature; name=signature.asc -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEO+dNsU4E3yXUXRK2zQJF27ox2GcFAmkmd9EACgkQzQJF27ox 2GfjbRAAg82TJ/jndfb4C5vd2RyRgw5PsjEamfTk2RBL23wmn34K3jl4vMXCveV3 wxU5vJ7240s562JR71XyUd92qGU6z1jfHnW9OMbI5FetprEhx3l1+caZ4VfV1YOQ T2C43B8DT/rnq3fuMBNvi68xddz1e7fqHhyvF3DoDWi8mFSeWTv/I6BT+3PN/EUg exG96/zHQ4l+7+fUGMvchWrLPri6DcMpXWWtnhdEZC8LW2zjCA57gVcTGIBQRl9h 3prxDFKpZR17EMief1gg2gGybwC8NIgz5fdkEmAW/9Z5QojiWuqlPkIGrFEZtxvx tTWsGY9AVeGZIN+PJ1O6Z27+FWRTnwcgtMX9wZLp2UTJBdQwGPJPNk1FtkX4a4rA qKu7Ljhkvf/bntyOOKmpqkkcnAEBLsDnzhAnbMHy3oOVNxqJvvfUaix/XPuI3Hhg JXpHMPbspVibt/god18WVNRWp3bymNf+38Mm9xlpt9qfNTfMa+2FmoP5usmT2xoN RSuYW7aj33yJFvRJkHZ7B6/O1FmgYTGZgm8OdCc9TUn2hO2CDP2oynTlM1Sa5Vcz ba0cfdQJSyzXx9tX24Bt4MWlwMsqmvQYUVWAYyVi+eK8uRDjptLxicsdz2FCma9L UQtNNbPbrMbMDhSgSw9VzX770Ltm6VASTNvK507InMWlQBpYvqE= =DTqK -----END PGP SIGNATURE----- --2wLoCjLG0gt/mUHY--