本文主要记录下ioctl() 、 unlocked_ioctl() 和 compact_ioctl()的区别与联系。
ioctl() is one of the remaining parts of the kernel which runs under the Big Kernel Lock (BKL). In the past, the usage of the BKL has made it possible for long-running
ioctl() methods to create long latencies for unrelated processes.
Follows an explanation of the patch that introduced
compat_ioctl into 2.6.11. The removal of the
ioctl field happened a lot later, in 2.6.36.
ioctl was executed, it took the Big Kernel Lock (BKL), so nothing else could execute at the same time. This is very bad on a multiprocessor machine, so there was a big effort to get rid of the BKL. First,
unlocked_ioctl was introduced. It lets each driver writer choose what lock to use instead. This can be difficult, so there was a period of transition during which old drivers still worked (using
ioctl) but new drivers could use the improved interface (
unlocked_ioctl). Eventually all drivers were converted and
ioctl could be removed.
compat_ioctl is actually unrelated, even though it was added at the same time. Its purpose is to allow 32-bit userland programs to make
ioctl calls on a 64-bit kernel. The meaning of the last argument to
ioctl depends on the driver, so there is no way to do a driver-independent conversion.