[RFC PATCH] uprobes: copy to user-space xol page with proper cache flushing
Oleg Nesterov
oleg at redhat.com
Fri Apr 11 08:22:07 PDT 2014
On 04/11, Oleg Nesterov wrote:
>
> Can't we do _something_
> like below?
If not, I'd propose the patch below.
I can be easily wrong, but it seems that arch/arm can reimplement
arch_uprobe_flush_xol_icache() and do flush_ptrace_access()-like
code. It needs kaddr, but this is not a problem.
Btw. From arch/arm/include/asm/cacheflush.h
#define flush_icache_user_range(vma,page,addr,len) \
flush_dcache_page(page)
but it has no users?
And I am just curious, why arm's copy_to_user_page() disables premption
before memcpy?
Oleg.
--- x/kernel/events/uprobes.c
+++ x/kernel/events/uprobes.c
@@ -1274,6 +1274,17 @@ static unsigned long xol_take_insn_slot(
return slot_addr;
}
+void __weak arch_uprobe_flush_xol_icache(struct page *page,
+ unsigned long vaddr, int len)
+{
+ /*
+ * We need copy_to_user_page/flush_icache_user_range but this
+ * needs vma. If this doesn't work on your arch, reimplement.
+ */
+ flush_dcache_page(area->page);
+
+}
+
/*
* xol_get_insn_slot - allocate a slot for xol.
* Returns the allocated slot address or 0.
@@ -1294,11 +1305,8 @@ static unsigned long xol_get_insn_slot(s
/* Initialize the slot */
copy_to_page(area->page, xol_vaddr,
&uprobe->arch.ixol, sizeof(uprobe->arch.ixol));
- /*
- * We probably need flush_icache_user_range() but it needs vma.
- * This should work on supported architectures too.
- */
- flush_dcache_page(area->page);
+ arch_uprobe_flush_xol_icache(area->page, xol_vaddr,
+ sizeof(uprobe->arch.ixol));
return xol_vaddr;
}
More information about the linux-arm-kernel
mailing list