diff --git a/lib/hypervisor/hv_kvm.py b/lib/hypervisor/hv_kvm.py index 671b8dfd545bfd6ecc5cfe51eb11fe1bb76acaf0..bd969cf8717e9bc3bd229a0d905743249fb18f7b 100644 --- a/lib/hypervisor/hv_kvm.py +++ b/lib/hypervisor/hv_kvm.py @@ -722,6 +722,12 @@ class KVMHypervisor(hv_base.BaseHypervisor): kvm_cmd, kvm_nics, up_hvp = kvm_runtime up_hvp = objects.FillDict(conf_hvp, up_hvp) + kvm_version = self._GetKVMVersion() + if kvm_version: + _, v_major, v_min, v_rev = kvm_version + else: + raise errors.HypervisorError("Unable to get KVM version") + # We know it's safe to run as a different user upon migration, so we'll use # the latest conf, from conf_hvp. security_model = conf_hvp[constants.HV_SECURITY_MODEL] @@ -737,19 +743,33 @@ class KVMHypervisor(hv_base.BaseHypervisor): tap_extra = "" nic_type = up_hvp[constants.HV_NIC_TYPE] if nic_type == constants.HT_NIC_PARAVIRTUAL: - nic_model = "model=virtio" + # From version 0.12.0, kvm uses a new sintax for network configuration. + if (v_major, v_min) >= (0,12): + nic_model = "virtio-net-pci" + else: + nic_model = "virtio" + if up_hvp[constants.HV_VHOST_NET]: - tap_extra = ",vhost=on" + # vhost_net is only available from version 0.13.0 or newer + if (v_major, v_min) >= (0,13): + tap_extra = ",vhost=on" + else: + raise errors.HypervisorError("vhost_net is configured" + " but it is not available") else: - nic_model = "model=%s" % nic_type + nic_model = 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._WriteNetScriptFile(instance, nic_seq, nic) - 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 (v_major, v_min) >= (0,12): + nic_val = "%s,mac=%s,netdev=netdev%s" % (nic_model, nic.mac, nic_seq) + tap_val = "type=tap,id=netdev%s,script=%s%s" % (nic_seq, script, tap_extra) + kvm_cmd.extend(["-netdev", tap_val, "-device", nic_val]) + else: + nic_val = "nic,vlan=%s,macaddr=%s,model=%s" % (nic_seq, nic.mac, nic_model) + tap_val = "tap,vlan=%s,script=%s" % (nic_seq, script) + kvm_cmd.extend(["-net", tap_val, "-net", nic_val]) if incoming: target, port = incoming