[CRIU] [PATCH] restore: Allow to ignore resource limits from image
Cyrill Gorcunov
gorcunov at openvz.org
Tue Jul 2 04:02:49 EDT 2013
rhel6 has RLIM_NLIMITS defined to 15, while modern
kernels increased this value to 16. So warn a user
that some particular resource is ingnored on restore
if criu built on rhel6 node.
More precisely -- this limit comes from not linux
headers but from glibc-headers-2.12-1.80.el6.x86_64,
thus even have kernel headers updated I still see
this problem.
(the 16th resource is RLIMIT_RTTIME which is not present
on old system. If the container has been c/r with
criu from the scratch there won't be a problem, but
I'm testing containers which are snapshoted by openvz
kernel who has own CPT_RLIM_NLIMITS = 16 independently
of system headers).
Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
cr-restore.c | 33 +++++++++++++++++----------------
1 file changed, 17 insertions(+), 16 deletions(-)
diff --git a/cr-restore.c b/cr-restore.c
index 2146da2..774f379 100644
--- a/cr-restore.c
+++ b/cr-restore.c
@@ -1808,9 +1808,9 @@ static unsigned long decode_rlim(u_int64_t ival)
static int prepare_rlimits(int pid, struct task_restore_core_args *ta)
{
- int fd, ret;
+ int fd, ret, nr_rlim;
- ta->nr_rlim = 0;
+ ta->nr_rlim = nr_rlim = 0;
fd = open_image(CR_FD_RLIMIT, O_RSTR, pid);
if (fd < 0) {
@@ -1823,32 +1823,33 @@ static int prepare_rlimits(int pid, struct task_restore_core_args *ta)
}
while (1) {
- int l;
RlimitEntry *re;
ret = pb_read_one_eof(fd, &re, PB_RLIMIT);
if (ret <= 0)
break;
- l = ta->nr_rlim;
- if (l == RLIM_NLIMITS) {
- pr_err("Too many rlimits in image for %d\n", pid);
- ret = -1;
- break;
- }
+ if (nr_rlim < RLIM_NLIMITS) {
+ struct rlimit *r = &ta->rlims[nr_rlim];
- ta->rlims[l].rlim_cur = decode_rlim(re->cur);
- ta->rlims[l].rlim_max = decode_rlim(re->max);
- if (ta->rlims[l].rlim_cur > ta->rlims[l].rlim_max) {
- pr_err("Can't restore cur > max for %d.%d\n", pid, l);
- ta->rlims[l].rlim_cur = ta->rlims[l].rlim_max;
+ r->rlim_cur = decode_rlim(re->cur);
+ r->rlim_max = decode_rlim(re->max);
+ if (r->rlim_cur > r->rlim_max) {
+ pr_err("Can't restore cur > max for %d.%d\n",
+ pid, nr_rlim);
+ r->rlim_cur = r->rlim_max;
+ }
+ } else {
+ pr_warn("Resource limit %d ignored for %d\n",
+ nr_rlim, pid);
}
rlimit_entry__free_unpacked(re, NULL);
-
- ta->nr_rlim++;
+ nr_rlim++;
}
+ ta->nr_rlim = min(nr_rlim, RLIM_NLIMITS);
+
close(fd);
return ret;
}
--
1.8.1.4
More information about the CRIU
mailing list