Skip to contentSkip to conversation

runqemu improvements

PATCH New Aníbal Limón 1 participant 4 messages Oct 22, 2015

lore
Share & tools
lore
#0 lore raw

cover runqemu improvements

The first patch enable support for use kvm without vhost a new option (kvm-vhost) was added for use kvm with vhost,

The second and third patch enables usage of virtio devices/drivers in qemu machines by default, I ran all oe-core qemu machines with core-image-minimal, i tested arm, arm64, arm-lsb, x86, x86-64, x86-64-lsb running sanity tests and x86 with core-image-rt.

The following changes since commit 8578bc17b54da97d42b257b3c8f398ac52b91a9f:

libc-package: Fix localedef multilib dependency issues (2015-10-20 10:12:01 +0100)

are available in the git repository at:

git://git.yoctoproject.org/poky-contrib alimon/runqemu_changes
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=alimon/runqemu_changes

Aníbal Limón (3):
runqemu: Enable support for kvm without vhost in x86 and x86_64 linux-yocto{,-rt}: Enable support for virtio drivers in qemu machines.
runqemu-internal: Enable support for use virtio devices.

 meta/recipes-kernel/linux/linux-yocto-rt_3.14.bb |  1 +
 meta/recipes-kernel/linux/linux-yocto-rt_4.1.bb  |  1 +
 meta/recipes-kernel/linux/linux-yocto_3.14.bb    |  2 +-
 meta/recipes-kernel/linux/linux-yocto_3.19.bb    |  2 +-
 meta/recipes-kernel/linux/linux-yocto_4.1.bb     |  2 +-
 scripts/runqemu                                  | 31 +++++++++-----
 scripts/runqemu-internal                         | 53 +++++++-----------------
 7 files changed, 42 insertions(+), 50 deletions(-)
Signature · 1 line
2.1.4
#1 lore raw

PATCH 1/3 runqemu: Enable support for kvm without vhost in x86 and x86_64

KVM can be used without vhost so add a new option to runqemu for use kvm with vhost.

Example,
runqemu qemux86 core-image-minimal kvm # kvm without vhost runqemu qemux86 core-image-minimal kvm-vhost # kvm with vhost

[YOCTO #7443]

---
 scripts/runqemu          | 31 +++++++++++++++++++++----------
 scripts/runqemu-internal |  6 +++++-
 2 files changed, 26 insertions(+), 11 deletions(-)
scripts/runqemu +21 -10
index 5989507..e01d276 100755
@@ -33,6 +33,7 @@ usage() {
     echo "    nographic - disables video console"
     echo "    serial - enables a serial console on /dev/ttyS0"
     echo "    kvm - enables KVM when running qemux86/qemux86-64 (VT-capable CPU required)"
+    echo "    kvm-vhost - enables KVM with vhost support when running qemux86/qemux86-64 (VT-capable CPU required)"
     echo "    publicvnc - enable a VNC server open to all hosts"
     echo "  qemuparams=\"xyz\" - specify custom parameters to QEMU"
     echo "  bootparams=\"xyz\" - specify custom kernel parameters during boot"
@@ -71,6 +72,8 @@ SERIALSTDIO=""
 TCPSERIAL_PORTNUM=""
 KVM_ENABLED="no"
 KVM_ACTIVE="no"
+VHOST_ENABLED="no"
+VHOST_ACTIVE="no"
 
 # Determine whether the file is a kernel or QEMU image, and set the
 # appropriate variables
@@ -170,6 +173,11 @@ while true; do
             KVM_ENABLED="yes"
             KVM_CAPABLE=`grep -q 'vmx\|svm' /proc/cpuinfo && echo 1`
             ;;
+        "kvm-vhost")
+            KVM_ENABLED="yes"
+            KVM_CAPABLE=`grep -q 'vmx\|svm' /proc/cpuinfo && echo 1`
+            VHOST_ENABLED="yes"
+            ;;
         "slirp")
             SLIRP_ENABLED="yes"
             ;;
