Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.3
katacontainers-image-initrd
agent_memory-hotplug-probe.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File agent_memory-hotplug-probe.patch of Package katacontainers-image-initrd
commit 2f4911566e9701c4f207864ebc564471812439e2 Author: Ralf Haferkamp <rhafer@suse.com> Date: Wed Jan 15 12:01:28 2020 +0100 agent: Fix mem-hotplug on x86 when ARCH_MEMORY_PROBE is set Don't use the /sys/devices/system/memory/probe interface on architectures where the firmware (ACPI) is notifying the system of hotplugged memory. This fixes an issue with the agent erroring out when the guest-kernel is compiled with CONFIG_ARCH_MEMORY_PROBE=y. Fixes: #712 Signed-off-by: Ralf Haferkamp <rhafer@suse.com> diff --git a/grpc.go b/grpc.go index ea0d7af..4c0dea3 100644 --- a/grpc.go +++ b/grpc.go @@ -54,6 +54,7 @@ var ( sysfsMemOnlinePath = "/sys/devices/system/memory" sysfsMemoryBlockSizePath = "/sys/devices/system/memory/block_size_bytes" sysfsMemoryHotplugProbePath = "/sys/devices/system/memory/probe" + sysfsAcpiMemoryHotplugPath = "/sys/firmware/acpi/hotplug/memory/enabled" sysfsConnectedCPUsPath = filepath.Join(sysfsCPUOnlinePath, "online") containersRootfsPath = "/run" @@ -1576,6 +1577,16 @@ func (a *agentGRPC) ReseedRandomDev(ctx context.Context, req *pb.ReseedRandomDev return emptyResp, reseedRNG(req.Data) } +func (a *agentGRPC) haveAcpiMemoryHotplug() bool { + enabled, err := ioutil.ReadFile(sysfsAcpiMemoryHotplugPath) + if err != nil { + return false + } else if strings.TrimSpace(string(enabled)) == "1" { + return true + } + return false +} + func (a *agentGRPC) GetGuestDetails(ctx context.Context, req *pb.GuestDetailsRequest) (*pb.GuestDetailsResponse, error) { var details pb.GuestDetailsResponse if req.MemBlockSize { @@ -1603,7 +1614,13 @@ func (a *agentGRPC) GetGuestDetails(ctx context.Context, req *pb.GuestDetailsReq } else if err != nil { return nil, err } else { - details.SupportMemHotplugProbe = true + // Avoid triggering memory hotplugging notifications when ACPI + // hotplugging is enabled + if a.haveAcpiMemoryHotplug() { + details.SupportMemHotplugProbe = false + } else { + details.SupportMemHotplugProbe = true + } } } diff --git a/grpc_test.go b/grpc_test.go index 768cd19..4bddb05 100644 --- a/grpc_test.go +++ b/grpc_test.go @@ -843,12 +843,38 @@ func TestGetGuestDetails(t *testing.T) { probeFile, err := ioutil.TempFile("", "probe") assert.NoError(err) + // sysfsAcpiMemoryHotplugPath exist and is 1 + hotplugEnabledFile, err := ioutil.TempFile("", "enabled") + assert.NoError(err) + _, err = hotplugEnabledFile.WriteString("1") + assert.NoError(err) + hotplugEnabledFile.Sync() + oldSysfsMemoryHotplugProbePath := sysfsMemoryHotplugProbePath + oldSysfsAcpiMemoryHotplugPath := sysfsAcpiMemoryHotplugPath defer func() { sysfsMemoryHotplugProbePath = oldSysfsMemoryHotplugProbePath + sysfsAcpiMemoryHotplugPath = oldSysfsAcpiMemoryHotplugPath }() sysfsMemoryHotplugProbePath = probeFile.Name() + sysfsAcpiMemoryHotplugPath = hotplugEnabledFile.Name() + resp, err = a.GetGuestDetails(context.TODO(), req) + assert.NoError(err) + assert.Equal(resp.SupportMemHotplugProbe, false) + + // sysfsAcpiMemoryHotplugPath exist and is 0 + _, err = hotplugEnabledFile.Seek(0, 0) + assert.NoError(err) + _, err = hotplugEnabledFile.WriteString("0") + assert.NoError(err) + hotplugEnabledFile.Sync() + resp, err = a.GetGuestDetails(context.TODO(), req) + assert.NoError(err) + assert.Equal(resp.SupportMemHotplugProbe, true) + + // sysfsAcpiMemoryHotplugPath does not exist + os.Remove(sysfsAcpiMemoryHotplugPath) resp, err = a.GetGuestDetails(context.TODO(), req) assert.NoError(err) assert.Equal(resp.SupportMemHotplugProbe, true)
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor