• Cyrill Gorcunov's avatar
    vdso: x86 -- Add handling of vvar zones · fe7b8aeb
    Cyrill Gorcunov authored
    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: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
    Acked-by: 's avatarAndrew Vagin <avagin@parallels.com>
    Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
    fe7b8aeb
cr-restore.c 57.2 KB