@@ -270,12 +278,6 @@ if [ "x$KVM_ENABLED" = "xyes" ]; then
         echo "$YOCTO_KVM_WIKI";
         exit 1;
     fi
-    if [ ! -e /dev/vhost-net ]; then
-        echo "Missing virtio net device. Have you inserted vhost-net module?"
-        echo "For further help see:"
-        echo "$YOCTO_PARAVIRT_KVM_WIKI";
-        exit 1;
-    fi
     if [ -w /dev/kvm -a -r /dev/kvm ]; then
         SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -enable-kvm"
         KVM_ACTIVE="yes"
@@ -285,13 +287,22 @@ if [ "x$KVM_ENABLED" = "xyes" ]; then
         echo "$YOCTO_KVM_WIKI";
         exit 1;
     fi
-    if [ ! -w /dev/vhost-net -o ! -r /dev/vhost-net ]; then
-	if [ "$SLIRP_ENABLED" != "yes" ] ; then
+    if [ "x$VHOST_ENABLED" = "xyes" ]; then
+        if [ ! -e /dev/vhost-net ]; then
+            echo "Missing virtio net device. Have you inserted vhost-net module?"
+            echo "For further help see:"
+            echo "$YOCTO_PARAVIRT_KVM_WIKI";
+            exit 1;
+        fi
+
+        if [ -w /dev/vhost-net -a -r /dev/vhost-net ]; then
+            VHOST_ACTIVE="yes"
+        else
             echo "You have no rights on /dev/vhost-net."
             echo "Please change the ownership of this file as described at:"
-            echo "$YOCTO_PARAVIRT_KVM_WIKI";
+            echo "$YOCTO_KVM_WIKI";
             exit 1;
-	fi
+        fi
     fi
 fi
 
scripts/runqemu-internal +5 -1
index 13840b3..38ea965 100755
@@ -267,7 +267,11 @@ else
         KERNEL_NETWORK_CMD="ip=192.168.7.$n2::192.168.7.$n1:255.255.255.0"
         QEMU_TAP_CMD="-net tap,vlan=0,ifname=$TAP,script=no,downscript=no"
         if [ "$KVM_ACTIVE" = "yes" ]; then
-            QEMU_NETWORK_CMD="-net nic,model=virtio $QEMU_TAP_CMD,vhost=on"
+            if [ "$VHOST_ACTIVE" = "yes" ]; then
+                QEMU_NETWORK_CMD="-net nic,model=virtio $QEMU_TAP_CMD,vhost=on"
+            else
+                QEMU_NETWORK_CMD="-net nic,model=virtio $QEMU_TAP_CMD"
+            fi
             DROOT="/dev/vda"
             ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio,format=raw"
         else
Signature · 1 line
2.1.4
#2 lore raw

PATCH 2/3 linux-yocto{, -rt}: Enable support for virtio drivers in qemu machines.

In reply to Aníbal Limón

In order to use virtio devices as default in runqemu script because these drivers are designed to use in vrit providing better performance.

