x86/module: Use text_mutex in apply_relocate_add()
authorJosh Poimboeuf <jpoimboe@redhat.com>
Wed, 29 Apr 2020 15:24:52 +0000 (10:24 -0500)
committerJiri Kosina <jkosina@suse.cz>
Thu, 7 May 2020 22:12:43 +0000 (00:12 +0200)
Now that the livepatch code no longer needs the text_mutex for changing
module permissions, move its usage down to apply_relocate_add().

Note the s390 version of apply_relocate_add() doesn't need to use the
text_mutex because it already uses s390_kernel_write_lock, which
accomplishes the same task.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Acked-by: Joe Lawrence <joe.lawrence@redhat.com>
Acked-by: Miroslav Benes <mbenes@suse.cz>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
arch/x86/kernel/module.c
kernel/livepatch/core.c

index 7614f47..23c95a5 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/gfp.h>
 #include <linux/jump_label.h>
 #include <linux/random.h>
+#include <linux/memory.h>
 
 #include <asm/text-patching.h>
 #include <asm/page.h>
@@ -227,14 +228,18 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
        bool early = me->state == MODULE_STATE_UNFORMED;
        void *(*write)(void *, const void *, size_t) = memcpy;
 
-       if (!early)
+       if (!early) {
                write = text_poke;
+               mutex_lock(&text_mutex);
+       }
 
        ret = __apply_relocate_add(sechdrs, strtab, symindex, relsec, me,
                                   write);
 
-       if (!early)
+       if (!early) {
                text_poke_sync();
+               mutex_unlock(&text_mutex);
+       }
 
        return ret;
 }
index 6b8b3c0..96d2da1 100644 (file)
@@ -775,9 +775,6 @@ static int klp_init_object_loaded(struct klp_patch *patch,
        int ret;
 
        if (klp_is_module(obj)) {
-
-               mutex_lock(&text_mutex);
-
                /*
                 * Only write module-specific relocations here
                 * (.klp.rela.{module}.*).  vmlinux-specific relocations were
@@ -785,9 +782,6 @@ static int klp_init_object_loaded(struct klp_patch *patch,
                 * itself.
                 */
                ret = klp_apply_object_relocs(patch, obj);
-
-               mutex_unlock(&text_mutex);
-
                if (ret)
                        return ret;
        }