diff --git a/pkg/plugins/generic/generic_plugin.go b/pkg/plugins/generic/generic_plugin.go index e7164c951..b04c60287 100644 --- a/pkg/plugins/generic/generic_plugin.go +++ b/pkg/plugins/generic/generic_plugin.go @@ -2,6 +2,7 @@ package generic import ( "bytes" + "errors" "os/exec" "reflect" "strconv" @@ -173,6 +174,10 @@ func (p *GenericPlugin) Apply() error { } if err := utils.SyncNodeState(p.DesireState, pfsToSkip); err != nil { + // Catch the "cannot allocate memory" error and try to use PCI realloc + if errors.Is(err, syscall.ENOMEM) { + p.addToDesiredKernelArgs(utils.KernelArgPciRealloc) + } return err } p.LastState = &sriovnetworkv1.SriovNetworkNodeState{} diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 115816e00..c107abcb7 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -48,6 +48,7 @@ const ( udevDisableNM = "/bindata/scripts/udev-find-sriov-pf.sh" nmUdevRule = "SUBSYSTEM==\"net\", ACTION==\"add|change|move\", ATTRS{device}==\"%s\", IMPORT{program}=\"/etc/udev/disable-nm-sriov.sh $env{INTERFACE} %s\"" + KernelArgPciRealloc = "pci=realloc" KernelArgIntelIommu = "intel_iommu=on" KernelArgIommuPt = "iommu=pt" )