Meta-resposta: Toda a matéria-prima que acontece no kernel do Linux passa pela lkml (a lista de discussão do kernel do Linux) . Para resumos explicativos, leia ou pesquise lwn (notícias semanais do Linux) .
Resposta: De A nova maneira de ioctl () por Jonathan Corbet :
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-runningioctl()
methods to create long latencies for unrelated processes.
Segue uma explicação do patch que introduziu unlocked_ioctl
e compat_ioctl
em 2.6.11. A remoção do campo ioctl
aconteceu muito mais tarde, em 2.6.36.
Explicação: Quando ioctl
foi executado, foi necessário o Big Kernel Lock (BKL), então nada mais poderia executar ao mesmo tempo. Isso é muito ruim em uma máquina multiprocessadora, então houve um grande esforço para se livrar da BKL. Primeiro, unlocked_ioctl
foi introduzido. Ele permite que cada gravador de driver escolha o bloqueio a ser usado. Isso pode ser difícil, então houve um período de transição durante o qual os drivers antigos ainda funcionavam (usando ioctl
), mas os novos drivers podiam usar a interface aprimorada ( unlocked_ioctl
). Eventualmente, todos os drivers foram convertidos e ioctl
pôde ser removido.
compat_ioctl
na verdade não está relacionado, embora tenha sido adicionado ao mesmo tempo. Sua finalidade é permitir que programas de usuário de 32 bits façam chamadas ioctl
em um kernel de 64 bits. O significado do último argumento para ioctl
depende do driver, portanto, não há como fazer uma conversão independente de driver.