From 50a61810056a421fb94acf26277995f2c1f31ede Mon Sep 17 00:00:00 2001 From: Qiang Huang Date: Wed, 6 Apr 2016 09:37:51 +0800 Subject: [PATCH] Add minimum limit for memory reservation Kernel has no limit for memory reservation, but in different kernel versions, the default behavior is different. On kernel 3.13, docker run --rm --memory-reservation 1k busybox cat /sys/fs/cgroup/memory/memory.soft_limit_in_bytes the output would be 4096, but on kernel 4.1, the output is 0. Since we have minimum limit for memory and kernel memory, we can have this limit for memory reservation as well, to make the behavior consistent. Signed-off-by: Qiang Huang --- daemon/daemon_unix.go | 3 +++ integration-cli/docker_cli_run_unix_test.go | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/daemon/daemon_unix.go b/daemon/daemon_unix.go index 1ef7dc2ebe..6214646338 100644 --- a/daemon/daemon_unix.go +++ b/daemon/daemon_unix.go @@ -355,6 +355,9 @@ func verifyContainerResources(resources *containertypes.Resources, sysInfo *sysi logrus.Warnf("Your kernel does not support memory soft limit capabilities. Limitation discarded.") resources.MemoryReservation = 0 } + if resources.MemoryReservation > 0 && resources.MemoryReservation < linuxMinMemory { + return warnings, fmt.Errorf("Minimum memory reservation allowed is 4MB") + } if resources.Memory > 0 && resources.MemoryReservation > 0 && resources.Memory < resources.MemoryReservation { return warnings, fmt.Errorf("Minimum memory limit should be larger than memory reservation limit, see usage") } diff --git a/integration-cli/docker_cli_run_unix_test.go b/integration-cli/docker_cli_run_unix_test.go index fe7cc6977a..8d06c3c407 100644 --- a/integration-cli/docker_cli_run_unix_test.go +++ b/integration-cli/docker_cli_run_unix_test.go @@ -583,6 +583,11 @@ func (s *DockerSuite) TestRunWithMemoryReservationInvalid(c *check.C) { c.Assert(err, check.NotNil) expected := "Minimum memory limit should be larger than memory reservation limit" c.Assert(strings.TrimSpace(out), checker.Contains, expected, check.Commentf("run container should fail with invalid memory reservation")) + + out, _, err = dockerCmdWithError("run", "--memory-reservation", "1k", "busybox", "true") + c.Assert(err, check.NotNil) + expected = "Minimum memory reservation allowed is 4MB" + c.Assert(strings.TrimSpace(out), checker.Contains, expected, check.Commentf("run container should fail with invalid memory reservation")) } func (s *DockerSuite) TestStopContainerSignal(c *check.C) {