On 12/03, Linus Torvalds wrote: > > On Tue, Dec 3, 2013 at 10:49 AM, Oleg Nesterov <o...@redhat.com> wrote: > > > > See the patch below. For review only > > Looks completely broken. Where do you guarantee that it's just a single page?
Yes, it is always a single page on all supported architectures. This is even documented. I believe that "NOTE:" comment above uprobe_write_opcode() tries to say this but I guess this comment should be cleanuped. And note also /* uprobe_write_opcode() assumes we don't cross page boundary */ BUG_ON((uprobe->offset & ~PAGE_MASK) + UPROBE_SWBP_INSN_SIZE > PAGE_SIZE); in prepare_uprobe(). > Yes, on x86, UPROBE_SWBP_INSN_SIZE is a single byte. And powerpc checks addr & 3 to ensure it doesn't cross the page. > frankly, on x86, exactly *because* it's a single byte, I don't > understand why we don't just write the damn thing with a single > "put_user()", and stop with all the idiotic games. Well, put_user() obviously can't work, mm != current->mm. So we need get_user_pages() at least. > No need to > invalidate caches, even, because if you overwrite the first byte of an > instruction, it all "just works". I can't comment this, I do not know how the hardware actually works. > Either the instruction decoding gets > the old one, or it gets the new one. Funny that. I have asked why access_process_vm() can't work when I saw the initial version of uprobes patches. I was told this can't work (even on x86). And I was told that this idiotic games were suggested by someone named Linus Torvalds ;) > And on non-x86, UPROBE_SWBP_INSN_SIZE is not necessarily 1, so it > could cross a page boundary. Yes. If we support such an architecture we should obviously update uprobe_write_opcode() accordingly. Oleg. -- 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/