Loading Documentation/Changes +15 −0 Original line number Original line Diff line number Diff line Loading @@ -48,6 +48,7 @@ o procps 3.2.0 # ps --version o oprofile 0.9 # oprofiled --version o oprofile 0.9 # oprofiled --version o udev 081 # udevinfo -V o udev 081 # udevinfo -V o grub 0.93 # grub --version o grub 0.93 # grub --version o mcelog 0.6 Kernel compilation Kernel compilation ================== ================== Loading Loading @@ -276,6 +277,16 @@ before running exportfs or mountd. It is recommended that all NFS services be protected from the internet-at-large by a firewall where services be protected from the internet-at-large by a firewall where that is possible. that is possible. mcelog ------ In Linux 2.6.31+ the i386 kernel needs to run the mcelog utility as a regular cronjob similar to the x86-64 kernel to process and log machine check events when CONFIG_X86_NEW_MCE is enabled. Machine check events are errors reported by the CPU. Processing them is strongly encouraged. All x86-64 kernels since 2.6.4 require the mcelog utility to process machine checks. Getting updated software Getting updated software ======================== ======================== Loading Loading @@ -365,6 +376,10 @@ FUSE ---- ---- o <http://sourceforge.net/projects/fuse> o <http://sourceforge.net/projects/fuse> mcelog ------ o <ftp://ftp.kernel.org/pub/linux/utils/cpu/mce/mcelog/> Networking Networking ********** ********** Loading Documentation/SubmittingPatches +60 −16 Original line number Original line Diff line number Diff line Loading @@ -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. Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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: Loading @@ -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. Loading Documentation/development-process/5.Posting +28 −3 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Documentation/feature-removal-schedule.txt +10 −0 Original line number Original line Diff line number Diff line Loading @@ -437,3 +437,13 @@ Why: Superseded by tdfxfb. I2C/DDC support used to live in a separate driver but this caused driver conflicts. driver but this caused driver conflicts. Who: Jean Delvare <khali@linux-fr.org> Who: Jean Delvare <khali@linux-fr.org> Krzysztof Helt <krzysztof.h1@wp.pl> Krzysztof Helt <krzysztof.h1@wp.pl> ---------------------------- What: CONFIG_X86_OLD_MCE When: 2.6.32 Why: Remove the old legacy 32bit machine check code. This has been superseded by the newer machine check code from the 64bit port, but the old version has been kept around for easier testing. Note this doesn't impact the old P5 and WinChip machine check handlers. Who: Andi Kleen <andi@firstfloor.org> Documentation/filesystems/debugfs.txt 0 → 100644 +158 −0 Original line number Original line Diff line number Diff line 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
Documentation/Changes +15 −0 Original line number Original line Diff line number Diff line Loading @@ -48,6 +48,7 @@ o procps 3.2.0 # ps --version o oprofile 0.9 # oprofiled --version o oprofile 0.9 # oprofiled --version o udev 081 # udevinfo -V o udev 081 # udevinfo -V o grub 0.93 # grub --version o grub 0.93 # grub --version o mcelog 0.6 Kernel compilation Kernel compilation ================== ================== Loading Loading @@ -276,6 +277,16 @@ before running exportfs or mountd. It is recommended that all NFS services be protected from the internet-at-large by a firewall where services be protected from the internet-at-large by a firewall where that is possible. that is possible. mcelog ------ In Linux 2.6.31+ the i386 kernel needs to run the mcelog utility as a regular cronjob similar to the x86-64 kernel to process and log machine check events when CONFIG_X86_NEW_MCE is enabled. Machine check events are errors reported by the CPU. Processing them is strongly encouraged. All x86-64 kernels since 2.6.4 require the mcelog utility to process machine checks. Getting updated software Getting updated software ======================== ======================== Loading Loading @@ -365,6 +376,10 @@ FUSE ---- ---- o <http://sourceforge.net/projects/fuse> o <http://sourceforge.net/projects/fuse> mcelog ------ o <ftp://ftp.kernel.org/pub/linux/utils/cpu/mce/mcelog/> Networking Networking ********** ********** Loading
Documentation/SubmittingPatches +60 −16 Original line number Original line Diff line number Diff line Loading @@ -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. Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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: Loading @@ -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. Loading
Documentation/development-process/5.Posting +28 −3 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading
Documentation/feature-removal-schedule.txt +10 −0 Original line number Original line Diff line number Diff line Loading @@ -437,3 +437,13 @@ Why: Superseded by tdfxfb. I2C/DDC support used to live in a separate driver but this caused driver conflicts. driver but this caused driver conflicts. Who: Jean Delvare <khali@linux-fr.org> Who: Jean Delvare <khali@linux-fr.org> Krzysztof Helt <krzysztof.h1@wp.pl> Krzysztof Helt <krzysztof.h1@wp.pl> ---------------------------- What: CONFIG_X86_OLD_MCE When: 2.6.32 Why: Remove the old legacy 32bit machine check code. This has been superseded by the newer machine check code from the 64bit port, but the old version has been kept around for easier testing. Note this doesn't impact the old P5 and WinChip machine check handlers. Who: Andi Kleen <andi@firstfloor.org>
Documentation/filesystems/debugfs.txt 0 → 100644 +158 −0 Original line number Original line Diff line number Diff line 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/