lkml.org 
[lkml]   [2011]   [Sep]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH RFC 7/8] s390/jump-label: add arch_jump_label_transform_early()
    Date
    From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

    This allows jump-label entries to be modified early, in a pre-SMP
    environment.

    Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
    Cc: Jan Glauber <jang@linux.vnet.ibm.com>
    ---
    arch/s390/kernel/jump_label.c | 49 +++++++++++++++++++++++++----------------
    1 files changed, 30 insertions(+), 19 deletions(-)

    diff --git a/arch/s390/kernel/jump_label.c b/arch/s390/kernel/jump_label.c
    index 44cc06b..6001228 100644
    --- a/arch/s390/kernel/jump_label.c
    +++ b/arch/s390/kernel/jump_label.c
    @@ -18,23 +18,12 @@ struct insn {
    } __packed;

    struct insn_args {
    - unsigned long *target;
    - struct insn *insn;
    - ssize_t size;
    + struct jump_entry *entry;
    + enum jump_label_type type;
    };

    -static int __arch_jump_label_transform(void *data)
    -{
    - struct insn_args *args = data;
    - int rc;
    -
    - rc = probe_kernel_write(args->target, args->insn, args->size);
    - WARN_ON_ONCE(rc < 0);
    - return 0;
    -}
    -
    -void arch_jump_label_transform(struct jump_entry *entry,
    - enum jump_label_type type)
    +static void __jump_label_transform(struct jump_entry *entry,
    + enum jump_label_type type)
    {
    struct insn_args args;
    struct insn insn;
    @@ -49,11 +38,33 @@ void arch_jump_label_transform(struct jump_entry *entry,
    insn.offset = 0;
    }

    - args.target = (void *) entry->code;
    - args.insn = &insn;
    - args.size = JUMP_LABEL_NOP_SIZE;
    + rc = probe_kernel_write(entry->code, &insn, JUMP_LABEL_NOP_SIZE);
    + WARN_ON_ONCE(rc < 0);
    +}
    +
    +static int __sm_arch_jump_label_transform(void *data)
    +{
    + struct insn_args *args = data;
    +
    + __jump_label_transform(args->entry, args->type);
    + return 0;
    +}

    - stop_machine(__arch_jump_label_transform, &args, NULL);
    +void arch_jump_label_transform(struct jump_entry *entry,
    + enum jump_label_type type)
    +{
    + struct insn_args args;
    +
    + args.entry = entry;
    + args.type = type;
    +
    + stop_machine(__sm_arch_jump_label_transform, &args, NULL);
    +}
    +
    +void __init arch_jump_label_transform_early(struct jump_entry *entry,
    + enum jump_label_type type)
    +{
    + __jump_label_transform(entry, type);
    }

    #endif
    --
    1.7.6.2


    \
     
     \ /
      Last update: 2011-09-30 01:29    [W:0.021 / U:89.752 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site