RFC x86: improve uaccess in signal
Get series with b4
b4 am [email protected]Versions newest first
- v1 RFC Latest4 patches 4 repliesIn review
Patches in v1 No applies recorded yet
| # | Subject and files | Size | Replies | Applied |
|---|---|---|---|---|
| 1/4 | x86: uaccess: rename __put_user_u64() to __put_user_asm_u64()arch/ | +3 | 0 replies | |
| 2/4 | x86: uaccess: introduce __{get|put}_user exception handling frameworkarch/ | +110 | 4 replies | |
| 3/4 | x86: signal: use __{get|put}_user exception handling frameworkarch/ | +99 | 0 replies | |
| 4/4 | x86: ia32_signal: use __{get|put}_user exception handling frameworkarch/ | +109 | 0 replies |
Reviews trailers per patch
No Reviewed-by, Acked-by or Tested-by trailers for v1 yet.
Cover letter [RFC -tip 0/4] x86: improve uaccess in signal
This patch series is experimental.
This is another proposal to improve uaccess in signal.
This patch series will improve signal handling performance. The normal path of signal handling should be same as this;
http://lkml.org/lkml/2008/9/25/332
I think there is a lot of fixup code in signal generated by __{get|put}_user(). In most case kernel only needs to know whether there is error, and error value is not important. And when an exception has occurred, kernel doesn't need to continue following __{get|put}_user() in that function.
I think in fixup code to use direct jump to the tail of function and returns error, will save fixup code size. This fixup code can be used __{get|put}_user() calls in same function.
The concept code is;
int func()
{
int err = 0;
.section .fixup
error_out:
err = -EFAULT;
goto out;
.previous
__{get|put}_user(); /* fixup: jump to error_out */
__{get|put}_user();
__{get|put}_user();
:
out:
return err;
}and the results are;
$ size *signal*.o.* text data bss dec hex filename 4646 0 0 4646 1226 ia32_signal.o.new 6006 0 0 6006 1776 ia32_signal.o.old 3557 0 0 3557 de5 signal.o.new 4540 0 0 4540 11bc signal.o.old 3840 0 0 3840 f00 signal32.o.new 4876 0 0 4876 130c signal32.o.old
However, this code is tricky, I can't say compiler guarantees to keep the order of this framework code and this code relies on the order, fixup section is before the all __{get|put}_user() codes and the out label is just before the return.
Comments are welcome.
Thanks,
Hiroshi