Finally managed to run l2fwd with virtio PMD. Providing details as promised.


1. For some reason, when l2fwd is running, virtual screen stops updating. The
system itself is NOT frozen: l2fwd forwards packets, processes can be
launched using QEMU guest agent, input is received and processed. Since this
doesn't happen with different driver and ported upstream DPDK, there is
obviously a software bug either in netUIO or in draft DPDK, not in QEMU.


2. Testing setup

Schematically:

  +-------------------+  +-------------------+  +-------------------+
  | Linux guest Alice |  | Windows guest     |  | Linux guest Bob   |
  |                   |  |                   |  |                   |
  | 172.16.0.1/24     |  |     __l2fwd__     |  | 172.16.0.2/24     |
  | 02:00:ac:10:00:01 |  |    /         \    |  | 02:00:ac:10:00:02 |
  |              ens4 |  | 00:04.0   00:05.0 |  | ens4              |
  +-------------------+  +-------------------+  +-------------------+
  | QEMU           dp |  | dp0    QEMU   dp1 |  | dp           QEMU |
  +-------------------+  +-------------------+  +-------------------+
              connect      listen     listen      connect
              :10000       :10000     :10001      :10001
  Linux host      \___________/           \_________/

Windows VM (Windows 10 Pro):

qemu-system-x86_64 \
    -enable-kvm -cpu host -smp 'cores=4,sockets=1,threads=1' -m 6G -drive 
"file=$disk,format=qcow2" \
    -netdev 'socket,listen=:10000,id=dp0' -device 
'virtio-net-pci,disable-modern=off,disable-legacy=on,netdev=dp0' \
    -netdev 'socket,listen=:10001,id=dp1' -device 
'virtio-net-pci,disable-modern=off,disable-legacy=on,netdev=dp1'

Linux VM "Alice" (Debian 10):

qemu-system-x86_64 \
    -enable-kvm -cpu host -smp 'cores=2,sockets=1,threads=1' -m 1G drive 
"file=$disk,format=qcow2" \
    -netdev "socket,connect=:10000,id=dp" -device 
'virtio-net-pci,disable-modern=off,disable-legacy=on,netdev=dp'

Linux VM "Bob" (Debian 10):

qemu-system-x86_64 \
    -enable-kvm -cpu host -smp 'cores=2,sockets=1,threads=1' -m 1G drive 
"file=$disk,format=qcow2" \
    -netdev "socket,connect=:10001,id=dp" -device 
'virtio-net-pci,disable-modern=off,disable-legacy=on,netdev=dp'

(Note: non-essential QEMU options omitted, like management NIC).

Driver: netUIO + multi-BAR patches from Narcisa + virtio HW ID patch.
DPDK: windpdk-v18.08-clang + PCI patch + patches for virtio.

Endpoint setup:

root@alice# ip link set ens4 address 02:00:ac:10:00:01
root@alice# ip address add 172.16.0.1/24 dev ens4
root@alice# ip link set ens4 up

root@bob# ip link set ens4 address 02:00:ac:10:00:02
root@bob# ip address add 172.16.0.2/24 dev ens4
root@bob# ip link set ens4 up

DUT setup:

Z:\dpdk\x64\Debug\netuio\netuio> pnputil /add-driver netuio.inf /install
Z:\dpdk\x64\Debug\l2fwd> l2fwd.exe -c3 -- -p3 -T1 --no-mac-updating
(display stops updating, exit later with Ctrl+C)

Validate connectivity:

root@alice# ping 172.16.0.2


3. Patch instruction is a bit involved:

* Base on windpdk-v18.08-clang.
* Import drivers/net/virtio from v18.08 (not attached due to size).
* Apply windpdk-virtio-1.patch (attached).
* Apply multi-BAR patches (not attached due to not being mine).
* Apply windpdk-virtio-2.patch (attached).

There is one patch in windpdk-virtio-2.patch that splits PCI config I/O of
arbitrary size to a series of 4/2/1 accesses. It is implemented in user-mode
because it was easier to debug, but maybe it should be moved to netUIO, so
that any region of PCI config space can be read/written in a single syscall.

-- 
Dmitry Kozlyuk

Reply via email to