297 lines
13 KiB
ReStructuredText
297 lines
13 KiB
ReStructuredText
|
.. 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.
|
||
|
|
||
|
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.
|