diff mbox

build-sys: add --disable-vhost-user

Message ID 20170718163437.18001-1-marcandre.lureau@redhat.com
State New
Headers show

Commit Message

Marc-André Lureau July 18, 2017, 4:34 p.m. UTC
Learn to compile out vhost-user. Keep it enabled by default on
non-mingw, that is assumed to be on POSIX.

When trying to make a vhost-user netdev, it gives the following error:

-netdev vhost-user,id=foo,chardev=chr-test: Parameter 'type' expects a netdev backend type

And similar error with the HMP/QMP monitors.

In the future, we may want to hide vhost-user from QAPI/introspection
with conditional compilation, although the design of this hasn't been
fully fleshed out yet and shouldn't prevent this patch from being
applied.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/net/vhost_net.c                | 12 ++++++++++--
 hw/net/virtio-net.c               |  4 ++++
 hw/virtio/virtio-pci.c            |  4 ++--
 net/hub.c                         |  2 ++
 net/net.c                         |  4 +++-
 configure                         | 22 +++++++++++++++++++++-
 default-configs/pci.mak           |  2 +-
 default-configs/s390x-softmmu.mak |  2 +-
 net/Makefile.objs                 |  2 +-
 qemu-options.hx                   |  4 ++++
 tests/Makefile.include            |  6 +++---
 11 files changed, 52 insertions(+), 12 deletions(-)

Comments

no-reply@patchew.org July 18, 2017, 4:42 p.m. UTC | #1
Hi,

This series failed build test on FreeBSD host. Please find the details below.

Type: series
Subject: [Qemu-devel] [PATCH] build-sys: add --disable-vhost-user
Message-id: 20170718163437.18001-1-marcandre.lureau@redhat.com

=== TEST SCRIPT BEGIN ===
#!/bin/sh
# Testing script will be invoked under the git checkout with
# HEAD pointing to a commit that has the patches applied on top of "base"
# branch
set -e
echo "=== ENV ==="
env
echo "=== PACKAGES ==="
pkg info
echo "=== TEST BEGIN ==="
CC=/usr/local/libexec/ccache/cc
INSTALL=$PWD/install
BUILD=$PWD/build
echo -n "Using CC: "
realpath $CC
mkdir -p $BUILD $INSTALL
SRC=$PWD
cd $BUILD
$SRC/configure --cc=$CC --prefix=$INSTALL --target-list=x86_64-softmmu
gmake -j4
# XXX: we need reliable clean up
# make check -j4 V=1
gmake install
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
From https://github.com/patchew-project/qemu
 * [new tag]               patchew/20170718163437.18001-1-marcandre.lureau@redhat.com -> patchew/20170718163437.18001-1-marcandre.lureau@redhat.com
Switched to a new branch 'test'
163dfc1613 build-sys: add --disable-vhost-user

