Skip to content

Commit 30176f6

Browse files
authored
Merge pull request #5481 from wizhaoredhat/fix_dpu_host
Fix mgmt port allocation with VFs provided as resource for DPU
2 parents 75730a4 + e64f540 commit 30176f6

File tree

2 files changed

+65
-50
lines changed

2 files changed

+65
-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

go-controller/pkg/ovnwebhook/nodeadmission.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ var commonNodeAnnotationChecks = map[string]checkNodeAnnot{
3535
util.OvnNodeGatewayMtuSupport: nil,
3636
util.OvnNodeManagementPort: nil,
3737
util.OvnNodeDontSNATSubnets: nil,
38+
util.OVNNodePrimaryDPUHostAddr: nil,
3839
util.OvnNodeChassisID: func(v annotationChange, _ string) error {
3940
if v.action == removed {
4041
return fmt.Errorf("%s cannot be removed", util.OvnNodeChassisID)

0 commit comments

Comments
 (0)