[YOCTO #8427]

---
 meta/recipes-kernel/linux/linux-yocto-rt_3.14.bb | 1 +
 meta/recipes-kernel/linux/linux-yocto-rt_4.1.bb  | 1 +
 meta/recipes-kernel/linux/linux-yocto_3.14.bb    | 2 +-
 meta/recipes-kernel/linux/linux-yocto_3.19.bb    | 2 +-
 meta/recipes-kernel/linux/linux-yocto_4.1.bb     | 2 +-
 5 files changed, 5 insertions(+), 3 deletions(-)
meta/recipes-kernel/linux/linux-yocto-rt_3.14.bb +1 -0
index 4d3d5c8..45a197e 100644
@@ -24,5 +24,6 @@ COMPATIBLE_MACHINE = "(qemux86|qemux86-64|qemuarm|qemuppc|qemumips)"
 # Functionality flags
 KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc features/taskstats/taskstats.scc"
 KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
+KERNEL_FEATURES_append_qemuall=" cfg/virtio.scc"
 KERNEL_FEATURES_append_qemux86=" cfg/sound.scc cfg/paravirt_kvm.scc"
 KERNEL_FEATURES_append_qemux86-64=" cfg/sound.scc"
meta/recipes-kernel/linux/linux-yocto-rt_4.1.bb +1 -0
index 32c9f86..e80b8e2 100644
@@ -22,5 +22,6 @@ COMPATIBLE_MACHINE = "(qemux86|qemux86-64|qemuarm|qemuppc|qemumips)"
 # Functionality flags
 KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc features/taskstats/taskstats.scc"
 KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
+KERNEL_FEATURES_append_qemuall=" cfg/virtio.scc"
 KERNEL_FEATURES_append_qemux86=" cfg/sound.scc cfg/paravirt_kvm.scc"
 KERNEL_FEATURES_append_qemux86-64=" cfg/sound.scc"
meta/recipes-kernel/linux/linux-yocto_3.14.bb +1 -1
index 0a37cb6..efba492 100644
@@ -36,7 +36,7 @@ COMPATIBLE_MACHINE = "qemuarm|qemuarm64|qemux86|qemuppc|qemumips|qemumips64|qemu
 # Functionality flags
 KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc"
 KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
-KERNEL_FEATURES_append_qemuarm=" cfg/virtio.scc"
+KERNEL_FEATURES_append_qemuall=" cfg/virtio.scc"
 KERNEL_FEATURES_append_qemux86=" cfg/sound.scc cfg/paravirt_kvm.scc"
 KERNEL_FEATURES_append_qemux86-64=" cfg/sound.scc cfg/paravirt_kvm.scc"
 KERNEL_FEATURES_append = " ${@bb.utils.contains("TUNE_FEATURES", "mx32", " cfg/x32.scc", "" ,d)}"
meta/recipes-kernel/linux/linux-yocto_3.19.bb +1 -1
index 4143a09..f9d77af 100644
@@ -36,7 +36,7 @@ COMPATIBLE_MACHINE = "qemuarm|qemuarm64|qemux86|qemuppc|qemumips|qemumips64|qemu
 # Functionality flags
 KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc"
 KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
-KERNEL_FEATURES_append_qemuarm=" cfg/virtio.scc"
+KERNEL_FEATURES_append_qemuall=" cfg/virtio.scc"
 KERNEL_FEATURES_append_qemux86=" cfg/sound.scc cfg/paravirt_kvm.scc"
 KERNEL_FEATURES_append_qemux86-64=" cfg/sound.scc cfg/paravirt_kvm.scc"
 KERNEL_FEATURES_append = " ${@bb.utils.contains("TUNE_FEATURES", "mx32", " cfg/x32.scc", "" ,d)}"
meta/recipes-kernel/linux/linux-yocto_4.1.bb +1 -1
index e98f2de..bdefbb8 100644
@@ -36,7 +36,7 @@ COMPATIBLE_MACHINE = "qemuarm|qemuarm64|qemux86|qemuppc|qemumips|qemumips64|qemu
 # Functionality flags
 KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc"
 KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
-KERNEL_FEATURES_append_qemuarm=" cfg/virtio.scc"
+KERNEL_FEATURES_append_qemuall=" cfg/virtio.scc"
 KERNEL_FEATURES_append_qemux86=" cfg/sound.scc cfg/paravirt_kvm.scc"
 KERNEL_FEATURES_append_qemux86-64=" cfg/sound.scc cfg/paravirt_kvm.scc"
 KERNEL_FEATURES_append = " ${@bb.utils.contains("TUNE_FEATURES", "mx32", " cfg/x32.scc", "" ,d)}"
Signature · 1 line
2.1.4
#3 lore raw

PATCH 3/3 runqemu-internal: Enable support for use virtio devices.

In reply to Aníbal Limón

Enable virtio usage for default in runqemu also get rid of duplicate configuration from now all qemu machines uses virtio.

[YOCTO #8427]

---
 scripts/runqemu-internal | 59 ++++++++++++++----------------------------------
 1 file changed, 17 insertions(+), 42 deletions(-)
scripts/runqemu-internal +17 -42
index 38ea965..3b0e54c 100755
@@ -120,16 +120,9 @@ if [ "$SLIRP_ENABLED" = "yes" ]; then
     KERNEL_NETWORK_CMD="ip=dhcp"
     QEMU_TAP_CMD=""
     QEMU_UI_OPTIONS="-show-cursor -usb -usbdevice wacom-tablet"
-    if [ "$KVM_ACTIVE" = "yes" ]; then
-        QEMU_NETWORK_CMD=""
-        DROOT="/dev/vda"
-        ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio,format=raw"
-    else
-        QEMU_NETWORK_CMD=""
-        DROOT="/dev/hda"
-        ROOTFS_OPTIONS="-drive file=$ROOTFS,if=ide,format=raw"
-    fi
-
+    QEMU_NETWORK_CMD=""
+    DROOT="/dev/vda"
+    ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio,format=raw"
 else
         acquire_lock() {
             lockfile=$1
@@ -266,24 +259,13 @@ else
 
         KERNEL_NETWORK_CMD="ip=192.168.7.$n2::192.168.7.$n1:255.255.255.0"
         QEMU_TAP_CMD="-net tap,vlan=0,ifname=$TAP,script=no,downscript=no"
-        if [ "$KVM_ACTIVE" = "yes" ]; then
-            if [ "$VHOST_ACTIVE" = "yes" ]; then
-                QEMU_NETWORK_CMD="-net nic,model=virtio $QEMU_TAP_CMD,vhost=on"
-            else
-                QEMU_NETWORK_CMD="-net nic,model=virtio $QEMU_TAP_CMD"
-            fi
-            DROOT="/dev/vda"
-            ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio,format=raw"
+        if [ "$VHOST_ACTIVE" = "yes" ]; then
+            QEMU_NETWORK_CMD="-net nic,model=virtio $QEMU_TAP_CMD,vhost=on"
         else
-            QEMU_NETWORK_CMD="-net nic,vlan=0 $QEMU_TAP_CMD"
-            DROOT="/dev/hda"
-            ROOTFS_OPTIONS="-drive file=$ROOTFS,if=ide,format=raw"
-        fi
-        if [ "$MACHINE" = "qemuarm64" ]; then
-            QEMU_NETWORK_CMD="-netdev tap,id=net0,ifname=$TAP,script=no,downscript=no -device virtio-net-device,netdev=net0 "
-            DROOT="/dev/vda"
-            ROOTFS_OPTIONS="-drive id=disk0,file=$ROOTFS,if=none,format=raw -device virtio-blk-device,drive=disk0"
+            QEMU_NETWORK_CMD="-net nic,model=virtio $QEMU_TAP_CMD"
         fi
+        DROOT="/dev/vda"
+        ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio,format=raw"
 
         KERNCMDLINE="mem=$QEMU_MEMORY"
         QEMU_UI_OPTIONS="-show-cursor -usb -usbdevice wacom-tablet"
@@ -368,16 +350,6 @@ if [ "$MACHINE" = "qemuarm" -o "$MACHINE" = "qemuarmv6" -o "$MACHINE" = "qemuarm
     QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS"
     # QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS -force-pointer"
     if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then
-        if [ "$MACHINE" = "qemuarm" ]; then
-            QEMU_NETWORK_CMD="-net nic,model=virtio $QEMU_TAP_CMD"
-            DROOT="/dev/vda"
-            ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio,format=raw"
-        else
-            QEMU_NETWORK_CMD="-net nic,vlan=0 $QEMU_TAP_CMD"
-            DROOT="/dev/sda"
-            ROOTFS_OPTIONS="-drive file=$ROOTFS,format=raw"
-        fi
-
         KERNCMDLINE="root=$DROOT rw console=ttyAMA0,115200 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY highres=off"
         QEMUOPTIONS="$QEMU_NETWORK_CMD -M ${MACHINE_SUBTYPE} $ROOTFS_OPTIONS -no-reboot $QEMU_UI_OPTIONS"
     fi
@@ -401,6 +373,10 @@ fi
 if [ "$MACHINE" = "qemuarm64" ]; then
     QEMU=qemu-system-aarch64
 
+    QEMU_NETWORK_CMD="-netdev tap,id=net0,ifname=$TAP,script=no,downscript=no -device virtio-net-device,netdev=net0 "
+    DROOT="/dev/vda"
+    ROOTFS_OPTIONS="-drive id=disk0,file=$ROOTFS,if=none,format=raw -device virtio-blk-device,drive=disk0"
+
     export QEMU_AUDIO_DRV="none"
     if [ "x$SERIALSTDIO" = "x" ] ; then
         QEMU_UI_OPTIONS="-nographic"
@@ -408,7 +384,7 @@ if [ "$MACHINE" = "qemuarm64" ]; then
         QEMU_UI_OPTIONS=""
     fi
     if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then
-        KERNCMDLINE="root=/dev/vda rw console=ttyAMA0,38400 mem=$QEMU_MEMORY highres=off $KERNEL_NETWORK_CMD"
+        KERNCMDLINE="root=$DROOT rw console=ttyAMA0,38400 mem=$QEMU_MEMORY highres=off $KERNEL_NETWORK_CMD"
         # qemu-system-aarch64 only support '-machine virt -cpu cortex-a57' for now
         QEMUOPTIONS="$QEMU_NETWORK_CMD -machine virt -cpu cortex-a57 $ROOTFS_OPTIONS $QEMU_UI_OPTIONS"
     fi
@@ -423,7 +399,6 @@ if [ "$MACHINE" = "qemuarm64" ]; then
     fi
 fi
 
-
 if [ "$MACHINE" = "qemux86" ]; then
     QEMU=qemu-system-i386
     if [ "$KVM_ACTIVE" = "yes" ]; then
@@ -522,8 +497,8 @@ if [ "$MACHINE" = "qemumips" -o "$MACHINE" = "qemumipsel" -o "$MACHINE" = "qemum
     QEMU_UI_OPTIONS="-vga cirrus $QEMU_UI_OPTIONS"
     if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then
         #KERNCMDLINE="root=/dev/hda console=ttyS0 console=tty0 $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
-        KERNCMDLINE="root=/dev/hda rw console=ttyS0 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
-        QEMUOPTIONS="$QEMU_NETWORK_CMD -M $MACHINE_SUBTYPE -drive file=$ROOTFS,format=raw -no-reboot $QEMU_UI_OPTIONS"
+        KERNCMDLINE="root=$DROOT rw console=ttyS0 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
+        QEMUOPTIONS="$QEMU_NETWORK_CMD -M $MACHINE_SUBTYPE $ROOTFS_OPTIONS -no-reboot $QEMU_UI_OPTIONS"
     fi
     if [ "$FSTYPE" = "nfs" ]; then
         if [ "$NFS_SERVER" = "192.168.7.1" -a ! -d "$NFS_DIR" ]; then
@@ -547,8 +522,8 @@ if [ "$MACHINE" = "qemuppc" ]; then
         QEMU_NETWORK_CMD="-net nic,model=pcnet $QEMU_TAP_CMD"
     fi
     if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then
-        KERNCMDLINE="root=/dev/hda rw console=ttyS0 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
-        QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE -M $MACHINE_SUBTYPE -drive file=$ROOTFS,format=raw -no-reboot $QEMU_UI_OPTIONS"
+        KERNCMDLINE="root=$DROOT rw console=ttyS0 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
+        QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE -M $MACHINE_SUBTYPE $ROOTFS_OPTIONS -no-reboot $QEMU_UI_OPTIONS"
     fi
     if [ "$FSTYPE" = "nfs" ]; then
         if [ "$NFS_SERVER" = "192.168.7.1" -a ! -d "$NFS_DIR" ]; then
Signature · 1 line
2.1.4