=== OUTPUT BEGIN ===
=== ENV ===
LOGNAME=patchew-tester
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
PWD=/var/tmp/patchew-tester-tmp-rj56yzun/src
HOME=/home/patchew-tester
USER=patchew-tester
SHELL=/bin/sh
PATCHEW=/home/patchew-tester/patchew/patchew-cli -s http://patchew.org --nodebug
=== PACKAGES ===
bash-4.4.12_2                  GNU Project's Bourne Again SHell
binutils-2.28,1                GNU binary tools
bison-3.0.4,1                  Parser generator from FSF, (mostly) compatible with Yacc
ca_root_nss-3.30.2             Root certificate bundle from the Mozilla Project
ccache-3.3.4_3                 Tool to minimize the compile time of C/C++ programs
curl-7.54.0                    Non-interactive tool to get files from FTP, GOPHER, HTTP(S) servers
cvsps-2.1_2                    Create patchset information from CVS
dtc-1.4.2_1                    Device Tree Compiler
expat-2.2.0_1                  XML 1.0 parser written in C
gcc-5.4.0                      GNU Compiler Collection 5
gcc-ecj-4.5                    Eclipse Java Compiler used to build GCC Java
gettext-runtime-0.19.8.1_1     GNU gettext runtime libraries and programs
git-2.13.0                     Distributed source code management tool
glib-2.46.2_5                  Some useful routines of C programming (current stable version)
gmake-4.2.1_1                  GNU version of 'make' utility
gmp-6.1.2                      Free library for arbitrary precision arithmetic
indexinfo-0.2.6                Utility to regenerate the GNU info page index
libffi-3.2.1                   Foreign Function Interface
libiconv-1.14_10               Character set conversion library
libnghttp2-1.21.0              HTTP/2.0 C Library
m4-1.4.18,1                    GNU M4
mpc-1.0.3                      Library of complex numbers with arbitrarily high precision
mpfr-3.1.5_1                   Library for multiple-precision floating-point computations
p5-Authen-SASL-2.16_1          Perl5 module for SASL authentication
p5-Digest-HMAC-1.03_1          Perl5 interface to HMAC Message-Digest Algorithms
p5-Error-0.17024               Error/exception handling in object-oriented programming style
p5-GSSAPI-0.28_1               Perl extension providing access to the GSSAPIv2 library
pcre-8.40                      Perl Compatible Regular Expressions library
perl5-5.24.1                   Practical Extraction and Report Language
pixman-0.34.0                  Low-level pixel manipulation library
pkg-1.10.1                     Package manager
pkgconf-1.3.0,1                Utility to help to configure compiler and linker flags
python-2.7_3,2                 "meta-port" for the default version of Python interpreter
python2-2_3                    The "meta-port" for version 2 of the Python interpreter
python27-2.7.13_3              Interpreted object-oriented programming language
python3-3_3                    The "meta-port" for version 3 of the Python interpreter
python35-3.5.3_1               Interpreted object-oriented programming language
readline-6.3.8                 Library for editing command lines as they are typed
sudo-1.8.20p1                  Allow others to run commands as root
=== TEST BEGIN ===
Using CC: /usr/local/bin/ccache
Install prefix    /var/tmp/patchew-tester-tmp-rj56yzun/src/install
BIOS directory    /var/tmp/patchew-tester-tmp-rj56yzun/src/install/share/qemu
binary directory  /var/tmp/patchew-tester-tmp-rj56yzun/src/install/bin
library directory /var/tmp/patchew-tester-tmp-rj56yzun/src/install/lib
module directory  /var/tmp/patchew-tester-tmp-rj56yzun/src/install/lib/qemu
libexec directory /var/tmp/patchew-tester-tmp-rj56yzun/src/install/libexec
include directory /var/tmp/patchew-tester-tmp-rj56yzun/src/install/include
config directory  /var/tmp/patchew-tester-tmp-rj56yzun/src/install/etc
local state directory   /var/tmp/patchew-tester-tmp-rj56yzun/src/install/var
Manual directory  /var/tmp/patchew-tester-tmp-rj56yzun/src/install/share/man
ELF interp prefix /usr/gnemul/qemu-%M
Source path       /var/tmp/patchew-tester-tmp-rj56yzun/src
C compiler        /usr/local/libexec/ccache/cc
Host C compiler   cc
C++ compiler      c++
Objective-C compiler clang
ARFLAGS           rv
CFLAGS            -O2 -g 
QEMU_CFLAGS       -I/usr/local/include/pixman-1   -pthread -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include -I/usr/local/include  -DNCURSES_WIDECHAR  -m64 -mcx16 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv  -Wno-string-plus-int -Wno-initializer-overrides -Wendif-labels -Wno-shift-negative-value -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-definition -Wtype-limits -fstack-protector-strong 
LDFLAGS           -Wl,--warn-common -m64 -g 
make              gmake
install           install
python            python -B
smbd              /usr/sbin/smbd
module support    no
host CPU          x86_64
host big endian   no
target list       x86_64-softmmu
gprof enabled     no
sparse enabled    no
strip binaries    yes
profiler          no
static build      no
pixman            system
SDL support       no 
GTK support       no 
GTK GL support    no
VTE support       no 
TLS priority      NORMAL
GNUTLS support    no
GNUTLS rnd        no
libgcrypt         no
libgcrypt kdf     no
nettle            no 
nettle kdf        no
libtasn1          no
curses support    yes
virgl support     no
curl support      yes
mingw32 support   no
Audio drivers     oss
Block whitelist (rw) 
Block whitelist (ro) 
VirtFS support    no
VNC support       yes
VNC SASL support  no
VNC JPEG support  no
VNC PNG support   no
xen support       no
brlapi support    no
bluez  support    no
Documentation     no
PIE               no
vde support       no
netmap support    yes
Linux AIO support no
ATTR/XATTR support no
Install blobs     yes
KVM support       no
HAX support       no
TCG support       yes
TCG debug enabled no
TCG interpreter   no
RDMA support      no
fdt support       no
preadv support    yes
fdatasync         no
madvise           yes
posix_madvise     yes
libcap-ng support no
vhost-net support no
vhost-scsi support no
vhost-vsock support no
vhost-user support yes
Trace backends    log
spice support     no 
rbd support       no
xfsctl support    no
smartcard support no
libusb            yes
usb net redir     no
OpenGL support    no
OpenGL dmabufs    no
libiscsi support  no
libnfs support    no
build guest agent yes
QGA VSS support   no
QGA w32 disk info no
QGA MSI support   no
seccomp support   no
coroutine backend ucontext
coroutine pool    yes
debug stack usage no
GlusterFS support no
gcov              gcov
gcov enabled      no
TPM support       yes
libssh2 support   no
TPM passthrough   no
QOM debugging     yes
Live block migration yes
lzo support       no
snappy support    no
bzip2 support     yes
NUMA host support no
tcmalloc support  no
jemalloc support  no
avx2 optimization no
replication support yes
VxHS block device no
  GEN     x86_64-softmmu/config-devices.mak.tmp
  GEN     config-host.h
  GEN     qemu-options.def
  GEN     qmp-commands.h
  GEN     x86_64-softmmu/config-devices.mak
  GEN     qapi-types.h
  GEN     qapi-visit.h
  GEN     qapi-event.h
  GEN     qmp-marshal.c
  GEN     qapi-types.c
  GEN     qapi-visit.c
  GEN     qapi-event.c
  GEN     qmp-introspect.h
  GEN     qmp-introspect.c
  GEN     trace/generated-tcg-tracers.h
  GEN     trace/generated-helpers-wrappers.h
  GEN     trace/generated-helpers.h
  GEN     trace/generated-helpers.c
  GEN     module_block.h
  GEN     tests/test-qapi-types.h
  GEN     tests/test-qapi-visit.h
  GEN     tests/test-qmp-commands.h
  GEN     tests/test-qapi-event.h
  GEN     tests/test-qmp-introspect.h
  GEN     trace-root.h
  GEN     util/trace.h
  GEN     crypto/trace.h
  GEN     io/trace.h
  GEN     migration/trace.h
  GEN     block/trace.h
  GEN     chardev/trace.h
  GEN     hw/block/trace.h
  GEN     hw/block/dataplane/trace.h
  GEN     hw/char/trace.h
  GEN     hw/intc/trace.h
  GEN     hw/net/trace.h
  GEN     hw/virtio/trace.h
  GEN     hw/audio/trace.h
  GEN     hw/misc/trace.h
  GEN     hw/usb/trace.h
  GEN     hw/scsi/trace.h
  GEN     hw/nvram/trace.h
  GEN     hw/display/trace.h
  GEN     hw/input/trace.h
  GEN     hw/timer/trace.h
  GEN     hw/dma/trace.h
  GEN     hw/sparc/trace.h
  GEN     hw/sd/trace.h
  GEN     hw/isa/trace.h
  GEN     hw/mem/trace.h
  GEN     hw/i386/trace.h
  GEN     hw/i386/xen/trace.h
  GEN     hw/9pfs/trace.h
  GEN     hw/ppc/trace.h
  GEN     hw/pci/trace.h
  GEN     hw/s390x/trace.h
  GEN     hw/vfio/trace.h
  GEN     hw/acpi/trace.h
  GEN     hw/arm/trace.h
  GEN     hw/alpha/trace.h
  GEN     hw/xen/trace.h
  GEN     ui/trace.h
  GEN     audio/trace.h
  GEN     net/trace.h
  GEN     target/arm/trace.h
  GEN     target/i386/trace.h
  GEN     target/mips/trace.h
  GEN     target/sparc/trace.h
  GEN     target/s390x/trace.h
  GEN     target/ppc/trace.h
  GEN     qom/trace.h
  GEN     linux-user/trace.h
  GEN     qapi/trace.h
  GEN     accel/tcg/trace.h
  GEN     accel/kvm/trace.h
  GEN     nbd/trace.h
  GEN     trace-root.c
  GEN     util/trace.c
  GEN     crypto/trace.c
  GEN     io/trace.c
  GEN     migration/trace.c
  GEN     block/trace.c
  GEN     chardev/trace.c
  GEN     hw/block/trace.c
  GEN     hw/block/dataplane/trace.c
  GEN     hw/char/trace.c
  GEN     hw/intc/trace.c
  GEN     hw/net/trace.c
  GEN     hw/virtio/trace.c
  GEN     hw/audio/trace.c
  GEN     hw/misc/trace.c
  GEN     hw/usb/trace.c
  GEN     hw/scsi/trace.c
  GEN     hw/nvram/trace.c
  GEN     hw/display/trace.c
  GEN     hw/input/trace.c
  GEN     hw/timer/trace.c
  GEN     hw/dma/trace.c
  GEN     hw/sparc/trace.c
  GEN     hw/sd/trace.c
  GEN     hw/isa/trace.c
  GEN     hw/mem/trace.c
  GEN     hw/i386/trace.c
  GEN     hw/i386/xen/trace.c
  GEN     hw/9pfs/trace.c
  GEN     hw/ppc/trace.c
  GEN     hw/pci/trace.c
  GEN     hw/s390x/trace.c
  GEN     hw/vfio/trace.c
  GEN     hw/acpi/trace.c
  GEN     hw/arm/trace.c
  GEN     hw/alpha/trace.c
  GEN     hw/xen/trace.c
  GEN     ui/trace.c
  GEN     audio/trace.c
  GEN     net/trace.c
  GEN     target/arm/trace.c
  GEN     target/i386/trace.c
  GEN     target/mips/trace.c
  GEN     target/sparc/trace.c
  GEN     target/s390x/trace.c
  GEN     target/ppc/trace.c
  GEN     qom/trace.c
  GEN     linux-user/trace.c
  GEN     qapi/trace.c
  GEN     accel/tcg/trace.c
  GEN     accel/kvm/trace.c
  GEN     nbd/trace.c
  GEN     config-all-devices.mak
  GEN     qga/qapi-generated/qga-qapi-types.h
  GEN     qga/qapi-generated/qga-qapi-visit.h
  GEN     qga/qapi-generated/qga-qmp-commands.h
  GEN     qga/qapi-generated/qga-qapi-types.c
  GEN     qga/qapi-generated/qga-qapi-visit.c
  GEN     qga/qapi-generated/qga-qmp-marshal.c
  CC      qmp-introspect.o
  CC      qapi-types.o
  CC      qapi-visit.o
  CC      qapi-event.o
  CC      qapi/qapi-visit-core.o
  CC      qapi/qapi-dealloc-visitor.o
  CC      qapi/qobject-input-visitor.o
  CC      qapi/qobject-output-visitor.o
  CC      qapi/qmp-registry.o
  CC      qapi/qmp-dispatch.o
  CC      qapi/string-input-visitor.o
  CC      qapi/string-output-visitor.o
  CC      qapi/opts-visitor.o
  CC      qapi/qapi-clone-visitor.o
  CC      qapi/qmp-event.o
  CC      qapi/qapi-util.o
  CC      qobject/qnull.o
  CC      qobject/qnum.o
  CC      qobject/qstring.o
  CC      qobject/qdict.o
  CC      qobject/qlist.o
  CC      qobject/qbool.o
  CC      qobject/qjson.o
  CC      qobject/qobject.o
  CC      qobject/json-lexer.o
  CC      qobject/json-streamer.o
  CC      qobject/json-parser.o
  CC      trace/control.o
  CC      trace/qmp.o
  CC      util/osdep.o
  CC      util/cutils.o
  CC      util/unicode.o
  CC      util/qemu-timer-common.o
  CC      util/bufferiszero.o
  CC      util/lockcnt.o
  CC      util/aiocb.o
  CC      util/async.o
  CC      util/thread-pool.o
  CC      util/qemu-timer.o
  CC      util/main-loop.o
  CC      util/iohandler.o
  CC      util/aio-posix.o
  CC      util/compatfd.o
  CC      util/event_notifier-posix.o
  CC      util/mmap-alloc.o
  CC      util/oslib-posix.o
  CC      util/qemu-openpty.o
  CC      util/qemu-thread-posix.o
  CC      util/memfd.o
  CC      util/envlist.o
  CC      util/path.o
  CC      util/module.o
  CC      util/host-utils.o
  CC      util/bitmap.o
  CC      util/bitops.o
  CC      util/hbitmap.o
  CC      util/fifo8.o
  CC      util/acl.o
  CC      util/cacheinfo.o
  CC      util/error.o
  CC      util/qemu-error.o
  CC      util/id.o
  CC      util/iov.o
  CC      util/qemu-config.o
  CC      util/qemu-sockets.o
  CC      util/uri.o
  CC      util/notify.o
  CC      util/qemu-option.o
  CC      util/qemu-progress.o
  CC      util/keyval.o
  CC      util/hexdump.o
  CC      util/crc32c.o
  CC      util/uuid.o
  CC      util/throttle.o
  CC      util/getauxval.o
  CC      util/readline.o
  CC      util/rcu.o
  CC      util/qemu-coroutine.o
  CC      util/qemu-coroutine-lock.o
  CC      util/qemu-coroutine-io.o
  CC      util/qemu-coroutine-sleep.o
  CC      util/coroutine-ucontext.o
  CC      util/buffer.o
  CC      util/timed-average.o
  CC      util/base64.o
  CC      util/log.o
  CC      util/qdist.o
  CC      util/qht.o
  CC      util/range.o
  CC      util/stats64.o
  CC      util/systemd.o
  CC      trace-root.o
  CC      util/trace.o
  CC      crypto/trace.o
  CC      io/trace.o
  CC      migration/trace.o
  CC      block/trace.o
  CC      chardev/trace.o
  CC      hw/block/trace.o
  CC      hw/block/dataplane/trace.o
  CC      hw/char/trace.o
  CC      hw/intc/trace.o
  CC      hw/net/trace.o
  CC      hw/virtio/trace.o
  CC      hw/audio/trace.o
  CC      hw/misc/trace.o
  CC      hw/usb/trace.o
  CC      hw/scsi/trace.o
  CC      hw/nvram/trace.o
  CC      hw/display/trace.o
  CC      hw/input/trace.o
  CC      hw/timer/trace.o
  CC      hw/dma/trace.o
  CC      hw/sparc/trace.o
  CC      hw/sd/trace.o
  CC      hw/isa/trace.o
  CC      hw/mem/trace.o
  CC      hw/i386/trace.o
  CC      hw/i386/xen/trace.o
  CC      hw/9pfs/trace.o
  CC      hw/ppc/trace.o
  CC      hw/pci/trace.o
  CC      hw/s390x/trace.o
  CC      hw/vfio/trace.o
  CC      hw/acpi/trace.o
  CC      hw/arm/trace.o
  CC      hw/alpha/trace.o
  CC      hw/xen/trace.o
  CC      ui/trace.o
  CC      audio/trace.o
  CC      net/trace.o
  CC      target/arm/trace.o
  CC      target/i386/trace.o
  CC      target/mips/trace.o
  CC      target/sparc/trace.o
  CC      target/s390x/trace.o
  CC      target/ppc/trace.o
  CC      qom/trace.o
  CC      linux-user/trace.o
  CC      qapi/trace.o
  CC      accel/tcg/trace.o
  CC      accel/kvm/trace.o
  CC      nbd/trace.o
  CC      crypto/pbkdf-stub.o
  CC      stubs/arch-query-cpu-def.o
  CC      stubs/arch-query-cpu-model-expansion.o
  CC      stubs/arch-query-cpu-model-comparison.o
  CC      stubs/arch-query-cpu-model-baseline.o
  CC      stubs/bdrv-next-monitor-owned.o
  CC      stubs/blk-commit-all.o
  CC      stubs/blockdev-close-all-bdrv-states.o
  CC      stubs/clock-warp.o
  CC      stubs/cpu-get-clock.o
  CC      stubs/cpu-get-icount.o
  CC      stubs/dump.o
  CC      stubs/error-printf.o
  CC      stubs/fdset.o
  CC      stubs/gdbstub.o
  CC      stubs/get-vm-name.o
  CC      stubs/iothread.o
  CC      stubs/iothread-lock.o
  CC      stubs/is-daemonized.o
  CC      stubs/machine-init-done.o
  CC      stubs/migr-blocker.o
  CC      stubs/monitor.o
  CC      stubs/notify-event.o
  CC      stubs/qtest.o
  CC      stubs/replay.o
  CC      stubs/runstate-check.o
  CC      stubs/set-fd-handler.o
  CC      stubs/slirp.o
  CC      stubs/sysbus.o
  CC      stubs/trace-control.o
  CC      stubs/uuid.o
  CC      stubs/vm-stop.o
  CC      stubs/vmstate.o
  CC      stubs/qmp_pc_dimm_device_list.o
  CC      stubs/target-monitor-defs.o
  CC      stubs/target-get-monitor-def.o
  CC      stubs/pc_madt_cpu_entry.o
  CC      stubs/vmgenid.o
  CC      stubs/xen-common.o
  CC      stubs/xen-hvm.o
  CC      contrib/ivshmem-client/ivshmem-client.o
  CC      contrib/ivshmem-client/main.o
  CC      contrib/ivshmem-server/ivshmem-server.o
  CC      contrib/ivshmem-server/main.o
  CC      qemu-nbd.o
  CC      blockjob.o
  CC      block.o
  CC      qemu-io-cmds.o
  CC      replication.o
  CC      block/raw-format.o
  CC      block/qcow.o
  CC      block/vdi.o
  CC      block/vmdk.o
  CC      block/cloop.o
  CC      block/bochs.o
  CC      block/vpc.o
  CC      block/vvfat.o
  CC      block/dmg.o
  CC      block/qcow2.o
  CC      block/qcow2-refcount.o
  CC      block/qcow2-cluster.o
  CC      block/qcow2-snapshot.o
  CC      block/qcow2-cache.o
  CC      block/qcow2-bitmap.o
  CC      block/qed.o
  CC      block/qed-l2-cache.o
  CC      block/qed-table.o
  CC      block/qed-cluster.o
  CC      block/qed-check.o
  CC      block/vhdx.o
  CC      block/vhdx-endian.o
  CC      block/vhdx-log.o
  CC      block/quorum.o
  CC      block/parallels.o
  CC      block/blkdebug.o
  CC      block/blkverify.o
  CC      block/blkreplay.o
  CC      block/block-backend.o
  CC      block/snapshot.o
  CC      block/qapi.o
  CC      block/file-posix.o
  CC      block/null.o
  CC      block/mirror.o
  CC      block/commit.o
  CC      block/io.o
  CC      block/throttle-groups.o
  CC      block/nbd.o
  CC      block/nbd-client.o
  CC      block/sheepdog.o
  CC      block/accounting.o
  CC      block/dirty-bitmap.o
  CC      block/write-threshold.o
  CC      block/backup.o
  CC      block/replication.o
  CC      block/crypto.o
  CC      nbd/server.o
  CC      nbd/client.o
  CC      nbd/common.o
  CC      block/curl.o
  CC      block/dmg-bz2.o
  CC      crypto/init.o
  CC      crypto/hash.o
  CC      crypto/hash-glib.o
  CC      crypto/hmac.o
  CC      crypto/hmac-glib.o
  CC      crypto/aes.o
  CC      crypto/desrfb.o
  CC      crypto/cipher.o
  CC      crypto/tlscreds.o
  CC      crypto/tlscredsanon.o
  CC      crypto/tlscredsx509.o
  CC      crypto/tlssession.o
  CC      crypto/secret.o
  CC      crypto/random-platform.o
  CC      crypto/pbkdf.o
  CC      crypto/ivgen.o
  CC      crypto/ivgen-essiv.o
  CC      crypto/ivgen-plain.o
  CC      crypto/ivgen-plain64.o
  CC      crypto/afsplit.o
  CC      crypto/xts.o
  CC      crypto/block.o
  CC      crypto/block-qcow.o
  CC      crypto/block-luks.o
  CC      io/channel.o
  CC      io/channel-buffer.o
  CC      io/channel-command.o
  CC      io/channel-file.o
  CC      io/channel-socket.o
  CC      io/channel-tls.o
  CC      io/channel-watch.o
  CC      io/channel-websock.o
  CC      io/channel-util.o
  CC      io/dns-resolver.o
  CC      io/task.o
  CC      qom/object.o
  CC      qom/container.o
  CC      qom/qom-qobject.o
  CC      qom/object_interfaces.o
  GEN     qemu-img-cmds.h
  CC      qemu-io.o
  CC      blockdev.o
  CC      blockdev-nbd.o
  CC      bootdevice.o
  CC      iothread.o
  CC      qdev-monitor.o
  CC      device-hotplug.o
  CC      os-posix.o
  CC      bt-host.o
  CC      bt-vhci.o
  CC      dma-helpers.o
  CC      vl.o
  CC      tpm.o
  CC      qmp-marshal.o
  CC      qmp.o
  CC      hmp.o
  CC      cpus-common.o
  CC      audio/audio.o
  CC      audio/noaudio.o
  CC      audio/wavaudio.o
  CC      audio/mixeng.o
  CC      audio/ossaudio.o
  CC      audio/wavcapture.o
  CC      backends/rng.o
  CC      backends/rng-egd.o
  CC      backends/rng-random.o
  CC      backends/tpm.o
  CC      backends/hostmem.o
  CC      backends/hostmem-ram.o
  CC      backends/cryptodev.o
  CC      backends/cryptodev-builtin.o
  CC      block/stream.o
  CC      chardev/msmouse.o
  CC      chardev/wctablet.o
  CC      chardev/testdev.o
  CC      disas/i386.o
  CC      hw/acpi/core.o
  CC      hw/acpi/piix4.o
  CC      hw/acpi/pcihp.o
  CC      hw/acpi/ich9.o
  CC      hw/acpi/tco.o
  CC      hw/acpi/cpu_hotplug.o
  CC      hw/acpi/memory_hotplug.o
  CC      hw/acpi/cpu.o
  CC      hw/acpi/nvdimm.o
  CC      hw/acpi/vmgenid.o
  CC      hw/acpi/acpi_interface.o
  CC      hw/acpi/bios-linker-loader.o
  CC      hw/acpi/aml-build.o
  CC      hw/acpi/ipmi.o
  CC      hw/acpi/acpi-stub.o
  CC      hw/acpi/ipmi-stub.o
  CC      hw/audio/sb16.o
  CC      hw/audio/es1370.o
  CC      hw/audio/ac97.o
  CC      hw/audio/fmopl.o
  CC      hw/audio/adlib.o
  CC      hw/audio/gus.o
  CC      hw/audio/gusemu_hal.o
  CC      hw/audio/gusemu_mixer.o
  CC      hw/audio/cs4231a.o
  CC      hw/audio/intel-hda.o
  CC      hw/audio/hda-codec.o
  CC      hw/audio/pcspk.o
  CC      hw/audio/soundhw.o
  CC      hw/block/block.o
  CC      hw/block/cdrom.o
  CC      hw/block/hd-geometry.o
  CC      hw/block/fdc.o
  CC      hw/block/pflash_cfi01.o
  CC      hw/block/nvme.o
  CC      hw/bt/core.o
  CC      hw/bt/l2cap.o
  CC      hw/bt/sdp.o
  CC      hw/bt/hci.o
  CC      hw/bt/hid.o
  CC      hw/bt/hci-csr.o
  CC      hw/char/ipoctal232.o
  CC      hw/char/parallel.o
  CC      hw/char/serial.o
  CC      hw/char/serial-isa.o
  CC      hw/char/serial-pci.o
  CC      hw/char/virtio-console.o
  CC      hw/char/debugcon.o
  CC      hw/core/qdev.o
  CC      hw/core/qdev-properties.o
  CC      hw/core/bus.o
  CC      hw/core/reset.o
  CC      hw/core/fw-path-provider.o
  CC      hw/core/irq.o
  CC      hw/core/hotplug.o
  CC      hw/core/nmi.o
  CC      hw/core/sysbus.o
  CC      hw/core/machine.o
  CC      hw/core/loader.o
  CC      hw/core/qdev-properties-system.o
  CC      hw/core/register.o
  CC      hw/core/or-irq.o
  CC      hw/cpu/core.o
  CC      hw/display/cirrus_vga.o
  CC      hw/display/vga-pci.o
  CC      hw/display/vga-isa.o
  CC      hw/display/vmware_vga.o
  CC      hw/dma/i8257.o
  CC      hw/i2c/core.o
  CC      hw/i2c/smbus.o
  CC      hw/i2c/smbus_eeprom.o
  CC      hw/i2c/smbus_ich9.o
  CC      hw/i2c/pm_smbus.o
  CC      hw/ide/core.o
  CC      hw/ide/atapi.o
  CC      hw/ide/qdev.o
  CC      hw/ide/pci.o
  CC      hw/ide/isa.o
  CC      hw/ide/piix.o
  CC      hw/ide/ahci.o
  CC      hw/ide/ich.o
  CC      hw/input/hid.o
  CC      hw/input/pckbd.o
  CC      hw/input/ps2.o
  CC      hw/input/vmmouse.o
  CC      hw/input/virtio-input.o
  CC      hw/input/virtio-input-hid.o
  CC      hw/intc/i8259_common.o
  CC      hw/intc/i8259.o
  CC      hw/intc/ioapic_common.o
  CC      hw/intc/intc.o
  CC      hw/ipack/ipack.o
  CC      hw/ipack/tpci200.o
  CC      hw/ipmi/ipmi.o
  CC      hw/ipmi/ipmi_bmc_sim.o
  CC      hw/ipmi/ipmi_bmc_extern.o
  CC      hw/ipmi/isa_ipmi_kcs.o
  CC      hw/ipmi/isa_ipmi_bt.o
  CC      hw/isa/isa-bus.o
  CC      hw/isa/apm.o
  CC      hw/mem/pc-dimm.o
  CC      hw/mem/nvdimm.o
  CC      hw/misc/applesmc.o
  CC      hw/misc/debugexit.o
  CC      hw/misc/sga.o
  CC      hw/misc/pc-testdev.o
  CC      hw/misc/pci-testdev.o
  CC      hw/misc/edu.o
  CC      hw/misc/unimp.o
  CC      hw/net/ne2000.o
  CC      hw/net/eepro100.o
  CC      hw/net/pcnet-pci.o
  CC      hw/net/pcnet.o
  CC      hw/net/e1000.o
  CC      hw/net/e1000x_common.o
  CC      hw/net/net_tx_pkt.o
  CC      hw/net/net_rx_pkt.o
  CC      hw/net/e1000e.o
  CC      hw/net/e1000e_core.o
  CC      hw/net/rtl8139.o
  CC      hw/net/vmxnet3.o
  CC      hw/net/ne2000-isa.o
  CC      hw/net/rocker/rocker.o
  CC      hw/net/rocker/rocker_fp.o
  CC      hw/net/rocker/rocker_desc.o
  CC      hw/net/rocker/rocker_world.o
  CC      hw/net/rocker/rocker_of_dpa.o
  CC      hw/nvram/eeprom93xx.o
  CC      hw/nvram/fw_cfg.o
  CC      hw/nvram/chrp_nvram.o
  CC      hw/pci-bridge/pci_bridge_dev.o
  CC      hw/pci-bridge/pcie_root_port.o
  CC      hw/pci-bridge/gen_pcie_root_port.o
  CC      hw/pci-bridge/pci_expander_bridge.o
  CC      hw/pci-bridge/xio3130_upstream.o
  CC      hw/pci-bridge/xio3130_downstream.o
  CC      hw/pci-bridge/ioh3420.o
  CC      hw/pci-bridge/i82801b11.o
  CC      hw/pci-host/pam.o
  CC      hw/pci-host/piix.o
  CC      hw/pci-host/q35.o
  CC      hw/pci/pci.o
  CC      hw/pci/pci_bridge.o
  CC      hw/pci/msix.o
  CC      hw/pci/msi.o
  CC      hw/pci/shpc.o
  CC      hw/pci/slotid_cap.o
  CC      hw/pci/pci_host.o
  CC      hw/pci/pcie_host.o
  CC      hw/pci/pcie.o
  CC      hw/pci/pcie_aer.o
  CC      hw/pci/pcie_port.o
  CC      hw/pci/pci-stub.o
  CC      hw/pcmcia/pcmcia.o
  CC      hw/scsi/scsi-disk.o
  CC      hw/scsi/scsi-generic.o
  CC      hw/scsi/scsi-bus.o
  CC      hw/scsi/lsi53c895a.o
  CC      hw/scsi/mptsas.o
  CC      hw/scsi/mptconfig.o
  CC      hw/scsi/mptendian.o
  CC      hw/scsi/megasas.o
  CC      hw/scsi/vmw_pvscsi.o
  CC      hw/scsi/esp.o
  CC      hw/scsi/esp-pci.o
  CC      hw/sd/sd.o
  CC      hw/sd/core.o
  CC      hw/sd/sdhci.o
  CC      hw/smbios/smbios.o
  CC      hw/smbios/smbios_type_38.o
  CC      hw/smbios/smbios-stub.o
  CC      hw/smbios/smbios_type_38-stub.o
  CC      hw/timer/hpet.o
  CC      hw/timer/i8254_common.o
  CC      hw/timer/i8254.o
  CC      hw/tpm/tpm_tis.o
  CC      hw/usb/core.o
  CC      hw/usb/combined-packet.o
  CC      hw/usb/bus.o
  CC      hw/usb/libhw.o
  CC      hw/usb/desc.o
  CC      hw/usb/desc-msos.o
  CC      hw/usb/hcd-uhci.o
  CC      hw/usb/hcd-ohci.o
  CC      hw/usb/hcd-ehci.o
  CC      hw/usb/hcd-ehci-pci.o
  CC      hw/usb/hcd-xhci.o
  CC      hw/usb/hcd-xhci-nec.o
  CC      hw/usb/dev-hub.o
  CC      hw/usb/dev-hid.o
  CC      hw/usb/dev-wacom.o
  CC      hw/usb/dev-storage.o
  CC      hw/usb/dev-uas.o
  CC      hw/usb/dev-audio.o
  CC      hw/usb/dev-serial.o
  CC      hw/usb/dev-network.o
  CC      hw/usb/dev-bluetooth.o
  CC      hw/usb/dev-smartcard-reader.o
  CC      hw/usb/dev-mtp.o
  CC      hw/usb/host-libusb.o
  CC      hw/usb/host-legacy.o
  CC      hw/virtio/virtio-rng.o
  CC      hw/virtio/virtio-pci.o
  CC      hw/virtio/virtio-bus.o
  CC      hw/virtio/virtio-mmio.o
  CC      hw/virtio/vhost-stub.o
  CC      hw/watchdog/watchdog.o
  CC      hw/watchdog/wdt_i6300esb.o
  CC      hw/watchdog/wdt_ib700.o
  CC      migration/migration.o
  CC      migration/socket.o
  CC      migration/fd.o
  CC      migration/exec.o
  CC      migration/tls.o
  CC      migration/channel.o
  CC      migration/savevm.o
  CC      migration/colo-comm.o
  CC      migration/colo.o
  CC      migration/colo-failover.o
  CC      migration/vmstate.o
  CC      migration/vmstate-types.o
  CC      migration/page_cache.o
  CC      migration/qemu-file.o
  CC      migration/global_state.o
  CC      migration/qemu-file-channel.o
  CC      migration/xbzrle.o
  CC      migration/postcopy-ram.o
  CC      migration/qjson.o
  CC      migration/block.o
  CC      net/net.o
  CC      net/queue.o
  CC      net/checksum.o
  CC      net/util.o
  CC      net/hub.o
  CC      net/socket.o
  CC      net/dump.o
  CC      net/eth.o
  CC      net/vhost-user.o
  CC      net/slirp.o
  CC      net/netmap.o
  CC      net/filter.o
  CC      net/filter-buffer.o
  CC      net/filter-mirror.o
  CC      net/colo-compare.o
  CC      net/colo.o
  CC      net/filter-rewriter.o
  CC      net/filter-replay.o
  CC      net/tap.o
  CC      net/tap-bsd.o
  CC      qom/cpu.o
  CC      replay/replay.o
  CC      replay/replay-internal.o
  CC      replay/replay-events.o
  CC      replay/replay-time.o
  CC      replay/replay-input.o
  CC      replay/replay-char.o
  CC      replay/replay-snapshot.o
  CC      replay/replay-net.o
  CC      replay/replay-audio.o
  CC      slirp/cksum.o
  CC      slirp/if.o
  CC      slirp/ip_icmp.o
  CC      slirp/ip6_icmp.o
  CC      slirp/ip6_input.o
  CC      slirp/ip6_output.o
  CC      slirp/ip_input.o
  CC      slirp/ip_output.o
  CC      slirp/dnssearch.o
  CC      slirp/dhcpv6.o
  CC      slirp/slirp.o
  CC      slirp/mbuf.o
  CC      slirp/misc.o
  CC      slirp/sbuf.o
  CC      slirp/socket.o
  CC      slirp/tcp_input.o
  CC      slirp/tcp_output.o
  CC      slirp/tcp_subr.o
  CC      slirp/tcp_timer.o
  CC      slirp/udp.o
  CC      slirp/udp6.o
  CC      slirp/bootp.o
  CC      slirp/tftp.o
  CC      slirp/arp_table.o
  CC      slirp/ndp_table.o
  CC      slirp/ncsi.o
  CC      ui/keymaps.o
  CC      ui/console.o
  CC      ui/cursor.o
  CC      ui/qemu-pixman.o
  CC      ui/input.o
  CC      ui/input-keymap.o
  CC      ui/input-legacy.o
  CC      ui/curses.o
  CC      ui/vnc.o
  CC      ui/vnc-enc-zlib.o
  CC      ui/vnc-enc-hextile.o
  CC      ui/vnc-enc-tight.o
  CC      ui/vnc-palette.o
  CC      ui/vnc-enc-zrle.o
  CC      ui/vnc-auth-vencrypt.o
  CC      ui/vnc-ws.o
  CC      ui/vnc-jobs.o
  CC      chardev/char.o
  CC      chardev/char-fd.o
  CC      chardev/char-fe.o
  CC      chardev/char-file.o
  CC      chardev/char-io.o
  CC      chardev/char-mux.o
  CC      chardev/char-null.o
  CC      chardev/char-parallel.o
  CC      chardev/char-pipe.o
  CC      chardev/char-pty.o
  CC      chardev/char-ringbuf.o
  CC      chardev/char-serial.o
  CC      chardev/char-socket.o
  CC      chardev/char-stdio.o
  CC      chardev/char-udp.o
  AS      optionrom/multiboot.o
  AS      optionrom/linuxboot.o
  CC      optionrom/linuxboot_dma.o
  AS      optionrom/kvmvapic.o
  BUILD   optionrom/multiboot.img
  BUILD   optionrom/linuxboot.img
  BUILD   optionrom/linuxboot_dma.img
  BUILD   optionrom/kvmvapic.img
  BUILD   optionrom/multiboot.raw
  BUILD   optionrom/linuxboot.raw
  BUILD   optionrom/linuxboot_dma.raw
  BUILD   optionrom/kvmvapic.raw
  SIGN    optionrom/multiboot.bin
  SIGN    optionrom/linuxboot.bin
  SIGN    optionrom/linuxboot_dma.bin
  SIGN    optionrom/kvmvapic.bin
  CC      qga/commands.o
  CC      qga/guest-agent-command-state.o
  CC      qga/main.o
  CC      qga/commands-posix.o
  CC      qga/channel-posix.o
  CC      qga/qapi-generated/qga-qapi-types.o
  CC      qga/qapi-generated/qga-qapi-visit.o
  CC      qga/qapi-generated/qga-qmp-marshal.o
  AR      libqemuutil.a
  AR      libqemustub.a
  CC      qemu-img.o
  LINK    qemu-io
  LINK    ivshmem-client
  LINK    ivshmem-server
  LINK    qemu-nbd
  LINK    qemu-ga
  GEN     x86_64-softmmu/hmp-commands.h
  GEN     x86_64-softmmu/hmp-commands-info.h
  GEN     x86_64-softmmu/config-target.h
  CC      x86_64-softmmu/exec.o
  CC      x86_64-softmmu/tcg/tcg.o
  CC      x86_64-softmmu/tcg/tcg-op.o
  CC      x86_64-softmmu/tcg/optimize.o
  LINK    qemu-img
  CC      x86_64-softmmu/tcg/tcg-common.o
  CC      x86_64-softmmu/tcg/tcg-runtime.o
  CC      x86_64-softmmu/fpu/softfloat.o
  CC      x86_64-softmmu/disas.o
  GEN     x86_64-softmmu/gdbstub-xml.c
  CC      x86_64-softmmu/hax-stub.o
  CC      x86_64-softmmu/arch_init.o
  CC      x86_64-softmmu/cpus.o
  CC      x86_64-softmmu/monitor.o
  CC      x86_64-softmmu/gdbstub.o
  CC      x86_64-softmmu/balloon.o
  CC      x86_64-softmmu/ioport.o
  CC      x86_64-softmmu/numa.o
  CC      x86_64-softmmu/qtest.o
  CC      x86_64-softmmu/memory.o
  CC      x86_64-softmmu/memory_mapping.o
  CC      x86_64-softmmu/dump.o
  CC      x86_64-softmmu/migration/ram.o
  CC      x86_64-softmmu/accel/accel.o
  CC      x86_64-softmmu/accel/stubs/kvm-stub.o
  CC      x86_64-softmmu/accel/tcg/tcg-all.o
  CC      x86_64-softmmu/accel/tcg/cputlb.o
  CC      x86_64-softmmu/accel/tcg/cpu-exec.o
  CC      x86_64-softmmu/accel/tcg/cpu-exec-common.o
  CC      x86_64-softmmu/accel/tcg/translate-all.o
  CC      x86_64-softmmu/hw/block/virtio-blk.o
  CC      x86_64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      x86_64-softmmu/hw/char/virtio-serial-bus.o
  CC      x86_64-softmmu/hw/core/generic-loader.o
  CC      x86_64-softmmu/hw/core/null-machine.o
  CC      x86_64-softmmu/hw/display/vga.o
  CC      x86_64-softmmu/hw/display/virtio-gpu.o
  CC      x86_64-softmmu/hw/display/virtio-gpu-3d.o
  CC      x86_64-softmmu/hw/display/virtio-gpu-pci.o
  CC      x86_64-softmmu/hw/display/virtio-vga.o
  CC      x86_64-softmmu/hw/intc/apic.o
  CC      x86_64-softmmu/hw/intc/apic_common.o
  CC      x86_64-softmmu/hw/intc/ioapic.o
  CC      x86_64-softmmu/hw/isa/lpc_ich9.o
  CC      x86_64-softmmu/hw/misc/vmport.o
  CC      x86_64-softmmu/hw/misc/pvpanic.o
  CC      x86_64-softmmu/hw/misc/mmio_interface.o
  CC      x86_64-softmmu/hw/net/virtio-net.o
  CC      x86_64-softmmu/hw/net/vhost_net.o
  CC      x86_64-softmmu/hw/scsi/virtio-scsi.o
  CC      x86_64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      x86_64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      x86_64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      x86_64-softmmu/hw/timer/mc146818rtc.o
  CC      x86_64-softmmu/hw/virtio/virtio.o
  CC      x86_64-softmmu/hw/virtio/virtio-balloon.o
  CC      x86_64-softmmu/hw/virtio/virtio-crypto.o
  CC      x86_64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      x86_64-softmmu/hw/i386/multiboot.o
  CC      x86_64-softmmu/hw/i386/pc.o
  CC      x86_64-softmmu/hw/i386/pc_piix.o
  CC      x86_64-softmmu/hw/i386/pc_q35.o
  CC      x86_64-softmmu/hw/i386/pc_sysfw.o
  CC      x86_64-softmmu/hw/i386/x86-iommu.o
  CC      x86_64-softmmu/hw/i386/intel_iommu.o
  CC      x86_64-softmmu/hw/i386/amd_iommu.o
  CC      x86_64-softmmu/hw/i386/kvmvapic.o
  CC      x86_64-softmmu/hw/i386/acpi-build.o
  CC      x86_64-softmmu/hw/i386/pci-assign-load-rom.o
  CC      x86_64-softmmu/target/i386/helper.o
  CC      x86_64-softmmu/target/i386/cpu.o
  CC      x86_64-softmmu/target/i386/gdbstub.o
  CC      x86_64-softmmu/target/i386/xsave_helper.o
  CC      x86_64-softmmu/target/i386/translate.o
  CC      x86_64-softmmu/target/i386/bpt_helper.o
  CC      x86_64-softmmu/target/i386/cc_helper.o
  CC      x86_64-softmmu/target/i386/excp_helper.o
  CC      x86_64-softmmu/target/i386/fpu_helper.o
  CC      x86_64-softmmu/target/i386/int_helper.o
  CC      x86_64-softmmu/target/i386/mem_helper.o
  CC      x86_64-softmmu/target/i386/misc_helper.o
  CC      x86_64-softmmu/target/i386/mpx_helper.o
  CC      x86_64-softmmu/target/i386/seg_helper.o
  CC      x86_64-softmmu/target/i386/smm_helper.o
  CC      x86_64-softmmu/target/i386/svm_helper.o
  CC      x86_64-softmmu/target/i386/machine.o
  CC      x86_64-softmmu/target/i386/arch_memory_mapping.o
  CC      x86_64-softmmu/target/i386/arch_dump.o
  CC      x86_64-softmmu/target/i386/monitor.o
  CC      x86_64-softmmu/target/i386/kvm-stub.o
  GEN     trace/generated-helpers.c
  CC      x86_64-softmmu/trace/control-target.o
  CC      x86_64-softmmu/gdbstub-xml.o
  CC      x86_64-softmmu/trace/generated-helpers.o
  LINK    x86_64-softmmu/qemu-system-x86_64
