[CRIU] [PATCH 2/2] files: Fix breaking of fds list ordering by splice
Kirill Tkhai
ktkhai at virtuozzo.com
Sat Jul 1 00:02:40 MSK 2017
Hi, Pavel,
On Fri, Jun 30, 2017 at 22:56, Pavel Begunkov wrote:
> Kirill, could you pls take a look?
>
> The basic idea is to preserve the order of the final list. The
> 'completed' list is split into 2 separate lists by #1a945c9, but the
> final splicing may break the order. As a simplest solution, I just
> returned it to the single list version.
> Should they really be explicitly separated? Then there should be some
> actual merge. Or maybe it's already sorted?
*completed* list is not ordered, because we add fles there
after they are restored. But they restore asynchronous
and it's impossible to guess, which time the certain fle will
be completed:
if you have 3 fles in the list hashed in the order: A, B, C;
you may have B restored first, then A, and then C.
So, if we kill fake list, fles still won't be ordered. And
I don't think we should have them be so, as we do not
use fles after the function is finished.
> On Fri, Jun 30, 2017 at 10:29 PM, Pavel Begunkov <asml.silence at gmail.com> wrote:
> > fds lists should be sorted in ascending order, splicing of 2 (ordered)
> > lists violates this invariant.
> >
> > Signed-off-by: Pavel Begunkov <asml.silence at gmail.com>
> > ---
> > criu/files.c | 14 +++++---------
> > 1 file changed, 5 insertions(+), 9 deletions(-)
> >
> > diff --git a/criu/files.c b/criu/files.c
> > index 4a263c438..a0df8f531 100644
> > --- a/criu/files.c
> > +++ b/criu/files.c
> > @@ -1161,12 +1161,13 @@ static int receive_fd(struct fdinfo_list_entry *fle)
> > return 0;
> > }
> >
> > -static void close_fdinfos(struct list_head *list)
> > +static void close_fake_fdinfos(struct list_head *list)
> > {
> > struct fdinfo_list_entry *fle;
> >
> > list_for_each_entry(fle, list, ps_list)
> > - close(fle->fe->fd);
> > + if (fle->fake)
> > + close(fle->fe->fd);
> > }
> >
> > static int open_fdinfos(struct pstree_item *me)
> > @@ -1174,7 +1175,6 @@ static int open_fdinfos(struct pstree_item *me)
> > struct list_head *list = &rsti(me)->fds;
> > struct fdinfo_list_entry *fle, *tmp;
> > LIST_HEAD(completed);
> > - LIST_HEAD(fake);
> > bool progress, again;
> > int st, ret = 0;
> >
> > @@ -1197,10 +1197,7 @@ static int open_fdinfos(struct pstree_item *me)
> > * and reduce number of fles in their checks.
> > */
> > list_del(&fle->ps_list);
> > - if (!fle->fake)
> > - list_add_tail(&fle->ps_list, &completed);
> > - else
> > - list_add_tail(&fle->ps_list, &fake);
> > + list_add_tail(&fle->ps_list, &completed);
> > }
> > if (ret == 1)
> > again = true;
> > @@ -1214,9 +1211,8 @@ static int open_fdinfos(struct pstree_item *me)
> > * Fake fles may be used for restore other
> > * file types, so their closing is delayed.
> > */
> > - close_fdinfos(&fake);
> > + close_fake_fdinfos(&completed);
> > splice:
> > - list_splice(&fake, list);
> > list_splice(&completed, list);
> >
> > return ret;
> > --
> > 2.11.1
> >
More information about the CRIU
mailing list