[CRIU] [PATCH 4/5] kdat: Cache kdat object into /run/criu.kdat (v2)
Adrian Reber
adrian at lisas.de
Thu Apr 27 08:00:47 PDT 2017
On Thu, Apr 27, 2017 at 04:53:50PM +0300, Pavel Emelyanov wrote:
> On 04/27/2017 09:11 AM, Adrian Reber wrote:
> > On Thu, Apr 27, 2017 at 08:37:09AM +0300, Mike Rapoport wrote:
> >> On Wed, Apr 26, 2017 at 04:37:34PM +0300, Pavel Emelyanov wrote:
> >>> Doing kerndat checks on every criu start is way too slow. We
> >>> need some way to speed this checks up on a particular box.
> >>>
> >>> As suggested by Andre, Dima and Mike let's try to keep the
> >>> collected kdat bits into some tmpfs file. Keeping it on
> >>> tmpfs would invaludate this cache on every machine reboot.
> >>>
> >>> There have been many suggestions how to generate this file,
> >>> my proposal is to create it once the kdat object is filled
> >>> by criu, w/o any explicit command. Optionally we can add
> >>> 'criu kdat --save|--drop' actions to manage this file.
> >>>
> >>> v2:
> >>> * don't ignore return code of write() (some glibcs complain)
> >>> * unlink tmp file in case rename failed
> >>>
> >>> Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
> >>> ---
> >>> criu/include/kerndat.h | 6 ++++
> >>> criu/include/magic.h | 7 +++++
> >>> criu/kerndat.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++-
> >>> 3 files changed, 97 insertions(+), 1 deletion(-)
> >>>
> >>> diff --git a/criu/include/kerndat.h b/criu/include/kerndat.h
> >>> index 6b621c6..b1722eb 100644
> >>> --- a/criu/include/kerndat.h
> >>> +++ b/criu/include/kerndat.h
> >>> @@ -29,6 +29,12 @@ enum loginuid_func {
> >>> };
> >>>
> >>> struct kerndat_s {
> >>> + /*
> >>> + * XXX: This structure is written AS IS into a tmpfs file,
> >>> + * so any changes in it should result in changed KDAT_MAGIC
> >>> + * value to avoid loading of bad kdat bits.
> >>> + */
> >>> + u32 magic;
> >>> dev_t shmem_dev;
> >>> int last_cap;
> >>> u64 zero_page_pfn;
> >>> diff --git a/criu/include/magic.h b/criu/include/magic.h
> >>> index 059d005..2297930 100644
> >>> --- a/criu/include/magic.h
> >>> +++ b/criu/include/magic.h
> >>> @@ -116,4 +116,11 @@
> >>> #define STATS_MAGIC 0x57093306 /* Ostashkov */
> >>> #define IRMAP_CACHE_MAGIC 0x57004059 /* Ivanovo */
> >>>
> >>> +/*
> >>> + * Magic for kerndat_s structure. When changing, keep the
> >>> + * old magics to avoid magic re-use.
> >>> + */
> >>> +
> >>> +#define KDAT_MAGIC_1 0x57023458 /* Torzhok */
> >>> +
> >>> #endif /* __CR_MAGIC_H__ */
> >>> diff --git a/criu/kerndat.c b/criu/kerndat.c
> >>> index 87a7b62..3aca1e4 100644
> >>> --- a/criu/kerndat.c
> >>> +++ b/criu/kerndat.c
> >>> @@ -650,10 +650,93 @@ close:
> >>> bclose(&f);
> >>> return ret;
> >>> }
> >>> +
> >>> +#define KERNDAT_CACHE_FILE "/run/criu.kdat"
> >>> +#define KERNDAT_CACHE_FILE_TMP "/run/.criu.kdat"
> >>
> >> What about running criu as non-root user?
>
> It, well, doesn't quite work by itself :) But yes, good catch, need to
> address that too somehow.
>
> > Could the location be Makefile dependent? For Fedora I would rather put
> > the file in /run/criu/criu.kdat
>
> Will do, thanks.
>
> > and create the directory via tmpfiles.d?
>
> I don't know what the tmpfiles.d is :) Would you explain, please?
https://www.freedesktop.org/software/systemd/man/tmpfiles.d.html
The distribution package could install a tmpfiles.d file (for systemd
based distribution) which creates a directory in /run with the necessary
access rights. I have lots of files in /usr/lib/tmpfiles.d/ and the
appropriate line for criu could look like
D /run/criu 0700 root root
Working with the git checkout criu could use the file you mentioned
/run/criu.kdat as that would not require to create an additional
directory in /run/. For the packaged version of criu it would be good to
point criu.kdat to /run/criu and install the mentioned tmpfiles.d from
above.
Adrian
More information about the CRIU
mailing list