Lista de verificação para submissão de patches do kernel Linux¶
Aqui estão algumas coisas básicas que os desenvolvedores devem fazer se quiserem ver suas submissões de patches de kernel aceitas mais rapidamente.
Estas diretrizes vão além da documentação fornecida em Documentation/process/submitting-patches.rst e em outros locais sobre o envio de patches para o kernel Linux.
Revise seu código¶
Se você usar um recurso, faça o #include do arquivo que define/declara esse recurso. Não dependa de outros arquivos de cabeçalho que incluam os que você usa de forma indireta.
Verifique o estilo geral do seu patch conforme detalhado em Documentation//process/coding-style.rst.
Todas as barreiras de memória {por exemplo,
barrier(),rmb(),wmb()} precisam de um comentário no código-fonte que explique a lógica do que estão fazendo e o porquê.
Revise as alterações do Kconfig¶
Quaisquer novas ou modificadas opções de
CONFIGnão bagunçam o menu de configuração e têm ‘desativado’ (off) como padrão, a menos que atendam aos critérios de exceção documentados emDocumentation/kbuild/kconfig-language.rst, atributos de menu: valor padrão.Todas as novas opções de
Kconfigpossuem texto de ajuda.Foram cuidadosamente revisadas com relação às combinações relevantes de
Kconfig. Isso é muito difícil de acertar apenas com testes --- exige capacidade de raciocínio. pays off here.
Forneça documentação¶
Inclua kernel-doc para documentar as APIs globais do kernel. (Não é obrigatório para funções estáticas, mas também é aceitável nelas.)
Todas as novas entradas em
/procdevem ser documentadas sobDocumentation/.Todos os novos parâmetros de inicialização (boot) do kernel devem ser documentados em
Documentation/admin-guide/kernel-parameters.rst.Todos os novos parâmetros de módulo devem ser documentados com
MODULE_PARM_DESC().Todas as novas interfaces com o espaço de usuário (userspace) devem ser documentadas em
Documentation/ABI/. ConsulteDocumentation/admin-guide/abi.rst(ouDocumentation/ABI/README) para obter mais informações. Patches que alteram interfaces de espaço de usuário devem incluir em cópia (CC) linux-api@vger.kernel.org.Se quaisquer ioctls forem adicionados pelo patch, atualize também
Documentation/userspace-api/ioctl/ioctl-number.rst.
Verifique seu código com ferramentas¶
Verifique se há violações triviais com o verificador de estilo de patch antes do envio (
scripts/checkpatch.pl). Você deve ser capaz de justificar todas as violações que permanecerem no seu patch.Faça uma verificação limpa com o sparse.
Use
make checkstacke corrija quaisquer problemas encontrados por ele. Observe que ocheckstacknão aponta problemas explicitamente, mas qualquer função individual que utilize mais de 512 bytes na pilha é uma candidata a alteração.
Compile seu código¶
Compila de forma limpa:
com as opções de
CONFIGaplicáveis ou modificadas definidas como=y,=me=n. Sem avisos/erros dogcc, sem avisos/erros do vinculador (linker).Passa em
allnoconfig,allmodconfigCompila com sucesso ao usar
O=builddirQuaisquer alterações em Documentation/ compilam com sucesso sem novos avisos/erros. Use
make htmldocsoumake pdfdocspara verificar a compilação e corrigir quaisquer problemas.
Compila em múltiplas arquiteturas de CPU usando ferramentas locais de compilação cruzada (cross-compile) ou alguma outra fazenda de compilação (build farm). Observe que testar em arquiteturas de diferentes tamanhos de palavra (32 e 64 bits) e diferentes endianness (big- e little-endian) é eficaz para capturar vários problemas de portabilidade decorrentes de falsas suposições sobre o intervalo de quantidade representável, alinhamento de dados ou endianness, entre outros.
O novo código adicionado foi compilado com
gcc -W(usemake KCFLAGS=-W). Isso gerará muito ruído, mas é bom para encontrar bugs como “warning: comparison between signed and unsigned”.Se o seu código-fonte modificado depender ou usar quaisquer APIs ou recursos do kernel relacionados aos seguintes símbolos do
Kconfig, teste múltiplas compilações com os símbolos relacionados doKconfigdesativados e/ou definidos como=m(se essa opção estiver disponível) [não todos ao mesmo tempo, apenas combinações variadas/aleatórias deles]:CONFIG_SMP,CONFIG_SYSFS,CONFIG_PROC_FS,CONFIG_INPUT,CONFIG_PCI,CONFIG_BLOCK,CONFIG_PM,CONFIG_MAGIC_SYSRQ,CONFIG_NET,CONFIG_INET=n(mas este último comCONFIG_NET=y).
Teste seu código¶
Foi testado com
CONFIG_PREEMPT,CONFIG_DEBUG_PREEMPT,CONFIG_SLUB_DEBUG,CONFIG_DEBUG_PAGEALLOC,CONFIG_DEBUG_MUTEXES,CONFIG_DEBUG_SPINLOCK,CONFIG_DEBUG_ATOMIC_SLEEP,CONFIG_PROVE_RCUeCONFIG_DEBUG_OBJECTS_RCU_HEADtodos habilitados simultaneamente.Foi testado em tempo de compilação e de execução com e sem
CONFIG_SMPeCONFIG_PREEMPT.Todos os caminhos de código foram executados com todos os recursos de lockdep ativados.
Foi verificado com a injeção de falhas de pelo menos slab e alocação de páginas. Consulte
Documentation/fault-injection/. Se o novo código for substancial, a adição de injeção de falhas específica do subsistema pode ser apropriada.Testado com a tag mais recente do linux-next para garantir que ele ainda funcione com todos os outros patches enfileirados e com várias alterações na VM, VFS e outros subsistemas.