From 11f8a9a493e9aa3d8f612bd77ff8b71d6fcf98e6 Mon Sep 17 00:00:00 2001 From: Jeremy Fitzhardinge Date: Thu, 29 Sep 2011 10:58:46 -0700 Subject: [PATCH] --- yaml --- r: 274739 b: refs/heads/master c: 61f42183fd15d5e666236f474d73b3555c7b83d1 h: refs/heads/master i: 274737: b9648b39ce7c11b643821729775b554bbbb35b00 274735: cfd461442ec5fefb79991c91aee565a0c77b7371 v: v3 --- [refs] | 2 +- trunk/arch/s390/kernel/jump_label.c | 51 ++++++++++++++++++----------- 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/[refs] b/[refs] index 41b5a1ad7a76..ebbbe790378f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 20284aa77c0f6227da4783a920b72dc61d4bcc09 +refs/heads/master: 61f42183fd15d5e666236f474d73b3555c7b83d1 diff --git a/trunk/arch/s390/kernel/jump_label.c b/trunk/arch/s390/kernel/jump_label.c index 44cc06bedf77..b987ab2c1541 100644 --- a/trunk/arch/s390/kernel/jump_label.c +++ b/trunk/arch/s390/kernel/jump_label.c @@ -18,26 +18,15 @@ 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) +static void __jump_label_transform(struct jump_entry *entry, + enum jump_label_type type) { - 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) -{ - struct insn_args args; struct insn insn; + int rc; if (type == JUMP_LABEL_ENABLE) { /* brcl 15,offset */ @@ -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((void *)entry->code, &insn, JUMP_LABEL_NOP_SIZE); + WARN_ON_ONCE(rc < 0); +} - stop_machine(__arch_jump_label_transform, &args, NULL); +static int __sm_arch_jump_label_transform(void *data) +{ + struct insn_args *args = data; + + __jump_label_transform(args->entry, args->type); + return 0; +} + +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 arch_jump_label_transform_static(struct jump_entry *entry, + enum jump_label_type type) +{ + __jump_label_transform(entry, type); } #endif