hw/scsi/vhost-scsi-common.o: In function `vhost_scsi_common_start':
/var/tmp/patchew-tester-tmp-rj56yzun/src/hw/scsi/vhost-scsi-common.c:41: undefined reference to `vhost_dev_enable_notifiers'
/var/tmp/patchew-tester-tmp-rj56yzun/src/hw/scsi/vhost-scsi-common.c:53: undefined reference to `vhost_dev_start'
/var/tmp/patchew-tester-tmp-rj56yzun/src/hw/scsi/vhost-scsi-common.c:64: undefined reference to `vhost_virtqueue_mask'
/var/tmp/patchew-tester-tmp-rj56yzun/src/hw/scsi/vhost-scsi-common.c:72: undefined reference to `vhost_dev_disable_notifiers'
hw/scsi/vhost-scsi-common.o: In function `vhost_scsi_common_stop':
/var/tmp/patchew-tester-tmp-rj56yzun/src/hw/scsi/vhost-scsi-common.c:83: undefined reference to `vhost_dev_stop'
/var/tmp/patchew-tester-tmp-rj56yzun/src/hw/scsi/vhost-scsi-common.c:93: undefined reference to `vhost_dev_disable_notifiers'
hw/scsi/vhost-scsi-common.o: In function `vhost_scsi_common_get_features':
/var/tmp/patchew-tester-tmp-rj56yzun/src/hw/scsi/vhost-scsi-common.c:101: undefined reference to `vhost_get_features'
hw/scsi/vhost-user-scsi.o: In function `vhost_user_scsi_realize':
/var/tmp/patchew-tester-tmp-rj56yzun/src/hw/scsi/vhost-user-scsi.c:94: undefined reference to `vhost_dev_init'
hw/scsi/vhost-user-scsi.o: In function `vhost_user_scsi_unrealize':
/var/tmp/patchew-tester-tmp-rj56yzun/src/hw/scsi/vhost-user-scsi.c:117: undefined reference to `vhost_dev_cleanup'
c++: error: linker command failed with exit code 1 (use -v to see invocation)
gmake[1]: *** [Makefile:197: qemu-system-x86_64] Error 1
gmake: *** [Makefile:328: subdir-x86_64-softmmu] Error 2
=== OUTPUT END ===

Test command exited with code: 2


---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@freelists.org
Michael S. Tsirkin July 18, 2017, 8:17 p.m. UTC | #2
On Tue, Jul 18, 2017 at 06:34:37PM +0200, Marc-André Lureau wrote:
> Learn to compile out vhost-user. Keep it enabled by default on
> non-mingw, that is assumed to be on POSIX.
> 
> When trying to make a vhost-user netdev, it gives the following error:
> 
> -netdev vhost-user,id=foo,chardev=chr-test: Parameter 'type' expects a netdev backend type
> 
> And similar error with the HMP/QMP monitors.
> 
> In the future, we may want to hide vhost-user from QAPI/introspection
> with conditional compilation, although the design of this hasn't been
> fully fleshed out yet and shouldn't prevent this patch from being
> applied.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

What's the reason we want to do this though?

