[GIT PULL] compat_ioctl cleanup

From: Arnd Bergmann
Date: Thu Dec 10 2009 - 17:14:14 EST


Linus,

If you like this stuff, please pull from

git://git.kernel.org/pub/scm/linux/kernel/git/arnd/playground.git compat-ioctl-merge

It's a major rework of the way we handle ioctl calls for 32 bit
emulation and gets rid of the BKL in there as well as saving
some 30kb of kernel memory.

It did however not go through linux-next because it had
conflicts/dependencies on the net-next tree and others.

The first two patches, killing off the BKL, have spend some time
in -mm, and I'm including them here because the rest of the
stuff depends on it.

The others are just cleanup, and if you decide not to take that
now, I'll have it properly go through linux-next for the 2.6.34 cycle.
I've been working on parts of this for some time and the whole
point is not to change any behaviour, so I'm not in a hurry here.

I have more patches on top of this to move other parts of
compat_ioctl.c into drivers, but those need more review and testing,
so they will have to wait for the next merge window.

Arnd
---
Arnd Bergmann (8):
compat_ioctl: remove all VT ioctl handling
compat_ioctl: Remove BKL
compat_ioctl: inline all conversion handlers
compat_ioctl: simplify calling of handlers
compat_ioctl: simplify lookup table
compat_ioctl: pass compat pointer directly to handlers
lp: move compat_ioctl handling into lp.c
usbdevfs: move compat_ioctl handling to devio.c

drivers/char/lp.c | 115 +++++--
drivers/usb/core/devio.c | 110 ++++++-
fs/compat_ioctl.c | 767 +++++++++++-------------------------------
include/linux/usbdevice_fs.h | 26 ++
4 files changed, 417 insertions(+), 601 deletions(-)

---

commit ac2c97eae25760490a5f71cd8d5c0135599a993c
Author: Arnd Bergmann <arnd@xxxxxxxx>
Date: Sat Nov 14 02:28:05 2009 +0100

usbdevfs: move compat_ioctl handling to devio.c

Half the compat_ioctl handling is in devio.c, the other
half is in fs/compat_ioctl.c. This moves everything into
one place for consistency.

As a positive side-effect, push down the BKL into the
ioctl methods.

Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>
Acked-by: Greg Kroah-Hartman <gregkh@xxxxxxx>
Cc: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>
Cc: Oliver Neukum <oliver@xxxxxxxxxx>
Cc: Alon Bar-Lev <alon.barlev@xxxxxxxxx>
Cc: David Vrabel <david.vrabel@xxxxxxx>
Cc: linux-usb@xxxxxxxxxxxxxxx

commit ecfa62f567c96e8e06500e9049598894fc5700d0
Author: Arnd Bergmann <arnd@xxxxxxxx>
Date: Sat Nov 14 01:33:13 2009 +0100

lp: move compat_ioctl handling into lp.c

Handling for LPSETTIMEOUT can easily be done in lp_ioctl, which
is the only user. As a positive side-effect, push the BKL
into the ioctl methods.

Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>
Acked-by: Greg Kroah-Hartman <gregkh@xxxxxxx>

commit 5c6596b027ac34f46f9d06a78b4a5adcb77b8149
Author: Arnd Bergmann <arnd@xxxxxxxx>
Date: Sat Nov 14 23:16:18 2009 +0100

compat_ioctl: pass compat pointer directly to handlers

Instead of having each handler call compat_ptr, we can now
convert the pointer once and pass that to each handler.
This saves a little bit of both source and object code size.

Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>

commit 88b13b474f3984f296a3b77bc98410ea24beb039
Author: Arnd Bergmann <arnd@xxxxxxxx>
Date: Thu Nov 5 19:52:55 2009 +0100

compat_ioctl: simplify lookup table

The compat_ioctl table now only contains entries for
COMPATIBLE_IOCTL, so we only need to know if a number
is listed in it or now.

As an optimization, we hash the table entries with a
reversible transformation to get a more uniform distribution
over it, sort the table at startup and then guess the
position in the table when an ioctl number gets called
to do a linear search from there.

With the current set of ioctl numbers and the chosen
transformation function, we need an average of four
steps to find if a number is in the set, all of the
accesses within one or two cache lines.

This at least as good as the previous hash table
approach but saves 8.5 kb of kernel memory.

Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>

commit 54d8470665395237b5b321d63b4567bfe7da5c50
Author: Arnd Bergmann <arnd@xxxxxxxx>
Date: Thu Nov 5 19:13:51 2009 +0100

compat_ioctl: simplify calling of handlers

The compat_ioctl array now contains only entries for ioctl numbers
that do not require a separate handler. By special-casing the
ULONG_IOCTL case in the do_ioctl_trans function, we can kill the
final use of a function pointer in the array.

text data bss dec hex filename
7539 13352 2080 22971 59bb before/fs/compat_ioctl.o
7910 8552 2080 18542 486e after/fs/compat_ioctl.o

Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>

commit 822dd237fa994132b14716b3645c25675132314d
Author: Arnd Bergmann <arnd@xxxxxxxx>
Date: Thu May 21 22:04:16 2009 +0000

compat_ioctl: inline all conversion handlers

This makes all ioctl conversion handlers called from
a single switch statement, leaving only COMPATIBLE_IOCTL
and ULONG_IOCTL statements in the table. This is somewhat
more space efficient and also lets us simplify the
handling of the lookup table significantly.

before:
text data bss dec hex filename
7619 14024 2080 23723 5cab obj/fs/compat_ioctl.o
after:
7567 13352 2080 22999 59d7 obj/fs/compat_ioctl.o

Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>

commit 5250df8da312c2ff04b30e0641f2d2fa179c5075
Author: Arnd Bergmann <arnd@xxxxxxxx>
Date: Fri Oct 16 02:25:25 2009 +0200

compat_ioctl: Remove BKL

We have always called ioctl conversion handlers under the big kernel lock,
although that is generally not necessary. In particular it is not needed
for conversion of data structures and for calling sys_ioctl or
do_vfs_ioctl, which will get the BKL again if needed.

Handlers doing more than those two have been moved out, so we can kill off
the BKL from compat_sys_ioctl. This may significantly improve latencies
with 32 bit applications, and it avoids a common scenario where a thread
acquires the BKL twice.

Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>
Cc: Greg Kroah-Hartman <gregkh@xxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>

commit 2ce869a90064bc3f2d6d9e9745da5c3ac0930a1c
Author: Arnd Bergmann <arnd@xxxxxxxx>
Date: Fri Oct 16 02:25:25 2009 +0200

compat_ioctl: remove all VT ioctl handling

The VT driver now handles all of these ioctls directly, so we can remove
the handlers from common code.

These are the only handlers that require the BKL because they directly
perform the ioctl action rather than just converting the data structures.
Once they are gone, we can remove the BKL from the remaining ioctl
conversion handlers.

Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>
Acked-by: Greg Kroah-Hartman <gregkh@xxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/