lkml.org 
[lkml]   [2022]   [Aug]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 11/14] kexec_file: drop weak attribute from functions
    Date
    From: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>

    commit 65d9a9a60fd71be964effb2e94747a6acb6e7015 upstream.

    As requested
    (http://lkml.kernel.org/r/87ee0q7b92.fsf@email.froward.int.ebiederm.org),
    this series converts weak functions in kexec to use the #ifdef approach.

    Quoting the 3e35142ef99fe ("kexec_file: drop weak attribute from
    arch_kexec_apply_relocations[_add]") changelog:

    : Since commit d1bcae833b32f1 ("ELF: Don't generate unused section symbols")
    : [1], binutils (v2.36+) started dropping section symbols that it thought
    : were unused. This isn't an issue in general, but with kexec_file.c, gcc
    : is placing kexec_arch_apply_relocations[_add] into a separate
    : .text.unlikely section and the section symbol ".text.unlikely" is being
    : dropped. Due to this, recordmcount is unable to find a non-weak symbol in
    : .text.unlikely to generate a relocation record against.

    This patch (of 2);

    Drop __weak attribute from functions in kexec_file.c:
    - arch_kexec_kernel_image_probe()
    - arch_kimage_file_post_load_cleanup()
    - arch_kexec_kernel_image_load()
    - arch_kexec_locate_mem_hole()
    - arch_kexec_kernel_verify_sig()

    arch_kexec_kernel_image_load() calls into kexec_image_load_default(), so
    drop the static attribute for the latter.

    arch_kexec_kernel_verify_sig() is not overridden by any architecture, so
    drop the __weak attribute.

    Link: https://lkml.kernel.org/r/cover.1656659357.git.naveen.n.rao@linux.vnet.ibm.com
    Link: https://lkml.kernel.org/r/2cd7ca1fe4d6bb6ca38e3283c717878388ed6788.1656659357.git.naveen.n.rao@linux.vnet.ibm.com
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Suggested-by: Eric Biederman <ebiederm@xmission.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/arm64/include/asm/kexec.h | 4 ++-
    arch/powerpc/include/asm/kexec.h | 9 +++++++
    arch/s390/include/asm/kexec.h | 3 ++
    arch/x86/include/asm/kexec.h | 6 +++++
    include/linux/kexec.h | 44 +++++++++++++++++++++++++++++++++------
    kernel/kexec_file.c | 35 +------------------------------
    6 files changed, 61 insertions(+), 40 deletions(-)

    --- a/arch/arm64/include/asm/kexec.h
    +++ b/arch/arm64/include/asm/kexec.h
    @@ -103,7 +103,9 @@ extern const struct kexec_file_ops kexec

    struct kimage;

    -extern int arch_kimage_file_post_load_cleanup(struct kimage *image);
    +int arch_kimage_file_post_load_cleanup(struct kimage *image);
    +#define arch_kimage_file_post_load_cleanup arch_kimage_file_post_load_cleanup
    +
    extern int load_other_segments(struct kimage *image,
    unsigned long kernel_load_addr, unsigned long kernel_size,
    char *initrd, unsigned long initrd_len,
    --- a/arch/powerpc/include/asm/kexec.h
    +++ b/arch/powerpc/include/asm/kexec.h
    @@ -119,6 +119,15 @@ int setup_purgatory(struct kimage *image
    #ifdef CONFIG_PPC64
    struct kexec_buf;

    +int arch_kexec_kernel_image_probe(struct kimage *image, void *buf, unsigned long buf_len);
    +#define arch_kexec_kernel_image_probe arch_kexec_kernel_image_probe
    +
    +int arch_kimage_file_post_load_cleanup(struct kimage *image);
    +#define arch_kimage_file_post_load_cleanup arch_kimage_file_post_load_cleanup
    +
    +int arch_kexec_locate_mem_hole(struct kexec_buf *kbuf);
    +#define arch_kexec_locate_mem_hole arch_kexec_locate_mem_hole
    +
    int load_crashdump_segments_ppc64(struct kimage *image,
    struct kexec_buf *kbuf);
    int setup_purgatory_ppc64(struct kimage *image, const void *slave_code,
    --- a/arch/s390/include/asm/kexec.h
    +++ b/arch/s390/include/asm/kexec.h
    @@ -92,5 +92,8 @@ int arch_kexec_apply_relocations_add(str
    const Elf_Shdr *relsec,
    const Elf_Shdr *symtab);
    #define arch_kexec_apply_relocations_add arch_kexec_apply_relocations_add
    +
    +int arch_kimage_file_post_load_cleanup(struct kimage *image);
    +#define arch_kimage_file_post_load_cleanup arch_kimage_file_post_load_cleanup
    #endif
    #endif /*_S390_KEXEC_H */
    --- a/arch/x86/include/asm/kexec.h
    +++ b/arch/x86/include/asm/kexec.h
    @@ -193,6 +193,12 @@ int arch_kexec_apply_relocations_add(str
    const Elf_Shdr *relsec,
    const Elf_Shdr *symtab);
    #define arch_kexec_apply_relocations_add arch_kexec_apply_relocations_add
    +
    +void *arch_kexec_kernel_image_load(struct kimage *image);
    +#define arch_kexec_kernel_image_load arch_kexec_kernel_image_load
    +
    +int arch_kimage_file_post_load_cleanup(struct kimage *image);
    +#define arch_kimage_file_post_load_cleanup arch_kimage_file_post_load_cleanup
    #endif
    #endif

    --- a/include/linux/kexec.h
    +++ b/include/linux/kexec.h
    @@ -182,21 +182,53 @@ int kexec_purgatory_get_set_symbol(struc
    void *buf, unsigned int size,
    bool get_value);
    void *kexec_purgatory_get_symbol_addr(struct kimage *image, const char *name);
    +void *kexec_image_load_default(struct kimage *image);
    +
    +#ifndef arch_kexec_kernel_image_probe
    +static inline int
    +arch_kexec_kernel_image_probe(struct kimage *image, void *buf, unsigned long buf_len)
    +{
    + return kexec_image_probe_default(image, buf, buf_len);
    +}
    +#endif
    +
    +#ifndef arch_kimage_file_post_load_cleanup
    +static inline int arch_kimage_file_post_load_cleanup(struct kimage *image)
    +{
    + return kexec_image_post_load_cleanup_default(image);
    +}
    +#endif
    +
    +#ifndef arch_kexec_kernel_image_load
    +static inline void *arch_kexec_kernel_image_load(struct kimage *image)
    +{
    + return kexec_image_load_default(image);
    +}
    +#endif

    -/* Architectures may override the below functions */
    -int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
    - unsigned long buf_len);
    -void *arch_kexec_kernel_image_load(struct kimage *image);
    -int arch_kimage_file_post_load_cleanup(struct kimage *image);
    #ifdef CONFIG_KEXEC_SIG
    int arch_kexec_kernel_verify_sig(struct kimage *image, void *buf,
    unsigned long buf_len);
    #endif
    -int arch_kexec_locate_mem_hole(struct kexec_buf *kbuf);

    extern int kexec_add_buffer(struct kexec_buf *kbuf);
    int kexec_locate_mem_hole(struct kexec_buf *kbuf);

    +#ifndef arch_kexec_locate_mem_hole
    +/**
    + * arch_kexec_locate_mem_hole - Find free memory to place the segments.
    + * @kbuf: Parameters for the memory search.
    + *
    + * On success, kbuf->mem will have the start address of the memory region found.
    + *
    + * Return: 0 on success, negative errno on error.
    + */
    +static inline int arch_kexec_locate_mem_hole(struct kexec_buf *kbuf)
    +{
    + return kexec_locate_mem_hole(kbuf);
    +}
    +#endif
    +
    /* Alignment required for elf header segment */
    #define ELF_CORE_HEADER_ALIGN 4096

    --- a/kernel/kexec_file.c
    +++ b/kernel/kexec_file.c
    @@ -62,14 +62,7 @@ int kexec_image_probe_default(struct kim
    return ret;
    }

    -/* Architectures can provide this probe function */
    -int __weak arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
    - unsigned long buf_len)
    -{
    - return kexec_image_probe_default(image, buf, buf_len);
    -}
    -
    -static void *kexec_image_load_default(struct kimage *image)
    +void *kexec_image_load_default(struct kimage *image)
    {
    if (!image->fops || !image->fops->load)
    return ERR_PTR(-ENOEXEC);
    @@ -80,11 +73,6 @@ static void *kexec_image_load_default(st
    image->cmdline_buf_len);
    }

    -void * __weak arch_kexec_kernel_image_load(struct kimage *image)
    -{
    - return kexec_image_load_default(image);
    -}
    -
    int kexec_image_post_load_cleanup_default(struct kimage *image)
    {
    if (!image->fops || !image->fops->cleanup)
    @@ -93,11 +81,6 @@ int kexec_image_post_load_cleanup_defaul
    return image->fops->cleanup(image->image_loader_data);
    }

    -int __weak arch_kimage_file_post_load_cleanup(struct kimage *image)
    -{
    - return kexec_image_post_load_cleanup_default(image);
    -}
    -
    #ifdef CONFIG_KEXEC_SIG
    static int kexec_image_verify_sig_default(struct kimage *image, void *buf,
    unsigned long buf_len)
    @@ -110,8 +93,7 @@ static int kexec_image_verify_sig_defaul
    return image->fops->verify_sig(buf, buf_len);
    }

    -int __weak arch_kexec_kernel_verify_sig(struct kimage *image, void *buf,
    - unsigned long buf_len)
    +int arch_kexec_kernel_verify_sig(struct kimage *image, void *buf, unsigned long buf_len)
    {
    return kexec_image_verify_sig_default(image, buf, buf_len);
    }
    @@ -617,19 +599,6 @@ int kexec_locate_mem_hole(struct kexec_b
    }

    /**
    - * arch_kexec_locate_mem_hole - Find free memory to place the segments.
    - * @kbuf: Parameters for the memory search.
    - *
    - * On success, kbuf->mem will have the start address of the memory region found.
    - *
    - * Return: 0 on success, negative errno on error.
    - */
    -int __weak arch_kexec_locate_mem_hole(struct kexec_buf *kbuf)
    -{
    - return kexec_locate_mem_hole(kbuf);
    -}
    -
    -/**
    * kexec_add_buffer - place a buffer in a kexec segment
    * @kbuf: Buffer contents and memory parameters.
    *

    \
     
     \ /
      Last update: 2022-08-19 17:43    [W:4.165 / U:0.184 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site