Skip to content

Conversation

@kolyshkin
Copy link
Collaborator

Sometimes setting CPU quota period fails when a new period is lower, and a parent cgroup has CPU quota limit set.

This happens as in cgroup v1 the quota and the period can not be set together (this is fixed in v2), and since the period is being set first, new_limit = old_quota/new_period may be higher than the parent cgroup limit.

The fix is to retry setting the period after the quota, to cover all possible scenarios.

Tested via runc integration tests. Before the commit, it fails:

root@ubu2004:~/git/runc# RUNC=`pwd`/../crun/crun.before bats -f "pod cgroup" -t  tests/integration/update.bats
1..1
not ok 1 update cpu period in a pod cgroup with pod limit set
# (in test file tests/integration/update.bats, line 424)
#   `[ "$status" -eq 0 ]' failed
# crun.before spec (status=0):
#
# crun.before run -d --console-socket /tmp/bats-run-30428-dYkMDC/runc.4FdCtn/tty/sock test_update (status=0):
#
# crun.before update --cpu-quota 600000 test_update (status=1):
# writing file `cpu.cfs_quota_us`: Invalid argument
# crun.before update --cpu-period 10000 --cpu-quota 3000 test_update (status=1):
# writing file `cpu.cfs_period_us`: Invalid argument

With the fix, the test passes.

Originally reported for runc in
opencontainers/runc#3084

if (UNLIKELY (ret < 0))
return ret;
{
if (errno != EINVAL)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could you please replace errno with crun_error_get_errno (err)?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's exactly what I was thinking, thanks!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right (I thought about that but forgot).

In addition, I forgot to add !cpu->quota check, since if we won't be setting quota later, we need to return an error. Fixed now.

* it is rejected by the kernel (EINVAL) as old_quota/new_period exceeds
* the parent cgroup quota limit. If this happens and the quota is going
* to be set, ignore the error for now and retry after setting the quota.
*/
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since the err is not used, we'll need to free it with crun_error_release (err);

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

Sometimes setting CPU quota period fails when a new period is lower,
and a parent cgroup has CPU quota limit set.

This happens as in cgroup v1 the quota and the period can not be set
together (this is fixed in v2), and since the period is being set first,
new_limit = old_quota/new_period may be higher than the parent cgroup
limit.

The fix is to retry setting the period after the quota, to cover all
possible scenarios.

Tested via runc integration tests. Before the commit, it fails:

	root@ubu2004:~/git/runc# RUNC=`pwd`/../crun/crun.before bats -f "pod cgroup" -t  tests/integration/update.bats
	1..1
	not ok 1 update cpu period in a pod cgroup with pod limit set
	# (in test file tests/integration/update.bats, line 424)
	#   `[ "$status" -eq 0 ]' failed
	# crun.before spec (status=0):
	#
	# crun.before run -d --console-socket /tmp/bats-run-30428-dYkMDC/runc.4FdCtn/tty/sock test_update (status=0):
	#
	# crun.before update --cpu-quota 600000 test_update (status=1):
	# writing file `cpu.cfs_quota_us`: Invalid argument
	# crun.before update --cpu-period 10000 --cpu-quota 3000 test_update (status=1):
	# writing file `cpu.cfs_period_us`: Invalid argument

With the fix, the test passes.

Originally reported for runc in
opencontainers/runc#3084

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
Copy link
Member

@giuseppe giuseppe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@giuseppe giuseppe merged commit 93f249f into containers:main Apr 7, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants