1 .. SPDX-License-Identifier: GPL-2.0 1 .. SPDX-License-Identifier: GPL-2.0 2 .. include:: <isonum.txt> 2 .. include:: <isonum.txt> 3 3 4 ======= 4 ======= 5 DebugFS 5 DebugFS 6 ======= 6 ======= 7 7 8 Copyright |copy| 2009 Jonathan Corbet <corbet@l 8 Copyright |copy| 2009 Jonathan Corbet <corbet@lwn.net> 9 9 10 Debugfs exists as a simple way for kernel deve 10 Debugfs exists as a simple way for kernel developers to make information 11 available to user space. Unlike /proc, which 11 available to user space. Unlike /proc, which is only meant for information 12 about a process, or sysfs, which has strict on 12 about a process, or sysfs, which has strict one-value-per-file rules, 13 debugfs has no rules at all. Developers can p 13 debugfs has no rules at all. Developers can put any information they want 14 there. The debugfs filesystem is also intende 14 there. The debugfs filesystem is also intended to not serve as a stable 15 ABI to user space; in theory, there are no sta 15 ABI to user space; in theory, there are no stability constraints placed on 16 files exported there. The real world is not a 16 files exported there. The real world is not always so simple, though [1]_; 17 even debugfs interfaces are best designed with 17 even debugfs interfaces are best designed with the idea that they will need 18 to be maintained forever. 18 to be maintained forever. 19 19 20 Debugfs is typically mounted with a command li 20 Debugfs is typically mounted with a command like:: 21 21 22 mount -t debugfs none /sys/kernel/debug 22 mount -t debugfs none /sys/kernel/debug 23 23 24 (Or an equivalent /etc/fstab line). 24 (Or an equivalent /etc/fstab line). 25 The debugfs root directory is accessible only 25 The debugfs root directory is accessible only to the root user by 26 default. To change access to the tree the "uid 26 default. To change access to the tree the "uid", "gid" and "mode" mount 27 options can be used. 27 options can be used. 28 28 29 Note that the debugfs API is exported GPL-only 29 Note that the debugfs API is exported GPL-only to modules. 30 30 31 Code using debugfs should include <linux/debug 31 Code using debugfs should include <linux/debugfs.h>. Then, the first order 32 of business will be to create at least one dir 32 of business will be to create at least one directory to hold a set of 33 debugfs files:: 33 debugfs files:: 34 34 35 struct dentry *debugfs_create_dir(const ch 35 struct dentry *debugfs_create_dir(const char *name, struct dentry *parent); 36 36 37 This call, if successful, will make a director 37 This call, if successful, will make a directory called name underneath the 38 indicated parent directory. If parent is NULL 38 indicated parent directory. If parent is NULL, the directory will be 39 created in the debugfs root. On success, the 39 created in the debugfs root. On success, the return value is a struct 40 dentry pointer which can be used to create fil 40 dentry pointer which can be used to create files in the directory (and to 41 clean it up at the end). An ERR_PTR(-ERROR) r 41 clean it up at the end). An ERR_PTR(-ERROR) return value indicates that 42 something went wrong. If ERR_PTR(-ENODEV) is 42 something went wrong. If ERR_PTR(-ENODEV) is returned, that is an 43 indication that the kernel has been built with 43 indication that the kernel has been built without debugfs support and none 44 of the functions described below will work. 44 of the functions described below will work. 45 45 46 The most general way to create a file within a 46 The most general way to create a file within a debugfs directory is with:: 47 47 48 struct dentry *debugfs_create_file(const c 48 struct dentry *debugfs_create_file(const char *name, umode_t mode, 49 struct 49 struct dentry *parent, void *data, 50 const s 50 const struct file_operations *fops); 51 51 52 Here, name is the name of the file to create, 52 Here, name is the name of the file to create, mode describes the access 53 permissions the file should have, parent indic 53 permissions the file should have, parent indicates the directory which 54 should hold the file, data will be stored in t 54 should hold the file, data will be stored in the i_private field of the 55 resulting inode structure, and fops is a set o 55 resulting inode structure, and fops is a set of file operations which 56 implement the file's behavior. At a minimum, 56 implement the file's behavior. At a minimum, the read() and/or write() 57 operations should be provided; others can be i 57 operations should be provided; others can be included as needed. Again, 58 the return value will be a dentry pointer to t 58 the return value will be a dentry pointer to the created file, 59 ERR_PTR(-ERROR) on error, or ERR_PTR(-ENODEV) 59 ERR_PTR(-ERROR) on error, or ERR_PTR(-ENODEV) if debugfs support is 60 missing. 60 missing. 61 61 62 Create a file with an initial size, the follow 62 Create a file with an initial size, the following function can be used 63 instead:: 63 instead:: 64 64 65 void debugfs_create_file_size(const char * 65 void debugfs_create_file_size(const char *name, umode_t mode, 66 struct dentr 66 struct dentry *parent, void *data, 67 const struct 67 const struct file_operations *fops, 68 loff_t file_ 68 loff_t file_size); 69 69 70 file_size is the initial file size. The other 70 file_size is the initial file size. The other parameters are the same 71 as the function debugfs_create_file. 71 as the function debugfs_create_file. 72 72 73 In a number of cases, the creation of a set of 73 In a number of cases, the creation of a set of file operations is not 74 actually necessary; the debugfs code provides 74 actually necessary; the debugfs code provides a number of helper functions 75 for simple situations. Files containing a sin 75 for simple situations. Files containing a single integer value can be 76 created with any of:: 76 created with any of:: 77 77 78 void debugfs_create_u8(const char *name, u 78 void debugfs_create_u8(const char *name, umode_t mode, 79 struct dentry *pare 79 struct dentry *parent, u8 *value); 80 void debugfs_create_u16(const char *name, 80 void debugfs_create_u16(const char *name, umode_t mode, 81 struct dentry *par 81 struct dentry *parent, u16 *value); 82 void debugfs_create_u32(const char *name, 82 void debugfs_create_u32(const char *name, umode_t mode, 83 struct dentry *par 83 struct dentry *parent, u32 *value); 84 void debugfs_create_u64(const char *name, 84 void debugfs_create_u64(const char *name, umode_t mode, 85 struct dentry *par 85 struct dentry *parent, u64 *value); 86 86 87 These files support both reading and writing t 87 These files support both reading and writing the given value; if a specific 88 file should not be written to, simply set the 88 file should not be written to, simply set the mode bits accordingly. The 89 values in these files are in decimal; if hexad 89 values in these files are in decimal; if hexadecimal is more appropriate, 90 the following functions can be used instead:: 90 the following functions can be used instead:: 91 91 92 void debugfs_create_x8(const char *name, u 92 void debugfs_create_x8(const char *name, umode_t mode, 93 struct dentry *pare 93 struct dentry *parent, u8 *value); 94 void debugfs_create_x16(const char *name, 94 void debugfs_create_x16(const char *name, umode_t mode, 95 struct dentry *par 95 struct dentry *parent, u16 *value); 96 void debugfs_create_x32(const char *name, 96 void debugfs_create_x32(const char *name, umode_t mode, 97 struct dentry *par 97 struct dentry *parent, u32 *value); 98 void debugfs_create_x64(const char *name, 98 void debugfs_create_x64(const char *name, umode_t mode, 99 struct dentry *par 99 struct dentry *parent, u64 *value); 100 100 101 These functions are useful as long as the deve 101 These functions are useful as long as the developer knows the size of the 102 value to be exported. Some types can have dif 102 value to be exported. Some types can have different widths on different 103 architectures, though, complicating the situat 103 architectures, though, complicating the situation somewhat. There are 104 functions meant to help out in such special ca 104 functions meant to help out in such special cases:: 105 105 106 void debugfs_create_size_t(const char *nam 106 void debugfs_create_size_t(const char *name, umode_t mode, 107 struct dentry * 107 struct dentry *parent, size_t *value); 108 108 109 As might be expected, this function will creat 109 As might be expected, this function will create a debugfs file to represent 110 a variable of type size_t. 110 a variable of type size_t. 111 111 112 Similarly, there are helpers for variables of 112 Similarly, there are helpers for variables of type unsigned long, in decimal 113 and hexadecimal:: 113 and hexadecimal:: 114 114 115 struct dentry *debugfs_create_ulong(const 115 struct dentry *debugfs_create_ulong(const char *name, umode_t mode, 116 struct 116 struct dentry *parent, 117 unsign 117 unsigned long *value); 118 void debugfs_create_xul(const char *name, 118 void debugfs_create_xul(const char *name, umode_t mode, 119 struct dentry *par 119 struct dentry *parent, unsigned long *value); 120 120 121 Boolean values can be placed in debugfs with:: 121 Boolean values can be placed in debugfs with:: 122 122 123 void debugfs_create_bool(const char *name, !! 123 struct dentry *debugfs_create_bool(const char *name, umode_t mode, 124 struct dentry *pa !! 124 struct dentry *parent, bool *value); 125 125 126 A read on the resulting file will yield either 126 A read on the resulting file will yield either Y (for non-zero values) or 127 N, followed by a newline. If written to, it w 127 N, followed by a newline. If written to, it will accept either upper- or 128 lower-case values, or 1 or 0. Any other input 128 lower-case values, or 1 or 0. Any other input will be silently ignored. 129 129 130 Also, atomic_t values can be placed in debugfs 130 Also, atomic_t values can be placed in debugfs with:: 131 131 132 void debugfs_create_atomic_t(const char *n 132 void debugfs_create_atomic_t(const char *name, umode_t mode, 133 struct dentry 133 struct dentry *parent, atomic_t *value) 134 134 135 A read of this file will get atomic_t values, 135 A read of this file will get atomic_t values, and a write of this file 136 will set atomic_t values. 136 will set atomic_t values. 137 137 138 Another option is exporting a block of arbitra 138 Another option is exporting a block of arbitrary binary data, with 139 this structure and function:: 139 this structure and function:: 140 140 141 struct debugfs_blob_wrapper { 141 struct debugfs_blob_wrapper { 142 void *data; 142 void *data; 143 unsigned long size; 143 unsigned long size; 144 }; 144 }; 145 145 146 struct dentry *debugfs_create_blob(const c 146 struct dentry *debugfs_create_blob(const char *name, umode_t mode, 147 struct 147 struct dentry *parent, 148 struct 148 struct debugfs_blob_wrapper *blob); 149 149 150 A read of this file will return the data point 150 A read of this file will return the data pointed to by the 151 debugfs_blob_wrapper structure. Some drivers 151 debugfs_blob_wrapper structure. Some drivers use "blobs" as a simple way 152 to return several lines of (static) formatted 152 to return several lines of (static) formatted text output. This function 153 can be used to export binary information, but 153 can be used to export binary information, but there does not appear to be 154 any code which does so in the mainline. Note 154 any code which does so in the mainline. Note that all files created with 155 debugfs_create_blob() are read-only. 155 debugfs_create_blob() are read-only. 156 156 157 If you want to dump a block of registers (some 157 If you want to dump a block of registers (something that happens quite 158 often during development, even if little such !! 158 often during development, even if little such code reaches mainline. 159 debugfs offers two functions: one to make a re !! 159 Debugfs offers two functions: one to make a registers-only file, and 160 another to insert a register block in the midd 160 another to insert a register block in the middle of another sequential 161 file:: 161 file:: 162 162 163 struct debugfs_reg32 { 163 struct debugfs_reg32 { 164 char *name; 164 char *name; 165 unsigned long offset; 165 unsigned long offset; 166 }; 166 }; 167 167 168 struct debugfs_regset32 { 168 struct debugfs_regset32 { 169 const struct debugfs_reg32 *regs; 169 const struct debugfs_reg32 *regs; 170 int nregs; 170 int nregs; 171 void __iomem *base; 171 void __iomem *base; 172 struct device *dev; /* Optional de 172 struct device *dev; /* Optional device for Runtime PM */ 173 }; 173 }; 174 174 175 debugfs_create_regset32(const char *name, 175 debugfs_create_regset32(const char *name, umode_t mode, 176 struct dentry *par 176 struct dentry *parent, 177 struct debugfs_reg 177 struct debugfs_regset32 *regset); 178 178 179 void debugfs_print_regs32(struct seq_file 179 void debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs, 180 int nregs, void __iom 180 int nregs, void __iomem *base, char *prefix); 181 181 182 The "base" argument may be 0, but you may want 182 The "base" argument may be 0, but you may want to build the reg32 array 183 using __stringify, and a number of register na 183 using __stringify, and a number of register names (macros) are actually 184 byte offsets over a base for the register bloc 184 byte offsets over a base for the register block. 185 185 186 If you want to dump a u32 array in debugfs, yo !! 186 If you want to dump an u32 array in debugfs, you can create file with:: 187 187 188 struct debugfs_u32_array { 188 struct debugfs_u32_array { 189 u32 *array; 189 u32 *array; 190 u32 n_elements; 190 u32 n_elements; 191 }; 191 }; 192 192 193 void debugfs_create_u32_array(const char * 193 void debugfs_create_u32_array(const char *name, umode_t mode, 194 struct dentry *parent, 194 struct dentry *parent, 195 struct debugfs_u32_arr 195 struct debugfs_u32_array *array); 196 196 197 The "array" argument wraps a pointer to the ar 197 The "array" argument wraps a pointer to the array's data and the number 198 of its elements. Note: Once array is created i 198 of its elements. Note: Once array is created its size can not be changed. 199 199 200 There is a helper function to create a device- !! 200 There is a helper function to create device related seq_file:: 201 201 202 void debugfs_create_devm_seqfile(struct dev 202 void debugfs_create_devm_seqfile(struct device *dev, 203 const char *na 203 const char *name, 204 struct dentry 204 struct dentry *parent, 205 int (*read_fn) 205 int (*read_fn)(struct seq_file *s, 206 void * 206 void *data)); 207 207 208 The "dev" argument is the device related to th 208 The "dev" argument is the device related to this debugfs file, and 209 the "read_fn" is a function pointer which to b 209 the "read_fn" is a function pointer which to be called to print the 210 seq_file content. 210 seq_file content. 211 211 212 There are a couple of other directory-oriented 212 There are a couple of other directory-oriented helper functions:: 213 213 214 struct dentry *debugfs_rename(struct dentr 214 struct dentry *debugfs_rename(struct dentry *old_dir, 215 struct dentr 215 struct dentry *old_dentry, 216 struct dentr 216 struct dentry *new_dir, 217 const char * 217 const char *new_name); 218 218 219 struct dentry *debugfs_create_symlink(cons 219 struct dentry *debugfs_create_symlink(const char *name, 220 stru 220 struct dentry *parent, 221 cons 221 const char *target); 222 222 223 A call to debugfs_rename() will give a new nam 223 A call to debugfs_rename() will give a new name to an existing debugfs 224 file, possibly in a different directory. The 224 file, possibly in a different directory. The new_name must not exist prior 225 to the call; the return value is old_dentry wi 225 to the call; the return value is old_dentry with updated information. 226 Symbolic links can be created with debugfs_cre 226 Symbolic links can be created with debugfs_create_symlink(). 227 227 228 There is one important thing that all debugfs 228 There is one important thing that all debugfs users must take into account: 229 there is no automatic cleanup of any directori 229 there is no automatic cleanup of any directories created in debugfs. If a 230 module is unloaded without explicitly removing 230 module is unloaded without explicitly removing debugfs entries, the result 231 will be a lot of stale pointers and no end of 231 will be a lot of stale pointers and no end of highly antisocial behavior. 232 So all debugfs users - at least those which ca 232 So all debugfs users - at least those which can be built as modules - must 233 be prepared to remove all files and directorie 233 be prepared to remove all files and directories they create there. A file 234 can be removed with:: 234 can be removed with:: 235 235 236 void debugfs_remove(struct dentry *dentry) 236 void debugfs_remove(struct dentry *dentry); 237 237 238 The dentry value can be NULL or an error value 238 The dentry value can be NULL or an error value, in which case nothing will 239 be removed. 239 be removed. 240 240 241 Once upon a time, debugfs users were required 241 Once upon a time, debugfs users were required to remember the dentry 242 pointer for every debugfs file they created so 242 pointer for every debugfs file they created so that all files could be 243 cleaned up. We live in more civilized times n 243 cleaned up. We live in more civilized times now, though, and debugfs users 244 can call:: 244 can call:: 245 245 246 void debugfs_remove_recursive(struct dentr 246 void debugfs_remove_recursive(struct dentry *dentry); 247 247 248 If this function is passed a pointer for the d 248 If this function is passed a pointer for the dentry corresponding to the 249 top-level directory, the entire hierarchy belo 249 top-level directory, the entire hierarchy below that directory will be 250 removed. 250 removed. 251 251 252 .. [1] http://lwn.net/Articles/309298/ 252 .. [1] http://lwn.net/Articles/309298/
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.