mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 17:08:10 +00:00
Merge branch 'docs-next' of git://git.lwn.net/linux-2.6
* 'docs-next' of git://git.lwn.net/linux-2.6: Document the debugfs API Documentation: Add "how to write a good patch summary" to SubmittingPatches SubmittingPatches: fix typo docs: Encourage better changelogs in the development process document Document Reported-by in SubmittingPatches
This commit is contained in:
commit
1904187a69
3 changed files with 246 additions and 19 deletions
|
@ -91,6 +91,10 @@ Be as specific as possible. The WORST descriptions possible include
|
||||||
things like "update driver X", "bug fix for driver X", or "this patch
|
things like "update driver X", "bug fix for driver X", or "this patch
|
||||||
includes updates for subsystem X. Please apply."
|
includes updates for subsystem X. Please apply."
|
||||||
|
|
||||||
|
The maintainer will thank you if you write your patch description in a
|
||||||
|
form which can be easily pulled into Linux's source code management
|
||||||
|
system, git, as a "commit log". See #15, below.
|
||||||
|
|
||||||
If your description starts to get long, that's a sign that you probably
|
If your description starts to get long, that's a sign that you probably
|
||||||
need to split up your patch. See #3, next.
|
need to split up your patch. See #3, next.
|
||||||
|
|
||||||
|
@ -405,7 +409,14 @@ person it names. This tag documents that potentially interested parties
|
||||||
have been included in the discussion
|
have been included in the discussion
|
||||||
|
|
||||||
|
|
||||||
14) Using Tested-by: and Reviewed-by:
|
14) Using Reported-by:, Tested-by: and Reviewed-by:
|
||||||
|
|
||||||
|
If this patch fixes a problem reported by somebody else, consider adding a
|
||||||
|
Reported-by: tag to credit the reporter for their contribution. Please
|
||||||
|
note that this tag should not be added without the reporter's permission,
|
||||||
|
especially if the problem was not reported in a public forum. That said,
|
||||||
|
if we diligently credit our bug reporters, they will, hopefully, be
|
||||||
|
inspired to help us again in the future.
|
||||||
|
|
||||||
A Tested-by: tag indicates that the patch has been successfully tested (in
|
A Tested-by: tag indicates that the patch has been successfully tested (in
|
||||||
some environment) by the person named. This tag informs maintainers that
|
some environment) by the person named. This tag informs maintainers that
|
||||||
|
@ -444,7 +455,7 @@ offer a Reviewed-by tag for a patch. This tag serves to give credit to
|
||||||
reviewers and to inform maintainers of the degree of review which has been
|
reviewers and to inform maintainers of the degree of review which has been
|
||||||
done on the patch. Reviewed-by: tags, when supplied by reviewers known to
|
done on the patch. Reviewed-by: tags, when supplied by reviewers known to
|
||||||
understand the subject area and to perform thorough reviews, will normally
|
understand the subject area and to perform thorough reviews, will normally
|
||||||
increase the liklihood of your patch getting into the kernel.
|
increase the likelihood of your patch getting into the kernel.
|
||||||
|
|
||||||
|
|
||||||
15) The canonical patch format
|
15) The canonical patch format
|
||||||
|
@ -485,12 +496,33 @@ phrase" should not be a filename. Do not use the same "summary
|
||||||
phrase" for every patch in a whole patch series (where a "patch
|
phrase" for every patch in a whole patch series (where a "patch
|
||||||
series" is an ordered sequence of multiple, related patches).
|
series" is an ordered sequence of multiple, related patches).
|
||||||
|
|
||||||
Bear in mind that the "summary phrase" of your email becomes
|
Bear in mind that the "summary phrase" of your email becomes a
|
||||||
a globally-unique identifier for that patch. It propagates
|
globally-unique identifier for that patch. It propagates all the way
|
||||||
all the way into the git changelog. The "summary phrase" may
|
into the git changelog. The "summary phrase" may later be used in
|
||||||
later be used in developer discussions which refer to the patch.
|
developer discussions which refer to the patch. People will want to
|
||||||
People will want to google for the "summary phrase" to read
|
google for the "summary phrase" to read discussion regarding that
|
||||||
discussion regarding that patch.
|
patch. It will also be the only thing that people may quickly see
|
||||||
|
when, two or three months later, they are going through perhaps
|
||||||
|
thousands of patches using tools such as "gitk" or "git log
|
||||||
|
--oneline".
|
||||||
|
|
||||||
|
For these reasons, the "summary" must be no more than 70-75
|
||||||
|
characters, and it must describe both what the patch changes, as well
|
||||||
|
as why the patch might be necessary. It is challenging to be both
|
||||||
|
succinct and descriptive, but that is what a well-written summary
|
||||||
|
should do.
|
||||||
|
|
||||||
|
The "summary phrase" may be prefixed by tags enclosed in square
|
||||||
|
brackets: "Subject: [PATCH tag] <summary phrase>". The tags are not
|
||||||
|
considered part of the summary phrase, but describe how the patch
|
||||||
|
should be treated. Common tags might include a version descriptor if
|
||||||
|
the multiple versions of the patch have been sent out in response to
|
||||||
|
comments (i.e., "v1, v2, v3"), or "RFC" to indicate a request for
|
||||||
|
comments. If there are four patches in a patch series the individual
|
||||||
|
patches may be numbered like this: 1/4, 2/4, 3/4, 4/4. This assures
|
||||||
|
that developers understand the order in which the patches should be
|
||||||
|
applied and that they have reviewed or applied all of the patches in
|
||||||
|
the patch series.
|
||||||
|
|
||||||
A couple of example Subjects:
|
A couple of example Subjects:
|
||||||
|
|
||||||
|
@ -510,19 +542,31 @@ the patch author in the changelog.
|
||||||
The explanation body will be committed to the permanent source
|
The explanation body will be committed to the permanent source
|
||||||
changelog, so should make sense to a competent reader who has long
|
changelog, so should make sense to a competent reader who has long
|
||||||
since forgotten the immediate details of the discussion that might
|
since forgotten the immediate details of the discussion that might
|
||||||
have led to this patch.
|
have led to this patch. Including symptoms of the failure which the
|
||||||
|
patch addresses (kernel log messages, oops messages, etc.) is
|
||||||
|
especially useful for people who might be searching the commit logs
|
||||||
|
looking for the applicable patch. If a patch fixes a compile failure,
|
||||||
|
it may not be necessary to include _all_ of the compile failures; just
|
||||||
|
enough that it is likely that someone searching for the patch can find
|
||||||
|
it. As in the "summary phrase", it is important to be both succinct as
|
||||||
|
well as descriptive.
|
||||||
|
|
||||||
The "---" marker line serves the essential purpose of marking for patch
|
The "---" marker line serves the essential purpose of marking for patch
|
||||||
handling tools where the changelog message ends.
|
handling tools where the changelog message ends.
|
||||||
|
|
||||||
One good use for the additional comments after the "---" marker is for
|
One good use for the additional comments after the "---" marker is for
|
||||||
a diffstat, to show what files have changed, and the number of inserted
|
a diffstat, to show what files have changed, and the number of
|
||||||
and deleted lines per file. A diffstat is especially useful on bigger
|
inserted and deleted lines per file. A diffstat is especially useful
|
||||||
patches. Other comments relevant only to the moment or the maintainer,
|
on bigger patches. Other comments relevant only to the moment or the
|
||||||
not suitable for the permanent changelog, should also go here.
|
maintainer, not suitable for the permanent changelog, should also go
|
||||||
Use diffstat options "-p 1 -w 70" so that filenames are listed from the
|
here. A good example of such comments might be "patch changelogs"
|
||||||
top of the kernel source tree and don't use too much horizontal space
|
which describe what has changed between the v1 and v2 version of the
|
||||||
(easily fit in 80 columns, maybe with some indentation).
|
patch.
|
||||||
|
|
||||||
|
If you are going to include a diffstat after the "---" marker, please
|
||||||
|
use diffstat options "-p 1 -w 70" so that filenames are listed from
|
||||||
|
the top of the kernel source tree and don't use too much horizontal
|
||||||
|
space (easily fit in 80 columns, maybe with some indentation).
|
||||||
|
|
||||||
See more details on the proper patch format in the following
|
See more details on the proper patch format in the following
|
||||||
references.
|
references.
|
||||||
|
|
|
@ -119,7 +119,7 @@ which takes quite a bit of time and thought after the "real work" has been
|
||||||
done. When done properly, though, it is time well spent.
|
done. When done properly, though, it is time well spent.
|
||||||
|
|
||||||
|
|
||||||
5.4: PATCH FORMATTING
|
5.4: PATCH FORMATTING AND CHANGELOGS
|
||||||
|
|
||||||
So now you have a perfect series of patches for posting, but the work is
|
So now you have a perfect series of patches for posting, but the work is
|
||||||
not done quite yet. Each patch needs to be formatted into a message which
|
not done quite yet. Each patch needs to be formatted into a message which
|
||||||
|
@ -146,8 +146,33 @@ that end, each patch will be composed of the following:
|
||||||
- One or more tag lines, with, at a minimum, one Signed-off-by: line from
|
- One or more tag lines, with, at a minimum, one Signed-off-by: line from
|
||||||
the author of the patch. Tags will be described in more detail below.
|
the author of the patch. Tags will be described in more detail below.
|
||||||
|
|
||||||
The above three items should, normally, be the text used when committing
|
The items above, together, form the changelog for the patch. Writing good
|
||||||
the change to a revision control system. They are followed by:
|
changelogs is a crucial but often-neglected art; it's worth spending
|
||||||
|
another moment discussing this issue. When writing a changelog, you should
|
||||||
|
bear in mind that a number of different people will be reading your words.
|
||||||
|
These include subsystem maintainers and reviewers who need to decide
|
||||||
|
whether the patch should be included, distributors and other maintainers
|
||||||
|
trying to decide whether a patch should be backported to other kernels, bug
|
||||||
|
hunters wondering whether the patch is responsible for a problem they are
|
||||||
|
chasing, users who want to know how the kernel has changed, and more. A
|
||||||
|
good changelog conveys the needed information to all of these people in the
|
||||||
|
most direct and concise way possible.
|
||||||
|
|
||||||
|
To that end, the summary line should describe the effects of and motivation
|
||||||
|
for the change as well as possible given the one-line constraint. The
|
||||||
|
detailed description can then amplify on those topics and provide any
|
||||||
|
needed additional information. If the patch fixes a bug, cite the commit
|
||||||
|
which introduced the bug if possible. If a problem is associated with
|
||||||
|
specific log or compiler output, include that output to help others
|
||||||
|
searching for a solution to the same problem. If the change is meant to
|
||||||
|
support other changes coming in later patch, say so. If internal APIs are
|
||||||
|
changed, detail those changes and how other developers should respond. In
|
||||||
|
general, the more you can put yourself into the shoes of everybody who will
|
||||||
|
be reading your changelog, the better that changelog (and the kernel as a
|
||||||
|
whole) will be.
|
||||||
|
|
||||||
|
Needless to say, the changelog should be the text used when committing the
|
||||||
|
change to a revision control system. It will be followed by:
|
||||||
|
|
||||||
- The patch itself, in the unified ("-u") patch format. Using the "-p"
|
- The patch itself, in the unified ("-u") patch format. Using the "-p"
|
||||||
option to diff will associate function names with changes, making the
|
option to diff will associate function names with changes, making the
|
||||||
|
|
158
Documentation/filesystems/debugfs.txt
Normal file
158
Documentation/filesystems/debugfs.txt
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
Copyright 2009 Jonathan Corbet <corbet@lwn.net>
|
||||||
|
|
||||||
|
Debugfs exists as a simple way for kernel developers to make information
|
||||||
|
available to user space. Unlike /proc, which is only meant for information
|
||||||
|
about a process, or sysfs, which has strict one-value-per-file rules,
|
||||||
|
debugfs has no rules at all. Developers can put any information they want
|
||||||
|
there. The debugfs filesystem is also intended to not serve as a stable
|
||||||
|
ABI to user space; in theory, there are no stability constraints placed on
|
||||||
|
files exported there. The real world is not always so simple, though [1];
|
||||||
|
even debugfs interfaces are best designed with the idea that they will need
|
||||||
|
to be maintained forever.
|
||||||
|
|
||||||
|
Debugfs is typically mounted with a command like:
|
||||||
|
|
||||||
|
mount -t debugfs none /sys/kernel/debug
|
||||||
|
|
||||||
|
(Or an equivalent /etc/fstab line).
|
||||||
|
|
||||||
|
Note that the debugfs API is exported GPL-only to modules.
|
||||||
|
|
||||||
|
Code using debugfs should include <linux/debugfs.h>. Then, the first order
|
||||||
|
of business will be to create at least one directory to hold a set of
|
||||||
|
debugfs files:
|
||||||
|
|
||||||
|
struct dentry *debugfs_create_dir(const char *name, struct dentry *parent);
|
||||||
|
|
||||||
|
This call, if successful, will make a directory called name underneath the
|
||||||
|
indicated parent directory. If parent is NULL, the directory will be
|
||||||
|
created in the debugfs root. On success, the return value is a struct
|
||||||
|
dentry pointer which can be used to create files in the directory (and to
|
||||||
|
clean it up at the end). A NULL return value indicates that something went
|
||||||
|
wrong. If ERR_PTR(-ENODEV) is returned, that is an indication that the
|
||||||
|
kernel has been built without debugfs support and none of the functions
|
||||||
|
described below will work.
|
||||||
|
|
||||||
|
The most general way to create a file within a debugfs directory is with:
|
||||||
|
|
||||||
|
struct dentry *debugfs_create_file(const char *name, mode_t mode,
|
||||||
|
struct dentry *parent, void *data,
|
||||||
|
const struct file_operations *fops);
|
||||||
|
|
||||||
|
Here, name is the name of the file to create, mode describes the access
|
||||||
|
permissions the file should have, parent indicates the directory which
|
||||||
|
should hold the file, data will be stored in the i_private field of the
|
||||||
|
resulting inode structure, and fops is a set of file operations which
|
||||||
|
implement the file's behavior. At a minimum, the read() and/or write()
|
||||||
|
operations should be provided; others can be included as needed. Again,
|
||||||
|
the return value will be a dentry pointer to the created file, NULL for
|
||||||
|
error, or ERR_PTR(-ENODEV) if debugfs support is missing.
|
||||||
|
|
||||||
|
In a number of cases, the creation of a set of file operations is not
|
||||||
|
actually necessary; the debugfs code provides a number of helper functions
|
||||||
|
for simple situations. Files containing a single integer value can be
|
||||||
|
created with any of:
|
||||||
|
|
||||||
|
struct dentry *debugfs_create_u8(const char *name, mode_t mode,
|
||||||
|
struct dentry *parent, u8 *value);
|
||||||
|
struct dentry *debugfs_create_u16(const char *name, mode_t mode,
|
||||||
|
struct dentry *parent, u16 *value);
|
||||||
|
struct dentry *debugfs_create_u32(const char *name, mode_t mode,
|
||||||
|
struct dentry *parent, u32 *value);
|
||||||
|
struct dentry *debugfs_create_u64(const char *name, mode_t mode,
|
||||||
|
struct dentry *parent, u64 *value);
|
||||||
|
|
||||||
|
These files support both reading and writing the given value; if a specific
|
||||||
|
file should not be written to, simply set the mode bits accordingly. The
|
||||||
|
values in these files are in decimal; if hexadecimal is more appropriate,
|
||||||
|
the following functions can be used instead:
|
||||||
|
|
||||||
|
struct dentry *debugfs_create_x8(const char *name, mode_t mode,
|
||||||
|
struct dentry *parent, u8 *value);
|
||||||
|
struct dentry *debugfs_create_x16(const char *name, mode_t mode,
|
||||||
|
struct dentry *parent, u16 *value);
|
||||||
|
struct dentry *debugfs_create_x32(const char *name, mode_t mode,
|
||||||
|
struct dentry *parent, u32 *value);
|
||||||
|
|
||||||
|
Note that there is no debugfs_create_x64().
|
||||||
|
|
||||||
|
These functions are useful as long as the developer knows the size of the
|
||||||
|
value to be exported. Some types can have different widths on different
|
||||||
|
architectures, though, complicating the situation somewhat. There is a
|
||||||
|
function meant to help out in one special case:
|
||||||
|
|
||||||
|
struct dentry *debugfs_create_size_t(const char *name, mode_t mode,
|
||||||
|
struct dentry *parent,
|
||||||
|
size_t *value);
|
||||||
|
|
||||||
|
As might be expected, this function will create a debugfs file to represent
|
||||||
|
a variable of type size_t.
|
||||||
|
|
||||||
|
Boolean values can be placed in debugfs with:
|
||||||
|
|
||||||
|
struct dentry *debugfs_create_bool(const char *name, mode_t mode,
|
||||||
|
struct dentry *parent, u32 *value);
|
||||||
|
|
||||||
|
A read on the resulting file will yield either Y (for non-zero values) or
|
||||||
|
N, followed by a newline. If written to, it will accept either upper- or
|
||||||
|
lower-case values, or 1 or 0. Any other input will be silently ignored.
|
||||||
|
|
||||||
|
Finally, a block of arbitrary binary data can be exported with:
|
||||||
|
|
||||||
|
struct debugfs_blob_wrapper {
|
||||||
|
void *data;
|
||||||
|
unsigned long size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct dentry *debugfs_create_blob(const char *name, mode_t mode,
|
||||||
|
struct dentry *parent,
|
||||||
|
struct debugfs_blob_wrapper *blob);
|
||||||
|
|
||||||
|
A read of this file will return the data pointed to by the
|
||||||
|
debugfs_blob_wrapper structure. Some drivers use "blobs" as a simple way
|
||||||
|
to return several lines of (static) formatted text output. This function
|
||||||
|
can be used to export binary information, but there does not appear to be
|
||||||
|
any code which does so in the mainline. Note that all files created with
|
||||||
|
debugfs_create_blob() are read-only.
|
||||||
|
|
||||||
|
There are a couple of other directory-oriented helper functions:
|
||||||
|
|
||||||
|
struct dentry *debugfs_rename(struct dentry *old_dir,
|
||||||
|
struct dentry *old_dentry,
|
||||||
|
struct dentry *new_dir,
|
||||||
|
const char *new_name);
|
||||||
|
|
||||||
|
struct dentry *debugfs_create_symlink(const char *name,
|
||||||
|
struct dentry *parent,
|
||||||
|
const char *target);
|
||||||
|
|
||||||
|
A call to debugfs_rename() will give a new name to an existing debugfs
|
||||||
|
file, possibly in a different directory. The new_name must not exist prior
|
||||||
|
to the call; the return value is old_dentry with updated information.
|
||||||
|
Symbolic links can be created with debugfs_create_symlink().
|
||||||
|
|
||||||
|
There is one important thing that all debugfs users must take into account:
|
||||||
|
there is no automatic cleanup of any directories created in debugfs. If a
|
||||||
|
module is unloaded without explicitly removing debugfs entries, the result
|
||||||
|
will be a lot of stale pointers and no end of highly antisocial behavior.
|
||||||
|
So all debugfs users - at least those which can be built as modules - must
|
||||||
|
be prepared to remove all files and directories they create there. A file
|
||||||
|
can be removed with:
|
||||||
|
|
||||||
|
void debugfs_remove(struct dentry *dentry);
|
||||||
|
|
||||||
|
The dentry value can be NULL, in which case nothing will be removed.
|
||||||
|
|
||||||
|
Once upon a time, debugfs users were required to remember the dentry
|
||||||
|
pointer for every debugfs file they created so that all files could be
|
||||||
|
cleaned up. We live in more civilized times now, though, and debugfs users
|
||||||
|
can call:
|
||||||
|
|
||||||
|
void debugfs_remove_recursive(struct dentry *dentry);
|
||||||
|
|
||||||
|
If this function is passed a pointer for the dentry corresponding to the
|
||||||
|
top-level directory, the entire hierarchy below that directory will be
|
||||||
|
removed.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
[1] http://lwn.net/Articles/309298/
|
Loading…
Reference in a new issue