> ---
>  hw/net/vhost_net.c                | 12 ++++++++++--
>  hw/net/virtio-net.c               |  4 ++++
>  hw/virtio/virtio-pci.c            |  4 ++--
>  net/hub.c                         |  2 ++
>  net/net.c                         |  4 +++-
>  configure                         | 22 +++++++++++++++++++++-
>  default-configs/pci.mak           |  2 +-
>  default-configs/s390x-softmmu.mak |  2 +-
>  net/Makefile.objs                 |  2 +-
>  qemu-options.hx                   |  4 ++++
>  tests/Makefile.include            |  6 +++---
>  11 files changed, 52 insertions(+), 12 deletions(-)
> 
> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> index e037db63a3..565a1cc99d 100644
> --- a/hw/net/vhost_net.c
> +++ b/hw/net/vhost_net.c
> @@ -56,6 +56,7 @@ static const int kernel_feature_bits[] = {
>      VHOST_INVALID_FEATURE_BIT
>  };
>  
> +#ifdef CONFIG_VHOST_USER
>  /* Features supported by others. */
>  static const int user_feature_bits[] = {
>      VIRTIO_F_NOTIFY_ON_EMPTY,
> @@ -86,6 +87,7 @@ static const int user_feature_bits[] = {
>  
>      VHOST_INVALID_FEATURE_BIT
>  };
> +#endif
>  
>  static const int *vhost_net_get_feature_bits(struct vhost_net *net)
>  {
> @@ -95,9 +97,11 @@ static const int *vhost_net_get_feature_bits(struct vhost_net *net)
>      case NET_CLIENT_DRIVER_TAP:
>          feature_bits = kernel_feature_bits;
>          break;
> +#ifdef CONFIG_VHOST_USER
>      case NET_CLIENT_DRIVER_VHOST_USER:
>          feature_bits = user_feature_bits;
>          break;
> +#endif
>      default:
>          error_report("Feature bits not defined for this type: %d",
>                  net->nc->info->type);
> @@ -193,6 +197,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
>          }
>      }
>  
> +#ifdef CONFIG_VHOST_USER
>      /* Set sane init value. Override when guest acks. */
>      if (net->nc->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
>          features = vhost_user_get_acked_features(net->nc);
> @@ -203,7 +208,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
>              goto fail;
>          }
>      }
> -
> +#endif
>      vhost_net_ack_features(net, features);
>  
>      return net;
> @@ -309,6 +314,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
>          net = get_vhost_net(ncs[i].peer);
>          vhost_net_set_vq_index(net, i * 2);
>  
> +#ifdef CONFIG_VHOST_USER
>          /* Suppress the masking guest notifiers on vhost user
>           * because vhost user doesn't interrupt masking/unmasking
>           * properly.
> @@ -316,8 +322,8 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
>          if (net->nc->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
>              dev->use_guest_notifier_mask = false;
>          }
> +#endif
>       }
> -
>      r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true);
>      if (r < 0) {
>          error_report("Error binding guest notifier: %d", -r);
> @@ -414,10 +420,12 @@ VHostNetState *get_vhost_net(NetClientState *nc)
>      case NET_CLIENT_DRIVER_TAP:
>          vhost_net = tap_get_vhost_net(nc);
>          break;
> +#ifdef CONFIG_VHOST_USER
>      case NET_CLIENT_DRIVER_VHOST_USER:
>          vhost_net = vhost_user_get_vhost_net(nc);
>          assert(vhost_net);
>          break;
> +#endif
>      default:
>          break;
>      }
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index 148071a396..9bda4ab4f8 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -524,9 +524,11 @@ static int peer_attach(VirtIONet *n, int index)
>          return 0;
>      }
>  
> +#ifdef CONFIG_VHOST_USER
>      if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
>          vhost_set_vring_enable(nc->peer, 1);
>      }
> +#endif
>  
>      if (nc->peer->info->type != NET_CLIENT_DRIVER_TAP) {
>          return 0;
> @@ -547,9 +549,11 @@ static int peer_detach(VirtIONet *n, int index)
>          return 0;
>      }
>  
> +#ifdef CONFIG_VHOST_USER
>      if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
>          vhost_set_vring_enable(nc->peer, 0);
>      }
> +#endif
>  
>      if (nc->peer->info->type !=  NET_CLIENT_DRIVER_TAP) {
>          return 0;
> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> index 5d14bd66dc..85b82e6c94 100644
> --- a/hw/virtio/virtio-pci.c
> +++ b/hw/virtio/virtio-pci.c
> @@ -2135,7 +2135,7 @@ static const TypeInfo vhost_scsi_pci_info = {
>  };
>  #endif
>  
> -#ifdef CONFIG_LINUX
> +#ifdef CONFIG_VHOST_USER
>  /* vhost-user-scsi-pci */
>  static Property vhost_user_scsi_pci_properties[] = {
>      DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors,
> @@ -2665,7 +2665,7 @@ static void virtio_pci_register_types(void)
>  #ifdef CONFIG_VHOST_SCSI
>      type_register_static(&vhost_scsi_pci_info);
>  #endif
> -#ifdef CONFIG_LINUX
> +#ifdef CONFIG_VHOST_USER
>      type_register_static(&vhost_user_scsi_pci_info);
>  #endif
>  #ifdef CONFIG_VHOST_VSOCK
> diff --git a/net/hub.c b/net/hub.c
> index 32d8cf5cd4..ec06275ff6 100644
> --- a/net/hub.c
> +++ b/net/hub.c
> @@ -322,7 +322,9 @@ void net_hub_check_clients(void)
>              case NET_CLIENT_DRIVER_TAP:
>              case NET_CLIENT_DRIVER_SOCKET:
>              case NET_CLIENT_DRIVER_VDE:
> +#ifdef CONFIG_VHOST_USER
>              case NET_CLIENT_DRIVER_VHOST_USER:
> +#endif
>                  has_host_dev = 1;
>                  break;
>              default:
> diff --git a/net/net.c b/net/net.c
> index 0e28099554..d11909421c 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -957,7 +957,7 @@ static int (* const net_client_init_fun[NET_CLIENT_DRIVER__MAX])(
>          [NET_CLIENT_DRIVER_BRIDGE]    = net_init_bridge,
>  #endif
>          [NET_CLIENT_DRIVER_HUBPORT]   = net_init_hubport,
> -#ifdef CONFIG_VHOST_NET_USED
> +#if defined(CONFIG_VHOST_NET_USED) && defined(CONFIG_VHOST_USER)
>          [NET_CLIENT_DRIVER_VHOST_USER] = net_init_vhost_user,
>  #endif
>  #ifdef CONFIG_L2TPV3
> @@ -1033,10 +1033,12 @@ static int net_client_init1(const void *object, bool is_netdev, Error **errp)
>              legacy.type = NET_CLIENT_DRIVER_NETMAP;
>              legacy.u.netmap = opts->u.netmap;
>              break;
> +#ifdef CONFIG_VHOST_USER
>          case NET_LEGACY_OPTIONS_TYPE_VHOST_USER:
>              legacy.type = NET_CLIENT_DRIVER_VHOST_USER;
>              legacy.u.vhost_user = opts->u.vhost_user;
>              break;
> +#endif
>          default:
>              abort();
>          }
> diff --git a/configure b/configure
> index a3f0522e8f..defb9e9974 100755
> --- a/configure
> +++ b/configure
> @@ -306,6 +306,7 @@ tcg="yes"
>  vhost_net="no"
>  vhost_scsi="no"
>  vhost_vsock="no"
> +vhost_user=""
>  kvm="no"
>  hax="no"
>  rdma=""
> @@ -1283,6 +1284,10 @@ for opt do
>    ;;
>    --enable-vxhs) vxhs="yes"
>    ;;
> +  --disable-vhost-user) vhost_user="no"
> +  ;;
> +  --enable-vhost-user) vhost_user="yes"
> +  ;;
>    *)
>        echo "ERROR: unknown option $opt"
>        echo "Try '$0 --help' for more information"
> @@ -1291,6 +1296,14 @@ for opt do
>    esac
>  done
>  
> +if test "$vhost_user" = ""; then
> +    if test "$mingw32" = "yes" ; then
> +        vhost_user="no"
> +    else
> +        vhost_user="yes"
> +    fi
> +fi
> +
>  case "$cpu" in
>      ppc)
>             CPU_CFLAGS="-m32"
> @@ -1518,6 +1531,7 @@ disabled with --disable-FEATURE, default is enabled if available:
>    qom-cast-debug  cast debugging support
>    tools           build qemu-io, qemu-nbd and qemu-image tools
>    vxhs            Veritas HyperScale vDisk backend support
> +  vhost-user      vhost-user support
>  
>  NOTE: The object files are built at the place where configure is launched
>  EOF
> @@ -5278,6 +5292,7 @@ echo "libcap-ng support $cap_ng"
>  echo "vhost-net support $vhost_net"
>  echo "vhost-scsi support $vhost_scsi"
>  echo "vhost-vsock support $vhost_vsock"
> +echo "vhost-user support $vhost_user"
>  echo "Trace backends    $trace_backends"
>  if have_backend "simple"; then
>  echo "Trace output file $trace_file-<pid>"
> @@ -5696,6 +5711,9 @@ fi
>  if test "$vhost_vsock" = "yes" ; then
>    echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
>  fi
> +if test "$vhost_user" = "yes" ; then
> +  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
> +fi
>  if test "$blobs" = "yes" ; then
>    echo "INSTALL_BLOBS=yes" >> $config_host_mak
>  fi
> @@ -6279,7 +6297,9 @@ if supported_kvm_target $target; then
>      echo "CONFIG_KVM=y" >> $config_target_mak
>      if test "$vhost_net" = "yes" ; then
>          echo "CONFIG_VHOST_NET=y" >> $config_target_mak
> -        echo "CONFIG_VHOST_NET_TEST_$target_name=y" >> $config_host_mak
> +        if test "$vhost_user" = "yes" ; then
> +            echo "CONFIG_VHOST_USER_NET_TEST_$target_name=y" >> $config_host_mak
> +        fi
>      fi
>  fi
>  if supported_hax_target $target; then
> diff --git a/default-configs/pci.mak b/default-configs/pci.mak
> index 53ff10975c..708d7b19ad 100644
> --- a/default-configs/pci.mak
> +++ b/default-configs/pci.mak
> @@ -43,4 +43,4 @@ CONFIG_VGA=y
>  CONFIG_VGA_PCI=y
>  CONFIG_IVSHMEM=$(CONFIG_EVENTFD)
>  CONFIG_ROCKER=y
> -CONFIG_VHOST_USER_SCSI=$(CONFIG_LINUX)
> +CONFIG_VHOST_USER_SCSI=$(CONFIG_VHOST_USER)
> diff --git a/default-configs/s390x-softmmu.mak b/default-configs/s390x-softmmu.mak
> index b227a36179..bb870477f8 100644
> --- a/default-configs/s390x-softmmu.mak
> +++ b/default-configs/s390x-softmmu.mak
> @@ -1,6 +1,6 @@
>  CONFIG_PCI=y
>  CONFIG_VIRTIO_PCI=y
> -CONFIG_VHOST_USER_SCSI=$(CONFIG_LINUX)
> +CONFIG_VHOST_USER_SCSI=$(CONFIG_VHOST_USER)
>  CONFIG_VIRTIO=y
>  CONFIG_SCLPCONSOLE=y
>  CONFIG_TERMINAL3270=y
> diff --git a/net/Makefile.objs b/net/Makefile.objs
> index 67ba5e26fb..7cac7ed1e4 100644
> --- a/net/Makefile.objs
> +++ b/net/Makefile.objs
> @@ -3,7 +3,7 @@ common-obj-y += socket.o
>  common-obj-y += dump.o
>  common-obj-y += eth.o
>  common-obj-$(CONFIG_L2TPV3) += l2tpv3.o
> -common-obj-$(CONFIG_POSIX) += vhost-user.o
> +common-obj-$(CONFIG_VHOST_USER) += vhost-user.o
>  common-obj-$(CONFIG_SLIRP) += slirp.o
>  common-obj-$(CONFIG_VDE) += vde.o
>  common-obj-$(CONFIG_NETMAP) += netmap.o
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 746b5fa75d..c2d4ae440f 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -1994,8 +1994,10 @@ DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
>      "                VALE port (created on the fly) called 'name' ('nmname' is name of the \n"
>      "                netmap device, defaults to '/dev/netmap')\n"
>  #endif
> +#ifdef CONFIG_VHOST_USER
>      "-netdev vhost-user,id=str,chardev=dev[,vhostforce=on|off]\n"
>      "                configure a vhost-user network, backed by a chardev 'dev'\n"
> +#endif
>      "-netdev hubport,id=str,hubid=n\n"
>      "                configure a hub port on QEMU VLAN 'n'\n", QEMU_ARCH_ALL)
>  DEF("net", HAS_ARG, QEMU_OPTION_net,
> @@ -2428,6 +2430,7 @@ The hubport netdev lets you connect a NIC to a QEMU "vlan" instead of a single
>  netdev.  @code{-net} and @code{-device} with parameter @option{vlan} create the
>  required hub automatically.
>  
> +#ifdef CONFIG_VHOST_USER
>  @item -netdev vhost-user,chardev=@var{id}[,vhostforce=on|off][,queues=n]
>  
>  Establish a vhost-user netdev, backed by a chardev @var{id}. The chardev should
> @@ -2445,6 +2448,7 @@ qemu -m 512 -object memory-backend-file,id=mem,size=512M,mem-path=/hugetlbfs,sha
>       -netdev type=vhost-user,id=net0,chardev=chr0 \
>       -device virtio-net-pci,netdev=net0
>  @end example
> +#endif
>  
>  @item -net dump[,vlan=@var{n}][,file=@var{file}][,len=@var{len}]
>  Dump network traffic on VLAN @var{n} to file @var{file} (@file{qemu-vlan0.pcap} by default).
> diff --git a/tests/Makefile.include b/tests/Makefile.include
> index cfbb689e0e..6b9a0ce07e 100644
> --- a/tests/Makefile.include
> +++ b/tests/Makefile.include
> @@ -252,9 +252,9 @@ check-qtest-i386-y += tests/pc-cpu-test$(EXESUF)
>  check-qtest-i386-y += tests/q35-test$(EXESUF)
>  check-qtest-i386-y += tests/vmgenid-test$(EXESUF)
>  gcov-files-i386-y += hw/pci-host/q35.c
> -check-qtest-i386-$(CONFIG_VHOST_NET_TEST_i386) += tests/vhost-user-test$(EXESUF)
> -ifeq ($(CONFIG_VHOST_NET_TEST_i386),)
> -check-qtest-x86_64-$(CONFIG_VHOST_NET_TEST_x86_64) += tests/vhost-user-test$(EXESUF)
> +check-qtest-i386-$(CONFIG_VHOST_USER_NET_TEST_i386) += tests/vhost-user-test$(EXESUF)
> +ifeq ($(CONFIG_VHOST_USER_NET_TEST_i386),)
> +check-qtest-x86_64-$(CONFIG_VHOST_USER_NET_TEST_x86_64) += tests/vhost-user-test$(EXESUF)
>  endif
>  check-qtest-i386-y += tests/test-netfilter$(EXESUF)
>  check-qtest-i386-y += tests/test-filter-mirror$(EXESUF)
> -- 
> 2.14.0.rc0.1.g40ca67566
Michael S. Tsirkin July 26, 2017, 5:52 p.m. UTC | #3
On Tue, Jul 18, 2017 at 06:34:37PM +0200, Marc-André Lureau wrote:
> Learn to compile out vhost-user. Keep it enabled by default on
> non-mingw, that is assumed to be on POSIX.
> 
> When trying to make a vhost-user netdev, it gives the following error:
> 
> -netdev vhost-user,id=foo,chardev=chr-test: Parameter 'type' expects a netdev backend type
> 
> And similar error with the HMP/QMP monitors.
> 
> In the future, we may want to hide vhost-user from QAPI/introspection
> with conditional compilation, although the design of this hasn't been
> fully fleshed out yet and shouldn't prevent this patch from being
> applied.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

After an offline discussion, looks like the idea is to be able to ship a
cut down binary with less features (and e.g. smaller attack surface?).

Besides failing build on freebsd, this patch has too much ifdefery for
my taste. How about we patch just net/net.c?


> ---
>  hw/net/vhost_net.c                | 12 ++++++++++--
>  hw/net/virtio-net.c               |  4 ++++
>  hw/virtio/virtio-pci.c            |  4 ++--
>  net/hub.c                         |  2 ++
>  net/net.c                         |  4 +++-
>  configure                         | 22 +++++++++++++++++++++-
>  default-configs/pci.mak           |  2 +-
>  default-configs/s390x-softmmu.mak |  2 +-
>  net/Makefile.objs                 |  2 +-
>  qemu-options.hx                   |  4 ++++
>  tests/Makefile.include            |  6 +++---
>  11 files changed, 52 insertions(+), 12 deletions(-)
> 
> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> index e037db63a3..565a1cc99d 100644
> --- a/hw/net/vhost_net.c
> +++ b/hw/net/vhost_net.c
> @@ -56,6 +56,7 @@ static const int kernel_feature_bits[] = {
>      VHOST_INVALID_FEATURE_BIT
>  };
>  
> +#ifdef CONFIG_VHOST_USER
>  /* Features supported by others. */
>  static const int user_feature_bits[] = {
>      VIRTIO_F_NOTIFY_ON_EMPTY,
> @@ -86,6 +87,7 @@ static const int user_feature_bits[] = {
>  
>      VHOST_INVALID_FEATURE_BIT
>  };
> +#endif
>  
>  static const int *vhost_net_get_feature_bits(struct vhost_net *net)
>  {
> @@ -95,9 +97,11 @@ static const int *vhost_net_get_feature_bits(struct vhost_net *net)
>      case NET_CLIENT_DRIVER_TAP:
>          feature_bits = kernel_feature_bits;
>          break;
> +#ifdef CONFIG_VHOST_USER
>      case NET_CLIENT_DRIVER_VHOST_USER:
>          feature_bits = user_feature_bits;
>          break;
> +#endif
>      default:
>          error_report("Feature bits not defined for this type: %d",
>                  net->nc->info->type);
> @@ -193,6 +197,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
>          }
>      }
>  
> +#ifdef CONFIG_VHOST_USER
>      /* Set sane init value. Override when guest acks. */
>      if (net->nc->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
>          features = vhost_user_get_acked_features(net->nc);
> @@ -203,7 +208,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
>              goto fail;
>          }
>      }
> -
> +#endif
>      vhost_net_ack_features(net, features);
>  
>      return net;
> @@ -309,6 +314,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
>          net = get_vhost_net(ncs[i].peer);
>          vhost_net_set_vq_index(net, i * 2);
>  
> +#ifdef CONFIG_VHOST_USER
>          /* Suppress the masking guest notifiers on vhost user
>           * because vhost user doesn't interrupt masking/unmasking
>           * properly.
> @@ -316,8 +322,8 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
>          if (net->nc->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
>              dev->use_guest_notifier_mask = false;
>          }
> +#endif
>       }
> -
>      r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true);
>      if (r < 0) {
>          error_report("Error binding guest notifier: %d", -r);
> @@ -414,10 +420,12 @@ VHostNetState *get_vhost_net(NetClientState *nc)
>      case NET_CLIENT_DRIVER_TAP:
>          vhost_net = tap_get_vhost_net(nc);
>          break;
> +#ifdef CONFIG_VHOST_USER
>      case NET_CLIENT_DRIVER_VHOST_USER:
>          vhost_net = vhost_user_get_vhost_net(nc);
>          assert(vhost_net);
>          break;
> +#endif
>      default:
>          break;
>      }
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index 148071a396..9bda4ab4f8 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -524,9 +524,11 @@ static int peer_attach(VirtIONet *n, int index)
>          return 0;
>      }
>  
> +#ifdef CONFIG_VHOST_USER
>      if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
>          vhost_set_vring_enable(nc->peer, 1);
>      }
> +#endif
>  
>      if (nc->peer->info->type != NET_CLIENT_DRIVER_TAP) {
>          return 0;
> @@ -547,9 +549,11 @@ static int peer_detach(VirtIONet *n, int index)
>          return 0;
>      }
>  
> +#ifdef CONFIG_VHOST_USER
>      if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
>          vhost_set_vring_enable(nc->peer, 0);
>      }
> +#endif
>  
>      if (nc->peer->info->type !=  NET_CLIENT_DRIVER_TAP) {
>          return 0;
> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> index 5d14bd66dc..85b82e6c94 100644
> --- a/hw/virtio/virtio-pci.c
> +++ b/hw/virtio/virtio-pci.c
> @@ -2135,7 +2135,7 @@ static const TypeInfo vhost_scsi_pci_info = {
>  };
>  #endif
>  
> -#ifdef CONFIG_LINUX
> +#ifdef CONFIG_VHOST_USER
>  /* vhost-user-scsi-pci */
>  static Property vhost_user_scsi_pci_properties[] = {
>      DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors,
> @@ -2665,7 +2665,7 @@ static void virtio_pci_register_types(void)
>  #ifdef CONFIG_VHOST_SCSI
>      type_register_static(&vhost_scsi_pci_info);
>  #endif
> -#ifdef CONFIG_LINUX
> +#ifdef CONFIG_VHOST_USER
>      type_register_static(&vhost_user_scsi_pci_info);
>  #endif
>  #ifdef CONFIG_VHOST_VSOCK
> diff --git a/net/hub.c b/net/hub.c
> index 32d8cf5cd4..ec06275ff6 100644
> --- a/net/hub.c
> +++ b/net/hub.c
> @@ -322,7 +322,9 @@ void net_hub_check_clients(void)
>              case NET_CLIENT_DRIVER_TAP:
>              case NET_CLIENT_DRIVER_SOCKET:
>              case NET_CLIENT_DRIVER_VDE:
> +#ifdef CONFIG_VHOST_USER
>              case NET_CLIENT_DRIVER_VHOST_USER:
> +#endif
>                  has_host_dev = 1;
>                  break;
>              default:
> diff --git a/net/net.c b/net/net.c
> index 0e28099554..d11909421c 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -957,7 +957,7 @@ static int (* const net_client_init_fun[NET_CLIENT_DRIVER__MAX])(
>          [NET_CLIENT_DRIVER_BRIDGE]    = net_init_bridge,
>  #endif
>          [NET_CLIENT_DRIVER_HUBPORT]   = net_init_hubport,
> -#ifdef CONFIG_VHOST_NET_USED
> +#if defined(CONFIG_VHOST_NET_USED) && defined(CONFIG_VHOST_USER)
>          [NET_CLIENT_DRIVER_VHOST_USER] = net_init_vhost_user,
>  #endif
>  #ifdef CONFIG_L2TPV3
> @@ -1033,10 +1033,12 @@ static int net_client_init1(const void *object, bool is_netdev, Error **errp)
>              legacy.type = NET_CLIENT_DRIVER_NETMAP;
>              legacy.u.netmap = opts->u.netmap;
>              break;
> +#ifdef CONFIG_VHOST_USER
>          case NET_LEGACY_OPTIONS_TYPE_VHOST_USER:
>              legacy.type = NET_CLIENT_DRIVER_VHOST_USER;
>              legacy.u.vhost_user = opts->u.vhost_user;
>              break;
> +#endif
>          default:
>              abort();
>          }
> diff --git a/configure b/configure
> index a3f0522e8f..defb9e9974 100755
> --- a/configure
> +++ b/configure
> @@ -306,6 +306,7 @@ tcg="yes"
>  vhost_net="no"
>  vhost_scsi="no"
>  vhost_vsock="no"
> +vhost_user=""
>  kvm="no"
>  hax="no"
>  rdma=""
> @@ -1283,6 +1284,10 @@ for opt do
>    ;;
>    --enable-vxhs) vxhs="yes"
>    ;;
> +  --disable-vhost-user) vhost_user="no"
> +  ;;
> +  --enable-vhost-user) vhost_user="yes"
> +  ;;
>    *)
>        echo "ERROR: unknown option $opt"
>        echo "Try '$0 --help' for more information"
> @@ -1291,6 +1296,14 @@ for opt do
>    esac
>  done
>  
> +if test "$vhost_user" = ""; then
> +    if test "$mingw32" = "yes" ; then
> +        vhost_user="no"
> +    else
> +        vhost_user="yes"
> +    fi
> +fi
> +
>  case "$cpu" in
>      ppc)
>             CPU_CFLAGS="-m32"
> @@ -1518,6 +1531,7 @@ disabled with --disable-FEATURE, default is enabled if available:
>    qom-cast-debug  cast debugging support
>    tools           build qemu-io, qemu-nbd and qemu-image tools
>    vxhs            Veritas HyperScale vDisk backend support
> +  vhost-user      vhost-user support
>  
>  NOTE: The object files are built at the place where configure is launched
>  EOF
> @@ -5278,6 +5292,7 @@ echo "libcap-ng support $cap_ng"
>  echo "vhost-net support $vhost_net"
>  echo "vhost-scsi support $vhost_scsi"
>  echo "vhost-vsock support $vhost_vsock"
> +echo "vhost-user support $vhost_user"
>  echo "Trace backends    $trace_backends"
>  if have_backend "simple"; then
>  echo "Trace output file $trace_file-<pid>"
> @@ -5696,6 +5711,9 @@ fi
>  if test "$vhost_vsock" = "yes" ; then
>    echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
>  fi
> +if test "$vhost_user" = "yes" ; then
> +  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
> +fi
>  if test "$blobs" = "yes" ; then
>    echo "INSTALL_BLOBS=yes" >> $config_host_mak
>  fi
> @@ -6279,7 +6297,9 @@ if supported_kvm_target $target; then
>      echo "CONFIG_KVM=y" >> $config_target_mak
>      if test "$vhost_net" = "yes" ; then
>          echo "CONFIG_VHOST_NET=y" >> $config_target_mak
> -        echo "CONFIG_VHOST_NET_TEST_$target_name=y" >> $config_host_mak
> +        if test "$vhost_user" = "yes" ; then
> +            echo "CONFIG_VHOST_USER_NET_TEST_$target_name=y" >> $config_host_mak
> +        fi
>      fi
>  fi
>  if supported_hax_target $target; then
> diff --git a/default-configs/pci.mak b/default-configs/pci.mak
> index 53ff10975c..708d7b19ad 100644
> --- a/default-configs/pci.mak
> +++ b/default-configs/pci.mak
> @@ -43,4 +43,4 @@ CONFIG_VGA=y
>  CONFIG_VGA_PCI=y
>  CONFIG_IVSHMEM=$(CONFIG_EVENTFD)
>  CONFIG_ROCKER=y
> -CONFIG_VHOST_USER_SCSI=$(CONFIG_LINUX)
> +CONFIG_VHOST_USER_SCSI=$(CONFIG_VHOST_USER)
> diff --git a/default-configs/s390x-softmmu.mak b/default-configs/s390x-softmmu.mak
> index b227a36179..bb870477f8 100644
> --- a/default-configs/s390x-softmmu.mak
> +++ b/default-configs/s390x-softmmu.mak
> @@ -1,6 +1,6 @@
>  CONFIG_PCI=y
>  CONFIG_VIRTIO_PCI=y
> -CONFIG_VHOST_USER_SCSI=$(CONFIG_LINUX)
> +CONFIG_VHOST_USER_SCSI=$(CONFIG_VHOST_USER)
>  CONFIG_VIRTIO=y
>  CONFIG_SCLPCONSOLE=y
>  CONFIG_TERMINAL3270=y
> diff --git a/net/Makefile.objs b/net/Makefile.objs
> index 67ba5e26fb..7cac7ed1e4 100644
> --- a/net/Makefile.objs
> +++ b/net/Makefile.objs
> @@ -3,7 +3,7 @@ common-obj-y += socket.o
>  common-obj-y += dump.o
>  common-obj-y += eth.o
>  common-obj-$(CONFIG_L2TPV3) += l2tpv3.o
> -common-obj-$(CONFIG_POSIX) += vhost-user.o
> +common-obj-$(CONFIG_VHOST_USER) += vhost-user.o
>  common-obj-$(CONFIG_SLIRP) += slirp.o
>  common-obj-$(CONFIG_VDE) += vde.o
>  common-obj-$(CONFIG_NETMAP) += netmap.o
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 746b5fa75d..c2d4ae440f 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -1994,8 +1994,10 @@ DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
>      "                VALE port (created on the fly) called 'name' ('nmname' is name of the \n"
>      "                netmap device, defaults to '/dev/netmap')\n"
>  #endif
> +#ifdef CONFIG_VHOST_USER
>      "-netdev vhost-user,id=str,chardev=dev[,vhostforce=on|off]\n"
>      "                configure a vhost-user network, backed by a chardev 'dev'\n"
> +#endif
>      "-netdev hubport,id=str,hubid=n\n"
>      "                configure a hub port on QEMU VLAN 'n'\n", QEMU_ARCH_ALL)
>  DEF("net", HAS_ARG, QEMU_OPTION_net,
> @@ -2428,6 +2430,7 @@ The hubport netdev lets you connect a NIC to a QEMU "vlan" instead of a single
>  netdev.  @code{-net} and @code{-device} with parameter @option{vlan} create the
>  required hub automatically.
>  
> +#ifdef CONFIG_VHOST_USER
>  @item -netdev vhost-user,chardev=@var{id}[,vhostforce=on|off][,queues=n]
>  
>  Establish a vhost-user netdev, backed by a chardev @var{id}. The chardev should
> @@ -2445,6 +2448,7 @@ qemu -m 512 -object memory-backend-file,id=mem,size=512M,mem-path=/hugetlbfs,sha
>       -netdev type=vhost-user,id=net0,chardev=chr0 \
>       -device virtio-net-pci,netdev=net0
>  @end example
> +#endif
>  
>  @item -net dump[,vlan=@var{n}][,file=@var{file}][,len=@var{len}]
>  Dump network traffic on VLAN @var{n} to file @var{file} (@file{qemu-vlan0.pcap} by default).
> diff --git a/tests/Makefile.include b/tests/Makefile.include
> index cfbb689e0e..6b9a0ce07e 100644
> --- a/tests/Makefile.include
> +++ b/tests/Makefile.include
> @@ -252,9 +252,9 @@ check-qtest-i386-y += tests/pc-cpu-test$(EXESUF)
>  check-qtest-i386-y += tests/q35-test$(EXESUF)
>  check-qtest-i386-y += tests/vmgenid-test$(EXESUF)
>  gcov-files-i386-y += hw/pci-host/q35.c
> -check-qtest-i386-$(CONFIG_VHOST_NET_TEST_i386) += tests/vhost-user-test$(EXESUF)
> -ifeq ($(CONFIG_VHOST_NET_TEST_i386),)
> -check-qtest-x86_64-$(CONFIG_VHOST_NET_TEST_x86_64) += tests/vhost-user-test$(EXESUF)
> +check-qtest-i386-$(CONFIG_VHOST_USER_NET_TEST_i386) += tests/vhost-user-test$(EXESUF)
> +ifeq ($(CONFIG_VHOST_USER_NET_TEST_i386),)
> +check-qtest-x86_64-$(CONFIG_VHOST_USER_NET_TEST_x86_64) += tests/vhost-user-test$(EXESUF)
>  endif
>  check-qtest-i386-y += tests/test-netfilter$(EXESUF)
>  check-qtest-i386-y += tests/test-filter-mirror$(EXESUF)
> -- 
> 2.14.0.rc0.1.g40ca67566
Marc-André Lureau July 27, 2017, 11:31 p.m. UTC | #4
Hi

On Wed, Jul 26, 2017 at 7:53 PM Michael S. Tsirkin <mst@redhat.com> wrote:
>
> On Tue, Jul 18, 2017 at 06:34:37PM +0200, Marc-André Lureau wrote:
> > Learn to compile out vhost-user. Keep it enabled by default on
> > non-mingw, that is assumed to be on POSIX.
> >
> > When trying to make a vhost-user netdev, it gives the following error:
> >
> > -netdev vhost-user,id=foo,chardev=chr-test: Parameter 'type' expects a netdev backend type
> >
> > And similar error with the HMP/QMP monitors.
> >
> > In the future, we may want to hide vhost-user from QAPI/introspection
> > with conditional compilation, although the design of this hasn't been
> > fully fleshed out yet and shouldn't prevent this patch from being
> > applied.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>
> After an offline discussion, looks like the idea is to be able to ship a
> cut down binary with less features (and e.g. smaller attack surface?).
>
> Besides failing build on freebsd, this patch has too much ifdefery for
> my taste. How about we patch just net/net.c?
>

The point with --disable-vhost-user was to remove all vhost-user code.

For netdev vhost-user only, it would be as simple as
removing/compiling out the line:

       [NET_CLIENT_DRIVER_VHOST_USER] = net_init_vhost_user,

Not sure it's worth a configure option in this case.

>
>
> > ---
> >  hw/net/vhost_net.c                | 12 ++++++++++--
> >  hw/net/virtio-net.c               |  4 ++++
> >  hw/virtio/virtio-pci.c            |  4 ++--
> >  net/hub.c                         |  2 ++
> >  net/net.c                         |  4 +++-
> >  configure                         | 22 +++++++++++++++++++++-
> >  default-configs/pci.mak           |  2 +-
> >  default-configs/s390x-softmmu.mak |  2 +-
> >  net/Makefile.objs                 |  2 +-
> >  qemu-options.hx                   |  4 ++++
> >  tests/Makefile.include            |  6 +++---
> >  11 files changed, 52 insertions(+), 12 deletions(-)
> >
> > diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> > index e037db63a3..565a1cc99d 100644
> > --- a/hw/net/vhost_net.c
> > +++ b/hw/net/vhost_net.c
> > @@ -56,6 +56,7 @@ static const int kernel_feature_bits[] = {
> >      VHOST_INVALID_FEATURE_BIT
> >  };
> >
> > +#ifdef CONFIG_VHOST_USER
> >  /* Features supported by others. */
> >  static const int user_feature_bits[] = {
> >      VIRTIO_F_NOTIFY_ON_EMPTY,
> > @@ -86,6 +87,7 @@ static const int user_feature_bits[] = {
> >
> >      VHOST_INVALID_FEATURE_BIT
> >  };
> > +#endif
> >
> >  static const int *vhost_net_get_feature_bits(struct vhost_net *net)
> >  {
> > @@ -95,9 +97,11 @@ static const int *vhost_net_get_feature_bits(struct vhost_net *net)
> >      case NET_CLIENT_DRIVER_TAP:
> >          feature_bits = kernel_feature_bits;
> >          break;
> > +#ifdef CONFIG_VHOST_USER
> >      case NET_CLIENT_DRIVER_VHOST_USER:
> >          feature_bits = user_feature_bits;
> >          break;
> > +#endif
> >      default:
> >          error_report("Feature bits not defined for this type: %d",
> >                  net->nc->info->type);
> > @@ -193,6 +197,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
> >          }
> >      }
> >
> > +#ifdef CONFIG_VHOST_USER
> >      /* Set sane init value. Override when guest acks. */
> >      if (net->nc->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
> >          features = vhost_user_get_acked_features(net->nc);
> > @@ -203,7 +208,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
> >              goto fail;
> >          }
> >      }
> > -
> > +#endif
> >      vhost_net_ack_features(net, features);
> >
> >      return net;
> > @@ -309,6 +314,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
> >          net = get_vhost_net(ncs[i].peer);
> >          vhost_net_set_vq_index(net, i * 2);
> >
> > +#ifdef CONFIG_VHOST_USER
> >          /* Suppress the masking guest notifiers on vhost user
> >           * because vhost user doesn't interrupt masking/unmasking
> >           * properly.
> > @@ -316,8 +322,8 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
> >          if (net->nc->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
> >              dev->use_guest_notifier_mask = false;
> >          }
> > +#endif
> >       }
> > -
> >      r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true);
> >      if (r < 0) {
> >          error_report("Error binding guest notifier: %d", -r);
> > @@ -414,10 +420,12 @@ VHostNetState *get_vhost_net(NetClientState *nc)
> >      case NET_CLIENT_DRIVER_TAP:
> >          vhost_net = tap_get_vhost_net(nc);
> >          break;
> > +#ifdef CONFIG_VHOST_USER
> >      case NET_CLIENT_DRIVER_VHOST_USER:
> >          vhost_net = vhost_user_get_vhost_net(nc);
> >          assert(vhost_net);
> >          break;
> > +#endif
> >      default:
> >          break;
> >      }
> > diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> > index 148071a396..9bda4ab4f8 100644
> > --- a/hw/net/virtio-net.c
> > +++ b/hw/net/virtio-net.c
> > @@ -524,9 +524,11 @@ static int peer_attach(VirtIONet *n, int index)
> >          return 0;
> >      }
> >
> > +#ifdef CONFIG_VHOST_USER
> >      if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
> >          vhost_set_vring_enable(nc->peer, 1);
> >      }
> > +#endif
> >
> >      if (nc->peer->info->type != NET_CLIENT_DRIVER_TAP) {
> >          return 0;
> > @@ -547,9 +549,11 @@ static int peer_detach(VirtIONet *n, int index)
> >          return 0;
> >      }
> >
> > +#ifdef CONFIG_VHOST_USER
> >      if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
> >          vhost_set_vring_enable(nc->peer, 0);
> >      }
> > +#endif
> >
> >      if (nc->peer->info->type !=  NET_CLIENT_DRIVER_TAP) {
> >          return 0;
> > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> > index 5d14bd66dc..85b82e6c94 100644
> > --- a/hw/virtio/virtio-pci.c
> > +++ b/hw/virtio/virtio-pci.c
> > @@ -2135,7 +2135,7 @@ static const TypeInfo vhost_scsi_pci_info = {
> >  };
> >  #endif
> >
> > -#ifdef CONFIG_LINUX
> > +#ifdef CONFIG_VHOST_USER
> >  /* vhost-user-scsi-pci */
> >  static Property vhost_user_scsi_pci_properties[] = {
> >      DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors,
> > @@ -2665,7 +2665,7 @@ static void virtio_pci_register_types(void)
> >  #ifdef CONFIG_VHOST_SCSI
> >      type_register_static(&vhost_scsi_pci_info);
> >  #endif
> > -#ifdef CONFIG_LINUX
> > +#ifdef CONFIG_VHOST_USER
> >      type_register_static(&vhost_user_scsi_pci_info);
> >  #endif
> >  #ifdef CONFIG_VHOST_VSOCK
> > diff --git a/net/hub.c b/net/hub.c
> > index 32d8cf5cd4..ec06275ff6 100644
> > --- a/net/hub.c
> > +++ b/net/hub.c
> > @@ -322,7 +322,9 @@ void net_hub_check_clients(void)
> >              case NET_CLIENT_DRIVER_TAP:
> >              case NET_CLIENT_DRIVER_SOCKET:
> >              case NET_CLIENT_DRIVER_VDE:
> > +#ifdef CONFIG_VHOST_USER
> >              case NET_CLIENT_DRIVER_VHOST_USER:
> > +#endif
> >                  has_host_dev = 1;
> >                  break;
> >              default:
> > diff --git a/net/net.c b/net/net.c
> > index 0e28099554..d11909421c 100644
> > --- a/net/net.c
> > +++ b/net/net.c
> > @@ -957,7 +957,7 @@ static int (* const net_client_init_fun[NET_CLIENT_DRIVER__MAX])(
> >          [NET_CLIENT_DRIVER_BRIDGE]    = net_init_bridge,
> >  #endif
> >          [NET_CLIENT_DRIVER_HUBPORT]   = net_init_hubport,
> > -#ifdef CONFIG_VHOST_NET_USED
> > +#if defined(CONFIG_VHOST_NET_USED) && defined(CONFIG_VHOST_USER)
> >          [NET_CLIENT_DRIVER_VHOST_USER] = net_init_vhost_user,
> >  #endif
> >  #ifdef CONFIG_L2TPV3
> > @@ -1033,10 +1033,12 @@ static int net_client_init1(const void *object, bool is_netdev, Error **errp)
> >              legacy.type = NET_CLIENT_DRIVER_NETMAP;
> >              legacy.u.netmap = opts->u.netmap;
> >              break;
> > +#ifdef CONFIG_VHOST_USER
> >          case NET_LEGACY_OPTIONS_TYPE_VHOST_USER:
> >              legacy.type = NET_CLIENT_DRIVER_VHOST_USER;
> >              legacy.u.vhost_user = opts->u.vhost_user;
> >              break;
> > +#endif
> >          default:
> >              abort();
> >          }
> > diff --git a/configure b/configure
> > index a3f0522e8f..defb9e9974 100755
> > --- a/configure
> > +++ b/configure
> > @@ -306,6 +306,7 @@ tcg="yes"
> >  vhost_net="no"
> >  vhost_scsi="no"
> >  vhost_vsock="no"
> > +vhost_user=""
> >  kvm="no"
> >  hax="no"
> >  rdma=""
> > @@ -1283,6 +1284,10 @@ for opt do
> >    ;;
> >    --enable-vxhs) vxhs="yes"
> >    ;;
> > +  --disable-vhost-user) vhost_user="no"
> > +  ;;
> > +  --enable-vhost-user) vhost_user="yes"
> > +  ;;
> >    *)
> >        echo "ERROR: unknown option $opt"
> >        echo "Try '$0 --help' for more information"
> > @@ -1291,6 +1296,14 @@ for opt do
> >    esac
> >  done
> >
> > +if test "$vhost_user" = ""; then
> > +    if test "$mingw32" = "yes" ; then
> > +        vhost_user="no"
> > +    else
> > +        vhost_user="yes"
> > +    fi
> > +fi
> > +
> >  case "$cpu" in
> >      ppc)
> >             CPU_CFLAGS="-m32"
> > @@ -1518,6 +1531,7 @@ disabled with --disable-FEATURE, default is enabled if available:
> >    qom-cast-debug  cast debugging support
> >    tools           build qemu-io, qemu-nbd and qemu-image tools
> >    vxhs            Veritas HyperScale vDisk backend support
> > +  vhost-user      vhost-user support
> >
> >  NOTE: The object files are built at the place where configure is launched
> >  EOF
> > @@ -5278,6 +5292,7 @@ echo "libcap-ng support $cap_ng"
> >  echo "vhost-net support $vhost_net"
> >  echo "vhost-scsi support $vhost_scsi"
> >  echo "vhost-vsock support $vhost_vsock"
> > +echo "vhost-user support $vhost_user"
> >  echo "Trace backends    $trace_backends"
> >  if have_backend "simple"; then
> >  echo "Trace output file $trace_file-<pid>"
> > @@ -5696,6 +5711,9 @@ fi
> >  if test "$vhost_vsock" = "yes" ; then
> >    echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
> >  fi
> > +if test "$vhost_user" = "yes" ; then
> > +  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
> > +fi
> >  if test "$blobs" = "yes" ; then
> >    echo "INSTALL_BLOBS=yes" >> $config_host_mak
> >  fi
> > @@ -6279,7 +6297,9 @@ if supported_kvm_target $target; then
> >      echo "CONFIG_KVM=y" >> $config_target_mak
> >      if test "$vhost_net" = "yes" ; then
> >          echo "CONFIG_VHOST_NET=y" >> $config_target_mak
> > -        echo "CONFIG_VHOST_NET_TEST_$target_name=y" >> $config_host_mak
> > +        if test "$vhost_user" = "yes" ; then
> > +            echo "CONFIG_VHOST_USER_NET_TEST_$target_name=y" >> $config_host_mak
> > +        fi
> >      fi
> >  fi
> >  if supported_hax_target $target; then
> > diff --git a/default-configs/pci.mak b/default-configs/pci.mak
> > index 53ff10975c..708d7b19ad 100644
> > --- a/default-configs/pci.mak
> > +++ b/default-configs/pci.mak
> > @@ -43,4 +43,4 @@ CONFIG_VGA=y
> >  CONFIG_VGA_PCI=y
> >  CONFIG_IVSHMEM=$(CONFIG_EVENTFD)
> >  CONFIG_ROCKER=y
> > -CONFIG_VHOST_USER_SCSI=$(CONFIG_LINUX)
> > +CONFIG_VHOST_USER_SCSI=$(CONFIG_VHOST_USER)
> > diff --git a/default-configs/s390x-softmmu.mak b/default-configs/s390x-softmmu.mak
> > index b227a36179..bb870477f8 100644
> > --- a/default-configs/s390x-softmmu.mak
> > +++ b/default-configs/s390x-softmmu.mak
> > @@ -1,6 +1,6 @@
> >  CONFIG_PCI=y
> >  CONFIG_VIRTIO_PCI=y
> > -CONFIG_VHOST_USER_SCSI=$(CONFIG_LINUX)
> > +CONFIG_VHOST_USER_SCSI=$(CONFIG_VHOST_USER)
> >  CONFIG_VIRTIO=y
> >  CONFIG_SCLPCONSOLE=y
> >  CONFIG_TERMINAL3270=y
> > diff --git a/net/Makefile.objs b/net/Makefile.objs
> > index 67ba5e26fb..7cac7ed1e4 100644
> > --- a/net/Makefile.objs
> > +++ b/net/Makefile.objs
> > @@ -3,7 +3,7 @@ common-obj-y += socket.o
> >  common-obj-y += dump.o
> >  common-obj-y += eth.o
> >  common-obj-$(CONFIG_L2TPV3) += l2tpv3.o
> > -common-obj-$(CONFIG_POSIX) += vhost-user.o
> > +common-obj-$(CONFIG_VHOST_USER) += vhost-user.o
> >  common-obj-$(CONFIG_SLIRP) += slirp.o
> >  common-obj-$(CONFIG_VDE) += vde.o
> >  common-obj-$(CONFIG_NETMAP) += netmap.o
> > diff --git a/qemu-options.hx b/qemu-options.hx
> > index 746b5fa75d..c2d4ae440f 100644
> > --- a/qemu-options.hx
> > +++ b/qemu-options.hx
> > @@ -1994,8 +1994,10 @@ DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
> >      "                VALE port (created on the fly) called 'name' ('nmname' is name of the \n"
> >      "                netmap device, defaults to '/dev/netmap')\n"
> >  #endif
> > +#ifdef CONFIG_VHOST_USER
> >      "-netdev vhost-user,id=str,chardev=dev[,vhostforce=on|off]\n"
> >      "                configure a vhost-user network, backed by a chardev 'dev'\n"
> > +#endif
> >      "-netdev hubport,id=str,hubid=n\n"
> >      "                configure a hub port on QEMU VLAN 'n'\n", QEMU_ARCH_ALL)
> >  DEF("net", HAS_ARG, QEMU_OPTION_net,
> > @@ -2428,6 +2430,7 @@ The hubport netdev lets you connect a NIC to a QEMU "vlan" instead of a single
> >  netdev.  @code{-net} and @code{-device} with parameter @option{vlan} create the
> >  required hub automatically.
> >
> > +#ifdef CONFIG_VHOST_USER
> >  @item -netdev vhost-user,chardev=@var{id}[,vhostforce=on|off][,queues=n]
> >
> >  Establish a vhost-user netdev, backed by a chardev @var{id}. The chardev should
> > @@ -2445,6 +2448,7 @@ qemu -m 512 -object memory-backend-file,id=mem,size=512M,mem-path=/hugetlbfs,sha
> >       -netdev type=vhost-user,id=net0,chardev=chr0 \
> >       -device virtio-net-pci,netdev=net0
> >  @end example
> > +#endif
> >
> >  @item -net dump[,vlan=@var{n}][,file=@var{file}][,len=@var{len}]
> >  Dump network traffic on VLAN @var{n} to file @var{file} (@file{qemu-vlan0.pcap} by default).
> > diff --git a/tests/Makefile.include b/tests/Makefile.include
> > index cfbb689e0e..6b9a0ce07e 100644
> > --- a/tests/Makefile.include
> > +++ b/tests/Makefile.include
> > @@ -252,9 +252,9 @@ check-qtest-i386-y += tests/pc-cpu-test$(EXESUF)
> >  check-qtest-i386-y += tests/q35-test$(EXESUF)
> >  check-qtest-i386-y += tests/vmgenid-test$(EXESUF)
> >  gcov-files-i386-y += hw/pci-host/q35.c
> > -check-qtest-i386-$(CONFIG_VHOST_NET_TEST_i386) += tests/vhost-user-test$(EXESUF)
> > -ifeq ($(CONFIG_VHOST_NET_TEST_i386),)
> > -check-qtest-x86_64-$(CONFIG_VHOST_NET_TEST_x86_64) += tests/vhost-user-test$(EXESUF)
> > +check-qtest-i386-$(CONFIG_VHOST_USER_NET_TEST_i386) += tests/vhost-user-test$(EXESUF)
> > +ifeq ($(CONFIG_VHOST_USER_NET_TEST_i386),)
> > +check-qtest-x86_64-$(CONFIG_VHOST_USER_NET_TEST_x86_64) += tests/vhost-user-test$(EXESUF)
> >  endif
> >  check-qtest-i386-y += tests/test-netfilter$(EXESUF)
> >  check-qtest-i386-y += tests/test-filter-mirror$(EXESUF)
> > --
> > 2.14.0.rc0.1.g40ca67566
>
Michael S. Tsirkin July 28, 2017, 3:09 a.m. UTC | #5
On Fri, Jul 28, 2017 at 01:31:31AM +0200, Marc-André Lureau wrote:
> Hi
> 
> On Wed, Jul 26, 2017 at 7:53 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> >
> > On Tue, Jul 18, 2017 at 06:34:37PM +0200, Marc-André Lureau wrote:
> > > Learn to compile out vhost-user. Keep it enabled by default on
> > > non-mingw, that is assumed to be on POSIX.
> > >
> > > When trying to make a vhost-user netdev, it gives the following error:
> > >
> > > -netdev vhost-user,id=foo,chardev=chr-test: Parameter 'type' expects a netdev backend type
> > >
> > > And similar error with the HMP/QMP monitors.
> > >
> > > In the future, we may want to hide vhost-user from QAPI/introspection
> > > with conditional compilation, although the design of this hasn't been
> > > fully fleshed out yet and shouldn't prevent this patch from being
> > > applied.
> > >
> > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> >
> > After an offline discussion, looks like the idea is to be able to ship a
> > cut down binary with less features (and e.g. smaller attack surface?).
> >
> > Besides failing build on freebsd, this patch has too much ifdefery for
> > my taste. How about we patch just net/net.c?
> >
> 
> The point with --disable-vhost-user was to remove all vhost-user code.

Does not seem to be worth the cost of all these ifdefs.

> For netdev vhost-user only,

Wouldn't we want to disable scsi as well?

> it would be as simple as
> removing/compiling out the line:
> 
>        [NET_CLIENT_DRIVER_VHOST_USER] = net_init_vhost_user,

And I guess the help and tests as well?

> Not sure it's worth a configure option in this case.

Seems like a reasonable thing to do but up to you.

> >
> >
> > > ---
> > >  hw/net/vhost_net.c                | 12 ++++++++++--
> > >  hw/net/virtio-net.c               |  4 ++++
> > >  hw/virtio/virtio-pci.c            |  4 ++--
> > >  net/hub.c                         |  2 ++
> > >  net/net.c                         |  4 +++-
> > >  configure                         | 22 +++++++++++++++++++++-
> > >  default-configs/pci.mak           |  2 +-
> > >  default-configs/s390x-softmmu.mak |  2 +-
> > >  net/Makefile.objs                 |  2 +-
> > >  qemu-options.hx                   |  4 ++++
> > >  tests/Makefile.include            |  6 +++---
> > >  11 files changed, 52 insertions(+), 12 deletions(-)
> > >
> > > diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> > > index e037db63a3..565a1cc99d 100644
> > > --- a/hw/net/vhost_net.c
> > > +++ b/hw/net/vhost_net.c
> > > @@ -56,6 +56,7 @@ static const int kernel_feature_bits[] = {
> > >      VHOST_INVALID_FEATURE_BIT
> > >  };
> > >
> > > +#ifdef CONFIG_VHOST_USER
> > >  /* Features supported by others. */
> > >  static const int user_feature_bits[] = {
> > >      VIRTIO_F_NOTIFY_ON_EMPTY,
> > > @@ -86,6 +87,7 @@ static const int user_feature_bits[] = {
> > >
> > >      VHOST_INVALID_FEATURE_BIT
> > >  };
> > > +#endif
> > >
> > >  static const int *vhost_net_get_feature_bits(struct vhost_net *net)
> > >  {
> > > @@ -95,9 +97,11 @@ static const int *vhost_net_get_feature_bits(struct vhost_net *net)
> > >      case NET_CLIENT_DRIVER_TAP:
> > >          feature_bits = kernel_feature_bits;
> > >          break;
> > > +#ifdef CONFIG_VHOST_USER
> > >      case NET_CLIENT_DRIVER_VHOST_USER:
> > >          feature_bits = user_feature_bits;
> > >          break;
> > > +#endif
> > >      default:
> > >          error_report("Feature bits not defined for this type: %d",
> > >                  net->nc->info->type);
> > > @@ -193,6 +197,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
> > >          }
> > >      }
> > >
> > > +#ifdef CONFIG_VHOST_USER
> > >      /* Set sane init value. Override when guest acks. */
> > >      if (net->nc->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
> > >          features = vhost_user_get_acked_features(net->nc);
> > > @@ -203,7 +208,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
> > >              goto fail;
> > >          }
> > >      }
> > > -
> > > +#endif
> > >      vhost_net_ack_features(net, features);
> > >
> > >      return net;
> > > @@ -309,6 +314,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
> > >          net = get_vhost_net(ncs[i].peer);
> > >          vhost_net_set_vq_index(net, i * 2);
> > >
> > > +#ifdef CONFIG_VHOST_USER
> > >          /* Suppress the masking guest notifiers on vhost user
> > >           * because vhost user doesn't interrupt masking/unmasking
> > >           * properly.
> > > @@ -316,8 +322,8 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
> > >          if (net->nc->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
> > >              dev->use_guest_notifier_mask = false;
> > >          }
> > > +#endif
> > >       }
> > > -
> > >      r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true);
> > >      if (r < 0) {
> > >          error_report("Error binding guest notifier: %d", -r);
> > > @@ -414,10 +420,12 @@ VHostNetState *get_vhost_net(NetClientState *nc)
> > >      case NET_CLIENT_DRIVER_TAP:
> > >          vhost_net = tap_get_vhost_net(nc);
> > >          break;
> > > +#ifdef CONFIG_VHOST_USER
> > >      case NET_CLIENT_DRIVER_VHOST_USER:
> > >          vhost_net = vhost_user_get_vhost_net(nc);
> > >          assert(vhost_net);
> > >          break;
> > > +#endif
> > >      default:
> > >          break;
> > >      }
> > > diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> > > index 148071a396..9bda4ab4f8 100644
> > > --- a/hw/net/virtio-net.c
> > > +++ b/hw/net/virtio-net.c
> > > @@ -524,9 +524,11 @@ static int peer_attach(VirtIONet *n, int index)
> > >          return 0;
> > >      }
> > >
> > > +#ifdef CONFIG_VHOST_USER
> > >      if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
> > >          vhost_set_vring_enable(nc->peer, 1);
> > >      }
> > > +#endif
> > >
> > >      if (nc->peer->info->type != NET_CLIENT_DRIVER_TAP) {
> > >          return 0;
> > > @@ -547,9 +549,11 @@ static int peer_detach(VirtIONet *n, int index)
> > >          return 0;
> > >      }
> > >
> > > +#ifdef CONFIG_VHOST_USER
> > >      if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
> > >          vhost_set_vring_enable(nc->peer, 0);
> > >      }
> > > +#endif
> > >
> > >      if (nc->peer->info->type !=  NET_CLIENT_DRIVER_TAP) {
> > >          return 0;
> > > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> > > index 5d14bd66dc..85b82e6c94 100644
> > > --- a/hw/virtio/virtio-pci.c
> > > +++ b/hw/virtio/virtio-pci.c
> > > @@ -2135,7 +2135,7 @@ static const TypeInfo vhost_scsi_pci_info = {
> > >  };
> > >  #endif
> > >
> > > -#ifdef CONFIG_LINUX
> > > +#ifdef CONFIG_VHOST_USER
> > >  /* vhost-user-scsi-pci */
> > >  static Property vhost_user_scsi_pci_properties[] = {
> > >      DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors,
> > > @@ -2665,7 +2665,7 @@ static void virtio_pci_register_types(void)
> > >  #ifdef CONFIG_VHOST_SCSI
> > >      type_register_static(&vhost_scsi_pci_info);
> > >  #endif
> > > -#ifdef CONFIG_LINUX
> > > +#ifdef CONFIG_VHOST_USER
> > >      type_register_static(&vhost_user_scsi_pci_info);
> > >  #endif
> > >  #ifdef CONFIG_VHOST_VSOCK
> > > diff --git a/net/hub.c b/net/hub.c
> > > index 32d8cf5cd4..ec06275ff6 100644
> > > --- a/net/hub.c
> > > +++ b/net/hub.c
> > > @@ -322,7 +322,9 @@ void net_hub_check_clients(void)
> > >              case NET_CLIENT_DRIVER_TAP:
> > >              case NET_CLIENT_DRIVER_SOCKET:
> > >              case NET_CLIENT_DRIVER_VDE:
> > > +#ifdef CONFIG_VHOST_USER
> > >              case NET_CLIENT_DRIVER_VHOST_USER:
> > > +#endif
> > >                  has_host_dev = 1;
> > >                  break;
> > >              default:
> > > diff --git a/net/net.c b/net/net.c
> > > index 0e28099554..d11909421c 100644
> > > --- a/net/net.c
> > > +++ b/net/net.c
> > > @@ -957,7 +957,7 @@ static int (* const net_client_init_fun[NET_CLIENT_DRIVER__MAX])(
> > >          [NET_CLIENT_DRIVER_BRIDGE]    = net_init_bridge,
> > >  #endif
> > >          [NET_CLIENT_DRIVER_HUBPORT]   = net_init_hubport,
> > > -#ifdef CONFIG_VHOST_NET_USED
> > > +#if defined(CONFIG_VHOST_NET_USED) && defined(CONFIG_VHOST_USER)
> > >          [NET_CLIENT_DRIVER_VHOST_USER] = net_init_vhost_user,
> > >  #endif
> > >  #ifdef CONFIG_L2TPV3
> > > @@ -1033,10 +1033,12 @@ static int net_client_init1(const void *object, bool is_netdev, Error **errp)
> > >              legacy.type = NET_CLIENT_DRIVER_NETMAP;
> > >              legacy.u.netmap = opts->u.netmap;
> > >              break;
> > > +#ifdef CONFIG_VHOST_USER
> > >          case NET_LEGACY_OPTIONS_TYPE_VHOST_USER:
> > >              legacy.type = NET_CLIENT_DRIVER_VHOST_USER;
> > >              legacy.u.vhost_user = opts->u.vhost_user;
> > >              break;
> > > +#endif
> > >          default:
> > >              abort();
> > >          }
> > > diff --git a/configure b/configure
> > > index a3f0522e8f..defb9e9974 100755
> > > --- a/configure
> > > +++ b/configure
> > > @@ -306,6 +306,7 @@ tcg="yes"
> > >  vhost_net="no"
> > >  vhost_scsi="no"
> > >  vhost_vsock="no"
> > > +vhost_user=""
> > >  kvm="no"
> > >  hax="no"
> > >  rdma=""
> > > @@ -1283,6 +1284,10 @@ for opt do
> > >    ;;
> > >    --enable-vxhs) vxhs="yes"
> > >    ;;
> > > +  --disable-vhost-user) vhost_user="no"
> > > +  ;;
> > > +  --enable-vhost-user) vhost_user="yes"
> > > +  ;;
> > >    *)
> > >        echo "ERROR: unknown option $opt"
> > >        echo "Try '$0 --help' for more information"
> > > @@ -1291,6 +1296,14 @@ for opt do
> > >    esac
> > >  done
> > >
> > > +if test "$vhost_user" = ""; then
> > > +    if test "$mingw32" = "yes" ; then
> > > +        vhost_user="no"
> > > +    else
> > > +        vhost_user="yes"
> > > +    fi
> > > +fi
> > > +
> > >  case "$cpu" in
> > >      ppc)
> > >             CPU_CFLAGS="-m32"
> > > @@ -1518,6 +1531,7 @@ disabled with --disable-FEATURE, default is enabled if available:
> > >    qom-cast-debug  cast debugging support
> > >    tools           build qemu-io, qemu-nbd and qemu-image tools
> > >    vxhs            Veritas HyperScale vDisk backend support
> > > +  vhost-user      vhost-user support
> > >
> > >  NOTE: The object files are built at the place where configure is launched
> > >  EOF
> > > @@ -5278,6 +5292,7 @@ echo "libcap-ng support $cap_ng"
> > >  echo "vhost-net support $vhost_net"
> > >  echo "vhost-scsi support $vhost_scsi"
> > >  echo "vhost-vsock support $vhost_vsock"
> > > +echo "vhost-user support $vhost_user"
> > >  echo "Trace backends    $trace_backends"
> > >  if have_backend "simple"; then
> > >  echo "Trace output file $trace_file-<pid>"
> > > @@ -5696,6 +5711,9 @@ fi
> > >  if test "$vhost_vsock" = "yes" ; then
> > >    echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
> > >  fi
> > > +if test "$vhost_user" = "yes" ; then
> > > +  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
> > > +fi
> > >  if test "$blobs" = "yes" ; then
> > >    echo "INSTALL_BLOBS=yes" >> $config_host_mak
> > >  fi
> > > @@ -6279,7 +6297,9 @@ if supported_kvm_target $target; then
> > >      echo "CONFIG_KVM=y" >> $config_target_mak
> > >      if test "$vhost_net" = "yes" ; then
> > >          echo "CONFIG_VHOST_NET=y" >> $config_target_mak
> > > -        echo "CONFIG_VHOST_NET_TEST_$target_name=y" >> $config_host_mak
> > > +        if test "$vhost_user" = "yes" ; then
> > > +            echo "CONFIG_VHOST_USER_NET_TEST_$target_name=y" >> $config_host_mak
> > > +        fi
> > >      fi
> > >  fi
> > >  if supported_hax_target $target; then
> > > diff --git a/default-configs/pci.mak b/default-configs/pci.mak
> > > index 53ff10975c..708d7b19ad 100644
> > > --- a/default-configs/pci.mak
> > > +++ b/default-configs/pci.mak
> > > @@ -43,4 +43,4 @@ CONFIG_VGA=y
> > >  CONFIG_VGA_PCI=y
> > >  CONFIG_IVSHMEM=$(CONFIG_EVENTFD)
> > >  CONFIG_ROCKER=y
> > > -CONFIG_VHOST_USER_SCSI=$(CONFIG_LINUX)
> > > +CONFIG_VHOST_USER_SCSI=$(CONFIG_VHOST_USER)
> > > diff --git a/default-configs/s390x-softmmu.mak b/default-configs/s390x-softmmu.mak
> > > index b227a36179..bb870477f8 100644
> > > --- a/default-configs/s390x-softmmu.mak
> > > +++ b/default-configs/s390x-softmmu.mak
> > > @@ -1,6 +1,6 @@
> > >  CONFIG_PCI=y
> > >  CONFIG_VIRTIO_PCI=y
> > > -CONFIG_VHOST_USER_SCSI=$(CONFIG_LINUX)
> > > +CONFIG_VHOST_USER_SCSI=$(CONFIG_VHOST_USER)
> > >  CONFIG_VIRTIO=y
> > >  CONFIG_SCLPCONSOLE=y
> > >  CONFIG_TERMINAL3270=y
> > > diff --git a/net/Makefile.objs b/net/Makefile.objs
> > > index 67ba5e26fb..7cac7ed1e4 100644
> > > --- a/net/Makefile.objs
> > > +++ b/net/Makefile.objs
> > > @@ -3,7 +3,7 @@ common-obj-y += socket.o
> > >  common-obj-y += dump.o
> > >  common-obj-y += eth.o
> > >  common-obj-$(CONFIG_L2TPV3) += l2tpv3.o
> > > -common-obj-$(CONFIG_POSIX) += vhost-user.o
> > > +common-obj-$(CONFIG_VHOST_USER) += vhost-user.o
> > >  common-obj-$(CONFIG_SLIRP) += slirp.o
> > >  common-obj-$(CONFIG_VDE) += vde.o
> > >  common-obj-$(CONFIG_NETMAP) += netmap.o
> > > diff --git a/qemu-options.hx b/qemu-options.hx
> > > index 746b5fa75d..c2d4ae440f 100644
> > > --- a/qemu-options.hx
> > > +++ b/qemu-options.hx
> > > @@ -1994,8 +1994,10 @@ DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
> > >      "                VALE port (created on the fly) called 'name' ('nmname' is name of the \n"
> > >      "                netmap device, defaults to '/dev/netmap')\n"
> > >  #endif
> > > +#ifdef CONFIG_VHOST_USER
> > >      "-netdev vhost-user,id=str,chardev=dev[,vhostforce=on|off]\n"
> > >      "                configure a vhost-user network, backed by a chardev 'dev'\n"
> > > +#endif
> > >      "-netdev hubport,id=str,hubid=n\n"
> > >      "                configure a hub port on QEMU VLAN 'n'\n", QEMU_ARCH_ALL)
> > >  DEF("net", HAS_ARG, QEMU_OPTION_net,
> > > @@ -2428,6 +2430,7 @@ The hubport netdev lets you connect a NIC to a QEMU "vlan" instead of a single
> > >  netdev.  @code{-net} and @code{-device} with parameter @option{vlan} create the
> > >  required hub automatically.
> > >
> > > +#ifdef CONFIG_VHOST_USER
> > >  @item -netdev vhost-user,chardev=@var{id}[,vhostforce=on|off][,queues=n]
> > >
> > >  Establish a vhost-user netdev, backed by a chardev @var{id}. The chardev should
> > > @@ -2445,6 +2448,7 @@ qemu -m 512 -object memory-backend-file,id=mem,size=512M,mem-path=/hugetlbfs,sha
> > >       -netdev type=vhost-user,id=net0,chardev=chr0 \
> > >       -device virtio-net-pci,netdev=net0
> > >  @end example
> > > +#endif
> > >
> > >  @item -net dump[,vlan=@var{n}][,file=@var{file}][,len=@var{len}]
> > >  Dump network traffic on VLAN @var{n} to file @var{file} (@file{qemu-vlan0.pcap} by default).
> > > diff --git a/tests/Makefile.include b/tests/Makefile.include
> > > index cfbb689e0e..6b9a0ce07e 100644
> > > --- a/tests/Makefile.include
> > > +++ b/tests/Makefile.include
> > > @@ -252,9 +252,9 @@ check-qtest-i386-y += tests/pc-cpu-test$(EXESUF)
> > >  check-qtest-i386-y += tests/q35-test$(EXESUF)
> > >  check-qtest-i386-y += tests/vmgenid-test$(EXESUF)
> > >  gcov-files-i386-y += hw/pci-host/q35.c
> > > -check-qtest-i386-$(CONFIG_VHOST_NET_TEST_i386) += tests/vhost-user-test$(EXESUF)
> > > -ifeq ($(CONFIG_VHOST_NET_TEST_i386),)
> > > -check-qtest-x86_64-$(CONFIG_VHOST_NET_TEST_x86_64) += tests/vhost-user-test$(EXESUF)
> > > +check-qtest-i386-$(CONFIG_VHOST_USER_NET_TEST_i386) += tests/vhost-user-test$(EXESUF)
> > > +ifeq ($(CONFIG_VHOST_USER_NET_TEST_i386),)
> > > +check-qtest-x86_64-$(CONFIG_VHOST_USER_NET_TEST_x86_64) += tests/vhost-user-test$(EXESUF)
> > >  endif
> > >  check-qtest-i386-y += tests/test-netfilter$(EXESUF)
> > >  check-qtest-i386-y += tests/test-filter-mirror$(EXESUF)
> > > --
> > > 2.14.0.rc0.1.g40ca67566
> >
Philippe Mathieu-Daudé July 28, 2017, 5:01 a.m. UTC | #6
On 07/26/2017 02:52 PM, Michael S. Tsirkin wrote:
> On Tue, Jul 18, 2017 at 06:34:37PM +0200, Marc-André Lureau wrote:
...
>> In the future, we may want to hide vhost-user from QAPI/introspection
>> with conditional compilation, although the design of this hasn't been
>> fully fleshed out yet and shouldn't prevent this patch from being
>> applied.
>>
>> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> After an offline discussion, looks like the idea is to be able to ship a
> cut down binary with less features (and e.g. smaller attack surface?).

I think it deserves it own thread, there will be many ideas about it.

I liked this idea a first because it speeds up compilation time (so the 
CI build system can run more tests, cover more of less code...) but then 
we have this unreadable unmanageable ifdefery very hard to maintain, you 
end up not compiling this piece of code, then move things around, 
refactor a bit, change some API and zombie code survives around until 
someone who has this lib try to compile the obsolete code.

This is also why I now prefer to build via docker images (the 
qemu:debian-amd64 try to come with as many dev packages as possible to 
increase code coverage).

There is some dream about having one monolithic QEMU binary able to run 
all cpus/machines/devices. I think this way do reduce attack surface by 
exposing all the surface. This is a bit what is happening during release 
candidate testing when /master is closed, people start to use QEMU 
[differently than while adding features], more surface is stressed, then 
many issues appear and get resolved.

Thomas Huth did some effort adding more poisoned macros and move common 
objects to common-obj, we can do more here, we may need to split more 
sources to move more common code.


Another experience is I'm trying to model a 32-bit big endian ARM board 
then got bugged with 64-bit code this board will never use, or issue 
with PCI and AHCI, so I started to comment those objects using 
obj-$(CONFIG_X) but then CONFIG_X also depends of CONFIG_Y and so, then 
it become hardly scalable, see [1]:

+CONFIG_LAN9118=$(or 
$(CONFIG_REALVIEW),$(CONFIG_EXYNOS4),$(CONFIG_FSL_IMX31))
+CONFIG_SMC91C111=$(or 
$(CONFIG_PXA2XX),$(CONFIG_MAINSTONE),$(CONFIG_REALVIEW))
+CONFIG_ARM_MPTIMER=$(or 
$(CONFIG_A9MPCORE),$(CONFIG_ARM11MPCORE),$(CONFIG_A15MPCORE))
+CONFIG_HIGHBANK=$(and $(CONFIG_A9MPCORE),$(CONFIG_A15MPCORE))

we already have:

crypto-obj-$(if $(CONFIG_NETTLE),n,$(if $(CONFIG_GCRYPT_HMAC),n,y)) += 
hmac-glib.o
crypto/Makefile.objs:23:crypto-obj-$(if $(CONFIG_GCRYPT),n,$(if 
$(CONFIG_GNUTLS_RND),n,y)) += random-platform.o

I ended dropping this branch, I was thinking about using kconfig to 
manage dependencies... The obj-$(CONFIG_XYZ) is useful when kept tiny, 
at most 1 bitwise operation.

I wanted to share my experience and thoughts about it, I hope it's still 
understandable because it's very late :S

Regards,

Phil.

 > Besides failing build on freebsd, this patch has too much ifdefery for
 > my taste. How about we patch just net/net.c?

[1] 
https://github.com/philmd/qemu/commit/2c1c515345d626f47d0968821980f9389d4588b2#diff-6006132695caf8d409e781fbf3d4401f
diff mbox

Patch

diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
index e037db63a3..565a1cc99d 100644
--- a/hw/net/vhost_net.c
+++ b/hw/net/vhost_net.c
@@ -56,6 +56,7 @@  static const int kernel_feature_bits[] = {
     VHOST_INVALID_FEATURE_BIT
 };
 
+#ifdef CONFIG_VHOST_USER
 /* Features supported by others. */
 static const int user_feature_bits[] = {
     VIRTIO_F_NOTIFY_ON_EMPTY,
@@ -86,6 +87,7 @@  static const int user_feature_bits[] = {
 
     VHOST_INVALID_FEATURE_BIT
 };
+#endif
 
 static const int *vhost_net_get_feature_bits(struct vhost_net *net)
 {
@@ -95,9 +97,11 @@  static const int *vhost_net_get_feature_bits(struct vhost_net *net)
     case NET_CLIENT_DRIVER_TAP:
         feature_bits = kernel_feature_bits;
         break;
+#ifdef CONFIG_VHOST_USER
     case NET_CLIENT_DRIVER_VHOST_USER:
         feature_bits = user_feature_bits;
         break;
+#endif
     default:
         error_report("Feature bits not defined for this type: %d",
                 net->nc->info->type);
@@ -193,6 +197,7 @@  struct vhost_net *vhost_net_init(VhostNetOptions *options)
         }
     }
 
+#ifdef CONFIG_VHOST_USER
     /* Set sane init value. Override when guest acks. */
     if (net->nc->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
         features = vhost_user_get_acked_features(net->nc);
@@ -203,7 +208,7 @@  struct vhost_net *vhost_net_init(VhostNetOptions *options)
             goto fail;
         }
     }
