Meta-resposta: Todas as coisas cruas que acontecem no kernel do Linux passam por lkml (a lista de discussão do kernel do Linux) . Para resumos explicativos, leia ou pesquise o lwn (notícias semanais do Linux) .
Resposta: A partir da nova maneira de ioctl () por Jonathan Corbet :
ioctl()é uma das partes restantes do kernel que é executado sob o Big Kernel Lock (BKL). No passado, o uso do BKL tornou possível para aplicações de longa duraçãoioctl() métodos de longa criar latências longas para processos não relacionados.
Segue uma explicação do patch que introduziu unlocked_ioctlecompat_ioctl no 2.6.11. A remoção do ioctlcampo aconteceu muito depois, em 2.6.36.
Explicação: Quando ioctlfoi executado, foi necessário o Big Kernel Lock (BKL), para que nada mais pudesse ser executado ao mesmo tempo. Isso é muito ruim em uma máquina com multiprocessador, portanto houve um grande esforço para se livrar do BKL. Primeiro,unlocked_ioctl foi introduzido. Ele permite que cada gravador de driver escolha qual bloqueio usar. Isso pode ser difícil, portanto 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 ioctlpodem ser removidos.
compat_ioctlna verdade não é relacionado, mesmo que tenha sido adicionado ao mesmo tempo. Seu objetivo é permitir que programas de 32 bits do usuário façam ioctlchamadas em um kernel de 64 bits. O significado do último argumento para ioctldepende do driver, portanto, não há como fazer uma conversão independente do driver.
unlocked_ioctlisso que isso acontece? O fato de um ponteiro de função ser usado por arquivo (neste caso astruct file) parece que posso estar perto. Ounlocked_ioctlregistro para os arquivos de caracteres na inicialização do driver é posteriormknod?