From fbe27e2b5e8fed9a955f7f799f2c0fa574bf6375 Mon Sep 17 00:00:00 2001
From: Guido Trotter <ultrotter@google.com>
Date: Mon, 17 May 2010 13:05:13 +0100
Subject: [PATCH] KVM: vhost net acceleration support

This will only work on patched or newer (>= 2.6.34) kernels and with a
patched version of qemu-kvm.

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>
---
 lib/constants.py         |  3 +++
 lib/hypervisor/hv_kvm.py | 11 ++++++++---
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/lib/constants.py b/lib/constants.py
index aa84c8685..67db3efdc 100644
--- a/lib/constants.py
+++ b/lib/constants.py
@@ -437,6 +437,7 @@ HV_DISK_CACHE = "disk_cache"
 HV_SECURITY_MODEL = "security_model"
 HV_SECURITY_DOMAIN = "security_domain"
 HV_KVM_FLAG = "kvm_flag"
+HV_VHOST_NET = "vhost_net"
 
 HVS_PARAMETER_TYPES = {
   HV_BOOT_ORDER: VTYPE_STRING,
@@ -467,6 +468,7 @@ HVS_PARAMETER_TYPES = {
   HV_SECURITY_MODEL: VTYPE_STRING,
   HV_SECURITY_DOMAIN: VTYPE_STRING,
   HV_KVM_FLAG: VTYPE_STRING,
+  HV_VHOST_NET: VTYPE_BOOL,
   }
 
 HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
@@ -733,6 +735,7 @@ HVC_DEFAULTS = {
     HV_SECURITY_MODEL: HT_SM_NONE,
     HV_SECURITY_DOMAIN: '',
     HV_KVM_FLAG: "",
+    HV_VHOST_NET: False,
     },
   HT_FAKE: {
     },
diff --git a/lib/hypervisor/hv_kvm.py b/lib/hypervisor/hv_kvm.py
index 2f97c8465..af04dcacb 100644
--- a/lib/hypervisor/hv_kvm.py
+++ b/lib/hypervisor/hv_kvm.py
@@ -86,6 +86,7 @@ class KVMHypervisor(hv_base.BaseHypervisor):
     constants.HV_SECURITY_DOMAIN: hv_base.NO_CHECK,
     constants.HV_KVM_FLAG:
       hv_base.ParamInSet(False, constants.HT_KVM_FLAG_VALUES),
+    constants.HV_VHOST_NET: hv_base.NO_CHECK,
     }
 
   _MIGRATION_STATUS_RE = re.compile('Migration\s+status:\s+(\w+)',
@@ -611,19 +612,23 @@ class KVMHypervisor(hv_base.BaseHypervisor):
       kvm_cmd.extend(["-runas", hvp[constants.HV_SECURITY_DOMAIN]])
 
     if not kvm_nics:
-      kvm_cmd.extend(['-net', 'none'])
+      kvm_cmd.extend(["-net", "none"])
     else:
+      tap_extra = ""
       nic_type = hvparams[constants.HV_NIC_TYPE]
       if nic_type == constants.HT_NIC_PARAVIRTUAL:
         nic_model = "model=virtio"
+        if hvparams[constants.HV_VHOST_NET]:
+          tap_extra = ",vhost=on"
       else:
         nic_model = "model=%s" % nic_type
 
       for nic_seq, nic in enumerate(kvm_nics):
         nic_val = "nic,vlan=%s,macaddr=%s,%s" % (nic_seq, nic.mac, nic_model)
         script = self._WriteNetScript(instance, nic_seq, nic)
-        kvm_cmd.extend(['-net', nic_val])
-        kvm_cmd.extend(['-net', 'tap,vlan=%s,script=%s' % (nic_seq, script)])
+        tap_val = "tap,vlan=%s,script=%s%s" % (nic_seq, script, tap_extra)
+        kvm_cmd.extend(["-net", nic_val])
+        kvm_cmd.extend(["-net", tap_val])
         temp_files.append(script)
 
     if incoming:
-- 
GitLab