-
+#endif
     vhost_net_ack_features(net, features);
 
     return net;
@@ -309,6 +314,7 @@  int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
         net = get_vhost_net(ncs[i].peer);
         vhost_net_set_vq_index(net, i * 2);
 
+#ifdef CONFIG_VHOST_USER
         /* Suppress the masking guest notifiers on vhost user
          * because vhost user doesn't interrupt masking/unmasking
          * properly.
@@ -316,8 +322,8 @@  int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
         if (net->nc->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
             dev->use_guest_notifier_mask = false;
         }
+#endif
      }
-
     r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true);
     if (r < 0) {
         error_report("Error binding guest notifier: %d", -r);
@@ -414,10 +420,12 @@  VHostNetState *get_vhost_net(NetClientState *nc)
     case NET_CLIENT_DRIVER_TAP:
         vhost_net = tap_get_vhost_net(nc);
         break;
+#ifdef CONFIG_VHOST_USER
     case NET_CLIENT_DRIVER_VHOST_USER:
         vhost_net = vhost_user_get_vhost_net(nc);
         assert(vhost_net);
         break;
+#endif
     default:
         break;
     }
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 148071a396..9bda4ab4f8 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -524,9 +524,11 @@  static int peer_attach(VirtIONet *n, int index)
         return 0;
     }
 
+#ifdef CONFIG_VHOST_USER
     if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
         vhost_set_vring_enable(nc->peer, 1);
     }
+#endif
 
     if (nc->peer->info->type != NET_CLIENT_DRIVER_TAP) {
         return 0;
@@ -547,9 +549,11 @@  static int peer_detach(VirtIONet *n, int index)
         return 0;
     }
 
+#ifdef CONFIG_VHOST_USER
     if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_USER) {
         vhost_set_vring_enable(nc->peer, 0);
     }
+#endif
 
     if (nc->peer->info->type !=  NET_CLIENT_DRIVER_TAP) {
         return 0;
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 5d14bd66dc..85b82e6c94 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -2135,7 +2135,7 @@  static const TypeInfo vhost_scsi_pci_info = {
 };
 #endif
 
-#ifdef CONFIG_LINUX
+#ifdef CONFIG_VHOST_USER
 /* vhost-user-scsi-pci */
 static Property vhost_user_scsi_pci_properties[] = {
     DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors,
@@ -2665,7 +2665,7 @@  static void virtio_pci_register_types(void)
 #ifdef CONFIG_VHOST_SCSI
     type_register_static(&vhost_scsi_pci_info);
 #endif
-#ifdef CONFIG_LINUX
+#ifdef CONFIG_VHOST_USER
     type_register_static(&vhost_user_scsi_pci_info);
 #endif
 #ifdef CONFIG_VHOST_VSOCK
diff --git a/net/hub.c b/net/hub.c
index 32d8cf5cd4..ec06275ff6 100644
--- a/net/hub.c
+++ b/net/hub.c
@@ -322,7 +322,9 @@  void net_hub_check_clients(void)
             case NET_CLIENT_DRIVER_TAP:
             case NET_CLIENT_DRIVER_SOCKET:
             case NET_CLIENT_DRIVER_VDE:
+#ifdef CONFIG_VHOST_USER
             case NET_CLIENT_DRIVER_VHOST_USER:
+#endif
                 has_host_dev = 1;
                 break;
             default:
diff --git a/net/net.c b/net/net.c
index 0e28099554..d11909421c 100644
--- a/net/net.c
+++ b/net/net.c
@@ -957,7 +957,7 @@  static int (* const net_client_init_fun[NET_CLIENT_DRIVER__MAX])(
         [NET_CLIENT_DRIVER_BRIDGE]    = net_init_bridge,
 #endif
         [NET_CLIENT_DRIVER_HUBPORT]   = net_init_hubport,
-#ifdef CONFIG_VHOST_NET_USED
+#if defined(CONFIG_VHOST_NET_USED) && defined(CONFIG_VHOST_USER)
         [NET_CLIENT_DRIVER_VHOST_USER] = net_init_vhost_user,
 #endif
 #ifdef CONFIG_L2TPV3
@@ -1033,10 +1033,12 @@  static int net_client_init1(const void *object, bool is_netdev, Error **errp)
             legacy.type = NET_CLIENT_DRIVER_NETMAP;
             legacy.u.netmap = opts->u.netmap;
             break;
+#ifdef CONFIG_VHOST_USER
         case NET_LEGACY_OPTIONS_TYPE_VHOST_USER:
             legacy.type = NET_CLIENT_DRIVER_VHOST_USER;
             legacy.u.vhost_user = opts->u.vhost_user;
             break;
+#endif
         default:
             abort();
         }
diff --git a/configure b/configure
index a3f0522e8f..defb9e9974 100755
--- a/configure
+++ b/configure
@@ -306,6 +306,7 @@  tcg="yes"
 vhost_net="no"
 vhost_scsi="no"
 vhost_vsock="no"
+vhost_user=""
 kvm="no"
 hax="no"
 rdma=""
@@ -1283,6 +1284,10 @@  for opt do
   ;;
   --enable-vxhs) vxhs="yes"
   ;;
