Messages in this thread | | | Date | Tue, 26 Nov 2013 12:03:11 -0800 | Subject | Re: [PATCH] Add a text_poke syscall v2 | From | Linus Torvalds <> |
| |
On Tue, Nov 26, 2013 at 11:05 AM, Andy Lutomirski <luto@amacapital.net> wrote: > > IIRC someone proposed that, rather than specifying a "handler", that any > user thread that traps just wait until the poke completes. This would > complicate the kernel implementation a bit, but it would make the user > code a good deal simpler. Is there any reason that this is a bad idea?
Please do it this way instead, because user space will get the callback version wrong and then - because it never actually triggers in practice in normal situations - it will cause very *very* subtle bugs that we can't fix.
Making the kernel serialize the accesses is the right thing to do. Just a new per-mm mutex should trivially do it, then you don't even have to check the "current->mm == bp_target_mm" thing at all, you just make the bp handler do a simple
if (mutex_lock_interruptible(&mm->text_poke_mutex) >= 0) mutex_unlock(&mm->text_poke_mutex);
and return. All done.
Plus the callback thing is pointless if we can do the instruction switch atomically (which would be true for UP, for single-thread, and potentially for certain sizes/alignments coupled with known rules for particular micro-architectures). So it's not a particularly good interface anyway.
Btw, I also think that there's a separate problem wrt shared pages. Should we perhaps only allow this in private mappings? Because right now it has that "current->mm == bp_target_mm" thing, and generally it only works on one particular mm, but by using "get_user_pages_fast(, 1,..)" it really only requires write permissions on the page. So it could be shared mapping, and I could easily see people doing that on purpose ("open executable file, then use text_poke() to change it for this architecture") and THAT DOES NOT WORK with the current patch if somebody else is also running that app..
Linus
| |