fix(host): sync sriov nic bw on change config

This commit is contained in:
wanyaoqi
2023-11-14 16:39:03 +08:00
parent 421d903825
commit 13e8abbdc0
+30 -7
View File
@@ -2158,7 +2158,7 @@ func (s *SKVMGuestInstance) compareDescNetworks(newDesc *desc.SGuestDesc,
return net.Driver == "virtio" || net.Driver == "vfio-pci"
}
var isChangeNetworkValid = func(net *desc.SGuestNetwork) bool {
return net.Driver == "virtio"
return net.Driver == "virtio" || net.Driver == "vfio-pci"
}
var findNet = func(nets []*desc.SGuestNetwork, net *desc.SGuestNetwork) int {
@@ -2215,11 +2215,19 @@ func getNicBridge(nic *desc.SGuestNetwork) string {
}
}
func onNicChange(oldNic, newNic *desc.SGuestNetwork) error {
func (s *SKVMGuestInstance) onNicChange(oldNic, newNic *desc.SGuestNetwork) error {
log.Infof("nic changed old: %s new: %s", jsonutils.Marshal(oldNic), jsonutils.Marshal(newNic))
// override network base desc
oldNic.GuestnetworkBaseDesc = newNic.GuestnetworkBaseDesc
if oldNic.Driver == "vfio-pci" {
err := s.reconfigureVfioNicsBandwidth(oldNic)
if err != nil {
return err
}
return nil
}
oldbr := getNicBridge(oldNic)
oldifname := oldNic.Ifname
newbr := getNicBridge(newNic)
@@ -2294,7 +2302,7 @@ func (s *SKVMGuestInstance) SyncConfig(
if len(changedNetworks) > 0 && s.IsRunning() {
// process changed networks
for i := range changedNetworks {
err := onNicChange(changedNetworks[i][0], changedNetworks[i][1])
err := s.onNicChange(changedNetworks[i][0], changedNetworks[i][1])
if err != nil {
return nil, errors.Wrap(err, "onNicChange")
}
@@ -3024,8 +3032,8 @@ func (s *SKVMGuestInstance) sriovNicAttachInitScript(networkIndex int8, dev isol
for i := range s.Desc.Nics {
if s.Desc.Nics[i].Driver == "vfio-pci" && s.Desc.Nics[i].Index == networkIndex {
if dev.GetOvsOffloadInterfaceName() != "" {
cmd := fmt.Sprintf("ip link set dev %s vf %d mac %s\n",
dev.GetPfName(), dev.GetVirtfn(), s.Desc.Nics[i].Mac)
cmd := fmt.Sprintf("ip link set dev %s vf %d mac %s max_tx_rate %d\n",
dev.GetPfName(), dev.GetVirtfn(), s.Desc.Nics[i].Mac, s.Desc.Nics[i].Bw)
cmd += s.getNicUpScriptPath(s.Desc.Nics[i]) + "\n"
return cmd, nil
} else {
@@ -3051,8 +3059,8 @@ func (s *SKVMGuestInstance) generateSRIOVInitScripts() (string, error) {
return "", err
}
if dev.GetOvsOffloadInterfaceName() != "" {
cmd += fmt.Sprintf("ip link set dev %s vf %d mac %s\n",
dev.GetPfName(), dev.GetVirtfn(), s.Desc.Nics[i].Mac)
cmd += fmt.Sprintf("ip link set dev %s vf %d mac %s max_tx_rate %d\n",
dev.GetPfName(), dev.GetVirtfn(), s.Desc.Nics[i].Mac, s.Desc.Nics[i].Bw)
cmd += s.getNicUpScriptPath(s.Desc.Nics[i]) + "\n"
} else {
cmd += fmt.Sprintf(
@@ -3070,6 +3078,21 @@ func (s *SKVMGuestInstance) generateSRIOVInitScripts() (string, error) {
return cmd, nil
}
func (s *SKVMGuestInstance) reconfigureVfioNicsBandwidth(nicDesc *desc.SGuestNetwork) error {
if nicDesc.Driver == "vfio-pci" {
dev, err := s.GetSriovDeviceByNetworkIndex(nicDesc.Index)
if err != nil {
return errors.Wrap(err, "reconfigureVfioNicsBandwidth")
}
out, err := procutils.NewRemoteCommandAsFarAsPossible("ip", "link", "set", "dev", dev.GetPfName(),
"vf", strconv.Itoa(dev.GetVirtfn()), "max_tx_rate", strconv.Itoa(nicDesc.Bw)).Output()
if err != nil {
return errors.Wrapf(err, "reconfigureVfioNicsBandwidth set max_tx_rate %s", out)
}
}
return nil
}
func (s *SKVMGuestInstance) getQemuCmdline() (string, error) {
content, err := fileutils2.FileGetContents(s.GetStartScriptPath())
if err != nil {