+  --disable-vhost-user) vhost_user="no"
+  ;;
+  --enable-vhost-user) vhost_user="yes"
+  ;;
   *)
       echo "ERROR: unknown option $opt"
       echo "Try '$0 --help' for more information"
@@ -1291,6 +1296,14 @@  for opt do
   esac
 done
 
+if test "$vhost_user" = ""; then
+    if test "$mingw32" = "yes" ; then
+        vhost_user="no"
+    else
+        vhost_user="yes"
+    fi
+fi
+
 case "$cpu" in
     ppc)
            CPU_CFLAGS="-m32"
@@ -1518,6 +1531,7 @@  disabled with --disable-FEATURE, default is enabled if available:
   qom-cast-debug  cast debugging support
   tools           build qemu-io, qemu-nbd and qemu-image tools
   vxhs            Veritas HyperScale vDisk backend support
+  vhost-user      vhost-user support
 
 NOTE: The object files are built at the place where configure is launched
 EOF
@@ -5278,6 +5292,7 @@  echo "libcap-ng support $cap_ng"
 echo "vhost-net support $vhost_net"
 echo "vhost-scsi support $vhost_scsi"
 echo "vhost-vsock support $vhost_vsock"
+echo "vhost-user support $vhost_user"
 echo "Trace backends    $trace_backends"
 if have_backend "simple"; then
 echo "Trace output file $trace_file-<pid>"
