lkml.org 
[lkml]   [2016]   [Sep]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 2/5] kexec_file: Add buffer hand-over support for the next kernel
    Date
    The buffer hand-over mechanism allows the currently running kernel to pass
    data to kernel that will be kexec'd via a kexec segment. The second kernel
    can check whether the previous kernel sent data and retrieve it.

    This is the architecture-independent part of the feature.

    Signed-off-by: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com>
    ---
    include/linux/kexec.h | 31 +++++++++++++++++++++++
    kernel/kexec_file.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++
    2 files changed, 99 insertions(+)

    diff --git a/include/linux/kexec.h b/include/linux/kexec.h
    index 2a96292ee544..768245aa76bf 100644
    --- a/include/linux/kexec.h
    +++ b/include/linux/kexec.h
    @@ -389,6 +389,37 @@ static inline void *boot_phys_to_virt(unsigned long entry)
    return phys_to_virt(boot_phys_to_phys(entry));
    }

    +#ifdef CONFIG_KEXEC_FILE
    +bool __weak kexec_can_hand_over_buffer(void);
    +int __weak arch_kexec_add_handover_buffer(struct kimage *image,
    + unsigned long load_addr,
    + unsigned long size);
    +int kexec_add_handover_buffer(struct kexec_buf *kbuf);
    +int __weak kexec_get_handover_buffer(void **addr, unsigned long *size);
    +int __weak kexec_free_handover_buffer(void);
    +#else
    +struct kexec_buf;
    +
    +static inline bool kexec_can_hand_over_buffer(void)
    +{
    + return false;
    +}
    +
    +static inline int kexec_add_handover_buffer(struct kexec_buf *kbuf)
    +{
    + return -ENOTSUPP;
    +}
    +
    +static inline int kexec_get_handover_buffer(void **addr, unsigned long *size)
    +{
    + return -ENOTSUPP;
    +}
    +
    +static inline int kexec_free_handover_buffer(void)
    +{
    + return -ENOTSUPP;
    +}
    +#endif /* CONFIG_KEXEC_FILE */
    #else /* !CONFIG_KEXEC_CORE */
    struct pt_regs;
    struct task_struct;
    diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
    index 6f7fa8901171..35b04296484b 100644
    --- a/kernel/kexec_file.c
    +++ b/kernel/kexec_file.c
    @@ -116,6 +116,74 @@ void kimage_file_post_load_cleanup(struct kimage *image)
    image->image_loader_data = NULL;
    }

    +/**
    + * kexec_can_hand_over_buffer() - can we pass data to the kexec'd kernel?
    + */
    +bool __weak kexec_can_hand_over_buffer(void)
    +{
    + return false;
    +}
    +
    +/**
    + * arch_kexec_add_handover_buffer() - do arch-specific steps to handover buffer
    + *
    + * Architectures should use this function to pass on the handover buffer
    + * information to the next kernel.
    + *
    + * Return: 0 on success, negative errno on error.
    + */
    +int __weak arch_kexec_add_handover_buffer(struct kimage *image,
    + unsigned long load_addr,
    + unsigned long size)
    +{
    + return -ENOTSUPP;
    +}
    +
    +/**
    + * kexec_add_handover_buffer() - add buffer to be used by the next kernel
    + * @kbuf: Buffer contents and memory parameters.
    + *
    + * This function assumes that kexec_mutex is held.
    + * On successful return, @kbuf->mem will have the physical address of
    + * the buffer in the next kernel.
    + *
    + * Return: 0 on success, negative errno on error.
    + */
    +int kexec_add_handover_buffer(struct kexec_buf *kbuf)
    +{
    + int ret;
    +
    + if (!kexec_can_hand_over_buffer())
    + return -ENOTSUPP;
    +
    + ret = kexec_add_buffer(kbuf);
    + if (ret)
    + return ret;
    +
    + return arch_kexec_add_handover_buffer(kbuf->image, kbuf->mem,
    + kbuf->memsz);
    +}
    +
    +/**
    + * kexec_get_handover_buffer() - get handover buffer from the previous kernel
    + * @addr: On successful return, set to point to the buffer contents.
    + * @size: On successful return, set to the buffer size.
    + *
    + * Return: 0 on success, negative errno on error.
    + */
    +int __weak kexec_get_handover_buffer(void **addr, unsigned long *size)
    +{
    + return -ENOTSUPP;
    +}
    +
    +/**
    + * kexec_free_handover_buffer() - free memory used by the handover buffer
    + */
    +int __weak kexec_free_handover_buffer(void)
    +{
    + return -ENOTSUPP;
    +}
    +
    /*
    * In file mode list of segments is prepared by kernel. Copy relevant
    * data from user space, do error checking, prepare segment list
    --
    1.9.1
    \
     
     \ /
      Last update: 2016-09-17 09:59    [W:3.291 / U:0.204 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site