Skip to content

Commit e64f540

Browse files
wizhaoredhattsorya
andcommitted
Fix mgmt port allocation with VFs provided as resource for DPU
This commit fixes several issues when allocating the management port with a SR-IOV resource instead of hard coding the SR-IOV netdev name. Such issues come from the fact that the gateway and management port interfaces need to be present during Init. Otherwise other parts of the code will not have the proper interface. Signed-off-by: William Zhao <[email protected]> Co-Authored-By: Igal Tsoiref <[email protected]>
1 parent 1aa6734 commit e64f540

File tree

1 file changed

+64
-50
lines changed

1 file changed

+64
-50
lines changed

go-controller/pkg/node/default_node_network_controller.go

Lines changed: 64 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,59 @@ func handleNetdevResources(resourceName string) (string, error) {
607607
return netdevice, nil
608608
}
609609

610+
// configureMgmtPortNetdevFromResource uses device plugin resources to determine and set
611+
// the management port netdevice if a DP resource name is provided via configuration.
612+
func configureMgmtPortNetdevFromResource() error {
613+
if config.OvnKubeNode.MgmtPortDPResourceName == "" {
614+
return nil
615+
}
616+
if err := handleDevicePluginResources(); err != nil {
617+
return err
618+
}
619+
netdevice, err := handleNetdevResources(config.OvnKubeNode.MgmtPortDPResourceName)
620+
if err != nil {
621+
return err
622+
}
623+
if config.OvnKubeNode.MgmtPortNetdev != "" {
624+
klog.Warningf("MgmtPortNetdev is set explicitly (%s), overriding with resource...",
625+
config.OvnKubeNode.MgmtPortNetdev)
626+
}
627+
config.OvnKubeNode.MgmtPortNetdev = netdevice
628+
klog.V(5).Infof("Using MgmtPortNetdev (Netdev %s) passed via resource %s",
629+
config.OvnKubeNode.MgmtPortNetdev, config.OvnKubeNode.MgmtPortDPResourceName)
630+
return nil
631+
}
632+
633+
// Resolve gateway interface from PCI address when configured as "derive-from-mgmt-port"
634+
// configureGatewayInterfaceFromMgmtPort resolves and sets the gateway interface derived
635+
// from the management port's PF when `config.Gateway.Interface` is set to derive-from-mgmt-port.
636+
func configureGatewayInterfaceFromMgmtPort() error {
637+
if config.Gateway.Interface != types.DeriveFromMgmtPort {
638+
return nil
639+
}
640+
netdevName, err := getManagementPortNetDev(config.OvnKubeNode.MgmtPortNetdev)
641+
if err != nil {
642+
return err
643+
}
644+
pciAddr, err := util.GetSriovnetOps().GetPciFromNetDevice(netdevName)
645+
if err != nil {
646+
return err
647+
}
648+
pfPciAddr, err := util.GetSriovnetOps().GetPfPciFromVfPci(pciAddr)
649+
if err != nil {
650+
return err
651+
}
652+
netdevs, err := util.GetSriovnetOps().GetNetDevicesFromPci(pfPciAddr)
653+
if err != nil {
654+
return err
655+
}
656+
if len(netdevs) == 0 {
657+
return fmt.Errorf("no netdevs found for pci address %s", pfPciAddr)
658+
}
659+
config.Gateway.Interface = netdevs[0]
660+
return nil
661+
}
662+
610663
func exportManagementPortAnnotation(netdevName string, nodeAnnotator kube.Annotator) error {
611664
klog.Infof("Exporting management port annotation for netdev '%v'", netdevName)
612665
deviceID, err := util.GetDeviceIDFromNetdevice(netdevName)
@@ -927,6 +980,17 @@ func (nc *DefaultNodeNetworkController) Init(ctx context.Context) error {
927980

928981
nodeAnnotator := kube.NewNodeAnnotator(nc.Kube, node.Name)
929982

983+
// Use the device from environment when the DP resource name is specified.
984+
if err := configureMgmtPortNetdevFromResource(); err != nil {
985+
return err
986+
}
987+
988+
if config.OvnKubeNode.Mode == types.NodeModeDPUHost {
989+
if err := configureGatewayInterfaceFromMgmtPort(); err != nil {
990+
return err
991+
}
992+
}
993+
930994
// Setup management ports
931995
nc.mgmtPortController, err = createNodeManagementPortController(
932996
node,
@@ -1011,58 +1075,8 @@ func (nc *DefaultNodeNetworkController) Start(ctx context.Context) error {
10111075
nodeAnnotator := kube.NewNodeAnnotator(nc.Kube, node.Name)
10121076
waiter := newStartupWaiter()
10131077

1014-
// Use the device from environment when the DP resource name is specified.
1015-
if config.OvnKubeNode.MgmtPortDPResourceName != "" {
1016-
if err := handleDevicePluginResources(); err != nil {
1017-
return err
1018-
}
1019-
1020-
netdevice, err := handleNetdevResources(config.OvnKubeNode.MgmtPortDPResourceName)
1021-
if err != nil {
1022-
return err
1023-
}
1024-
1025-
if config.OvnKubeNode.MgmtPortNetdev != "" {
1026-
klog.Warningf("MgmtPortNetdev is set explicitly (%s), overriding with resource...",
1027-
config.OvnKubeNode.MgmtPortNetdev)
1028-
}
1029-
config.OvnKubeNode.MgmtPortNetdev = netdevice
1030-
klog.V(5).Infof("Using MgmtPortNetdev (Netdev %s) passed via resource %s",
1031-
config.OvnKubeNode.MgmtPortNetdev, config.OvnKubeNode.MgmtPortDPResourceName)
1032-
}
1033-
10341078
// Complete gateway initialization
10351079
if config.OvnKubeNode.Mode == types.NodeModeDPUHost {
1036-
// Resolve gateway interface from PCI address when configured as "derive-from-mgmt-port"
1037-
// This performs the following steps:
1038-
// Get the management port network device name
1039-
// Retrieve the PCI address of the management port device
1040-
// Get the Physical Function (PF) PCI address from the Virtual Function (VF) PCI address
1041-
// Retrieve all network devices associated with the PF PCI address
1042-
// Select the first available network device as the gateway interface
1043-
if config.Gateway.Interface == types.DeriveFromMgmtPort {
1044-
netdevName, err := getManagementPortNetDev(config.OvnKubeNode.MgmtPortNetdev)
1045-
if err != nil {
1046-
return err
1047-
}
1048-
pciAddr, err := util.GetSriovnetOps().GetPciFromNetDevice(netdevName)
1049-
if err != nil {
1050-
return err
1051-
}
1052-
pfPciAddr, err := util.GetSriovnetOps().GetPfPciFromVfPci(pciAddr)
1053-
if err != nil {
1054-
return err
1055-
}
1056-
netdevs, err := util.GetSriovnetOps().GetNetDevicesFromPci(pfPciAddr)
1057-
if err != nil {
1058-
return err
1059-
}
1060-
if len(netdevs) == 0 {
1061-
return fmt.Errorf("no netdevs found for pci address %s", pfPciAddr)
1062-
}
1063-
netdevName = netdevs[0]
1064-
config.Gateway.Interface = netdevName
1065-
}
10661080
err = nc.initGatewayDPUHost(nc.nodeAddress, nodeAnnotator)
10671081
if err != nil {
10681082
return err

0 commit comments

Comments
 (0)