From dae06cb500c7b24c4d888f8e8abce359341d3314 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Thu, 17 Dec 2020 18:38:16 +0800 Subject: [PATCH 1/8] refactor(host): startvm: add QEMU_CMD_KVM_ARG --- pkg/hostman/guestman/qemu-kvmhelper.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/pkg/hostman/guestman/qemu-kvmhelper.go b/pkg/hostman/guestman/qemu-kvmhelper.go index a264630f3f..35131a4e94 100644 --- a/pkg/hostman/guestman/qemu-kvmhelper.go +++ b/pkg/hostman/guestman/qemu-kvmhelper.go @@ -401,17 +401,14 @@ func (s *SKVMGuestInstance) _generateStartScript(data *jsonutils.JSONDict) (stri // cmd += " fi\n" // cmd += "else\n" cmd += "QEMU_CMD=$DEFAULT_QEMU_CMD\n" + if s.IsKvmSupport() { + cmd += "QEMU_CMD_KVM_ARG=-enable-kvm\n" + } else { + cmd += "QEMU_CMD_KVM_ARG=-no-kvm\n" + } // cmd += "fi\n" cmd += "function nic_speed() {\n" - cmd += " $QEMU_CMD " - - if s.IsKvmSupport() { - cmd += "-enable-kvm" - } else { - cmd += "-no-kvm" - } - - cmd += " -device virtio-net-pci,? 2>&1 | grep .speed= > /dev/null\n" + cmd += " $QEMU_CMD $QEMU_CMD_KVM_ARG -device virtio-net-pci,? 2>&1 | grep .speed= > /dev/null\n" cmd += " if [ \"$?\" -eq \"0\" ]; then\n" cmd += " echo \",speed=$1\"\n" cmd += " fi\n" From d4093e2155af5588f5fdf62113eb393b7ab2f5d9 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Thu, 17 Dec 2020 18:40:20 +0800 Subject: [PATCH 2/8] refactor(host): startvm: nic_speed: use raw string --- pkg/hostman/guestman/qemu-kvmhelper.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/pkg/hostman/guestman/qemu-kvmhelper.go b/pkg/hostman/guestman/qemu-kvmhelper.go index 35131a4e94..eefe152ecb 100644 --- a/pkg/hostman/guestman/qemu-kvmhelper.go +++ b/pkg/hostman/guestman/qemu-kvmhelper.go @@ -407,12 +407,14 @@ func (s *SKVMGuestInstance) _generateStartScript(data *jsonutils.JSONDict) (stri cmd += "QEMU_CMD_KVM_ARG=-no-kvm\n" } // cmd += "fi\n" - cmd += "function nic_speed() {\n" - cmd += " $QEMU_CMD $QEMU_CMD_KVM_ARG -device virtio-net-pci,? 2>&1 | grep .speed= > /dev/null\n" - cmd += " if [ \"$?\" -eq \"0\" ]; then\n" - cmd += " echo \",speed=$1\"\n" - cmd += " fi\n" - cmd += "}\n" + cmd += ` +function nic_speed() { + $QEMU_CMD $QEMU_CMD_KVM_ARG -device virtio-net-pci,? 2>&1 | grep .speed= > /dev/null + if [ "$?" -eq "0" ]; then + echo ",speed=$1" + fi +} +` // Generate Start VM script cmd += `CMD="$QEMU_CMD` From 52c3e93af757716897e422b90fcd011226d45e69 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Thu, 17 Dec 2020 18:46:03 +0800 Subject: [PATCH 3/8] refactor(host): startvm: for compat QEMU 2.12 outputs device help on stderr in the following style ``` virtio-net-pci.speed=int32 ``` QEMU 5.2.0 outputs it to stdout and in the following format ``` speed= - (default: -1) ``` --- pkg/hostman/guestman/qemu-kvmhelper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/hostman/guestman/qemu-kvmhelper.go b/pkg/hostman/guestman/qemu-kvmhelper.go index eefe152ecb..0bba2aa308 100644 --- a/pkg/hostman/guestman/qemu-kvmhelper.go +++ b/pkg/hostman/guestman/qemu-kvmhelper.go @@ -409,7 +409,7 @@ func (s *SKVMGuestInstance) _generateStartScript(data *jsonutils.JSONDict) (stri // cmd += "fi\n" cmd += ` function nic_speed() { - $QEMU_CMD $QEMU_CMD_KVM_ARG -device virtio-net-pci,? 2>&1 | grep .speed= > /dev/null + $QEMU_CMD $QEMU_CMD_KVM_ARG -device virtio-net-pci,help 2>&1 | grep -q "\ Date: Thu, 17 Dec 2020 19:00:09 +0800 Subject: [PATCH 4/8] feat(host): startvm: add nic_mtu shell func --- pkg/hostman/guestman/qemu-kvmhelper.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pkg/hostman/guestman/qemu-kvmhelper.go b/pkg/hostman/guestman/qemu-kvmhelper.go index 0bba2aa308..23232d3981 100644 --- a/pkg/hostman/guestman/qemu-kvmhelper.go +++ b/pkg/hostman/guestman/qemu-kvmhelper.go @@ -414,6 +414,18 @@ function nic_speed() { echo ",speed=$1" fi } + +function nic_mtu() { + local bridge="$1"; shift + + $QEMU_CMD $QEMU_CMD_KVM_ARG -device virtio-net-pci,help 2>&1 | grep -q '\ Date: Thu, 17 Dec 2020 18:46:10 +0800 Subject: [PATCH 5/8] feat(host): startvm: set vpc nic mtu Windows DHCP client does not respect DHCP MTU option --- pkg/hostman/guestman/qemu-kvmhelper.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/hostman/guestman/qemu-kvmhelper.go b/pkg/hostman/guestman/qemu-kvmhelper.go index 23232d3981..8f2a75d613 100644 --- a/pkg/hostman/guestman/qemu-kvmhelper.go +++ b/pkg/hostman/guestman/qemu-kvmhelper.go @@ -277,6 +277,7 @@ func (s *SKVMGuestInstance) getNicAddr(index int) int { } func (s *SKVMGuestInstance) getVnicDesc(nic jsonutils.JSONObject) string { + bridge, _ := nic.GetString("bridge") ifname, _ := nic.GetString("ifname") driver, _ := nic.GetString("driver") mac, _ := nic.GetString("mac") @@ -295,6 +296,9 @@ func (s *SKVMGuestInstance) getVnicDesc(nic jsonutils.JSONObject) string { cmd += fmt.Sprintf(",vectors=%d", vectors) } cmd += fmt.Sprintf("$(nic_speed %d)", bw) + if bridge == options.HostOptions.OvnIntegrationBridge { + cmd += fmt.Sprintf("$(nic_mtu %q)", bridge) + } } return cmd } From e201573d61280f6b9e803f9951538ead4d594d13 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Thu, 17 Dec 2020 21:36:58 +0800 Subject: [PATCH 6/8] feat(apis): add const VPC_OVN_ENCAP_COST --- pkg/apis/compute/vpcs_ovn.go | 2 ++ pkg/vpcagent/ovn/keeper.go | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/apis/compute/vpcs_ovn.go b/pkg/apis/compute/vpcs_ovn.go index cac44e9814..cf29532d10 100644 --- a/pkg/apis/compute/vpcs_ovn.go +++ b/pkg/apis/compute/vpcs_ovn.go @@ -18,6 +18,8 @@ import ( "yunion.io/x/pkg/util/netutils" ) +const VPC_OVN_ENCAP_COST = 58 + const ( VPC_EXTERNAL_ACCESS_MODE_DISTGW = "distgw" // distgw only VPC_EXTERNAL_ACCESS_MODE_EIP_DISTGW = "eip-distgw" // eip when available, distgw otherwise diff --git a/pkg/vpcagent/ovn/keeper.go b/pkg/vpcagent/ovn/keeper.go index 01b86b5bb9..67d12efa09 100644 --- a/pkg/vpcagent/ovn/keeper.go +++ b/pkg/vpcagent/ovn/keeper.go @@ -296,7 +296,7 @@ func (keeper *OVNNorthboundKeeper) ClaimNetwork(ctx context.Context, network *ag mdIp, "0.0.0.0", "0.0.0.0/0", network.GuestGateway, } - mtu -= 58 + mtu -= apis.VPC_OVN_ENCAP_COST const ( leaseTime = 86400 * 365 * 3 renewTime = 86400 From a0ad627114bb94d08c768c170c79f11432a27af7 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Thu, 17 Dec 2020 21:32:52 +0800 Subject: [PATCH 7/8] feat(region): networks: add getMtu method --- pkg/compute/models/networks.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 588b2a134e..cd493193cb 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -134,6 +134,21 @@ func (manager *SNetworkManager) AllowCreateItem(ctx context.Context, userCred mc return db.IsAdminAllowCreate(userCred, manager) } +func (self *SNetwork) getMtu() int { + baseMtu := options.Options.DefaultMtu + + wire := self.GetWire() + if wire != nil { + baseMtu = wire.Mtu + if IsOneCloudVpcResource(wire) { + baseMtu -= api.VPC_OVN_ENCAP_COST + } + return baseMtu + } + + return baseMtu +} + func (self *SNetwork) GetNetworkInterfaces() ([]SNetworkInterface, error) { sq := NetworkinterfacenetworkManager.Query().SubQuery() q := NetworkInterfaceManager.Query() From 44b6391a6206d4eca9e4ffc239774b66edc0a682 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Thu, 17 Dec 2020 21:37:27 +0800 Subject: [PATCH 8/8] fix(region): guestnetworks: use net calculated mtu --- pkg/compute/models/guestnetworks.go | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/pkg/compute/models/guestnetworks.go b/pkg/compute/models/guestnetworks.go index 89a86f4d99..445a5d7097 100644 --- a/pkg/compute/models/guestnetworks.go +++ b/pkg/compute/models/guestnetworks.go @@ -576,7 +576,7 @@ func (self *SGuestnetwork) getJsonDesc(network *SNetwork) *jsonutils.JSONDict { desc.Add(jsonutils.NewString(self.Driver), "driver") desc.Add(jsonutils.NewInt(int64(network.VlanId)), "vlan") desc.Add(jsonutils.NewInt(int64(self.getBandwidth())), "bw") - desc.Add(jsonutils.NewInt(int64(self.getMtu())), "mtu") + desc.Add(jsonutils.NewInt(int64(self.getMtu(network))), "mtu") desc.Add(jsonutils.NewInt(int64(self.Index)), "index") vips := self.GetVirtualIPs() if len(vips) > 0 { @@ -812,15 +812,8 @@ func (self *SGuestnetwork) getBandwidth() int { } } -func (self *SGuestnetwork) getMtu() int { - net := self.GetNetwork() - if net != nil { - wire := net.GetWire() - if wire != nil { - return wire.Mtu - } - } - return options.Options.DefaultMtu +func (self *SGuestnetwork) getMtu(net *SNetwork) int { + return net.getMtu() } func (self *SGuestnetwork) IsAllocated() bool {