From: Blaisorblade <bla...@ya...> - 2005-05-16 17:06:23
|
On Monday 16 May 2005 17:00, Jeff Dike wrote: > On Sun, May 15, 2005 at 08:44:44PM +0200, Blaisorblade wrote: > > copy_from_user() loops, in SKAS mode, calls do_op inside the inner loop; > > do_op acts on 4k at once, so with modern pipelines, the potential cost of > > the function call can be very big. > > Beyond that, we also call setjmp_wrapper, which simply puts a sigjmp_buf > > on the stack. > > Wouldn't the code be cleaner if we rip that out, together with the > > va_arg() calls, and do everything inside do_buffer_op? Doh, those are > > from userspace headers. However it looks they would be includable from > > kernel code (no reference to kernel headers), by adding them at the end > > of the include search path. > > What's your opinion? I'm ready to work on this. > I was unhappy about adding the setjmp there, but it turns out that the > kernel data might not be present and so can segfault. So, when that > happens, we need to get out of there and return an error, and the way > that's done is by the page fault handler longjmping back out. Yes, I remember it, I worked with you on diagnosing the /dev/kmem crash. > If you can think of a better way to do it, go ahead. I could move maybe move sigsetjmp to kernelspace code; however, another possibility would be to use the exception handler tables we've always supported without using them (only drawback is that the code *must* be inlined, and possibly the need for some assembler code, which however is probably avoidable). -- Paolo Giarrusso, aka Blaisorblade Skype user "PaoloGiarrusso" Linux registered user n. 292729 http://www.user-mode-linux.org/~blaisorblade |