| .. SPDX-License-Identifier: GPL-2.0 | 
 |  | 
 | The tip tree handbook | 
 | ===================== | 
 |  | 
 | What is the tip tree? | 
 | --------------------- | 
 |  | 
 | The tip tree is a collection of several subsystems and areas of | 
 | development. The tip tree is both a direct development tree and a | 
 | aggregation tree for several sub-maintainer trees. The tip tree gitweb URL | 
 | is: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git | 
 |  | 
 | The tip tree contains the following subsystems: | 
 |  | 
 |    - **x86 architecture** | 
 |  | 
 |      The x86 architecture development takes place in the tip tree except | 
 |      for the x86 KVM and XEN specific parts which are maintained in the | 
 |      corresponding subsystems and routed directly to mainline from | 
 |      there. It's still good practice to Cc the x86 maintainers on | 
 |      x86-specific KVM and XEN patches. | 
 |  | 
 |      Some x86 subsystems have their own maintainers in addition to the | 
 |      overall x86 maintainers.  Please Cc the overall x86 maintainers on | 
 |      patches touching files in arch/x86 even when they are not called out | 
 |      by the MAINTAINER file. | 
 |  | 
 |      Note, that ``x86@kernel.org`` is not a mailing list. It is merely a | 
 |      mail alias which distributes mails to the x86 top-level maintainer | 
 |      team. Please always Cc the Linux Kernel mailing list (LKML) | 
 |      ``linux-kernel@vger.kernel.org``, otherwise your mail ends up only in | 
 |      the private inboxes of the maintainers. | 
 |  | 
 |    - **Scheduler** | 
 |  | 
 |      Scheduler development takes place in the -tip tree, in the | 
 |      sched/core branch - with occasional sub-topic trees for | 
 |      work-in-progress patch-sets. | 
 |  | 
 |    - **Locking and atomics** | 
 |  | 
 |      Locking development (including atomics and other synchronization | 
 |      primitives that are connected to locking) takes place in the -tip | 
 |      tree, in the locking/core branch - with occasional sub-topic trees | 
 |      for work-in-progress patch-sets. | 
 |  | 
 |    - **Generic interrupt subsystem and interrupt chip drivers**: | 
 |  | 
 |      - interrupt core development happens in the irq/core branch | 
 |  | 
 |      - interrupt chip driver development also happens in the irq/core | 
 |        branch, but the patches are usually applied in a separate maintainer | 
 |        tree and then aggregated into irq/core | 
 |  | 
 |    - **Time, timers, timekeeping, NOHZ and related chip drivers**: | 
 |  | 
 |      - timekeeping, clocksource core, NTP and alarmtimer development | 
 |        happens in the timers/core branch, but patches are usually applied in | 
 |        a separate maintainer tree and then aggregated into timers/core | 
 |  | 
 |      - clocksource/event driver development happens in the timers/core | 
 |        branch, but patches are mostly applied in a separate maintainer tree | 
 |        and then aggregated into timers/core | 
 |  | 
 |    - **Performance counters core, architecture support and tooling**: | 
 |  | 
 |      - perf core and architecture support development happens in the | 
 |        perf/core branch | 
 |  | 
 |      - perf tooling development happens in the perf tools maintainer | 
 |        tree and is aggregated into the tip tree. | 
 |  | 
 |    - **CPU hotplug core** | 
 |  | 
 |    - **RAS core** | 
 |  | 
 |      Mostly x86-specific RAS patches are collected in the tip ras/core | 
 |      branch. | 
 |  | 
 |    - **EFI core** | 
 |  | 
 |      EFI development in the efi git tree. The collected patches are | 
 |      aggregated in the tip efi/core branch. | 
 |  | 
 |    - **RCU** | 
 |  | 
 |      RCU development happens in the linux-rcu tree. The resulting changes | 
 |      are aggregated into the tip core/rcu branch. | 
 |  | 
 |    - **Various core code components**: | 
 |  | 
 |        - debugobjects | 
 |  | 
 |        - objtool | 
 |  | 
 |        - random bits and pieces | 
 |  | 
 |  | 
 | Patch submission notes | 
 | ---------------------- | 
 |  | 
 | Selecting the tree/branch | 
 | ^^^^^^^^^^^^^^^^^^^^^^^^^ | 
 |  | 
 | In general, development against the head of the tip tree master branch is | 
 | fine, but for the subsystems which are maintained separately, have their | 
 | own git tree and are only aggregated into the tip tree, development should | 
 | take place against the relevant subsystem tree or branch. | 
 |  | 
 | Bug fixes which target mainline should always be applicable against the | 
 | mainline kernel tree. Potential conflicts against changes which are already | 
 | queued in the tip tree are handled by the maintainers. | 
 |  | 
 | Patch subject | 
 | ^^^^^^^^^^^^^ | 
 |  | 
 | The tip tree preferred format for patch subject prefixes is | 
 | 'subsys/component:', e.g. 'x86/apic:', 'x86/mm/fault:', 'sched/fair:', | 
 | 'genirq/core:'. Please do not use file names or complete file paths as | 
 | prefix. 'git log path/to/file' should give you a reasonable hint in most | 
 | cases. | 
 |  | 
 | The condensed patch description in the subject line should start with a | 
 | uppercase letter and should be written in imperative tone. | 
 |  | 
 |  | 
 | Changelog | 
 | ^^^^^^^^^ | 
 |  | 
 | The general rules about changelogs in the :ref:`Submitting patches guide | 
 | <describe_changes>`, apply. | 
 |  | 
 | The tip tree maintainers set value on following these rules, especially on | 
 | the request to write changelogs in imperative mood and not impersonating | 
 | code or the execution of it. This is not just a whim of the | 
 | maintainers. Changelogs written in abstract words are more precise and | 
 | tend to be less confusing than those written in the form of novels. | 
 |  | 
 | It's also useful to structure the changelog into several paragraphs and not | 
 | lump everything together into a single one. A good structure is to explain | 
 | the context, the problem and the solution in separate paragraphs and this | 
 | order. | 
 |  | 
 | Examples for illustration: | 
 |  | 
 |   Example 1:: | 
 |  | 
 |     x86/intel_rdt/mbm: Fix MBM overflow handler during hot cpu | 
 |  | 
 |     When a CPU is dying, we cancel the worker and schedule a new worker on a | 
 |     different CPU on the same domain. But if the timer is already about to | 
 |     expire (say 0.99s) then we essentially double the interval. | 
 |  | 
 |     We modify the hot cpu handling to cancel the delayed work on the dying | 
 |     cpu and run the worker immediately on a different cpu in same domain. We | 
 |     do not flush the worker because the MBM overflow worker reschedules the | 
 |     worker on same CPU and scans the domain->cpu_mask to get the domain | 
 |     pointer. | 
 |  | 
 |   Improved version:: | 
 |  | 
 |     x86/intel_rdt/mbm: Fix MBM overflow handler during CPU hotplug | 
 |  | 
 |     When a CPU is dying, the overflow worker is canceled and rescheduled on a | 
 |     different CPU in the same domain. But if the timer is already about to | 
 |     expire this essentially doubles the interval which might result in a non | 
 |     detected overflow. | 
 |  | 
 |     Cancel the overflow worker and reschedule it immediately on a different CPU | 
 |     in the same domain. The work could be flushed as well, but that would | 
 |     reschedule it on the same CPU. | 
 |  | 
 |   Example 2:: | 
 |  | 
 |     time: POSIX CPU timers: Ensure that variable is initialized | 
 |  | 
 |     If cpu_timer_sample_group returns -EINVAL, it will not have written into | 
 |     *sample. Checking for cpu_timer_sample_group's return value precludes the | 
 |     potential use of an uninitialized value of now in the following block. | 
 |     Given an invalid clock_idx, the previous code could otherwise overwrite | 
 |     *oldval in an undefined manner. This is now prevented. We also exploit | 
 |     short-circuiting of && to sample the timer only if the result will | 
 |     actually be used to update *oldval. | 
 |  | 
 |   Improved version:: | 
 |  | 
 |     posix-cpu-timers: Make set_process_cpu_timer() more robust | 
 |  | 
 |     Because the return value of cpu_timer_sample_group() is not checked, | 
 |     compilers and static checkers can legitimately warn about a potential use | 
 |     of the uninitialized variable 'now'. This is not a runtime issue as all | 
 |     call sites hand in valid clock ids. | 
 |  | 
 |     Also cpu_timer_sample_group() is invoked unconditionally even when the | 
 |     result is not used because *oldval is NULL. | 
 |  | 
 |     Make the invocation conditional and check the return value. | 
 |  | 
 |   Example 3:: | 
 |  | 
 |     The entity can also be used for other purposes. | 
 |  | 
 |     Let's rename it to be more generic. | 
 |  | 
 |   Improved version:: | 
 |  | 
 |     The entity can also be used for other purposes. | 
 |  | 
 |     Rename it to be more generic. | 
 |  | 
 |  | 
 | For complex scenarios, especially race conditions and memory ordering | 
 | issues, it is valuable to depict the scenario with a table which shows | 
 | the parallelism and the temporal order of events. Here is an example:: | 
 |  | 
 |     CPU0                            CPU1 | 
 |     free_irq(X)                     interrupt X | 
 |                                     spin_lock(desc->lock) | 
 |                                     wake irq thread() | 
 |                                     spin_unlock(desc->lock) | 
 |     spin_lock(desc->lock) | 
 |     remove action() | 
 |     shutdown_irq() | 
 |     release_resources()             thread_handler() | 
 |     spin_unlock(desc->lock)           access released resources. | 
 |                                       ^^^^^^^^^^^^^^^^^^^^^^^^^ | 
 |     synchronize_irq() | 
 |  | 
 | Lockdep provides similar useful output to depict a possible deadlock | 
 | scenario:: | 
 |  | 
 |     CPU0                                    CPU1 | 
 |     rtmutex_lock(&rcu->rt_mutex) | 
 |       spin_lock(&rcu->rt_mutex.wait_lock) | 
 |                                             local_irq_disable() | 
 |                                             spin_lock(&timer->it_lock) | 
 |                                             spin_lock(&rcu->mutex.wait_lock) | 
 |     --> Interrupt | 
 |         spin_lock(&timer->it_lock) | 
 |  | 
 |  | 
 | Function references in changelogs | 
 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
 |  | 
 | When a function is mentioned in the changelog, either the text body or the | 
 | subject line, please use the format 'function_name()'. Omitting the | 
 | brackets after the function name can be ambiguous:: | 
 |  | 
 |   Subject: subsys/component: Make reservation_count static | 
 |  | 
 |   reservation_count is only used in reservation_stats. Make it static. | 
 |  | 
 | The variant with brackets is more precise:: | 
 |  | 
 |   Subject: subsys/component: Make reservation_count() static | 
 |  | 
 |   reservation_count() is only called from reservation_stats(). Make it | 
 |   static. | 
 |  | 
 |  | 
 | Backtraces in changelogs | 
 | ^^^^^^^^^^^^^^^^^^^^^^^^ | 
 |  | 
 | See :ref:`backtraces`. | 
 |  | 
 | Ordering of commit tags | 
 | ^^^^^^^^^^^^^^^^^^^^^^^ | 
 |  | 
 | To have a uniform view of the commit tags, the tip maintainers use the | 
 | following tag ordering scheme: | 
 |  | 
 |  - Fixes: 12char-SHA1 ("sub/sys: Original subject line") | 
 |  | 
 |    A Fixes tag should be added even for changes which do not need to be | 
 |    backported to stable kernels, i.e. when addressing a recently introduced | 
 |    issue which only affects tip or the current head of mainline. These tags | 
 |    are helpful to identify the original commit and are much more valuable | 
 |    than prominently mentioning the commit which introduced a problem in the | 
 |    text of the changelog itself because they can be automatically | 
 |    extracted. | 
 |  | 
 |    The following example illustrates the difference:: | 
 |  | 
 |      Commit | 
 |  | 
 |        abcdef012345678 ("x86/xxx: Replace foo with bar") | 
 |  | 
 |      left an unused instance of variable foo around. Remove it. | 
 |  | 
 |      Signed-off-by: J.Dev <j.dev@mail> | 
 |  | 
 |    Please say instead:: | 
 |  | 
 |      The recent replacement of foo with bar left an unused instance of | 
 |      variable foo around. Remove it. | 
 |  | 
 |      Fixes: abcdef012345678 ("x86/xxx: Replace foo with bar") | 
 |      Signed-off-by: J.Dev <j.dev@mail> | 
 |  | 
 |    The latter puts the information about the patch into the focus and | 
 |    amends it with the reference to the commit which introduced the issue | 
 |    rather than putting the focus on the original commit in the first place. | 
 |  | 
 |  - Reported-by: ``Reporter <reporter@mail>`` | 
 |  | 
 |  - Closes: ``URL or Message-ID of the bug report this is fixing`` | 
 |  | 
 |  - Originally-by: ``Original author <original-author@mail>`` | 
 |  | 
 |  - Suggested-by: ``Suggester <suggester@mail>`` | 
 |  | 
 |  - Co-developed-by: ``Co-author <co-author@mail>`` | 
 |  | 
 |    Signed-off-by: ``Co-author <co-author@mail>`` | 
 |  | 
 |    Note, that Co-developed-by and Signed-off-by of the co-author(s) must | 
 |    come in pairs. | 
 |  | 
 |  - Signed-off-by: ``Author <author@mail>`` | 
 |  | 
 |    The first Signed-off-by (SOB) after the last Co-developed-by/SOB pair is the | 
 |    author SOB, i.e. the person flagged as author by git. | 
 |  | 
 |  - Signed-off-by: ``Patch handler <handler@mail>`` | 
 |  | 
 |    SOBs after the author SOB are from people handling and transporting | 
 |    the patch, but were not involved in development. SOB chains should | 
 |    reflect the **real** route a patch took as it was propagated to us, | 
 |    with the first SOB entry signalling primary authorship of a single | 
 |    author. Acks should be given as Acked-by lines and review approvals | 
 |    as Reviewed-by lines. | 
 |  | 
 |    If the handler made modifications to the patch or the changelog, then | 
 |    this should be mentioned **after** the changelog text and **above** | 
 |    all commit tags in the following format:: | 
 |  | 
 |      ... changelog text ends. | 
 |  | 
 |      [ handler: Replaced foo by bar and updated changelog ] | 
 |  | 
 |      First-tag: ..... | 
 |  | 
 |    Note the two empty new lines which separate the changelog text and the | 
 |    commit tags from that notice. | 
 |  | 
 |    If a patch is sent to the mailing list by a handler then the author has | 
 |    to be noted in the first line of the changelog with:: | 
 |  | 
 |      From: Author <author@mail> | 
 |  | 
 |      Changelog text starts here.... | 
 |  | 
 |    so the authorship is preserved. The 'From:' line has to be followed | 
 |    by a empty newline. If that 'From:' line is missing, then the patch | 
 |    would be attributed to the person who sent (transported, handled) it. | 
 |    The 'From:' line is automatically removed when the patch is applied | 
 |    and does not show up in the final git changelog. It merely affects | 
 |    the authorship information of the resulting Git commit. | 
 |  | 
 |  - Tested-by: ``Tester <tester@mail>`` | 
 |  | 
 |  - Reviewed-by: ``Reviewer <reviewer@mail>`` | 
 |  | 
 |  - Acked-by: ``Acker <acker@mail>`` | 
 |  | 
 |  - Cc: ``cc-ed-person <person@mail>`` | 
 |  | 
 |    If the patch should be backported to stable, then please add a '``Cc: | 
 |    stable@vger.kernel.org``' tag, but do not Cc stable when sending your | 
 |    mail. | 
 |  | 
 |  - Link: ``https://link/to/information`` | 
 |  | 
 |    For referring to an email posted to the kernel mailing lists, please | 
 |    use the lore.kernel.org redirector URL:: | 
 |  | 
 |      Link: https://lore.kernel.org/email-message-id@here | 
 |  | 
 |    This URL should be used when referring to relevant mailing list | 
 |    topics, related patch sets, or other notable discussion threads. | 
 |    A convenient way to associate ``Link:`` trailers with the commit | 
 |    message is to use markdown-like bracketed notation, for example:: | 
 |  | 
 |      A similar approach was attempted before as part of a different | 
 |      effort [1], but the initial implementation caused too many | 
 |      regressions [2], so it was backed out and reimplemented. | 
 |  | 
 |      Link: https://lore.kernel.org/some-msgid@here # [1] | 
 |      Link: https://bugzilla.example.org/bug/12345  # [2] | 
 |  | 
 |    You can also use ``Link:`` trailers to indicate the origin of the | 
 |    patch when applying it to your git tree. In that case, please use the | 
 |    dedicated ``patch.msgid.link`` domain instead of ``lore.kernel.org``. | 
 |    This practice makes it possible for automated tooling to identify | 
 |    which link to use to retrieve the original patch submission. For | 
 |    example:: | 
 |  | 
 |      Link: https://patch.msgid.link/patch-source-message-id@here | 
 |  | 
 | Please do not use combined tags, e.g. ``Reported-and-tested-by``, as | 
 | they just complicate automated extraction of tags. | 
 |  | 
 |  | 
 | Links to documentation | 
 | ^^^^^^^^^^^^^^^^^^^^^^ | 
 |  | 
 | Providing links to documentation in the changelog is a great help to later | 
 | debugging and analysis.  Unfortunately, URLs often break very quickly | 
 | because companies restructure their websites frequently.  Non-'volatile' | 
 | exceptions include the Intel SDM and the AMD APM. | 
 |  | 
 | Therefore, for 'volatile' documents, please create an entry in the kernel | 
 | bugzilla https://bugzilla.kernel.org and attach a copy of these documents | 
 | to the bugzilla entry. Finally, provide the URL of the bugzilla entry in | 
 | the changelog. | 
 |  | 
 | Patch resend or reminders | 
 | ^^^^^^^^^^^^^^^^^^^^^^^^^ | 
 |  | 
 | See :ref:`resend_reminders`. | 
 |  | 
 | Merge window | 
 | ^^^^^^^^^^^^ | 
 |  | 
 | Please do not expect patches to be reviewed or merged by tip | 
 | maintainers around or during the merge window.  The trees are closed | 
 | to all but urgent fixes during this time.  They reopen once the merge | 
 | window closes and a new -rc1 kernel has been released. | 
 |  | 
 | Large series should be submitted in mergeable state *at* *least* a week | 
 | before the merge window opens.  Exceptions are made for bug fixes and | 
 | *sometimes* for small standalone drivers for new hardware or minimally | 
 | invasive patches for hardware enablement. | 
 |  | 
 | During the merge window, the maintainers instead focus on following the | 
 | upstream changes, fixing merge window fallout, collecting bug fixes, and | 
 | allowing themselves a breath. Please respect that. | 
 |  | 
 | So called _urgent_ branches will be merged into mainline during the | 
 | stabilization phase of each release. | 
 |  | 
 |  | 
 | Git | 
 | ^^^ | 
 |  | 
 | The tip maintainers accept git pull requests from maintainers who provide | 
 | subsystem changes for aggregation in the tip tree. | 
 |  | 
 | Pull requests for new patch submissions are usually not accepted and do not | 
 | replace proper patch submission to the mailing list. The main reason for | 
 | this is that the review workflow is email based. | 
 |  | 
 | If you submit a larger patch series it is helpful to provide a git branch | 
 | in a private repository which allows interested people to easily pull the | 
 | series for testing. The usual way to offer this is a git URL in the cover | 
 | letter of the patch series. | 
 |  | 
 | Testing | 
 | ^^^^^^^ | 
 |  | 
 | Code should be tested before submitting to the tip maintainers.  Anything | 
 | other than minor changes should be built, booted and tested with | 
 | comprehensive (and heavyweight) kernel debugging options enabled. | 
 |  | 
 | These debugging options can be found in kernel/configs/x86_debug.config | 
 | and can be added to an existing kernel config by running: | 
 |  | 
 | 	make x86_debug.config | 
 |  | 
 | Some of these options are x86-specific and can be left out when testing | 
 | on other architectures. | 
 |  | 
 | .. _maintainer-tip-coding-style: | 
 |  | 
 | Coding style notes | 
 | ------------------ | 
 |  | 
 | Comment style | 
 | ^^^^^^^^^^^^^ | 
 |  | 
 | Sentences in comments start with an uppercase letter. | 
 |  | 
 | Single line comments:: | 
 |  | 
 | 	/* This is a single line comment */ | 
 |  | 
 | Multi-line comments:: | 
 |  | 
 | 	/* | 
 | 	 * This is a properly formatted | 
 | 	 * multi-line comment. | 
 | 	 * | 
 | 	 * Larger multi-line comments should be split into paragraphs. | 
 | 	 */ | 
 |  | 
 | No tail comments (see below): | 
 |  | 
 |   Please refrain from using tail comments. Tail comments disturb the | 
 |   reading flow in almost all contexts, but especially in code:: | 
 |  | 
 | 	if (somecondition_is_true) /* Don't put a comment here */ | 
 | 		dostuff(); /* Neither here */ | 
 |  | 
 | 	seed = MAGIC_CONSTANT; /* Nor here */ | 
 |  | 
 |   Use freestanding comments instead:: | 
 |  | 
 | 	/* This condition is not obvious without a comment */ | 
 | 	if (somecondition_is_true) { | 
 | 		/* This really needs to be documented */ | 
 | 		dostuff(); | 
 | 	} | 
 |  | 
 | 	/* This magic initialization needs a comment. Maybe not? */ | 
 | 	seed = MAGIC_CONSTANT; | 
 |  | 
 |   Use C++ style, tail comments when documenting structs in headers to | 
 |   achieve a more compact layout and better readability:: | 
 |  | 
 |         // eax | 
 |         u32     x2apic_shift    :  5, // Number of bits to shift APIC ID right | 
 |                                       // for the topology ID at the next level | 
 |                                 : 27; // Reserved | 
 |         // ebx | 
 |         u32     num_processors  : 16, // Number of processors at current level | 
 |                                 : 16; // Reserved | 
 |  | 
 |   versus:: | 
 |  | 
 | 	/* eax */ | 
 | 	        /* | 
 | 	         * Number of bits to shift APIC ID right for the topology ID | 
 | 	         * at the next level | 
 | 	         */ | 
 |          u32     x2apic_shift    :  5, | 
 | 		 /* Reserved */ | 
 | 				 : 27; | 
 |  | 
 | 	/* ebx */ | 
 | 		/* Number of processors at current level */ | 
 | 	u32     num_processors  : 16, | 
 | 		/* Reserved */ | 
 | 				: 16; | 
 |  | 
 | Comment the important things: | 
 |  | 
 |   Comments should be added where the operation is not obvious. Documenting | 
 |   the obvious is just a distraction:: | 
 |  | 
 | 	/* Decrement refcount and check for zero */ | 
 | 	if (refcount_dec_and_test(&p->refcnt)) { | 
 | 		do; | 
 | 		lots; | 
 | 		of; | 
 | 		magic; | 
 | 		things; | 
 | 	} | 
 |  | 
 |   Instead, comments should explain the non-obvious details and document | 
 |   constraints:: | 
 |  | 
 | 	if (refcount_dec_and_test(&p->refcnt)) { | 
 | 		/* | 
 | 		 * Really good explanation why the magic things below | 
 | 		 * need to be done, ordering and locking constraints, | 
 | 		 * etc.. | 
 | 		 */ | 
 | 		do; | 
 | 		lots; | 
 | 		of; | 
 | 		magic; | 
 | 		/* Needs to be the last operation because ... */ | 
 | 		things; | 
 | 	} | 
 |  | 
 | Function documentation comments: | 
 |  | 
 |   To document functions and their arguments please use kernel-doc format | 
 |   and not free form comments:: | 
 |  | 
 | 	/** | 
 | 	 * magic_function - Do lots of magic stuff | 
 | 	 * @magic:	Pointer to the magic data to operate on | 
 | 	 * @offset:	Offset in the data array of @magic | 
 | 	 * | 
 | 	 * Deep explanation of mysterious things done with @magic along | 
 |          * with documentation of the return values. | 
 | 	 * | 
 | 	 * Note, that the argument descriptors above are arranged | 
 | 	 * in a tabular fashion. | 
 | 	 */ | 
 |  | 
 |   This applies especially to globally visible functions and inline | 
 |   functions in public header files. It might be overkill to use kernel-doc | 
 |   format for every (static) function which needs a tiny explanation. The | 
 |   usage of descriptive function names often replaces these tiny comments. | 
 |   Apply common sense as always. | 
 |  | 
 |  | 
 | Documenting locking requirements | 
 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
 |   Documenting locking requirements is a good thing, but comments are not | 
 |   necessarily the best choice. Instead of writing:: | 
 |  | 
 | 	/* Caller must hold foo->lock */ | 
 | 	void func(struct foo *foo) | 
 | 	{ | 
 | 		... | 
 | 	} | 
 |  | 
 |   Please use:: | 
 |  | 
 | 	void func(struct foo *foo) | 
 | 	{ | 
 | 		lockdep_assert_held(&foo->lock); | 
 | 		... | 
 | 	} | 
 |  | 
 |   In PROVE_LOCKING kernels, lockdep_assert_held() emits a warning | 
 |   if the caller doesn't hold the lock.  Comments can't do that. | 
 |  | 
 | Bracket rules | 
 | ^^^^^^^^^^^^^ | 
 |  | 
 | Brackets should be omitted only if the statement which follows 'if', 'for', | 
 | 'while' etc. is truly a single line:: | 
 |  | 
 | 	if (foo) | 
 | 		do_something(); | 
 |  | 
 | The following is not considered to be a single line statement even | 
 | though C does not require brackets:: | 
 |  | 
 | 	for (i = 0; i < end; i++) | 
 | 		if (foo[i]) | 
 | 			do_something(foo[i]); | 
 |  | 
 | Adding brackets around the outer loop enhances the reading flow:: | 
 |  | 
 | 	for (i = 0; i < end; i++) { | 
 | 		if (foo[i]) | 
 | 			do_something(foo[i]); | 
 | 	} | 
 |  | 
 |  | 
 | Variable declarations | 
 | ^^^^^^^^^^^^^^^^^^^^^ | 
 |  | 
 | The preferred ordering of variable declarations at the beginning of a | 
 | function is reverse fir tree order:: | 
 |  | 
 | 	struct long_struct_name *descriptive_name; | 
 | 	unsigned long foo, bar; | 
 | 	unsigned int tmp; | 
 | 	int ret; | 
 |  | 
 | The above is faster to parse than the reverse ordering:: | 
 |  | 
 | 	int ret; | 
 | 	unsigned int tmp; | 
 | 	unsigned long foo, bar; | 
 | 	struct long_struct_name *descriptive_name; | 
 |  | 
 | And even more so than random ordering:: | 
 |  | 
 | 	unsigned long foo, bar; | 
 | 	int ret; | 
 | 	struct long_struct_name *descriptive_name; | 
 | 	unsigned int tmp; | 
 |  | 
 | Also please try to aggregate variables of the same type into a single | 
 | line. There is no point in wasting screen space:: | 
 |  | 
 | 	unsigned long a; | 
 | 	unsigned long b; | 
 | 	unsigned long c; | 
 | 	unsigned long d; | 
 |  | 
 | It's really sufficient to do:: | 
 |  | 
 | 	unsigned long a, b, c, d; | 
 |  | 
 | Please also refrain from introducing line splits in variable declarations:: | 
 |  | 
 | 	struct long_struct_name *descriptive_name = container_of(bar, | 
 | 						      struct long_struct_name, | 
 | 	                                              member); | 
 | 	struct foobar foo; | 
 |  | 
 | It's way better to move the initialization to a separate line after the | 
 | declarations:: | 
 |  | 
 | 	struct long_struct_name *descriptive_name; | 
 | 	struct foobar foo; | 
 |  | 
 | 	descriptive_name = container_of(bar, struct long_struct_name, member); | 
 |  | 
 |  | 
 | Variable types | 
 | ^^^^^^^^^^^^^^ | 
 |  | 
 | Please use the proper u8, u16, u32, u64 types for variables which are meant | 
 | to describe hardware or are used as arguments for functions which access | 
 | hardware. These types are clearly defining the bit width and avoid | 
 | truncation, expansion and 32/64-bit confusion. | 
 |  | 
 | u64 is also recommended in code which would become ambiguous for 32-bit | 
 | kernels when 'unsigned long' would be used instead. While in such | 
 | situations 'unsigned long long' could be used as well, u64 is shorter | 
 | and also clearly shows that the operation is required to be 64 bits wide | 
 | independent of the target CPU. | 
 |  | 
 | Please use 'unsigned int' instead of 'unsigned'. | 
 |  | 
 |  | 
 | Constants | 
 | ^^^^^^^^^ | 
 |  | 
 | Please do not use literal (hexa)decimal numbers in code or initializers. | 
 | Either use proper defines which have descriptive names or consider using | 
 | an enum. | 
 |  | 
 |  | 
 | Struct declarations and initializers | 
 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
 |  | 
 | Struct declarations should align the struct member names in a tabular | 
 | fashion:: | 
 |  | 
 | 	struct bar_order { | 
 | 		unsigned int	guest_id; | 
 | 		int		ordered_item; | 
 | 		struct menu	*menu; | 
 | 	}; | 
 |  | 
 | Please avoid documenting struct members within the declaration, because | 
 | this often results in strangely formatted comments and the struct members | 
 | become obfuscated:: | 
 |  | 
 | 	struct bar_order { | 
 | 		unsigned int	guest_id; /* Unique guest id */ | 
 | 		int		ordered_item; | 
 | 		/* Pointer to a menu instance which contains all the drinks */ | 
 | 		struct menu	*menu; | 
 | 	}; | 
 |  | 
 | Instead, please consider using the kernel-doc format in a comment preceding | 
 | the struct declaration, which is easier to read and has the added advantage | 
 | of including the information in the kernel documentation, for example, as | 
 | follows:: | 
 |  | 
 |  | 
 | 	/** | 
 | 	 * struct bar_order - Description of a bar order | 
 | 	 * @guest_id:		Unique guest id | 
 | 	 * @ordered_item:	The item number from the menu | 
 | 	 * @menu:		Pointer to the menu from which the item | 
 | 	 *  			was ordered | 
 | 	 * | 
 | 	 * Supplementary information for using the struct. | 
 | 	 * | 
 | 	 * Note, that the struct member descriptors above are arranged | 
 | 	 * in a tabular fashion. | 
 | 	 */ | 
 | 	struct bar_order { | 
 | 		unsigned int	guest_id; | 
 | 		int		ordered_item; | 
 | 		struct menu	*menu; | 
 | 	}; | 
 |  | 
 | Static struct initializers must use C99 initializers and should also be | 
 | aligned in a tabular fashion:: | 
 |  | 
 | 	static struct foo statfoo = { | 
 | 		.a		= 0, | 
 | 		.plain_integer	= CONSTANT_DEFINE_OR_ENUM, | 
 | 		.bar		= &statbar, | 
 | 	}; | 
 |  | 
 | Note that while C99 syntax allows the omission of the final comma, | 
 | we recommend the use of a comma on the last line because it makes | 
 | reordering and addition of new lines easier, and makes such future | 
 | patches slightly easier to read as well. | 
 |  | 
 | Line breaks | 
 | ^^^^^^^^^^^ | 
 |  | 
 | Restricting line length to 80 characters makes deeply indented code hard to | 
 | read.  Consider breaking out code into helper functions to avoid excessive | 
 | line breaking. | 
 |  | 
 | The 80 character rule is not a strict rule, so please use common sense when | 
 | breaking lines. Especially format strings should never be broken up. | 
 |  | 
 | When splitting function declarations or function calls, then please align | 
 | the first argument in the second line with the first argument in the first | 
 | line:: | 
 |  | 
 |   static int long_function_name(struct foobar *barfoo, unsigned int id, | 
 | 				unsigned int offset) | 
 |   { | 
 |  | 
 | 	if (!id) { | 
 | 		ret = longer_function_name(barfoo, DEFAULT_BARFOO_ID, | 
 | 					   offset); | 
 | 	... | 
 |  | 
 | Namespaces | 
 | ^^^^^^^^^^ | 
 |  | 
 | Function/variable namespaces improve readability and allow easy | 
 | grepping. These namespaces are string prefixes for globally visible | 
 | function and variable names, including inlines. These prefixes should | 
 | combine the subsystem and the component name such as 'x86_comp\_', | 
 | 'sched\_', 'irq\_', and 'mutex\_'. | 
 |  | 
 | This also includes static file scope functions that are immediately put | 
 | into globally visible driver templates - it's useful for those symbols | 
 | to carry a good prefix as well, for backtrace readability. | 
 |  | 
 | Namespace prefixes may be omitted for local static functions and | 
 | variables. Truly local functions, only called by other local functions, | 
 | can have shorter descriptive names - our primary concern is greppability | 
 | and backtrace readability. | 
 |  | 
 | Please note that 'xxx_vendor\_' and 'vendor_xxx_` prefixes are not | 
 | helpful for static functions in vendor-specific files. After all, it | 
 | is already clear that the code is vendor-specific. In addition, vendor | 
 | names should only be for truly vendor-specific functionality. | 
 |  | 
 | As always apply common sense and aim for consistency and readability. | 
 |  | 
 |  | 
 | Commit notifications | 
 | -------------------- | 
 |  | 
 | The tip tree is monitored by a bot for new commits. The bot sends an email | 
 | for each new commit to a dedicated mailing list | 
 | (``linux-tip-commits@vger.kernel.org``) and Cc's all people who are | 
 | mentioned in one of the commit tags. It uses the email message ID from the | 
 | Link tag at the end of the tag list to set the In-Reply-To email header so | 
 | the message is properly threaded with the patch submission email. | 
 |  | 
 | The tip maintainers and submaintainers try to reply to the submitter | 
 | when merging a patch, but they sometimes forget or it does not fit the | 
 | workflow of the moment. While the bot message is purely mechanical, it | 
 | also implies a 'Thank you! Applied.'. |