(2013/08/23 20:04), Heiko Carstens wrote: > The current two insn slot caches both use module_alloc/module_free > to allocate and free insn slot cache pages. > For s390 this is not sufficient since there is the need to allocate > insn slots that are either within the vmalloc module area or within > dma memory. > Therefore add a mechanism which allows to specify an own allocator > for an own insn slot cache. >
Acked-by: Masami Hiramatsu <masami.hiramatsu...@hitachi.com> Thank you! > Signed-off-by: Heiko Carstens <heiko.carst...@de.ibm.com> > --- > include/linux/kprobes.h | 2 ++ > kernel/kprobes.c | 20 ++++++++++++++++++-- > 2 files changed, 20 insertions(+), 2 deletions(-) > > diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h > index 077f653..925eaf2 100644 > --- a/include/linux/kprobes.h > +++ b/include/linux/kprobes.h > @@ -268,6 +268,8 @@ extern void kprobes_inc_nmissed_count(struct kprobe *p); > > struct kprobe_insn_cache { > struct mutex mutex; > + void *(*alloc)(void); /* allocate insn page */ > + void (*free)(void *); /* free insn page */ > struct list_head pages; /* list of kprobe_insn_page */ > size_t insn_size; /* size of instruction slot */ > int nr_garbage; > diff --git a/kernel/kprobes.c b/kernel/kprobes.c > index 9e4912d..a0d367a 100644 > --- a/kernel/kprobes.c > +++ b/kernel/kprobes.c > @@ -112,6 +112,7 @@ static struct kprobe_blackpoint kprobe_blacklist[] = { > struct kprobe_insn_page { > struct list_head list; > kprobe_opcode_t *insns; /* Page of instruction slots */ > + struct kprobe_insn_cache *cache; > int nused; > int ngarbage; > char slot_used[]; > @@ -132,8 +133,20 @@ enum kprobe_slot_state { > SLOT_USED = 2, > }; > > +static void *alloc_insn_page(void) > +{ > + return module_alloc(PAGE_SIZE); > +} > + > +static void free_insn_page(void *page) > +{ > + module_free(NULL, page); > +} > + > struct kprobe_insn_cache kprobe_insn_slots = { > .mutex = __MUTEX_INITIALIZER(kprobe_insn_slots.mutex), > + .alloc = alloc_insn_page, > + .free = free_insn_page, > .pages = LIST_HEAD_INIT(kprobe_insn_slots.pages), > .insn_size = MAX_INSN_SIZE, > .nr_garbage = 0, > @@ -182,7 +195,7 @@ kprobe_opcode_t __kprobes *__get_insn_slot(struct > kprobe_insn_cache *c) > * kernel image and loaded module images reside. This is required > * so x86_64 can correctly handle the %rip-relative fixups. > */ > - kip->insns = module_alloc(PAGE_SIZE); > + kip->insns = c->alloc(); > if (!kip->insns) { > kfree(kip); > goto out; > @@ -192,6 +205,7 @@ kprobe_opcode_t __kprobes *__get_insn_slot(struct > kprobe_insn_cache *c) > kip->slot_used[0] = SLOT_USED; > kip->nused = 1; > kip->ngarbage = 0; > + kip->cache = c; > list_add(&kip->list, &c->pages); > slot = kip->insns; > out: > @@ -213,7 +227,7 @@ static int __kprobes collect_one_slot(struct > kprobe_insn_page *kip, int idx) > */ > if (!list_is_singular(&kip->list)) { > list_del(&kip->list); > - module_free(NULL, kip->insns); > + kip->cache->free(kip->insns); > kfree(kip); > } > return 1; > @@ -274,6 +288,8 @@ out: > /* For optimized_kprobe buffer */ > struct kprobe_insn_cache kprobe_optinsn_slots = { > .mutex = __MUTEX_INITIALIZER(kprobe_optinsn_slots.mutex), > + .alloc = alloc_insn_page, > + .free = free_insn_page, > .pages = LIST_HEAD_INIT(kprobe_optinsn_slots.pages), > /* .insn_size is initialized later */ > .nr_garbage = 0, > -- Masami HIRAMATSU IT Management Research Dept. Linux Technology Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: masami.hiramatsu...@hitachi.com -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/