Skip to content
  • Pavel Emelyanov's avatar
    clear_refs: sanitize accepted commands declaration · 040fa020
    Pavel Emelyanov authored
    This is the implementation of the soft-dirty bit concept that should
    help keep track of changes in user memory, which in turn is very-very
    required by the checkpoint-restore project (http://criu.org
    
    ).
    
    To create a dump of an application(s) we save all the information about
    it to files, and the biggest part of such dump is the contents of tasks'
    memory.  However, there are usage scenarios where it's not required to
    get _all_ the task memory while creating a dump.  For example, when
    doing periodical dumps, it's only required to take full memory dump only
    at the first step and then take incremental changes of memory.  Another
    example is live migration.  We copy all the memory to the destination
    node without stopping all tasks, then stop them, check for what pages
    has changed, dump it and the rest of the state, then copy it to the
    destination node.  This decreases freeze time significantly.
    
    That said, some help from kernel to watch how processes modify the
    contents of their memory is required.
    
    The proposal is to track changes with the help of new soft-dirty bit
    this way:
    
    1. First do "echo 4 > /proc/$pid/clear_refs".
       At that point kernel clears the soft dirty _and_ the writable bits from all
       ptes of process $pid. From now on every write to any page will result in #pf
       and the subsequent call to pte_mkdirty/pmd_mkdirty, which in turn will set
       the soft dirty flag.
    
    2. Then read the /proc/$pid/pagemap2 and check the soft-dirty bit reported there
       (the 55'th one). If set, the respective pte was written to since last call
       to clear refs.
    
    The soft-dirty bit is the _PAGE_BIT_HIDDEN one.  Although it's used by
    kmemcheck, the latter one marks kernel pages with it, while the former
    bit is put on user pages so they do not conflict to each other.
    
    This patch:
    
    A new clear-refs type will be added in the next patch, so prepare
    code for that.
    
    [akpm@linux-foundation.org: don't assume that sizeof(enum clear_refs_types) == sizeof(int)]
    Signed-off-by: default avatarPavel Emelyanov <xemul@parallels.com>
    Cc: Matt Mackall <mpm@selenic.com>
    Cc: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
    Cc: Glauber Costa <glommer@parallels.com>
    Cc: Marcelo Tosatti <mtosatti@redhat.com>
    Cc: KOSAKI Motohiro <kosaki.motohiro@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    040fa020