Como posso descobrir desde qual versão do Linux uma função/macro da API do kernel está disponível ou sofreu alterações significativas (foi removida, houve alteração no tipo ou número de argumentos)?
Por exemplo, ao olhar a versão recente do , scatterlist.h
me deparei com sg_alloc_table_from_pages_segment
, que tem exatamente a funcionalidade necessária para meu módulo do kernel (driver). No entanto, a função, para minha decepção, ainda não está disponível na versão 5.10 para a qual o módulo do kernel foi desenvolvido, e terei que encontrar uma solução alternativa. Ainda assim, desejo oferecer suporte a futuras versões do kernel, caso realizemos uma atualização.
Normalmente, esses casos são tratados com cercas de pré-processador
#if LINUX_VERSION_CODE >= KERNEL_VERSION(...)
/*Version-specific implementation*/
#endif
Mas para aplicar esse padrão, preciso encontrar a versão do kernel na qual a função foi adicionada. Escanear manualmente todas as versões intermediárias do arquivo de cabeçalho seria uma tarefa de Sísifo.
Tendo descoberto que a
sg_alloc_table_from_pages_segment
função está no arquivo de origem scatterlist.c , ao olhar a culpa pelo arquivo de origem, foi encontrada a última modificação feita pelo commit 90e7a6d que aparece nas tags:Olhando para o Elixir Cross Referencer :
sg_alloc_table_from_pages_segment
.sg_alloc_table_from_pages_segment
.Isso confirma que o kernel principal v5.15-rc1 foi o primeiro a introduzir a função.
Observando uma instalação do AlmaLinux 8.10 com o código-fonte do Kernel instalado, podemos ver que ele
sg_alloc_table_from_pages_segment
foi retroportado para olinux-4.18.0-553.33.1.el8_10.x86_64
Kernel baseado em RHEL.A execução
git blame
no arquivo relevante revela que a função foi adicionada no commit 90e7a6de62781c27d6a111fccfb19b807f9b6887 . Como esse commit contém a nova declaração de função e não é uma alteração em uma função existente, não há necessidade de verificar os pais. A execuçãogit tag --contains 90e7a6de62781c27d6a111fccfb19b807f9b6887
então mostra que a função está disponível desde a v5.15 (ignorando potenciais backports) — estritamente falando, rc1, mas isso é irrelevante no queKERNEL_VERSION
diz respeito a isso.