[CRIU] [PATCH 5/5] vdso: x86 -- Add handling of vvar zones
Pavel Emelyanov
xemul at parallels.com
Wed Jun 11 04:28:57 PDT 2014
On 06/10/2014 10:16 PM, Cyrill Gorcunov wrote:
>
> New kernel 3.16 will have old vDSO zone splitted into the two vmas:
> one for vdso code itself and second that named vvar for data been
> referenced from vdso code.
>
> Because I can't do 'dump' and 'restore' parts of the code separately
> (otherwise test would fail) the commit is pretty big one and hard to
> read so here is detailed explanation what's going on.
>
> 1) When start dumping we detect vvar zone by reading /proc/pid/smap
> and looking up for "[vvar]" token. Note the vvar zone is mapped
> by a kernel with PF/IO flags so we should not fail here.
>
> Also it's assumed that at least for now kernel won't be changed
> much and [vvar] zone always follows the [vdso] zone, otherwise
> criu will print error.
>
> 2) In previous commits we disabled dumping vvar area contents so
> the restorer code never try to read vvar data but still we need
> to map vvar zone thus vma entry remains in image.
>
> 3) As with previous vdso format we might have 2 cases
>
> a) Dump and restore is happening on same kernel
> b) Dump and restore are done on different kernels
>
> To detect which case we have we parse vdso data from image
> and find symbols offsets then compare their values with runtime
> symbols provided us by a kernel. If they match and (!!!) the
> size of vvar zone is the same -- we simply remap both zones
> from runtime kernel into the positions dumpee had at checkpoint
> time. This is that named "inplace" remap (a).
>
> If this happens the vdso_proxify() routine drops VMA_AREA_REGULAR
> from vvar area provided by a caller code and restorer won't try
> to handle this vma. It looks somehow strange and probably should
> be reworked but for now I left it as is to minimize the patch.
>
> In case of (b) we need to generate a proxy. We do that in same
> way as we were before just include vvar zone into proxy and save
> vvar proxy address inside vdso mark injected into vdso area. Thus
> on subsequent checkpoint we can detect proxy vvar zone and rip
> it off the list of vmas to handle.
>
> Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
> ---
> arch/x86/include/asm/vdso.h | 9 ++-
> arch/x86/vdso-pie.c | 71 +++++++++++++++++-----
> arch/x86/vdso.c | 141 ++++++++++++++++++++++++++++++++++++--------
> cr-restore.c | 4 +-
> include/vdso.h | 3 +-
> pie/restorer.c | 28 ++++++++-
> proc_parse.c | 21 ++++++-
> 7 files changed, 229 insertions(+), 48 deletions(-)
>
> #ifdef CONFIG_VDSO
> if (vma_entry_is(vma_entry, VMA_AREA_VDSO)) {
> + VmaEntry *vma_vvar;
> +
> + if (i + 1 < args->nr_vmas) {
> + vma_vvar = args->tgt_vmas + i + 1;
> + if (!vma_entry_is(vma_entry, VMA_AREA_VVAR))
> + vma_vvar = NULL;
> + } else
> + vma_vvar = NULL;
So why do you consider vvar vma _in_ _images_ to strictly follow the vdso one?
More information about the CRIU
mailing list