Commit Graph

5214 Commits

Author SHA1 Message Date
Kir Kolyshkin c7f847ed3a libct/cg/sd: use global dbus connection
Using per cgroup manager dbus connection instances means
that every cgroup manager instance gets a new connection,
and those connections are never closed, ultimately resulting
in file descriptors limit being hit.

Revert back to using a single global dbus connection for everything,
without changing the callers.

NOTE that it is assumed a runtime can't use both root and rootless
dbus at the same time. If this happens, we panic.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-05-06 12:37:55 -07:00
Kir Kolyshkin 99c5c504ea libct/cg/sd: introduce and use getManagerProperty
Commit 47ef9a104f forgot to wrap GetManagerProperty("ControlGroup")
into retryOnDisconnect. Since there's one other user of
GetManagerProperty, add getManagerProperty wrapper and use it.

Fixes: 47ef9a104f

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-05-06 12:37:55 -07:00
Kir Kolyshkin ee36ccf591 Merge pull request #2941 from kolyshkin/another-kludge-to-fix-freeze
freezer: add delay after freeze

LGTMs: AkihiroSuda mrunalp dqminh
2021-05-06 12:28:53 -07:00
Kir Kolyshkin 524abc59f4 freezer: add delay after freeze
I hate to keep adding those kludges, but lately TestFreeze (and
TestSystemdFreeze) from libcontainer/integration fails a lot. The
failure comes and goes, and is probably this is caused by a slow host
allocated for the test, and a slow VM on top of it.

To remediate, add a small sleep on every 25th iteration in between
asking the kernel to freeze and checking its status.

In the worst case scenario (failure to freeze), this adds about 0.4 ms
(40 x 10 us) to the duration of the call.

It is hard to measure how this affects CI as GHA plays a roulette when
allocating a node to run the test on, but it seems to help. With
additional debug info, I saw somewhat frequent "frozen after 24 retries"
or "frozen after 49 retries", meaning it succeeded right after the added
sleep.

While at it, rewrite/improve the comments.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-05-06 10:51:46 -07:00
Akihiro Suda 4638b379fc Merge pull request #2929 from bwh-mind/ppc32
Update golang.org/x/sys to add linux/ppc support
2021-05-06 03:52:42 +09:00
Akihiro Suda f9176c909a Merge pull request #2909 from kolyshkin/libct-int-better-names
libct/int: misc cleanups and fixes
2021-05-06 02:21:19 +09:00
Mrunal Patel 2965ffc7e3 Merge pull request #2933 from oss-qm/submit/makefile_go_cmd
Makefile: allow overriding go command by environment
2021-05-04 09:57:45 -07:00
Enrico Weigelt, metux IT consult 541fc19e54 Makefile: allow overriding go command by environment
This is required for environments/build systems where a specific
go version / command needs to be used.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2021-05-04 12:41:12 +02:00
Mrunal Patel c73d766ee6 Merge pull request #2931 from kolyshkin/fix-release-sh
script/release.sh: add -a to force rebuild
2021-05-03 11:23:07 -07:00
Kir Kolyshkin 06a9ea36de script/release.sh: add -a to force rebuild
https://golang.org/cmd/go/#hdr-Build_and_test_caching says:

> If you have made changes to the C libraries on your system, you will
> need to clean the cache explicitly or else use the -a build flag
> (see 'go help build') to force rebuilding of packages that depend
> on the updated C libraries.

This means that:

1. We need to either 'go clean -cache' or 'go build -a' when building
   the release binary. Adding '-a' seems less intrusive / more focused.

2. The check for existing libseccomp.a (added by commit d748280aa)
   is no longer needed.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-05-03 10:30:23 -07:00
Ben Hutchings 91b01682ae Update golang.org/x/sys to add linux/ppc support
This package was recently updated to add support for Linux on
32-bit PowerPC (ppc), implemented by gccgo.

Signed-off-by: Ben Hutchings <ben.hutchings@essensium.com>
2021-05-03 00:38:11 +02:00
Aleksa Sarai d279ebd97d merge branch 'pr-2925'
Akihiro Suda (4):
  Revert "Makefile: rm go 1.13 workaround"
  libcontainer: avoid using t.Cleanup
  go.mod: demote to Go 1.13
  CI: enable Go 1.13 again

