• J
    livepatch: support for repatching a function · 3c33f5b9
    Josh Poimboeuf 提交于
    Add support for patching a function multiple times.  If multiple patches
    affect a function, the function in the most recently enabled patch
    "wins".  This enables a cumulative patch upgrade path, where each patch
    is a superset of previous patches.
    
    This requires restructuring the data a little bit.  With the current
    design, where each klp_func struct has its own ftrace_ops, we'd have to
    unregister the old ops and then register the new ops, because
    FTRACE_OPS_FL_IPMODIFY prevents us from having two ops registered for
    the same function at the same time.  That would leave a regression
    window where the function isn't patched at all (not good for a patch
    upgrade path).
    
    This patch replaces the per-klp_func ftrace_ops with a global klp_ops
    list, with one ftrace_ops per original function.  A single ftrace_ops is
    shared between all klp_funcs which have the same old_addr.  This allows
    the switch between function versions to happen instantaneously by
    updating the klp_ops struct's func_stack list.  The winner is the
    klp_func at the top of the func_stack (front of the list).
    
    [ jkosina@suse.cz: turn WARN_ON() into WARN_ON_ONCE() in ftrace handler to
      avoid storm in pathological cases ]
    Signed-off-by: NJosh Poimboeuf <jpoimboe@redhat.com>
    Reviewed-by: NJiri Slaby <jslaby@suse.cz>
    Signed-off-by: NJiri Kosina <jkosina@suse.cz>
    3c33f5b9
core.c 21.5 KB