• Peter Zijlstra's avatar
    livepatch: Remove .klp.arch · 1d05334d
    Peter Zijlstra authored
    After the previous patch, vmlinux-specific KLP relocations are now
    applied early during KLP module load.  This means that .klp.arch
    sections are no longer needed for *vmlinux-specific* KLP relocations.
    
    One might think they're still needed for *module-specific* KLP
    relocations.  If a to-be-patched module is loaded *after* its
    corresponding KLP module is loaded, any corresponding KLP relocations
    will be delayed until the to-be-patched module is loaded.  If any
    special sections (.parainstructions, for example) rely on those
    relocations, their initializations (apply_paravirt) need to be done
    afterwards.  Thus the apparent need for arch_klp_init_object_loaded()
    and its corresponding .klp.arch sections -- it allows some of the
    special section initializations to be done at a later time.
    
    But... if you look closer, that dependency between the special sections
    and the module-specific KLP relocations doesn't actually exist in
    reality.  Looking at the contents of the .altinstructions and
    .parainstructions sections, there's not a realistic scenario in which a
    KLP module's .altinstructions or .parainstructions section needs to
    access a symbol in a to-be-patched module.  It might need to access a
    local symbol or even a vmlinux symbol; but not another module's symbol.
    When a special section needs to reference a local or vmlinux symbol, a
    normal rela can be used instead of a KLP rela.
    
    Since the special section initializations don't actually have any real
    dependency on module-specific KLP relocations, .klp.arch and
    arch_klp_init_object_loaded() no longer have a reason to exist.  So
    remove them.
    
    As Peter said much more succinctly:
    
      So the reason for .klp.arch was that .klp.rela.* stuff would overwrite
      paravirt instructions. If that happens you're doing it wrong. Those
      RELAs are core kernel, not module, and thus should've happened in
      .rela.* sections at patch-module loading time.
    
      Reverting this removes the two apply_{paravirt,alternatives}() calls
      from the late patching path, and means we don't have to worry about
      them when removing module_disable_ro().
    
    [ jpoimboe: Rewrote patch description.  Tweaked klp_init_object_loaded()
    	    error path. ]
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: default avatarJoe Lawrence <joe.lawrence@redhat.com>
    Acked-by: default avatarMiroslav Benes <mbenes@suse.cz>
    Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
    1d05334d
core.c 30 KB