@@ -5696,6 +5711,9 @@  fi
 if test "$vhost_vsock" = "yes" ; then
   echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
 fi
+if test "$vhost_user" = "yes" ; then
+  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
+fi
 if test "$blobs" = "yes" ; then
   echo "INSTALL_BLOBS=yes" >> $config_host_mak
 fi
@@ -6279,7 +6297,9 @@  if supported_kvm_target $target; then
     echo "CONFIG_KVM=y" >> $config_target_mak
     if test "$vhost_net" = "yes" ; then
         echo "CONFIG_VHOST_NET=y" >> $config_target_mak
-        echo "CONFIG_VHOST_NET_TEST_$target_name=y" >> $config_host_mak
+        if test "$vhost_user" = "yes" ; then
+            echo "CONFIG_VHOST_USER_NET_TEST_$target_name=y" >> $config_host_mak
+        fi
     fi
 fi
 if supported_hax_target $target; then
diff --git a/default-configs/pci.mak b/default-configs/pci.mak
index 53ff10975c..708d7b19ad 100644
--- a/default-configs/pci.mak
+++ b/default-configs/pci.mak
@@ -43,4 +43,4 @@  CONFIG_VGA=y
 CONFIG_VGA_PCI=y
 CONFIG_IVSHMEM=$(CONFIG_EVENTFD)
 CONFIG_ROCKER=y
