[CRIU] [PATCH 3/3 v2] cg: Add rollback in get_cg_set
Cyrill Gorcunov
gorcunov at virtuozzo.com
Mon Apr 4 01:33:00 PDT 2016
On Sat, Apr 02, 2016 at 12:17:18AM -0700, Andrew Vagin wrote:
> >
> > if (collect && collect_cgroups(&cs->ctls)) {
> > - put_ctls(ctls);
> > + list_del(&cs->l);
> > + n_sets--;
>
> Can we call collect_cgroups() before filling cs?
We can, but I think it's more natural to splice here:
- allocate new cg_set
- splice existing data into it
- now operate with @cg_set only
>
> > + put_ctls(&cs->ctls);
> > xfree(cs);
> > + INIT_LIST_HEAD(ctls);
>
> I think it's better to use list_splice_init() instead of
> list_splice()
yup, thanks. attached.
-------------- next part --------------
>From 34e71b48c4fe1f16cbd7ca34d5f5df335c8b5442 Mon Sep 17 00:00:00 2001
From: Cyrill Gorcunov <gorcunov at virtuozzo.com>
Date: Thu, 31 Mar 2016 16:32:41 +0300
Subject: [PATCH] cg: Add rollback in get_cg_set
In case of error inside collect_cgroups we need
- @ctls list has been spliced into @cs->ctls so we cant just free it,
but rather use put_ctls on @cs->ctls
- delete @cs->l from global @cg_sets list before free it
https://jira.sw.ru/browse/PSBM-45553
Signed-off-by: Cyrill Gorcunov <gorcunov at virtuozzo.com>
---
criu/cgroup.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/criu/cgroup.c b/criu/cgroup.c
index ccac9fa..bb76606 100644
--- a/criu/cgroup.c
+++ b/criu/cgroup.c
@@ -201,7 +201,7 @@ static struct cg_set *get_cg_set(struct list_head *ctls, unsigned int n_ctls, bo
if (cs) {
cs->id = cg_set_ids++;
INIT_LIST_HEAD(&cs->ctls);
- list_splice(ctls, &cs->ctls);
+ list_splice_init(ctls, &cs->ctls);
cs->n_ctls = n_ctls;
list_add_tail(&cs->l, &cg_sets);
n_sets++;
@@ -214,7 +214,9 @@ static struct cg_set *get_cg_set(struct list_head *ctls, unsigned int n_ctls, bo
}
if (collect && collect_cgroups(&cs->ctls)) {
- put_ctls(ctls);
+ list_del(&cs->l);
+ n_sets--;
+ put_ctls(&cs->ctls);
xfree(cs);
return NULL;
}
--
2.5.5
More information about the CRIU
mailing list