LGTMs: kolyskhin cyphar
Closes #2925
2021-05-02 01:23:39 +10:00
Kir Kolyshkin b15ddb4739 Merge pull request #2919 from cyphar/warn-unknown-architecture
cloned_binary: switch from #error to #warning for SYS_memfd_create
2021-04-30 10:47:58 -07:00
Akihiro Suda c061bc78aa Merge pull request #2906 from kolyshkin/set-allow-nil 2021-04-30 21:01:15 +09:00
Akihiro Suda ee4612bcdc CI: enable Go 1.13 again
Dockre/Moby still builds runc with Go 1.13, so we should still support
Go 1.13.

Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
2021-04-30 19:15:51 +09:00
Akihiro Suda e2dd9220dd go.mod: demote to Go 1.13
Dockre/Moby still builds runc with Go 1.13, so we should still support
Go 1.13.

Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
2021-04-30 19:15:45 +09:00
Akihiro Suda 45f49e8fca libcontainer: avoid using t.Cleanup
t.Cleanup is not present in Go 1.13.
Dockre/Moby still builds runc with Go 1.13, so we should still support
Go 1.13.

Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
2021-04-30 19:13:05 +09:00
Akihiro Suda 1a659bc68e Revert "Makefile: rm go 1.13 workaround"
This reverts commit d0cbef576f.

Dockre/Moby still builds runc with Go 1.13, so we should still support
Go 1.13.

Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
2021-04-30 19:12:07 +09:00
Aleksa Sarai 016717a550 merge branch 'pr-2926'
Sebastiaan van Stijn (1):
  cgroups/systemd: replace deprecated dbus functions

LGTMs: AkihiroSuda cyphar
Closes #2926
2021-04-30 18:14:00 +10:00
Akihiro Suda 8f85f4f1f2 Merge pull request #2921 from kolyshkin/faster-openfile 2021-04-30 17:06:37 +09:00
Kir Kolyshkin abf12ce0db libc/cg: improve Manager docs
Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-29 15:30:12 -07:00
Kir Kolyshkin 3f65946756 libct/cg: make Set accept configs.Resources
A cgroup manager's Set method sets cgroup resources, but historically
it was accepting configs.Cgroups.

Refactor it to accept resources only. This is an improvement from the
API point of view, as the method can not change cgroup configuration
(such as path to the cgroup etc), it can only set (modify) its
resources/limits.

This also lays the foundation for complicated resource updates, as now
Set has two sets of resources -- the one that was previously specified
during cgroup manager creation (or the previous Set), and the one passed
in the argument, so it could deduce the difference between these. This
is a long term goal though.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-29 15:24:19 -07:00
Kir Kolyshkin af0710a0f8 libct/cg/sd/v2: fix Set argument
For some reason, systemd cgroup v2 driver's Set is not using its
container argument when generating systemd unit properties.

This bug is not detected by our update tests as we run a new binary
every time and thus a new instance of a cgroup manager.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-29 15:12:56 -07:00
Kir Kolyshkin 850b2c47b2 libct/cg/fscommon.OpenFile: speed up ro case
Commit 88e8350de2, among the other things, replaced filepath.Join with
securejoin.SecureJoin for both reads and writes to cgroupfs.

Commits e76ac1c054 and 31f0f5b7e0 switched more code to use
fscommon.ReadFile (and thus securejoin). Commit 0228226e6d introduced
fscommon.OpenFile (which uses securejoin as the fallback if openat2(2)
is not available, which is the case for older kernels), and commit
c95e69007c switched most of cgroup/fs[2] code to use it.

As a result, fs.GetStats() method became noticeable slower, mostly due
to securejoin calling os.Lstat and filepath.Clean.

Using securejoin as a security measure for cgroupfs files is
not well justified, as cgroupfs do not contain symlinks, and none of the
code using it have uncleaned paths. In particular, fs/fs2/systemd
managers do check and sanitize their paths.

This commit modifies the code to not use securejoin. Instead, it checks
that the opened file is indeed on cgroupfs.

Using BenchmarkGetStats on a CentOS 8 VM, I see the following
improvement:

