| .. SPDX-License-Identifier: GPL-2.0 |
| |
| How to help improve kernel documentation |
| ======================================== |
| |
| Documentation is an important part of any software-development project. |
| Good documentation helps to bring new developers in and helps established |
| developers work more effectively. Without top-quality documentation, a lot |
| of time is wasted in reverse-engineering the code and making avoidable |
| mistakes. |
| |
| Unfortunately, the kernel's documentation currently falls far short of what |
| it needs to be to support a project of this size and importance. |
| |
| This guide is for contributors who would like to improve that situation. |
| Kernel documentation improvements can be made by developers at a variety of |
| skill levels; they are a relatively easy way to learn the kernel process in |
| general and find a place in the community. The bulk of what follows is the |
| documentation maintainer's list of tasks that most urgently need to be |
| done. |
| |
| The documentation TODO list |
| --------------------------- |
| |
| There is an endless list of tasks that need to be carried out to get our |
| documentation to where it should be. This list contains a number of |
| important items, but is far from exhaustive; if you see a different way to |
| improve the documentation, please do not hold back! |
| |
| Addressing warnings |
| ~~~~~~~~~~~~~~~~~~~ |
| |
| The documentation build currently spews out an unbelievable number of |
| warnings. When you have that many, you might as well have none at all; |
| people ignore them, and they will never notice when their work adds new |
| ones. For this reason, eliminating warnings is one of the highest-priority |
| tasks on the documentation TODO list. The task itself is reasonably |
| straightforward, but it must be approached in the right way to be |
| successful. |
| |
| Warnings issued by a compiler for C code can often be dismissed as false |
| positives, leading to patches aimed at simply shutting the compiler up. |
| Warnings from the documentation build almost always point at a real |
| problem; making those warnings go away requires understanding the problem |
| and fixing it at its source. For this reason, patches fixing documentation |
| warnings should probably not say "fix a warning" in the changelog title; |
| they should indicate the real problem that has been fixed. |
| |
| Another important point is that documentation warnings are often created by |
| problems in kerneldoc comments in C code. While the documentation |
| maintainer appreciates being copied on fixes for these warnings, the |
| documentation tree is often not the right one to actually carry those |
| fixes; they should go to the maintainer of the subsystem in question. |
| |
| For example, in a documentation build I grabbed a pair of warnings nearly |
| at random:: |
| |
| ./drivers/devfreq/devfreq.c:1818: warning: bad line: |
| - Resource-managed devfreq_register_notifier() |
| ./drivers/devfreq/devfreq.c:1854: warning: bad line: |
| - Resource-managed devfreq_unregister_notifier() |
| |
| (The lines were split for readability). |
| |
| A quick look at the source file named above turned up a couple of kerneldoc |
| comments that look like this:: |
| |
| /** |
| * devm_devfreq_register_notifier() |
| - Resource-managed devfreq_register_notifier() |
| * @dev: The devfreq user device. (parent of devfreq) |
| * @devfreq: The devfreq object. |
| * @nb: The notifier block to be unregistered. |
| * @list: DEVFREQ_TRANSITION_NOTIFIER. |
| */ |
| |
| The problem is the missing "*", which confuses the build system's |
| simplistic idea of what C comment blocks look like. This problem had been |
| present since that comment was added in 2016 — a full four years. Fixing |
| it was a matter of adding the missing asterisks. A quick look at the |
| history for that file showed what the normal format for subject lines is, |
| and ``scripts/get_maintainer.pl`` told me who should receive it (pass paths to |
| your patches as arguments to scripts/get_maintainer.pl). The resulting patch |
| looked like this:: |
| |
| [PATCH] PM / devfreq: Fix two malformed kerneldoc comments |
| |
| Two kerneldoc comments in devfreq.c fail to adhere to the required format, |
| resulting in these doc-build warnings: |
| |
| ./drivers/devfreq/devfreq.c:1818: warning: bad line: |
| - Resource-managed devfreq_register_notifier() |
| ./drivers/devfreq/devfreq.c:1854: warning: bad line: |
| - Resource-managed devfreq_unregister_notifier() |
| |
| Add a couple of missing asterisks and make kerneldoc a little happier. |
| |
| Signed-off-by: Jonathan Corbet <corbet@lwn.net> |
| --- |
| drivers/devfreq/devfreq.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c |
| index 57f6944d65a6..00c9b80b3d33 100644 |
| --- a/drivers/devfreq/devfreq.c |
| +++ b/drivers/devfreq/devfreq.c |
| @@ -1814,7 +1814,7 @@ static void devm_devfreq_notifier_release(struct device *dev, void *res) |
| |
| /** |
| * devm_devfreq_register_notifier() |
| - - Resource-managed devfreq_register_notifier() |
| + * - Resource-managed devfreq_register_notifier() |
| * @dev: The devfreq user device. (parent of devfreq) |
| * @devfreq: The devfreq object. |
| * @nb: The notifier block to be unregistered. |
| @@ -1850,7 +1850,7 @@ EXPORT_SYMBOL(devm_devfreq_register_notifier); |
| |
| /** |
| * devm_devfreq_unregister_notifier() |
| - - Resource-managed devfreq_unregister_notifier() |
| + * - Resource-managed devfreq_unregister_notifier() |
| * @dev: The devfreq user device. (parent of devfreq) |
| * @devfreq: The devfreq object. |
| * @nb: The notifier block to be unregistered. |
| -- |
| 2.24.1 |
| |
| The entire process only took a few minutes. Of course, I then found that |
| somebody else had fixed it in a separate tree, highlighting another lesson: |
| always check linux-next to see if a problem has been fixed before you dig |
| into it. |
| |
| Other fixes will take longer, especially those relating to structure |
| members or function parameters that lack documentation. In such cases, it |
| is necessary to work out what the role of those members or parameters is |
| and describe them correctly. Overall, this task gets a little tedious at |
| times, but it's highly important. If we can actually eliminate warnings |
| from the documentation build, then we can start expecting developers to |
| avoid adding new ones. |
| |
| In addition to warnings from the regular documentation build, you can also |
| run ``make refcheckdocs`` to find references to nonexistent documentation |
| files. |
| |
| Languishing kerneldoc comments |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Developers are encouraged to write kerneldoc comments for their code, but |
| many of those comments are never pulled into the docs build. That makes |
| this information harder to find and, for example, makes Sphinx unable to |
| generate links to that documentation. Adding ``kernel-doc`` directives to |
| the documentation to bring those comments in can help the community derive |
| the full value of the work that has gone into creating them. |
| |
| The ``scripts/find-unused-docs.sh`` tool can be used to find these |
| overlooked comments. |
| |
| Note that the most value comes from pulling in the documentation for |
| exported functions and data structures. Many subsystems also have |
| kerneldoc comments for internal use; those should not be pulled into the |
| documentation build unless they are placed in a document that is |
| specifically aimed at developers working within the relevant subsystem. |
| |
| |
| Typo fixes |
| ~~~~~~~~~~ |
| |
| Fixing typographical or formatting errors in the documentation is a quick |
| way to figure out how to create and send patches, and it is a useful |
| service. I am always willing to accept such patches. That said, once you |
| have fixed a few, please consider moving on to more advanced tasks, leaving |
| some typos for the next beginner to address. |
| |
| Please note that some things are *not* typos and should not be "fixed": |
| |
| - Both American and British English spellings are allowed within the |
| kernel documentation. There is no need to fix one by replacing it with |
| the other. |
| |
| - The question of whether a period should be followed by one or two spaces |
| is not to be debated in the context of kernel documentation. Other |
| areas of rational disagreement, such as the "Oxford comma", are also |
| off-topic here. |
| |
| As with any patch to any project, please consider whether your change is |
| really making things better. |
| |
| Ancient documentation |
| ~~~~~~~~~~~~~~~~~~~~~ |
| |
| Some kernel documentation is current, maintained, and useful. Some |
| documentation is ... not. Dusty, old, and inaccurate documentation can |
| mislead readers and casts doubt on our documentation as a whole. Anything |
| that can be done to address such problems is more than welcome. |
| |
| Whenever you are working with a document, please consider whether it is |
| current, whether it needs updating, or whether it should perhaps be removed |
| altogether. There are a number of warning signs that you can pay attention |
| to here: |
| |
| - References to 2.x kernels |
| - Pointers to SourceForge repositories |
| - Nothing but typo fixes in the history for several years |
| - Discussion of pre-Git workflows |
| |
| The best thing to do, of course, would be to bring the documentation |
| current, adding whatever information is needed. Such work often requires |
| the cooperation of developers familiar with the subsystem in question, of |
| course. Developers are often more than willing to cooperate with people |
| working to improve the documentation when asked nicely, and when their |
| answers are listened to and acted upon. |
| |
| Some documentation is beyond hope; we occasionally find documents that |
| refer to code that was removed from the kernel long ago, for example. |
| There is surprising resistance to removing obsolete documentation, but we |
| should do that anyway. Extra cruft in our documentation helps nobody. |
| |
| In cases where there is perhaps some useful information in a badly outdated |
| document, and you are unable to update it, the best thing to do may be to |
| add a warning at the beginning. The following text is recommended:: |
| |
| .. warning :: |
| This document is outdated and in need of attention. Please use |
| this information with caution, and please consider sending patches |
| to update it. |
| |
| That way, at least our long-suffering readers have been warned that the |
| document may lead them astray. |
| |
| Documentation coherency |
| ~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The old-timers around here will remember the Linux books that showed up on |
| the shelves in the 1990s. They were simply collections of documentation |
| files scrounged from various locations on the net. The books have (mostly) |
| improved since then, but the kernel's documentation is still mostly built |
| on that model. It is thousands of files, almost each of which was written |
| in isolation from all of the others. We don't have a coherent body of |
| kernel documentation; we have thousands of individual documents. |
| |
| We have been trying to improve the situation through the creation of |
| a set of "books" that group documentation for specific readers. These |
| include: |
| |
| - Documentation/admin-guide/index.rst |
| - Documentation/core-api/index.rst |
| - Documentation/driver-api/index.rst |
| - Documentation/userspace-api/index.rst |
| |
| As well as this book on documentation itself. |
| |
| Moving documents into the appropriate books is an important task and needs |
| to continue. There are a couple of challenges associated with this work, |
| though. Moving documentation files creates short-term pain for the people |
| who work with those files; they are understandably unenthusiastic about |
| such changes. Usually the case can be made to move a document once; we |
| really don't want to keep shifting them around, though. |
| |
| Even when all documents are in the right place, though, we have only |
| managed to turn a big pile into a group of smaller piles. The work of |
| trying to knit all of those documents together into a single whole has not |
| yet begun. If you have bright ideas on how we could proceed on that front, |
| we would be more than happy to hear them. |
| |
| Stylesheet improvements |
| ~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| With the adoption of Sphinx we have much nicer-looking HTML output than we |
| once did. But it could still use a lot of improvement; Donald Knuth and |
| Edward Tufte would be unimpressed. That requires tweaking our stylesheets |
| to create more typographically sound, accessible, and readable output. |
| |
| Be warned: if you take on this task you are heading into classic bikeshed |
| territory. Expect a lot of opinions and discussion for even relatively |
| obvious changes. That is, alas, the nature of the world we live in. |
| |
| Non-LaTeX PDF build |
| ~~~~~~~~~~~~~~~~~~~ |
| |
| This is a decidedly nontrivial task for somebody with a lot of time and |
| Python skills. The Sphinx toolchain is relatively small and well |
| contained; it is easy to add to a development system. But building PDF or |
| EPUB output requires installing LaTeX, which is anything but small or well |
| contained. That would be a nice thing to eliminate. |
| |
| The original hope had been to use the rst2pdf tool (https://rst2pdf.org/) |
| for PDF generation, but it turned out to not be up to the task. |
| Development work on rst2pdf seems to have picked up again in recent times, |
| though, which is a hopeful sign. If a suitably motivated developer were to |
| work with that project to make rst2pdf work with the kernel documentation |
| build, the world would be eternally grateful. |
| |
| Write more documentation |
| ~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Naturally, there are massive parts of the kernel that are severely |
| underdocumented. If you have the knowledge to document a specific kernel |
| subsystem and the desire to do so, please do not hesitate to do some |
| writing and contribute the result to the kernel. Untold numbers of kernel |
| developers and users will thank you. |