Skip to content

Commit

Permalink
Merge pull request #18671 from wanyaoqi/automated-cherry-pick-of-#186…
Browse files Browse the repository at this point in the history
…69-upstream-master

Automated cherry pick of #18669: fix(host): sync sriov nic bw on change config
  • Loading branch information
zexi authored Nov 14, 2023
2 parents 7cf461e + 13e8abb commit e1c3299
Showing 1 changed file with 30 additions and 7 deletions.
37 changes: 30 additions & 7 deletions pkg/hostman/guestman/qemu-kvm.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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")
}
Expand Down Expand Up @@ -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 {
Expand All @@ -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(
Expand All @@ -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 {
Expand Down

0 comments on commit e1c3299

Please sign in to comment.