1*8353b533SDaniel Pereira.. SPDX-License-Identifier: GPL-2.0 2*8353b533SDaniel Pereira 3*8353b533SDaniel PereiraO manual da árvore tip 4*8353b533SDaniel Pereira====================== 5*8353b533SDaniel Pereira 6*8353b533SDaniel PereiraO que é a árvore tip? 7*8353b533SDaniel Pereira--------------------- 8*8353b533SDaniel Pereira 9*8353b533SDaniel PereiraA árvore tip é uma coleção de vários subsistemas e áreas de 10*8353b533SDaniel Pereiradesenvolvimento. A árvore tip é tanto uma árvore de desenvolvimento direto quanto uma 11*8353b533SDaniel Pereiraárvore de agregação para várias árvores de sub-mantenedores. A URL gitweb da árvore tip 12*8353b533SDaniel Pereiraé: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 13*8353b533SDaniel Pereira 14*8353b533SDaniel PereiraA árvore tip contém os seguintes subsistemas: 15*8353b533SDaniel Pereira 16*8353b533SDaniel Pereira - **Arquitetura x86** 17*8353b533SDaniel Pereira 18*8353b533SDaniel Pereira O desenvolvimento da arquitetura x86 ocorre na árvore tip, exceto 19*8353b533SDaniel Pereira pelas partes específicas do KVM e XEN no x86, que são mantidas nos 20*8353b533SDaniel Pereira subsistemas correspondentes e roteadas diretamente para a mainline a partir 21*8353b533SDaniel Pereira dali. Ainda é uma boa prática enviar Cc para os mantenedores x86 nos 22*8353b533SDaniel Pereira patches do KVM e XEN específicos para x86. 23*8353b533SDaniel Pereira 24*8353b533SDaniel Pereira Alguns subsistemas x86 têm seus próprios mantenedores além dos 25*8353b533SDaniel Pereira mantenedores gerais do x86. Por favor, envie Cc para os mantenedores gerais do x86 em 26*8353b533SDaniel Pereira patches que toquem em arquivos em arch/x86, mesmo quando não forem indicados 27*8353b533SDaniel Pereira pelo arquivo MAINTAINER. 28*8353b533SDaniel Pereira 29*8353b533SDaniel Pereira Note que ``x86@kernel.org`` não é uma lista de discussão. É meramente um 30*8353b533SDaniel Pereira alias de e-mail que distribui mensagens para a equipe de mantenedores de nível superior 31*8353b533SDaniel Pereira do x86. Por favor, sempre envie Cc para a lista de discussão do Linux Kernel (LKML) 32*8353b533SDaniel Pereira ``linux-kernel@vger.kernel.org``, caso contrário, seu e-mail acabará apenas nas 33*8353b533SDaniel Pereira caixas de entrada privadas dos mantenedores. 34*8353b533SDaniel Pereira 35*8353b533SDaniel Pereira - **Scheduler** 36*8353b533SDaniel Pereira 37*8353b533SDaniel Pereira O desenvolvimento do scheduler ocorre na árvore -tip, na 38*8353b533SDaniel Pereira branch sched/core - com ocasionais árvores de subtópicos para 39*8353b533SDaniel Pereira conjuntos de patches em progresso. 40*8353b533SDaniel Pereira 41*8353b533SDaniel Pereira - **Locking e atomics** 42*8353b533SDaniel Pereira 43*8353b533SDaniel Pereira O desenvolvimento de locking (incluindo atomics e outras primitivas de 44*8353b533SDaniel Pereira sincronização que estão conectadas ao locking) ocorre na árvore -tip, 45*8353b533SDaniel Pereira na branch locking/core - com ocasionais árvores de subtópicos 46*8353b533SDaniel Pereira para conjuntos de patches em progresso. 47*8353b533SDaniel Pereira 48*8353b533SDaniel Pereira - **Subsistema genérico de interrupções e drivers de chip de interrupção**: 49*8353b533SDaniel Pereira 50*8353b533SDaniel Pereira - o desenvolvimento do núcleo de interrupções ocorre na branch irq/core 51*8353b533SDaniel Pereira 52*8353b533SDaniel Pereira - o desenvolvimento do driver de chip de interrupção também ocorre na branch 53*8353b533SDaniel Pereira irq/core, mas os patches geralmente são aplicados em uma árvore de mantenedor 54*8353b533SDaniel Pereira separada e depois agregados na irq/core 55*8353b533SDaniel Pereira 56*8353b533SDaniel Pereira - **Tempo, timers, timekeeping, NOHZ e drivers de chip relacionados**: 57*8353b533SDaniel Pereira 58*8353b533SDaniel Pereira - o desenvolvimento do timekeeping, núcleo clocksource, NTP e alarmtimer 59*8353b533SDaniel Pereira ocorre na branch timers/core, mas os patches geralmente são aplicados em 60*8353b533SDaniel Pereira uma árvore de mantenedor separada e depois agregados na timers/core 61*8353b533SDaniel Pereira 62*8353b533SDaniel Pereira - o desenvolvimento do driver clocksource/event ocorre na branch 63*8353b533SDaniel Pereira timers/core, mas os patches são em sua maioria aplicados em uma árvore de mantenedor 64*8353b533SDaniel Pereira separada e depois agregados na timers/core 65*8353b533SDaniel Pereira 66*8353b533SDaniel Pereira - **Núcleo de contadores de desempenho, suporte a arquitetura e ferramentas**: 67*8353b533SDaniel Pereira 68*8353b533SDaniel Pereira - o desenvolvimento do núcleo perf e suporte a arquitetura ocorre na 69*8353b533SDaniel Pereira branch perf/core 70*8353b533SDaniel Pereira 71*8353b533SDaniel Pereira - o desenvolvimento de ferramentas perf ocorre na árvore do mantenedor 72*8353b533SDaniel Pereira de ferramentas perf e é agregado à árvore tip. 73*8353b533SDaniel Pereira 74*8353b533SDaniel Pereira - **Núcleo de hotplug de CPU** 75*8353b533SDaniel Pereira 76*8353b533SDaniel Pereira - **Núcleo RAS** 77*8353b533SDaniel Pereira 78*8353b533SDaniel Pereira Em sua maioria, os patches RAS específicos para x86 são coletados na branch 79*8353b533SDaniel Pereira ras/core da árvore tip. 80*8353b533SDaniel Pereira 81*8353b533SDaniel Pereira - **Núcleo EFI** 82*8353b533SDaniel Pereira 83*8353b533SDaniel Pereira Desenvolvimento EFI na árvore git efi. Os patches coletados são 84*8353b533SDaniel Pereira agregados na branch efi/core da árvore tip. 85*8353b533SDaniel Pereira 86*8353b533SDaniel Pereira - **RCU** 87*8353b533SDaniel Pereira 88*8353b533SDaniel Pereira O desenvolvimento do RCU ocorre na árvore linux-rcu. As mudanças resultantes 89*8353b533SDaniel Pereira são agregadas na branch core/rcu da árvore tip. 90*8353b533SDaniel Pereira 91*8353b533SDaniel Pereira - **Vários componentes de código do núcleo**: 92*8353b533SDaniel Pereira 93*8353b533SDaniel Pereira - debugobjects 94*8353b533SDaniel Pereira 95*8353b533SDaniel Pereira - objtool 96*8353b533SDaniel Pereira 97*8353b533SDaniel Pereira - partes e peças aleatórias 98*8353b533SDaniel Pereira 99*8353b533SDaniel Pereira 100*8353b533SDaniel PereiraNotas de submissão de patch 101*8353b533SDaniel Pereira--------------------------- 102*8353b533SDaniel Pereira 103*8353b533SDaniel PereiraSelecionando a árvore/branch 104*8353b533SDaniel Pereira^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 105*8353b533SDaniel Pereira 106*8353b533SDaniel PereiraEm geral, o desenvolvimento contra o head da branch master da árvore tip é 107*8353b533SDaniel Pereiraadequado, mas para os subsistemas que são mantidos separadamente, possuem sua 108*8353b533SDaniel Pereiraprópria árvore git e são apenas agregados na árvore tip, o desenvolvimento deve 109*8353b533SDaniel Pereiraocorrer contra a árvore ou branch do subsistema relevante. 110*8353b533SDaniel Pereira 111*8353b533SDaniel PereiraCorreções de bugs que visam a mainline devem sempre ser aplicáveis contra a 112*8353b533SDaniel Pereiraárvore do kernel mainline. Potenciais conflitos contra mudanças que já estão 113*8353b533SDaniel Pereirana fila da árvore tip são resolvidos pelos mantenedores. 114*8353b533SDaniel Pereira 115*8353b533SDaniel PereiraAssunto do patch 116*8353b533SDaniel Pereira^^^^^^^^^^^^^^^^ 117*8353b533SDaniel Pereira 118*8353b533SDaniel PereiraO formato preferido da árvore tip para prefixos de assunto do patch é 119*8353b533SDaniel Pereira'subsys/component:', ex. 'x86/apic:', 'x86/mm/fault:', 'sched/fair:', 120*8353b533SDaniel Pereira'genirq/core:'. Por favor, não use nomes de arquivos ou caminhos de arquivos completos como 121*8353b533SDaniel Pereiraprefixo. 'git log path/to/file' deve lhe dar uma dica razoável na maioria 122*8353b533SDaniel Pereirados casos. 123*8353b533SDaniel Pereira 124*8353b533SDaniel PereiraA descrição condensada do patch na linha de assunto deve começar com uma 125*8353b533SDaniel Pereiraletra maiúscula e deve ser escrita em tom imperativo. 126*8353b533SDaniel Pereira 127*8353b533SDaniel Pereira 128*8353b533SDaniel PereiraChangelog 129*8353b533SDaniel Pereira^^^^^^^^^ 130*8353b533SDaniel Pereira 131*8353b533SDaniel PereiraAs regras gerais sobre changelogs no :ref:`Guia de submissão de patches 132*8353b533SDaniel Pereira<pt_BR_describe_changes>`, se aplicam. 133*8353b533SDaniel Pereira 134*8353b533SDaniel PereiraOs mantenedores da árvore tip valorizam seguir essas regras, especialmente no 135*8353b533SDaniel Pereirapedido para escrever changelogs no modo imperativo e não personificando 136*8353b533SDaniel Pereirao código ou sua execução. Isso não é apenas um capricho dos 137*8353b533SDaniel Pereiramantenedores. Changelogs escritos em palavras abstratas são mais precisos e 138*8353b533SDaniel Pereiratendem a ser menos confusos do que aqueles escritos em forma de romances. 139*8353b533SDaniel Pereira 140*8353b533SDaniel PereiraTambém é útil estruturar o changelog em vários parágrafos e não 141*8353b533SDaniel Pereirajuntar tudo em um só. Uma boa estrutura é explicar 142*8353b533SDaniel Pereirao contexto, o problema e a solução em parágrafos separados e nesta 143*8353b533SDaniel Pereiraordem. 144*8353b533SDaniel Pereira 145*8353b533SDaniel PereiraExemplos para ilustração: 146*8353b533SDaniel Pereira 147*8353b533SDaniel Pereira Exemplo 1:: 148*8353b533SDaniel Pereira 149*8353b533SDaniel Pereira x86/intel_rdt/mbm: Corrigir o manipulador de overflow do MBM durante hot cpu 150*8353b533SDaniel Pereira 151*8353b533SDaniel Pereira Quando uma CPU está morrendo, cancelamos o worker e agendamos um novo worker em uma 152*8353b533SDaniel Pereira CPU diferente no mesmo domínio. Mas se o timer já está prestes a 153*8353b533SDaniel Pereira expirar (digamos 0.99s) então essencialmente dobramos o intervalo. 154*8353b533SDaniel Pereira 155*8353b533SDaniel Pereira Modificamos o tratamento de hot cpu para cancelar o trabalho atrasado na cpu 156*8353b533SDaniel Pereira que está morrendo e executar o worker imediatamente em uma cpu diferente no mesmo domínio. Não 157*8353b533SDaniel Pereira fazemos o flush do worker porque o worker de overflow do MBM reagenda o 158*8353b533SDaniel Pereira worker na mesma CPU e escaneia a domain->cpu_mask para obter o ponteiro 159*8353b533SDaniel Pereira do domínio. 160*8353b533SDaniel Pereira 161*8353b533SDaniel Pereira Versão melhorada:: 162*8353b533SDaniel Pereira 163*8353b533SDaniel Pereira x86/intel_rdt/mbm: Corrigir o manipulador de overflow do MBM durante hotplug de CPU 164*8353b533SDaniel Pereira 165*8353b533SDaniel Pereira Quando uma CPU está morrendo, o worker de overflow é cancelado e reagendado em uma 166*8353b533SDaniel Pereira CPU diferente no mesmo domínio. Mas se o timer já estiver prestes a 167*8353b533SDaniel Pereira expirar isso essencialmente dobra o intervalo, o que pode resultar em um overflow 168*8353b533SDaniel Pereira não detectado. 169*8353b533SDaniel Pereira 170*8353b533SDaniel Pereira Cancele o worker de overflow e reagende-o imediatamente em uma CPU diferente 171*8353b533SDaniel Pereira no mesmo domínio. O trabalho também poderia sofrer um flush, mas isso iria 172*8353b533SDaniel Pereira reagendá-lo na mesma CPU. 173*8353b533SDaniel Pereira 174*8353b533SDaniel Pereira Exemplo 2:: 175*8353b533SDaniel Pereira 176*8353b533SDaniel Pereira time: POSIX CPU timers: Garantir que a variável seja inicializada 177*8353b533SDaniel Pereira 178*8353b533SDaniel Pereira Se cpu_timer_sample_group retornar -EINVAL, ela não terá escrito em 179*8353b533SDaniel Pereira *sample. Checar o valor de retorno de cpu_timer_sample_group previne o 180*8353b533SDaniel Pereira uso potencial de um valor não inicializado de now no bloco seguinte. 181*8353b533SDaniel Pereira Dado um clock_idx inválido, o código anterior poderia caso contrário sobrescrever 182*8353b533SDaniel Pereira *oldval de maneira indefinida. Isso agora é prevenido. Também exploramos 183*8353b533SDaniel Pereira o curto-circuito do && para amostrar o timer apenas se o resultado for 184*8353b533SDaniel Pereira realmente usado para atualizar *oldval. 185*8353b533SDaniel Pereira 186*8353b533SDaniel Pereira Versão melhorada:: 187*8353b533SDaniel Pereira 188*8353b533SDaniel Pereira posix-cpu-timers: Tornar set_process_cpu_timer() mais robusto 189*8353b533SDaniel Pereira 190*8353b533SDaniel Pereira Como o valor de retorno de cpu_timer_sample_group() não é checado, 191*8353b533SDaniel Pereira compiladores e checadores estáticos podem legitimamente avisar sobre um uso potencial 192*8353b533SDaniel Pereira da variável não inicializada 'now'. Isso não é um problema de tempo de execução pois todos 193*8353b533SDaniel Pereira os locais de chamada passam ids de clock válidos. 194*8353b533SDaniel Pereira 195*8353b533SDaniel Pereira Além disso, cpu_timer_sample_group() é invocado incondicionalmente mesmo quando o 196*8353b533SDaniel Pereira resultado não é usado porque *oldval é NULL. 197*8353b533SDaniel Pereira 198*8353b533SDaniel Pereira Torne a invocação condicional e cheque o valor de retorno. 199*8353b533SDaniel Pereira 200*8353b533SDaniel Pereira Exemplo 3:: 201*8353b533SDaniel Pereira 202*8353b533SDaniel Pereira A entidade também pode ser usada para outros propósitos. 203*8353b533SDaniel Pereira 204*8353b533SDaniel Pereira Vamos renomeá-la para ser mais genérica. 205*8353b533SDaniel Pereira 206*8353b533SDaniel Pereira Versão melhorada:: 207*8353b533SDaniel Pereira 208*8353b533SDaniel Pereira A entidade também pode ser usada para outros propósitos. 209*8353b533SDaniel Pereira 210*8353b533SDaniel Pereira Renomeie para ser mais genérica. 211*8353b533SDaniel Pereira 212*8353b533SDaniel Pereira 213*8353b533SDaniel PereiraPara cenários complexos, especialmente condições de corrida (race conditions) e problemas 214*8353b533SDaniel Pereirade ordenação de memória, é valioso descrever o cenário com uma tabela que mostra 215*8353b533SDaniel Pereirao paralelismo e a ordem temporal dos eventos. Aqui está um exemplo:: 216*8353b533SDaniel Pereira 217*8353b533SDaniel Pereira CPU0 CPU1 218*8353b533SDaniel Pereira free_irq(X) interrupt X 219*8353b533SDaniel Pereira spin_lock(desc->lock) 220*8353b533SDaniel Pereira wake irq thread() 221*8353b533SDaniel Pereira spin_unlock(desc->lock) 222*8353b533SDaniel Pereira spin_lock(desc->lock) 223*8353b533SDaniel Pereira remove action() 224*8353b533SDaniel Pereira shutdown_irq() 225*8353b533SDaniel Pereira release_resources() thread_handler() 226*8353b533SDaniel Pereira spin_unlock(desc->lock) access released resources. 227*8353b533SDaniel Pereira ^^^^^^^^^^^^^^^^^^^^^^^^^ 228*8353b533SDaniel Pereira synchronize_irq() 229*8353b533SDaniel Pereira 230*8353b533SDaniel PereiraO Lockdep fornece uma saída útil semelhante para descrever um possível cenário 231*8353b533SDaniel Pereirade deadlock:: 232*8353b533SDaniel Pereira 233*8353b533SDaniel Pereira CPU0 CPU1 234*8353b533SDaniel Pereira rtmutex_lock(&rcu->rt_mutex) 235*8353b533SDaniel Pereira spin_lock(&rcu->rt_mutex.wait_lock) 236*8353b533SDaniel Pereira local_irq_disable() 237*8353b533SDaniel Pereira spin_lock(&timer->it_lock) 238*8353b533SDaniel Pereira spin_lock(&rcu->mutex.wait_lock) 239*8353b533SDaniel Pereira --> Interrupt 240*8353b533SDaniel Pereira spin_lock(&timer->it_lock) 241*8353b533SDaniel Pereira 242*8353b533SDaniel PereiraReferências a funções em changelogs 243*8353b533SDaniel Pereira^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 244*8353b533SDaniel Pereira 245*8353b533SDaniel PereiraQuando uma função é mencionada no changelog, seja no corpo do texto ou na 246*8353b533SDaniel Pereiralinha de assunto, por favor use o formato 'nome_da_funcao()'. Omitir os 247*8353b533SDaniel Pereiraparênteses após o nome da função pode ser ambíguo:: 248*8353b533SDaniel Pereira 249*8353b533SDaniel Pereira Subject: subsys/component: Make reservation_count static 250*8353b533SDaniel Pereira 251*8353b533SDaniel Pereira reservation_count is only used in reservation_stats. Make it static. 252*8353b533SDaniel Pereira 253*8353b533SDaniel PereiraA variante com parênteses é mais precisa:: 254*8353b533SDaniel Pereira 255*8353b533SDaniel Pereira Subject: subsys/component: Make reservation_count() static 256*8353b533SDaniel Pereira 257*8353b533SDaniel Pereira reservation_count() is only called from reservation_stats(). Make it 258*8353b533SDaniel Pereira static. 259*8353b533SDaniel Pereira 260*8353b533SDaniel Pereira 261*8353b533SDaniel PereiraBacktraces em changelogs 262*8353b533SDaniel Pereira^^^^^^^^^^^^^^^^^^^^^^^^ 263*8353b533SDaniel Pereira 264*8353b533SDaniel PereiraVeja :ref:`pt_BR_backtraces`. 265*8353b533SDaniel Pereira 266*8353b533SDaniel PereiraOrdenação das tags de commit 267*8353b533SDaniel Pereira^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 268*8353b533SDaniel Pereira 269*8353b533SDaniel PereiraPara ter uma visão uniforme das tags de commit, os mantenedores da tip usam o 270*8353b533SDaniel Pereiraseguinte esquema de ordenação de tags: 271*8353b533SDaniel Pereira 272*8353b533SDaniel Pereira - Fixes: 12+char-SHA1 ("sub/sys: Original subject line") 273*8353b533SDaniel Pereira 274*8353b533SDaniel Pereira Uma tag Fixes deve ser adicionada mesmo para alterações que não precisam ser 275*8353b533SDaniel Pereira portadas de volta (backported) para kernels estáveis, ou seja, quando abordar um 276*8353b533SDaniel Pereira problema recém-introduzido que afeta apenas a árvore tip ou o head atual da linha principal (mainline). Estas tags 277*8353b533SDaniel Pereira são úteis para identificar o commit original e são muito mais valiosas 278*8353b533SDaniel Pereira do que mencionar de forma proeminente o commit que introduziu um problema no 279*8353b533SDaniel Pereira próprio texto do changelog, porque elas podem ser automaticamente 280*8353b533SDaniel Pereira extraídas. 281*8353b533SDaniel Pereira 282*8353b533SDaniel Pereira O exemplo a seguir ilustra a diferença:: 283*8353b533SDaniel Pereira 284*8353b533SDaniel Pereira Commit 285*8353b533SDaniel Pereira 286*8353b533SDaniel Pereira abcdef012345678 ("x86/xxx: Replace foo with bar") 287*8353b533SDaniel Pereira 288*8353b533SDaniel Pereira deixou uma instância não utilizada da variável foo. Remova-a. 289*8353b533SDaniel Pereira 290*8353b533SDaniel Pereira Signed-off-by: J.Dev <j.dev@mail> 291*8353b533SDaniel Pereira 292*8353b533SDaniel Pereira Por favor, diga em vez disso:: 293*8353b533SDaniel Pereira 294*8353b533SDaniel Pereira A recente substituição de foo por bar deixou uma instância não utilizada da 295*8353b533SDaniel Pereira variável foo. Remova-a. 296*8353b533SDaniel Pereira 297*8353b533SDaniel Pereira Fixes: abcdef012345678 ("x86/xxx: Replace foo with bar") 298*8353b533SDaniel Pereira Signed-off-by: J.Dev <j.dev@mail> 299*8353b533SDaniel Pereira 300*8353b533SDaniel Pereira O último coloca as informações sobre o patch em foco e 301*8353b533SDaniel Pereira as complementa com a referência ao commit que introduziu o problema, 302*8353b533SDaniel Pereira em vez de colocar o foco no commit original em primeiro lugar. 303*8353b533SDaniel Pereira 304*8353b533SDaniel Pereira - Reported-by: ``Reporter <reporter@mail>`` 305*8353b533SDaniel Pereira 306*8353b533SDaniel Pereira - Closes: ``URL or Message-ID of the bug report this is fixing`` 307*8353b533SDaniel Pereira 308*8353b533SDaniel Pereira - Originally-by: ``Original author <original-author@mail>`` 309*8353b533SDaniel Pereira 310*8353b533SDaniel Pereira - Suggested-by: ``Suggester <suggester@mail>`` 311*8353b533SDaniel Pereira 312*8353b533SDaniel Pereira - Co-developed-by: ``Co-author <co-author@mail>`` 313*8353b533SDaniel Pereira 314*8353b533SDaniel Pereira Signed-off-by: ``Co-author <co-author@mail>`` 315*8353b533SDaniel Pereira 316*8353b533SDaniel Pereira Note que Co-developed-by e Signed-off-by do(s) co-autor(es) devem 317*8353b533SDaniel Pereira vir em pares. 318*8353b533SDaniel Pereira 319*8353b533SDaniel Pereira - Signed-off-by: ``Author <author@mail>`` 320*8353b533SDaniel Pereira 321*8353b533SDaniel Pereira O primeiro Signed-off-by (SOB) após o último par Co-developed-by/SOB é o 322*8353b533SDaniel Pereira SOB do autor, ou seja, a pessoa marcada como autora pelo git. 323*8353b533SDaniel Pereira 324*8353b533SDaniel Pereira - Signed-off-by: ``Patch handler <handler@mail>`` 325*8353b533SDaniel Pereira 326*8353b533SDaniel Pereira SOBs após o SOB do autor são de pessoas que lidam e transportam 327*8353b533SDaniel Pereira o patch, mas não estiveram envolvidas no desenvolvimento. As cadeias de SOB devem 328*8353b533SDaniel Pereira refletir a rota **real** que um patch tomou conforme foi propagado para nós, 329*8353b533SDaniel Pereira com a primeira entrada de SOB sinalizando a autoria principal de um único 330*8353b533SDaniel Pereira autor. Acks devem ser dados como linhas Acked-by e aprovações de revisão 331*8353b533SDaniel Pereira como linhas Reviewed-by. 332*8353b533SDaniel Pereira 333*8353b533SDaniel Pereira Se o manipulador fez modificações no patch ou no changelog, então 334*8353b533SDaniel Pereira isso deve ser mencionado **após** o texto do changelog e **acima** 335*8353b533SDaniel Pereira de todas as tags de commit no seguinte formato:: 336*8353b533SDaniel Pereira 337*8353b533SDaniel Pereira ... o texto do changelog termina. 338*8353b533SDaniel Pereira 339*8353b533SDaniel Pereira [ handler: Substituiu foo por bar e atualizou o changelog ] 340*8353b533SDaniel Pereira 341*8353b533SDaniel Pereira First-tag: ..... 342*8353b533SDaniel Pereira 343*8353b533SDaniel Pereira Observe as duas novas linhas vazias que separam o texto do changelog e as 344*8353b533SDaniel Pereira tags de commit daquele aviso. 345*8353b533SDaniel Pereira 346*8353b533SDaniel Pereira Se um patch for enviado para a lista de discussão por um manipulador, então o autor tem 347*8353b533SDaniel Pereira que ser notado na primeira linha do changelog com:: 348*8353b533SDaniel Pereira 349*8353b533SDaniel Pereira From: Author <author@mail> 350*8353b533SDaniel Pereira 351*8353b533SDaniel Pereira O texto do changelog começa aqui.... 352*8353b533SDaniel Pereira 353*8353b533SDaniel Pereira assim a autoria é preservada. A linha 'From:' tem que ser seguida 354*8353b533SDaniel Pereira por uma nova linha vazia. Se essa linha 'From:' estiver faltando, então o patch 355*8353b533SDaniel Pereira seria atribuído à pessoa que o enviou (transportou, manipulou). 356*8353b533SDaniel Pereira A linha 'From:' é automaticamente removida quando o patch é aplicado 357*8353b533SDaniel Pereira e não aparece no changelog final do git. Ela meramente afeta 358*8353b533SDaniel Pereira a informação de autoria do commit resultante do Git. 359*8353b533SDaniel Pereira 360*8353b533SDaniel Pereira - Tested-by: ``Tester <tester@mail>`` 361*8353b533SDaniel Pereira 362*8353b533SDaniel Pereira - Reviewed-by: ``Reviewer <reviewer@mail>`` 363*8353b533SDaniel Pereira 364*8353b533SDaniel Pereira - Acked-by: ``Acker <acker@mail>`` 365*8353b533SDaniel Pereira 366*8353b533SDaniel Pereira - Cc: ``cc-ed-person <person@mail>`` 367*8353b533SDaniel Pereira 368*8353b533SDaniel Pereira Se o patch deve ser portado para stable, então por favor adicione uma tag '``Cc: 369*8353b533SDaniel Pereira stable@vger.kernel.org``', mas não coloque em Cc o stable ao enviar o seu 370*8353b533SDaniel Pereira e-mail. 371*8353b533SDaniel Pereira 372*8353b533SDaniel Pereira - Link: ``https://link/to/information`` 373*8353b533SDaniel Pereira 374*8353b533SDaniel Pereira Para se referir a um e-mail postado nas listas de discussão do kernel, por favor 375*8353b533SDaniel Pereira use o URL de redirecionamento lore.kernel.org:: 376*8353b533SDaniel Pereira 377*8353b533SDaniel Pereira Link: https://lore.kernel.org/email-message-id@here 378*8353b533SDaniel Pereira 379*8353b533SDaniel Pereira Esta URL deve ser usada ao se referir a tópicos de lista de discussão relevantes, 380*8353b533SDaniel Pereira conjuntos de patches relacionados, ou outras threads de discussão notáveis. 381*8353b533SDaniel Pereira Uma maneira conveniente de associar os trailers ``Link:`` com a mensagem de commit 382*8353b533SDaniel Pereira é usar a notação de colchetes semelhante ao markdown, por exemplo:: 383*8353b533SDaniel Pereira 384*8353b533SDaniel Pereira A similar approach was attempted before as part of a different 385*8353b533SDaniel Pereira effort [1], but the initial implementation caused too many 386*8353b533SDaniel Pereira regressions [2], so it was backed out and reimplemented. 387*8353b533SDaniel Pereira 388*8353b533SDaniel Pereira Link: https://lore.kernel.org/some-msgid@here # [1] 389*8353b533SDaniel Pereira Link: https://bugzilla.example.org/bug/12345 # [2] 390*8353b533SDaniel Pereira 391*8353b533SDaniel Pereira Você também pode usar os trailers ``Link:`` para indicar a origem do 392*8353b533SDaniel Pereira patch ao aplicá-lo em sua árvore git. Neste caso, por favor use o 393*8353b533SDaniel Pereira domínio dedicado ``patch.msgid.link`` em vez de ``lore.kernel.org``. 394*8353b533SDaniel Pereira Esta prática torna possível que as ferramentas automatizadas identifiquem 395*8353b533SDaniel Pereira qual link usar para recuperar o envio do patch original. Por 396*8353b533SDaniel Pereira exemplo:: 397*8353b533SDaniel Pereira 398*8353b533SDaniel Pereira Link: https://patch.msgid.link/patch-source-message-id@here 399*8353b533SDaniel Pereira 400*8353b533SDaniel PereiraPor favor não use tags combinadas, ex. ``Reported-and-tested-by``, pois 401*8353b533SDaniel Pereiraelas apenas complicam a extração automatizada de tags. 402*8353b533SDaniel Pereira 403*8353b533SDaniel Pereira 404*8353b533SDaniel PereiraLinks para documentação 405*8353b533SDaniel Pereira^^^^^^^^^^^^^^^^^^^^^^^ 406*8353b533SDaniel Pereira 407*8353b533SDaniel PereiraFornecer links para a documentação no changelog é uma grande ajuda para depuração e 408*8353b533SDaniel Pereiraanálise posteriores. Infelizmente, os URLs costumam quebrar muito rapidamente 409*8353b533SDaniel Pereiraporque as empresas reestruturam seus sites frequentemente. Exceções não 'voláteis' 410*8353b533SDaniel Pereiraincluem o Intel SDM e o AMD APM. 411*8353b533SDaniel Pereira 412*8353b533SDaniel PereiraPortanto, para documentos 'voláteis', por favor crie uma entrada no bugzilla do kernel 413*8353b533SDaniel Pereirahttps://bugzilla.kernel.org e anexe uma cópia desses documentos 414*8353b533SDaniel Pereiraà entrada do bugzilla. Finalmente, forneça o URL da entrada do bugzilla no 415*8353b533SDaniel Pereirachangelog. 416*8353b533SDaniel Pereira 417*8353b533SDaniel PereiraReenvio de patch ou lembretes 418*8353b533SDaniel Pereira^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 419*8353b533SDaniel Pereira 420*8353b533SDaniel PereiraVeja :ref:`pt_BR_resend_reminders`. 421*8353b533SDaniel Pereira 422*8353b533SDaniel PereiraJanela de merge 423*8353b533SDaniel Pereira^^^^^^^^^^^^^^^ 424*8353b533SDaniel Pereira 425*8353b533SDaniel PereiraPor favor, não espere que os patches sejam revisados ou mesclados pelos mantenedores da árvore tip 426*8353b533SDaniel Pereiraem torno ou durante a janela de merge. As árvores ficam fechadas 427*8353b533SDaniel Pereirapara todos, exceto correções urgentes, durante esse tempo. Elas reabrem assim que a janela de merge 428*8353b533SDaniel Pereirafecha e um novo kernel -rc1 é lançado. 429*8353b533SDaniel Pereira 430*8353b533SDaniel PereiraGrandes séries devem ser enviadas em estado mesclável (mergeable state) *pelo* *menos* uma semana 431*8353b533SDaniel Pereiraantes da janela de merge abrir. Exceções são feitas para correções de bugs e 432*8353b533SDaniel Pereira*às vezes* para pequenos drivers independentes para novos hardwares ou patches minimamente 433*8353b533SDaniel Pereirainvasivos para ativação de hardware. 434*8353b533SDaniel Pereira 435*8353b533SDaniel PereiraDurante a janela de merge, os mantenedores se concentram em seguir as 436*8353b533SDaniel Pereiraalterações upstream, corrigir problemas resultantes da janela de merge, coletar correções de bugs, e 437*8353b533SDaniel Pereirase permitir um respiro. Por favor, respeite isso. 438*8353b533SDaniel Pereira 439*8353b533SDaniel PereiraOs chamados branches _urgent_ serão mesclados na linha principal (mainline) durante a 440*8353b533SDaniel Pereirafase de estabilização de cada versão. 441*8353b533SDaniel Pereira 442*8353b533SDaniel Pereira 443*8353b533SDaniel PereiraGit 444*8353b533SDaniel Pereira^^^ 445*8353b533SDaniel Pereira 446*8353b533SDaniel PereiraOs mantenedores da árvore tip aceitam pull requests do git de mantenedores que fornecem 447*8353b533SDaniel Pereiraalterações de subsistema para agregação na árvore tip. 448*8353b533SDaniel Pereira 449*8353b533SDaniel PereiraPull requests para novos envios de patches normalmente não são aceitos e não 450*8353b533SDaniel Pereirasubstituem o envio adequado de patch para a lista de discussão. O principal motivo para 451*8353b533SDaniel Pereiraisso é que o fluxo de trabalho de revisão é baseado em e-mail. 452*8353b533SDaniel Pereira 453*8353b533SDaniel PereiraSe você enviar uma série maior de patches, é útil fornecer um branch git 454*8353b533SDaniel Pereiraem um repositório privado que permita que pessoas interessadas façam pull da 455*8353b533SDaniel Pereirasérie facilmente para testes. A maneira usual de oferecer isso é uma URL do git na carta de apresentação (cover letter) 456*8353b533SDaniel Pereirada série de patches. 457*8353b533SDaniel Pereira 458*8353b533SDaniel PereiraTestes 459*8353b533SDaniel Pereira^^^^^^ 460*8353b533SDaniel Pereira 461*8353b533SDaniel PereiraO código deve ser testado antes de ser enviado para os mantenedores da árvore tip. Qualquer coisa 462*8353b533SDaniel Pereiraalém de alterações menores deve ser construída, inicializada e testada com 463*8353b533SDaniel Pereiraopções abrangentes (e pesadas) de depuração do kernel ativadas. 464*8353b533SDaniel Pereira 465*8353b533SDaniel PereiraEssas opções de depuração podem ser encontradas em kernel/configs/x86_debug.config 466*8353b533SDaniel Pereirae podem ser adicionadas a uma configuração de kernel existente executando: 467*8353b533SDaniel Pereira 468*8353b533SDaniel Pereira make x86_debug.config 469*8353b533SDaniel Pereira 470*8353b533SDaniel PereiraAlgumas dessas opções são específicas do x86 e podem ser deixadas de fora ao testar 471*8353b533SDaniel Pereiraem outras arquiteturas. 472*8353b533SDaniel Pereira 473*8353b533SDaniel Pereira.. _pt_BR_maintainer-tip-coding-style: 474*8353b533SDaniel Pereira 475*8353b533SDaniel PereiraNotas de estilo de código 476*8353b533SDaniel Pereira------------------------- 477*8353b533SDaniel Pereira 478*8353b533SDaniel PereiraEstilo de comentário 479*8353b533SDaniel Pereira^^^^^^^^^^^^^^^^^^^^ 480*8353b533SDaniel Pereira 481*8353b533SDaniel PereiraFrases em comentários começam com uma letra maiúscula. 482*8353b533SDaniel Pereira 483*8353b533SDaniel PereiraComentários de linha única:: 484*8353b533SDaniel Pereira 485*8353b533SDaniel Pereira /* Este é um comentário de linha única */ 486*8353b533SDaniel Pereira 487*8353b533SDaniel PereiraComentários de várias linhas:: 488*8353b533SDaniel Pereira 489*8353b533SDaniel Pereira /* 490*8353b533SDaniel Pereira * This is a properly formatted 491*8353b533SDaniel Pereira * multi-line comment. 492*8353b533SDaniel Pereira * 493*8353b533SDaniel Pereira * Larger multi-line comments should be split into paragraphs. 494*8353b533SDaniel Pereira */ 495*8353b533SDaniel Pereira 496*8353b533SDaniel PereiraSem comentários no fim da linha (veja abaixo): 497*8353b533SDaniel Pereira 498*8353b533SDaniel Pereira Por favor, abstenha-se de usar comentários no fim da linha. Comentários no fim da linha atrapalham o 499*8353b533SDaniel Pereira fluxo de leitura em quase todos os contextos, mas especialmente em código:: 500*8353b533SDaniel Pereira 501*8353b533SDaniel Pereira if (somecondition_is_true) /* Não coloque um comentário aqui */ 502*8353b533SDaniel Pereira dostuff(); /* Nem aqui */ 503*8353b533SDaniel Pereira 504*8353b533SDaniel Pereira seed = MAGIC_CONSTANT; /* Nem aqui */ 505*8353b533SDaniel Pereira 506*8353b533SDaniel Pereira Use comentários independentes em vez disso:: 507*8353b533SDaniel Pereira 508*8353b533SDaniel Pereira /* Esta condição não é óbvia sem um comentário */ 509*8353b533SDaniel Pereira if (somecondition_is_true) { 510*8353b533SDaniel Pereira /* Isso realmente precisa ser documentado */ 511*8353b533SDaniel Pereira dostuff(); 512*8353b533SDaniel Pereira } 513*8353b533SDaniel Pereira 514*8353b533SDaniel Pereira /* Esta inicialização mágica precisa de um comentário. Talvez não? */ 515*8353b533SDaniel Pereira seed = MAGIC_CONSTANT; 516*8353b533SDaniel Pereira 517*8353b533SDaniel Pereira Use o estilo C++, comentários no fim da linha ao documentar structs em headers para 518*8353b533SDaniel Pereira alcançar um layout mais compacto e melhor legibilidade:: 519*8353b533SDaniel Pereira 520*8353b533SDaniel Pereira // eax 521*8353b533SDaniel Pereira u32 x2apic_shift : 5, // Número de bits para deslocar o ID APIC para a direita 522*8353b533SDaniel Pereira // para o ID de topologia no próximo nível 523*8353b533SDaniel Pereira : 27; // Reservado 524*8353b533SDaniel Pereira // ebx 525*8353b533SDaniel Pereira u32 num_processors : 16, // Número de processadores no nível atual 526*8353b533SDaniel Pereira : 16; // Reservado 527*8353b533SDaniel Pereira 528*8353b533SDaniel Pereira versus:: 529*8353b533SDaniel Pereira 530*8353b533SDaniel Pereira /* eax */ 531*8353b533SDaniel Pereira /* 532*8353b533SDaniel Pereira * Número de bits para deslocar o ID APIC para a direita para o ID de topologia 533*8353b533SDaniel Pereira * no próximo nível 534*8353b533SDaniel Pereira */ 535*8353b533SDaniel Pereira u32 x2apic_shift : 5, 536*8353b533SDaniel Pereira /* Reservado */ 537*8353b533SDaniel Pereira : 27; 538*8353b533SDaniel Pereira 539*8353b533SDaniel Pereira /* ebx */ 540*8353b533SDaniel Pereira /* Número de processadores no nível atual */ 541*8353b533SDaniel Pereira u32 num_processors : 16, 542*8353b533SDaniel Pereira /* Reservado */ 543*8353b533SDaniel Pereira : 16; 544*8353b533SDaniel Pereira 545*8353b533SDaniel PereiraComente as coisas importantes: 546*8353b533SDaniel Pereira 547*8353b533SDaniel Pereira Comentários devem ser adicionados onde a operação não é óbvia. Documentar 548*8353b533SDaniel Pereira o óbvio é apenas uma distração:: 549*8353b533SDaniel Pereira 550*8353b533SDaniel Pereira /* Decrementa o refcount e verifica por zero */ 551*8353b533SDaniel Pereira if (refcount_dec_and_test(&p->refcnt)) { 552*8353b533SDaniel Pereira do; 553*8353b533SDaniel Pereira lots; 554*8353b533SDaniel Pereira of; 555*8353b533SDaniel Pereira magic; 556*8353b533SDaniel Pereira things; 557*8353b533SDaniel Pereira } 558*8353b533SDaniel Pereira 559*8353b533SDaniel Pereira Em vez disso, os comentários devem explicar os detalhes não óbvios e documentar 560*8353b533SDaniel Pereira as restrições:: 561*8353b533SDaniel Pereira 562*8353b533SDaniel Pereira if (refcount_dec_and_test(&p->refcnt)) { 563*8353b533SDaniel Pereira /* 564*8353b533SDaniel Pereira * Explicação muito boa de por que as coisas mágicas abaixo 565*8353b533SDaniel Pereira * precisam ser feitas, restrições de ordenação e locking, 566*8353b533SDaniel Pereira * etc.. 567*8353b533SDaniel Pereira */ 568*8353b533SDaniel Pereira do; 569*8353b533SDaniel Pereira lots; 570*8353b533SDaniel Pereira of; 571*8353b533SDaniel Pereira magic; 572*8353b533SDaniel Pereira /* Precisa ser a última operação porque ... */ 573*8353b533SDaniel Pereira things; 574*8353b533SDaniel Pereira } 575*8353b533SDaniel Pereira 576*8353b533SDaniel PereiraComentários de documentação de função: 577*8353b533SDaniel Pereira 578*8353b533SDaniel Pereira Para documentar funções e seus argumentos por favor use o formato kernel-doc 579*8353b533SDaniel Pereira e não comentários de formato livre:: 580*8353b533SDaniel Pereira 581*8353b533SDaniel Pereira /** 582*8353b533SDaniel Pereira * magic_function - Faz muitas coisas mágicas 583*8353b533SDaniel Pereira * @magic: Ponteiro para os dados mágicos nos quais operar 584*8353b533SDaniel Pereira * @offset: Deslocamento no array de dados de @magic 585*8353b533SDaniel Pereira * 586*8353b533SDaniel Pereira * Explicação profunda das coisas misteriosas feitas com @magic junto 587*8353b533SDaniel Pereira * com a documentação dos valores de retorno. 588*8353b533SDaniel Pereira * 589*8353b533SDaniel Pereira * Note que os descritores de argumento acima estão dispostos 590*8353b533SDaniel Pereira * de forma tabular. 591*8353b533SDaniel Pereira */ 592*8353b533SDaniel Pereira 593*8353b533SDaniel Pereira Isto se aplica especialmente a funções visíveis globalmente e funções 594*8353b533SDaniel Pereira inline em arquivos de cabeçalho públicos. Pode ser um exagero usar o formato 595*8353b533SDaniel Pereira kernel-doc para cada função (estática) que precisa de uma pequena explicação. O 596*8353b533SDaniel Pereira uso de nomes de funções descritivos frequentemente substitui esses pequenos comentários. 597*8353b533SDaniel Pereira Aplique o bom senso como sempre. 598*8353b533SDaniel Pereira 599*8353b533SDaniel Pereira 600*8353b533SDaniel PereiraDocumentando requisitos de locking 601*8353b533SDaniel Pereira^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 602*8353b533SDaniel Pereira Documentar requisitos de locking é uma coisa boa, mas comentários não 603*8353b533SDaniel Pereira são necessariamente a melhor escolha. Em vez de escrever:: 604*8353b533SDaniel Pereira 605*8353b533SDaniel Pereira /* Caller must hold foo->lock */ 606*8353b533SDaniel Pereira void func(struct foo *foo) 607*8353b533SDaniel Pereira { 608*8353b533SDaniel Pereira ... 609*8353b533SDaniel Pereira } 610*8353b533SDaniel Pereira 611*8353b533SDaniel Pereira Por favor, use:: 612*8353b533SDaniel Pereira 613*8353b533SDaniel Pereira void func(struct foo *foo) 614*8353b533SDaniel Pereira { 615*8353b533SDaniel Pereira lockdep_assert_held(&foo->lock); 616*8353b533SDaniel Pereira ... 617*8353b533SDaniel Pereira } 618*8353b533SDaniel Pereira 619*8353b533SDaniel Pereira Em kernels PROVE_LOCKING, lockdep_assert_held() emite um aviso 620*8353b533SDaniel Pereira se o chamador não detém o lock. Comentários não podem fazer isso. 621*8353b533SDaniel Pereira 622*8353b533SDaniel PereiraRegras de chaves 623*8353b533SDaniel Pereira^^^^^^^^^^^^^^^^ 624*8353b533SDaniel Pereira 625*8353b533SDaniel PereiraChaves devem ser omitidas apenas se a instrução que se segue a 'if', 'for', 626*8353b533SDaniel Pereira'while' etc. for verdadeiramente uma única linha:: 627*8353b533SDaniel Pereira 628*8353b533SDaniel Pereira if (foo) 629*8353b533SDaniel Pereira do_something(); 630*8353b533SDaniel Pereira 631*8353b533SDaniel PereiraO seguinte não é considerado uma instrução de linha única mesmo 632*8353b533SDaniel Pereiraque o C não exija chaves:: 633*8353b533SDaniel Pereira 634*8353b533SDaniel Pereira for (i = 0; i < end; i++) 635*8353b533SDaniel Pereira if (foo[i]) 636*8353b533SDaniel Pereira do_something(foo[i]); 637*8353b533SDaniel Pereira 638*8353b533SDaniel PereiraAdicionar chaves ao redor do loop externo melhora o fluxo de leitura:: 639*8353b533SDaniel Pereira 640*8353b533SDaniel Pereira for (i = 0; i < end; i++) { 641*8353b533SDaniel Pereira if (foo[i]) 642*8353b533SDaniel Pereira do_something(foo[i]); 643*8353b533SDaniel Pereira } 644*8353b533SDaniel Pereira 645*8353b533SDaniel Pereira 646*8353b533SDaniel PereiraDeclarações de variáveis 647*8353b533SDaniel Pereira^^^^^^^^^^^^^^^^^^^^^^^^ 648*8353b533SDaniel Pereira 649*8353b533SDaniel PereiraA ordem preferida das declarações de variáveis no início de uma 650*8353b533SDaniel Pereirafunção é a ordem de árvore de abeto invertida (reverse fir tree order):: 651*8353b533SDaniel Pereira 652*8353b533SDaniel Pereira struct long_struct_name *descriptive_name; 653*8353b533SDaniel Pereira unsigned long foo, bar; 654*8353b533SDaniel Pereira unsigned int tmp; 655*8353b533SDaniel Pereira int ret; 656*8353b533SDaniel Pereira 657*8353b533SDaniel PereiraO que está acima é mais rápido de analisar do que a ordem invertida:: 658*8353b533SDaniel Pereira 659*8353b533SDaniel Pereira int ret; 660*8353b533SDaniel Pereira unsigned int tmp; 661*8353b533SDaniel Pereira unsigned long foo, bar; 662*8353b533SDaniel Pereira struct long_struct_name *descriptive_name; 663*8353b533SDaniel Pereira 664*8353b533SDaniel PereiraE ainda mais do que uma ordem aleatória:: 665*8353b533SDaniel Pereira 666*8353b533SDaniel Pereira unsigned long foo, bar; 667*8353b533SDaniel Pereira int ret; 668*8353b533SDaniel Pereira struct long_struct_name *descriptive_name; 669*8353b533SDaniel Pereira unsigned int tmp; 670*8353b533SDaniel Pereira 671*8353b533SDaniel PereiraTambém por favor tente agregar variáveis do mesmo tipo em uma única 672*8353b533SDaniel Pereiralinha. Não há sentido em desperdiçar espaço na tela:: 673*8353b533SDaniel Pereira 674*8353b533SDaniel Pereira unsigned long a; 675*8353b533SDaniel Pereira unsigned long b; 676*8353b533SDaniel Pereira unsigned long c; 677*8353b533SDaniel Pereira unsigned long d; 678*8353b533SDaniel Pereira 679*8353b533SDaniel PereiraÉ realmente suficiente fazer:: 680*8353b533SDaniel Pereira 681*8353b533SDaniel Pereira unsigned long a, b, c, d; 682*8353b533SDaniel Pereira 683*8353b533SDaniel PereiraPor favor, evite também introduzir divisões de linha em declarações de variáveis:: 684*8353b533SDaniel Pereira 685*8353b533SDaniel Pereira struct long_struct_name *descriptive_name = container_of(bar, 686*8353b533SDaniel Pereira struct long_struct_name, 687*8353b533SDaniel Pereira member); 688*8353b533SDaniel Pereira struct foobar foo; 689*8353b533SDaniel Pereira 690*8353b533SDaniel PereiraÉ muito melhor mover a inicialização para uma linha separada após as 691*8353b533SDaniel Pereiradeclarações:: 692*8353b533SDaniel Pereira 693*8353b533SDaniel Pereira struct long_struct_name *descriptive_name; 694*8353b533SDaniel Pereira struct foobar foo; 695*8353b533SDaniel Pereira 696*8353b533SDaniel Pereira descriptive_name = container_of(bar, struct long_struct_name, member); 697*8353b533SDaniel Pereira 698*8353b533SDaniel Pereira 699*8353b533SDaniel PereiraTipos de variáveis 700*8353b533SDaniel Pereira^^^^^^^^^^^^^^^^^^ 701*8353b533SDaniel Pereira 702*8353b533SDaniel PereiraPor favor use os tipos u8, u16, u32, u64 adequados para variáveis que são destinadas 703*8353b533SDaniel Pereiraa descrever hardware ou são usadas como argumentos para funções que acessam 704*8353b533SDaniel Pereirahardware. Estes tipos definem claramente a largura em bits e evitam 705*8353b533SDaniel Pereiratruncamento, expansão e confusão entre 32/64 bits. 706*8353b533SDaniel Pereira 707*8353b533SDaniel Pereirau64 também é recomendado em código que se tornaria ambíguo para kernels 708*8353b533SDaniel Pereirade 32 bits quando 'unsigned long' fosse usado em vez disso. Embora em tais 709*8353b533SDaniel Pereirasituações 'unsigned long long' pudesse ser usado também, u64 é mais curto 710*8353b533SDaniel Pereirae também mostra claramente que a operação requer uma largura de 64 bits 711*8353b533SDaniel Pereiraindependente da CPU alvo. 712*8353b533SDaniel Pereira 713*8353b533SDaniel PereiraPor favor use 'unsigned int' em vez de 'unsigned'. 714*8353b533SDaniel Pereira 715*8353b533SDaniel Pereira 716*8353b533SDaniel PereiraConstantes 717*8353b533SDaniel Pereira^^^^^^^^^^ 718*8353b533SDaniel Pereira 719*8353b533SDaniel PereiraPor favor, não use números (hexa)decimais literais em código ou inicializadores. 720*8353b533SDaniel PereiraOu use defines adequados que tenham nomes descritivos ou considere usar 721*8353b533SDaniel Pereiraum enum. 722*8353b533SDaniel Pereira 723*8353b533SDaniel Pereira 724*8353b533SDaniel PereiraDeclarações e inicializadores de struct 725*8353b533SDaniel Pereira^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 726*8353b533SDaniel Pereira 727*8353b533SDaniel PereiraAs declarações de struct devem alinhar os nomes dos membros da struct de forma 728*8353b533SDaniel Pereiratabular:: 729*8353b533SDaniel Pereira 730*8353b533SDaniel Pereira struct bar_order { 731*8353b533SDaniel Pereira unsigned int guest_id; 732*8353b533SDaniel Pereira int ordered_item; 733*8353b533SDaniel Pereira struct menu *menu; 734*8353b533SDaniel Pereira }; 735*8353b533SDaniel Pereira 736*8353b533SDaniel PereiraPor favor, evite documentar os membros da struct dentro da declaração, pois 737*8353b533SDaniel Pereiraisso frequentemente resulta em comentários formatados de maneira estranha e os membros da struct 738*8353b533SDaniel Pereiraficam ofuscados:: 739*8353b533SDaniel Pereira 740*8353b533SDaniel Pereira struct bar_order { 741*8353b533SDaniel Pereira unsigned int guest_id; /* ID único do convidado */ 742*8353b533SDaniel Pereira int ordered_item; 743*8353b533SDaniel Pereira /* Ponteiro para uma instância de menu que contém todas as bebidas */ 744*8353b533SDaniel Pereira struct menu *menu; 745*8353b533SDaniel Pereira }; 746*8353b533SDaniel Pereira 747*8353b533SDaniel PereiraEm vez disso, por favor considere usar o formato kernel-doc em um comentário precedendo 748*8353b533SDaniel Pereiraa declaração da struct, que é mais fácil de ler e tem a vantagem adicional 749*8353b533SDaniel Pereirade incluir a informação na documentação do kernel, por exemplo, da 750*8353b533SDaniel Pereiraseguinte forma:: 751*8353b533SDaniel Pereira 752*8353b533SDaniel Pereira 753*8353b533SDaniel Pereira /** 754*8353b533SDaniel Pereira * struct bar_order - Descrição de um pedido de bar 755*8353b533SDaniel Pereira * @guest_id: ID único do convidado 756*8353b533SDaniel Pereira * @ordered_item: O número do item do menu 757*8353b533SDaniel Pereira * @menu: Ponteiro para o menu do qual o item 758*8353b533SDaniel Pereira * foi pedido 759*8353b533SDaniel Pereira * 760*8353b533SDaniel Pereira * Informação suplementar para usar a struct. 761*8353b533SDaniel Pereira * 762*8353b533SDaniel Pereira * Note que os descritores dos membros da struct acima estão dispostos 763*8353b533SDaniel Pereira * de forma tabular. 764*8353b533SDaniel Pereira */ 765*8353b533SDaniel Pereira struct bar_order { 766*8353b533SDaniel Pereira unsigned int guest_id; 767*8353b533SDaniel Pereira int ordered_item; 768*8353b533SDaniel Pereira struct menu *menu; 769*8353b533SDaniel Pereira }; 770*8353b533SDaniel Pereira 771*8353b533SDaniel PereiraInicializadores de struct estáticos devem usar inicializadores C99 e também devem ser 772*8353b533SDaniel Pereiraalinhados de forma tabular:: 773*8353b533SDaniel Pereira 774*8353b533SDaniel Pereira static struct foo statfoo = { 775*8353b533SDaniel Pereira .a = 0, 776*8353b533SDaniel Pereira .plain_integer = CONSTANT_DEFINE_OR_ENUM, 777*8353b533SDaniel Pereira .bar = &statbar, 778*8353b533SDaniel Pereira }; 779*8353b533SDaniel Pereira 780*8353b533SDaniel PereiraNote que embora a sintaxe C99 permita a omissão da vírgula final, 781*8353b533SDaniel Pereiranós recomendamos o uso de uma vírgula na última linha porque isso torna 782*8353b533SDaniel Pereirao reordenamento e a adição de novas linhas mais fáceis, e também torna tais 783*8353b533SDaniel Pereirapatches futuros ligeiramente mais fáceis de ler. 784*8353b533SDaniel Pereira 785*8353b533SDaniel PereiraQuebras de linha 786*8353b533SDaniel Pereira^^^^^^^^^^^^^^^^ 787*8353b533SDaniel Pereira 788*8353b533SDaniel PereiraRestringir o comprimento da linha a 80 caracteres torna código profundamente indentado difícil de 789*8353b533SDaniel Pereiraler. Considere dividir o código em funções auxiliares para evitar quebra de 790*8353b533SDaniel Pereiralinha excessiva. 791*8353b533SDaniel Pereira 792*8353b533SDaniel PereiraA regra de 80 caracteres não é uma regra estrita, então por favor use bom senso ao 793*8353b533SDaniel Pereiraquebrar linhas. Especialmente strings de formato nunca devem ser divididas. 794*8353b533SDaniel Pereira 795*8353b533SDaniel PereiraAo dividir declarações de funções ou chamadas de funções, então por favor alinhe 796*8353b533SDaniel Pereirao primeiro argumento na segunda linha com o primeiro argumento na primeira 797*8353b533SDaniel Pereiralinha:: 798*8353b533SDaniel Pereira 799*8353b533SDaniel Pereira static int long_function_name(struct foobar *barfoo, unsigned int id, 800*8353b533SDaniel Pereira unsigned int offset) 801*8353b533SDaniel Pereira { 802*8353b533SDaniel Pereira 803*8353b533SDaniel Pereira if (!id) { 804*8353b533SDaniel Pereira ret = longer_function_name(barfoo, DEFAULT_BARFOO_ID, 805*8353b533SDaniel Pereira offset); 806*8353b533SDaniel Pereira ... 807*8353b533SDaniel Pereira 808*8353b533SDaniel PereiraNamespaces 809*8353b533SDaniel Pereira^^^^^^^^^^ 810*8353b533SDaniel Pereira 811*8353b533SDaniel PereiraNamespaces de funções/variáveis melhoram a legibilidade e permitem 812*8353b533SDaniel Pereiragrepping fácil. Estes namespaces são prefixos de string para nomes 813*8353b533SDaniel Pereirade funções e variáveis visíveis globalmente, incluindo inlines. Estes prefixos devem 814*8353b533SDaniel Pereiracombinar o subsistema e o nome do componente como 'x86_comp\_', 815*8353b533SDaniel Pereira'sched\_', 'irq\_', e 'mutex\_'. 816*8353b533SDaniel Pereira 817*8353b533SDaniel PereiraIsso também inclui funções estáticas de escopo de arquivo que são imediatamente colocadas 818*8353b533SDaniel Pereiraem templates de driver visíveis globalmente - é útil que esses símbolos 819*8353b533SDaniel Pereiratambém carreguem um bom prefixo, para legibilidade do backtrace. 820*8353b533SDaniel Pereira 821*8353b533SDaniel PereiraPrefixos de namespace podem ser omitidos para funções e variáveis 822*8353b533SDaniel Pereiraestáticas locais. Funções verdadeiramente locais, chamadas apenas por outras funções locais, 823*8353b533SDaniel Pereirapodem ter nomes descritivos mais curtos - nossa preocupação principal é a facilidade de grepping 824*8353b533SDaniel Pereirae a legibilidade do backtrace. 825*8353b533SDaniel Pereira 826*8353b533SDaniel PereiraPor favor note que os prefixos 'xxx_vendor\_' e 'vendor_xxx\_' não são 827*8353b533SDaniel Pereiraúteis para funções estáticas em arquivos específicos de fornecedores. Afinal, 828*8353b533SDaniel Pereirajá está claro que o código é específico do fornecedor. Além disso, nomes 829*8353b533SDaniel Pereirade fornecedores devem ser apenas para funcionalidades verdadeiramente específicas de fornecedores. 830*8353b533SDaniel Pereira 831*8353b533SDaniel PereiraComo sempre, aplique o bom senso e vise a consistência e a legibilidade. 832*8353b533SDaniel Pereira 833*8353b533SDaniel Pereira 834*8353b533SDaniel PereiraNotificações de commit 835*8353b533SDaniel Pereira---------------------- 836*8353b533SDaniel Pereira 837*8353b533SDaniel PereiraA árvore tip é monitorada por um bot por novos commits. O bot envia um email 838*8353b533SDaniel Pereirapara cada novo commit para uma lista de discussão dedicada 839*8353b533SDaniel Pereira(``linux-tip-commits@vger.kernel.org``) e coloca em Cc todas as pessoas que são 840*8353b533SDaniel Pereiramencionadas em uma das tags de commit. Ele usa o ID da mensagem de email da 841*8353b533SDaniel Pereiratag Link no final da lista de tags para definir o cabeçalho de email In-Reply-To para que 842*8353b533SDaniel Pereiraa mensagem seja encadeada corretamente com o email de submissão do patch. 843*8353b533SDaniel Pereira 844*8353b533SDaniel PereiraOs mantenedores e submantenedores tip tentam responder ao remetente 845*8353b533SDaniel Pereiraao fazer o merge de um patch, mas às vezes eles esquecem ou isso não se encaixa no 846*8353b533SDaniel Pereirafluxo de trabalho do momento. Embora a mensagem do bot seja puramente mecânica, ela 847*8353b533SDaniel Pereiratambém implica em um 'Obrigado! Aplicado.'. 848