Before:
> BenchmarkGetStats-8               8376            625135 ns/op

After:
> BenchmarkGetStats-8   	   12226	    485015 ns/op

An intermediate version, with no fstatfs to check fstype:
> BenchmarkGetStats-8              13162            452281 ns/op

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-29 14:55:02 -07:00
Sebastiaan van Stijn 71a8aee846 cgroups/systemd: replace deprecated dbus functions
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2021-04-29 22:07:02 +02:00
Akihiro Suda c2c35aefee Merge pull request #2911 from kolyshkin/debug-enable-file-line
logging: enable file/line info if --debug is set
2021-04-28 12:07:21 +09:00
Aleksa Sarai fac849263b merge branch 'pr-2923'
Shiming Zhang (3):
  libct/cg/sd: add dbus manager
  libct/cg/sd: add renew dbus connection
  Privatize NewUserSystemDbus

Kir Kolyshkin (2):
  libct/cg/sd: add isDbusError
  libct/cg/sd: retry on dbus disconnect

LGTMs: mrunalp cyphar
Closes #2923
2021-04-28 13:02:12 +10:00
Aleksa Sarai b2eb90816e merge branch 'pr-2922'
Akihiro Suda (1):
  CI: update Fedora to 34

LGTMs: mrunalp cyphar
Closes #2922
2021-04-28 10:13:11 +10:00
Kir Kolyshkin 47ef9a104f libct/cg/sd: retry on dbus disconnect
Instead of reconnecting to dbus after some failed operations, and
returning an error (so a caller has to retry), reconnect AND retry
in place for all such operations.

This should fix issues caused by a stale dbus connection after e.g.
a dbus daemon restart.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-27 16:19:49 -07:00
Shiming Zhang 6122bc8beb Privatize NewUserSystemDbus
Signed-off-by: Shiming Zhang <wzshiming@foxmail.com>
Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-27 16:16:27 -07:00
Shiming Zhang 15fee9899f libct/cg/sd: add renew dbus connection
[@kolyshkin: doc nits, use dbus.ErrClosed and isDbusError]

Signed-off-by: Shiming Zhang <wzshiming@foxmail.com>
Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-27 16:16:05 -07:00
Kir Kolyshkin bacfc2c2f9 libct/cg/sd: add isDbusError
Generalize isUnitExists as isDbusError, and use errors.As while at it
(which can handle wrapped errors as well).

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-27 16:14:04 -07:00
Shiming Zhang cdbed6f02f libct/cg/sd: add dbus manager
[@kolyshkin: documentation nits]

Signed-off-by: Shiming Zhang <wzshiming@foxmail.com>
Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-27 16:02:39 -07:00
Kir Kolyshkin 9efd8466ab libct/cg/fscommon.OpenFile: reverse checks order
In case openat2() is not available, it does not make sense to calculate
relpath (and check if path has /sys/fs/cgroup prefix).

Reverse the order of checks to not do that in case openat2 is not
available.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-27 09:51:31 -07:00
Kir Kolyshkin 0bee5e0b01 libct/cg/fs: add GetStats benchmark
On my CentOS 8 VM it shows:

> BenchmarkGetStats-8   	    8376	    625135 ns/op

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-27 09:51:20 -07:00
Akihiro Suda 7e7eb1c39d CI: update Fedora to 34
Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
2021-04-27 23:52:53 +09:00
Aleksa Sarai d3cee12a78 cloned_binary: switch from #error to #warning for SYS_memfd_create
We shouldn't refuse to build on architectures just because we don't know
what the syscall number of memfd_create(2) is. In addition, use the
correct defined(...) macros for ppc64 (these are the ones glibc uses).