-CONFIG_VHOST_USER_SCSI=$(CONFIG_LINUX)
+CONFIG_VHOST_USER_SCSI=$(CONFIG_VHOST_USER)
diff --git a/default-configs/s390x-softmmu.mak b/default-configs/s390x-softmmu.mak
index b227a36179..bb870477f8 100644
--- a/default-configs/s390x-softmmu.mak
+++ b/default-configs/s390x-softmmu.mak
@@ -1,6 +1,6 @@ 
 CONFIG_PCI=y
 CONFIG_VIRTIO_PCI=y
-CONFIG_VHOST_USER_SCSI=$(CONFIG_LINUX)
+CONFIG_VHOST_USER_SCSI=$(CONFIG_VHOST_USER)
 CONFIG_VIRTIO=y
 CONFIG_SCLPCONSOLE=y
 CONFIG_TERMINAL3270=y
diff --git a/net/Makefile.objs b/net/Makefile.objs
index 67ba5e26fb..7cac7ed1e4 100644
--- a/net/Makefile.objs
+++ b/net/Makefile.objs
@@ -3,7 +3,7 @@  common-obj-y += socket.o
 common-obj-y += dump.o
 common-obj-y += eth.o
 common-obj-$(CONFIG_L2TPV3) += l2tpv3.o
-common-obj-$(CONFIG_POSIX) += vhost-user.o
+common-obj-$(CONFIG_VHOST_USER) += vhost-user.o
 common-obj-$(CONFIG_SLIRP) += slirp.o
 common-obj-$(CONFIG_VDE) += vde.o
 common-obj-$(CONFIG_NETMAP) += netmap.o
diff --git a/qemu-options.hx b/qemu-options.hx
index 746b5fa75d..c2d4ae440f 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -1994,8 +1994,10 @@  DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
     "                VALE port (created on the fly) called 'name' ('nmname' is name of the \n"
     "                netmap device, defaults to '/dev/netmap')\n"
 #endif
+#ifdef CONFIG_VHOST_USER
     "-netdev vhost-user,id=str,chardev=dev[,vhostforce=on|off]\n"
     "                configure a vhost-user network, backed by a chardev 'dev'\n"
+#endif
     "-netdev hubport,id=str,hubid=n\n"
     "                configure a hub port on QEMU VLAN 'n'\n", QEMU_ARCH_ALL)
 DEF("net", HAS_ARG, QEMU_OPTION_net,
@@ -2428,6 +2430,7 @@  The hubport netdev lets you connect a NIC to a QEMU "vlan" instead of a single
 netdev.  @code{-net} and @code{-device} with parameter @option{vlan} create the
 required hub automatically.
 
+#ifdef CONFIG_VHOST_USER
 @item -netdev vhost-user,chardev=@var{id}[,vhostforce=on|off][,queues=n]
 
 Establish a vhost-user netdev, backed by a chardev @var{id}. The chardev should
@@ -2445,6 +2448,7 @@  qemu -m 512 -object memory-backend-file,id=mem,size=512M,mem-path=/hugetlbfs,sha
      -netdev type=vhost-user,id=net0,chardev=chr0 \
      -device virtio-net-pci,netdev=net0
 @end example
+#endif
 
 @item -net dump[,vlan=@var{n}][,file=@var{file}][,len=@var{len}]
 Dump network traffic on VLAN @var{n} to file @var{file} (@file{qemu-vlan0.pcap} by default).
diff --git a/tests/Makefile.include b/tests/Makefile.include
index cfbb689e0e..6b9a0ce07e 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -252,9 +252,9 @@  check-qtest-i386-y += tests/pc-cpu-test$(EXESUF)
 check-qtest-i386-y += tests/q35-test$(EXESUF)
 check-qtest-i386-y += tests/vmgenid-test$(EXESUF)
 gcov-files-i386-y += hw/pci-host/q35.c
-check-qtest-i386-$(CONFIG_VHOST_NET_TEST_i386) += tests/vhost-user-test$(EXESUF)
-ifeq ($(CONFIG_VHOST_NET_TEST_i386),)
-check-qtest-x86_64-$(CONFIG_VHOST_NET_TEST_x86_64) += tests/vhost-user-test$(EXESUF)
+check-qtest-i386-$(CONFIG_VHOST_USER_NET_TEST_i386) += tests/vhost-user-test$(EXESUF)
+ifeq ($(CONFIG_VHOST_USER_NET_TEST_i386),)
+check-qtest-x86_64-$(CONFIG_VHOST_USER_NET_TEST_x86_64) += tests/vhost-user-test$(EXESUF)
 endif
 check-qtest-i386-y += tests/test-netfilter$(EXESUF)
 check-qtest-i386-y += tests/test-filter-mirror$(EXESUF)