| .. 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.'. |