This series introduces support for passt as a new network backend for
QEMU.

The purpose of this new backend is to help to use passt daemon as
easily as the user backend ('-nic passt' as we have '-nic user').
All the passt functionalities will not be available to keep it simple,
and the goal is not to be supported by libvirt, as in these cases the
best way to use passt will be to use stream or vhost-user backend
with an externaly started passt daemon.

passt is a modern, unprivileged, user-mode networking solution that
provides guest connectivity by launching an external helper process. This
series adds the core backend and integrates it with vhost-user for
high-performance, accelerated networking.

The series is structured to first improve the general networking code
before adding the new feature. The first patch extracts from the stream
backend the functions that will be reused in the passt backend. The
following patches are a preparatory refactoring to decouple the generic
vhost layer from specific backend implementations (tap, vhost-user, etc.).
This is achieved by replacing hardcoded type checks with a callback-based
system in NetClientInfo and vhost-net, making the vhost infrastructure more
modular and extensible.

With the refactoring in place, subsequent patches introduce the passt
backend itself, reusing the generic stream handling logic. The final
patch adds vhost-user support to passt, which plugs cleanly into the
newly refactored vhost layer.

Some benchmarks:

 Reference '-net user':

  -net user,hostfwd=tcp::10001-:10001

    iperf3 -c localhost -p 10001  -t 60 -4

    [ ID] Interval           Transfer     Bitrate         Retr
    [  5]   0.00-60.00  sec  14.2 GBytes  2.03 Gbits/sec    1            sender
    [  5]   0.00-60.00  sec  14.2 GBytes  2.03 Gbits/sec                  
receiver

 New backend '-netdev passt'

  -netdev passt,vhost-user=off,tcp-ports=10001

    iperf3 -c localhost -p 10001  -t 60 -4

    [ ID] Interval           Transfer     Bitrate         Retr
    [  5]   0.00-60.00  sec  27.1 GBytes  3.88 Gbits/sec    0            sender
    [  5]   0.00-60.03  sec  27.1 GBytes  3.88 Gbits/sec                  
receiver

  -netdev passt,vhost-user=on,tcp-ports=10001

    iperf3 -c localhost -p 10001  -t 60 -4

    [ ID] Interval           Transfer     Bitrate         Retr
    [  5]   0.00-60.00  sec   224 GBytes  32.1 Gbits/sec    4            sender
    [  5]   0.00-60.05  sec   224 GBytes  32.0 Gbits/sec                  
receiver

v4:
  - back to v2 parameters (except debug and trace parameters) + v3 generic 
"param"
  - update documentation

v3:
  - tested with
        -nic passt
    and
        -nic passt,model=virtio,vhost-user=on

    and fixed passt_check_peer_type()
  - moved new fields from NetClientInfo to vhost-net struct
  - Remove most of the hardcoded parameters to introduce a generic
    "param" parameter, like:
      -nic passt,param=--tcp-ports=10001,param=--udp-ports=10001
  - added patches:
    vhost_net: Rename vhost_set_vring_enable() for clarity
    net: Add is_vhost_user flag to vhost_net struct
    (this one replaces "net: Introduce helper to identify vhost-user clients")
  - update documentation

v2:
  - rebase:
      fix conflict with
        837b87c4c5ba ("net/stream: skip automatic zero-init of large array")
  - add path parameter to provide path of passt if it is not in PATH
  - add 2 patches:
        "net: Allow network backends to advertise max TX queue size"
        "net: Consolidate vhost feature bits into NetClientInfo"

Thanks,
Laurent

Laurent Vivier (11):
  net: Refactor stream logic for reuse in '-net passt'
  net: Define net_client_set_link()
  vhost_net: Rename vhost_set_vring_enable() for clarity
  net: Add get_vhost_net callback to NetClientInfo
  net: Consolidate vhost feature bits into vhost_net structure
  net: Add get_acked_features callback to VhostNetOptions
  net: Add save_acked_features callback to vhost_net
  net: Allow network backends to advertise max TX queue size
  net: Add is_vhost_user flag to vhost_net struct
  net: Add passt network backend
  net/passt: Implement vhost-user backend support

 docs/system/devices/net.rst   |  50 ++-
 hmp-commands.hx               |   3 +
 hw/net/vhost_net-stub.c       |   3 +-
 hw/net/vhost_net.c            | 145 +------
 hw/net/virtio-net.c           |  36 +-
 include/hw/virtio/vhost.h     |   5 +
 include/net/net.h             |   3 +
 include/net/tap.h             |   3 -
 include/net/vhost-user.h      |  19 -
 include/net/vhost-vdpa.h      |   4 -
 include/net/vhost_net.h       |  10 +-
 meson.build                   |   6 +
 meson_options.txt             |   2 +
 net/clients.h                 |   4 +
 net/hub.c                     |   3 +
 net/meson.build               |   6 +-
 net/net.c                     |  36 +-
 net/passt.c                   | 753 ++++++++++++++++++++++++++++++++++
 net/stream.c                  | 282 +++----------
 net/stream_data.c             | 193 +++++++++
 net/stream_data.h             |  31 ++
 net/tap-win32.c               |   5 -
 net/tap.c                     |  43 +-
 net/vhost-user-stub.c         |   1 -
 net/vhost-user.c              |  60 ++-
 net/vhost-vdpa.c              |  11 +-
 qapi/net.json                 | 118 ++++++
 qemu-options.hx               | 153 ++++++-
 scripts/meson-buildoptions.sh |   3 +
 29 files changed, 1564 insertions(+), 427 deletions(-)
 delete mode 100644 include/net/vhost-user.h
 create mode 100644 net/passt.c
 create mode 100644 net/stream_data.c
 create mode 100644 net/stream_data.h

-- 
2.49.0



Reply via email to