xref: /linux/Documentation/translations/pt_BR/process/maintainer-tip.rst (revision 14c897740388216acd59477a382de327d5e27ba4)
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