Fixes: 3aead32ea2 ("nsenter: hard-code memfd_create(2) syscall numbers")
Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
2021-04-26 18:08:32 +10:00
Mrunal Patel 42a18e7f02 Merge pull request #2818 from kolyshkin/rootless-cgroup2-mount
Fix cgroup2 mount for rootless case
2021-04-22 17:04:19 -07:00
Akihiro Suda d061b41d9d Merge pull request #2917 from kolyshkin/validate-mounts
Validate mounts
2021-04-22 18:31:25 +09:00
Akihiro Suda 76559c60f1 Merge pull request #2918 from kolyshkin/freeze-3
libct/cg/fs/freezer: make sure to thaw on failure
2021-04-21 14:24:36 +09:00
Mrunal Patel b69bd53648 Merge pull request #2869 from dqminh/fix-oss-fuzz
Fix oss-fuzz build
2021-04-20 19:07:52 -07:00
Kir Kolyshkin fcd7fe85e1 libct/cg/fs/freezer: make sure to thaw on failure
Function (*FreezerGroup).Set has a few paths where in can return an
error. In any case, if an error is returned, we failed to freeze,
and we need to thaw to avoid leaving the cgroup in a stuck state.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-20 15:57:59 -07:00
Kir Kolyshkin 0216716c18 tests/int: add a case for cgroupv2 mount
This checks that in-container view of /sys/fs/cgroup does not
contain any extra cgroups (which was the case for rootless
before the previous commit).

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-20 12:37:54 -07:00
Kir Kolyshkin 5ffcc5683e tests/int: use bfq test with rootless
As the rootless cgroup2 mount is now fixed, we can enable this test
for rootless as well.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-20 12:37:39 -07:00
Kir Kolyshkin ff692f289b Fix cgroup2 mount for rootless case
In case of rootless, cgroup2 mount is not possible (see [1] for more
details), so since commit 9c81440fb5 runc bind-mounts the whole
/sys/fs/cgroup into container.

Problem is, if cgroupns is enabled, /sys/fs/cgroup inside the container
is supposed to show the cgroup files for this cgroup, not the root one.

The fix is to pass through and use the cgroup path in case cgroup2
mount failed, cgroupns is enabled, and the path is non-empty.

Surely this requires the /sys/fs/cgroup mount in the spec, so modify
runc spec --rootless to keep it.

Before:

	$ ./runc run aaa
	# find /sys/fs/cgroup/ -type d
	/sys/fs/cgroup
	/sys/fs/cgroup/user.slice
	/sys/fs/cgroup/user.slice/user-1000.slice
	/sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service
	...
	# ls -l /sys/fs/cgroup/cgroup.controllers
	-r--r--r--    1 nobody   nogroup          0 Feb 24 02:22 /sys/fs/cgroup/cgroup.controllers
	# wc -w /sys/fs/cgroup/cgroup.procs
	142 /sys/fs/cgroup/cgroup.procs
	# cat /sys/fs/cgroup/memory.current
	cat: can't open '/sys/fs/cgroup/memory.current': No such file or directory

After:

	# find /sys/fs/cgroup/ -type d
	/sys/fs/cgroup/
	# ls -l /sys/fs/cgroup/cgroup.controllers
	-r--r--r--    1 root     root             0 Feb 24 02:43 /sys/fs/cgroup/cgroup.controllers
	# wc -w /sys/fs/cgroup/cgroup.procs
	2 /sys/fs/cgroup/cgroup.procs
	# cat /sys/fs/cgroup/memory.current
	577536

[1] https://github.com/opencontainers/runc/issues/2158

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-20 12:35:40 -07:00
Kir Kolyshkin 3826db196d libct/rootfs/mountCgroupV2: minor refactor
1. s/cgroupPath/dest/

2. don't hardcode /sys/fs/cgroup

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-20 12:30:30 -07:00
Kir Kolyshkin 1e476578b6 libct/rootfs: introduce and use mountConfig
The code is already passing three parameters around from
mountToRootfs to mountCgroupV* to mountToRootfs again.

I am about to add another parameter, so let's introduce and
use struct mountConfig to pass around.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-20 12:30:06 -07:00
Kir Kolyshkin deb8a8dd77 libct/newInitConfig: nit
Move the initialization of Console* fields as they are unconditional.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-20 12:30:02 -07:00
Kir Kolyshkin 2192670a24 libct/configs/validate: validate mounts
Add a check that mount destination is absolute (as per OCI spec).

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-20 11:48:44 -07:00
Kir Kolyshkin 1f1e91b1a0 libct/specconv: check mount destination is absolute
Per OCI runtime spec, mount destination MUST be absolute. Let's check
that and return an error if not.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-04-20 11:26:16 -07:00