Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'docs' of git://git.lwn.net/linux-2.6

* 'docs' of git://git.lwn.net/linux-2.6:
Add additional examples in Documentation/spinlocks.txt
Move sched-rt-group.txt to scheduler/
Documentation: move rpc-cache.txt to filesystems/
Documentation: move nfsroot.txt to filesystems/
Spell out behavior of atomic_dec_and_lock() in kerneldoc
Fix a typo in highres.txt
Fixes to the seq_file document
Fill out information on patch tags in SubmittingPatches
Add the seq_file documentation

+380 -20
-4
Documentation/00-INDEX
··· 271 271 - directory with information on the NetLabel subsystem. 272 272 networking/ 273 273 - directory with info on various aspects of networking with Linux. 274 - nfsroot.txt 275 - - short guide on setting up a diskless box with NFS root filesystem. 276 274 nmi_watchdog.txt 277 275 - info on NMI watchdog for SMP systems. 278 276 nommu-mmap.txt ··· 319 321 - a description of what robust futexes are. 320 322 rocket.txt 321 323 - info on the Comtrol RocketPort multiport serial driver. 322 - rpc-cache.txt 323 - - introduction to the caching mechanisms in the sunrpc layer. 324 324 rt-mutex-design.txt 325 325 - description of the RealTime mutex implementation design. 326 326 rt-mutex.txt
+51 -3
Documentation/SubmittingPatches
··· 328 328 point out some special detail about the sign-off. 329 329 330 330 331 - 13) When to use Acked-by: 331 + 13) When to use Acked-by: and Cc: 332 332 333 333 The Signed-off-by: tag indicates that the signer was involved in the 334 334 development of the patch, or that he/she was in the patch's delivery path. ··· 349 349 For example, if a patch affects multiple subsystems and has an Acked-by: from 350 350 one subsystem maintainer then this usually indicates acknowledgement of just 351 351 the part which affects that maintainer's code. Judgement should be used here. 352 - When in doubt people should refer to the original discussion in the mailing 352 + When in doubt people should refer to the original discussion in the mailing 353 353 list archives. 354 354 355 + If a person has had the opportunity to comment on a patch, but has not 356 + provided such comments, you may optionally add a "Cc:" tag to the patch. 357 + This is the only tag which might be added without an explicit action by the 358 + person it names. This tag documents that potentially interested parties 359 + have been included in the discussion 355 360 356 - 14) The canonical patch format 361 + 362 + 14) Using Test-by: and Reviewed-by: 363 + 364 + A Tested-by: tag indicates that the patch has been successfully tested (in 365 + some environment) by the person named. This tag informs maintainers that 366 + some testing has been performed, provides a means to locate testers for 367 + future patches, and ensures credit for the testers. 368 + 369 + Reviewed-by:, instead, indicates that the patch has been reviewed and found 370 + acceptable according to the Reviewer's Statement: 371 + 372 + Reviewer's statement of oversight 373 + 374 + By offering my Reviewed-by: tag, I state that: 375 + 376 + (a) I have carried out a technical review of this patch to 377 + evaluate its appropriateness and readiness for inclusion into 378 + the mainline kernel. 379 + 380 + (b) Any problems, concerns, or questions relating to the patch 381 + have been communicated back to the submitter. I am satisfied 382 + with the submitter's response to my comments. 383 + 384 + (c) While there may be things that could be improved with this 385 + submission, I believe that it is, at this time, (1) a 386 + worthwhile modification to the kernel, and (2) free of known 387 + issues which would argue against its inclusion. 388 + 389 + (d) While I have reviewed the patch and believe it to be sound, I 390 + do not (unless explicitly stated elsewhere) make any 391 + warranties or guarantees that it will achieve its stated 392 + purpose or function properly in any given situation. 393 + 394 + A Reviewed-by tag is a statement of opinion that the patch is an 395 + appropriate modification of the kernel without any remaining serious 396 + technical issues. Any interested reviewer (who has done the work) can 397 + offer a Reviewed-by tag for a patch. This tag serves to give credit to 398 + reviewers and to inform maintainers of the degree of review which has been 399 + done on the patch. Reviewed-by: tags, when supplied by reviewers known to 400 + understand the subject area and to perform thorough reviews, will normally 401 + increase the liklihood of your patch getting into the kernel. 402 + 403 + 404 + 15) The canonical patch format 357 405 358 406 The canonical patch subject line is: 359 407
+6
Documentation/filesystems/00-INDEX
··· 66 66 - info on the Linux implementation of Sys V mandatory file locking. 67 67 ncpfs.txt 68 68 - info on Novell Netware(tm) filesystem using NCP protocol. 69 + nfsroot.txt 70 + - short guide on setting up a diskless box with NFS root filesystem. 69 71 ntfs.txt 70 72 - info and mount options for the NTFS filesystem (Windows NT). 71 73 ocfs2.txt ··· 84 82 - info on relay, for efficient streaming from kernel to user space. 85 83 romfs.txt 86 84 - description of the ROMFS filesystem. 85 + rpc-cache.txt 86 + - introduction to the caching mechanisms in the sunrpc layer. 87 + seq_file.txt 88 + - how to use the seq_file API 87 89 sharedsubtree.txt 88 90 - a description of shared subtrees for namespaces. 89 91 smbfs.txt
+283
Documentation/filesystems/seq_file.txt
··· 1 + The seq_file interface 2 + 3 + Copyright 2003 Jonathan Corbet <corbet@lwn.net> 4 + This file is originally from the LWN.net Driver Porting series at 5 + http://lwn.net/Articles/driver-porting/ 6 + 7 + 8 + There are numerous ways for a device driver (or other kernel component) to 9 + provide information to the user or system administrator. One useful 10 + technique is the creation of virtual files, in debugfs, /proc or elsewhere. 11 + Virtual files can provide human-readable output that is easy to get at 12 + without any special utility programs; they can also make life easier for 13 + script writers. It is not surprising that the use of virtual files has 14 + grown over the years. 15 + 16 + Creating those files correctly has always been a bit of a challenge, 17 + however. It is not that hard to make a virtual file which returns a 18 + string. But life gets trickier if the output is long - anything greater 19 + than an application is likely to read in a single operation. Handling 20 + multiple reads (and seeks) requires careful attention to the reader's 21 + position within the virtual file - that position is, likely as not, in the 22 + middle of a line of output. The kernel has traditionally had a number of 23 + implementations that got this wrong. 24 + 25 + The 2.6 kernel contains a set of functions (implemented by Alexander Viro) 26 + which are designed to make it easy for virtual file creators to get it 27 + right. 28 + 29 + The seq_file interface is available via <linux/seq_file.h>. There are 30 + three aspects to seq_file: 31 + 32 + * An iterator interface which lets a virtual file implementation 33 + step through the objects it is presenting. 34 + 35 + * Some utility functions for formatting objects for output without 36 + needing to worry about things like output buffers. 37 + 38 + * A set of canned file_operations which implement most operations on 39 + the virtual file. 40 + 41 + We'll look at the seq_file interface via an extremely simple example: a 42 + loadable module which creates a file called /proc/sequence. The file, when 43 + read, simply produces a set of increasing integer values, one per line. The 44 + sequence will continue until the user loses patience and finds something 45 + better to do. The file is seekable, in that one can do something like the 46 + following: 47 + 48 + dd if=/proc/sequence of=out1 count=1 49 + dd if=/proc/sequence skip=1 out=out2 count=1 50 + 51 + Then concatenate the output files out1 and out2 and get the right 52 + result. Yes, it is a thoroughly useless module, but the point is to show 53 + how the mechanism works without getting lost in other details. (Those 54 + wanting to see the full source for this module can find it at 55 + http://lwn.net/Articles/22359/). 56 + 57 + 58 + The iterator interface 59 + 60 + Modules implementing a virtual file with seq_file must implement a simple 61 + iterator object that allows stepping through the data of interest. 62 + Iterators must be able to move to a specific position - like the file they 63 + implement - but the interpretation of that position is up to the iterator 64 + itself. A seq_file implementation that is formatting firewall rules, for 65 + example, could interpret position N as the Nth rule in the chain. 66 + Positioning can thus be done in whatever way makes the most sense for the 67 + generator of the data, which need not be aware of how a position translates 68 + to an offset in the virtual file. The one obvious exception is that a 69 + position of zero should indicate the beginning of the file. 70 + 71 + The /proc/sequence iterator just uses the count of the next number it 72 + will output as its position. 73 + 74 + Four functions must be implemented to make the iterator work. The first, 75 + called start() takes a position as an argument and returns an iterator 76 + which will start reading at that position. For our simple sequence example, 77 + the start() function looks like: 78 + 79 + static void *ct_seq_start(struct seq_file *s, loff_t *pos) 80 + { 81 + loff_t *spos = kmalloc(sizeof(loff_t), GFP_KERNEL); 82 + if (! spos) 83 + return NULL; 84 + *spos = *pos; 85 + return spos; 86 + } 87 + 88 + The entire data structure for this iterator is a single loff_t value 89 + holding the current position. There is no upper bound for the sequence 90 + iterator, but that will not be the case for most other seq_file 91 + implementations; in most cases the start() function should check for a 92 + "past end of file" condition and return NULL if need be. 93 + 94 + For more complicated applications, the private field of the seq_file 95 + structure can be used. There is also a special value whch can be returned 96 + by the start() function called SEQ_START_TOKEN; it can be used if you wish 97 + to instruct your show() function (described below) to print a header at the 98 + top of the output. SEQ_START_TOKEN should only be used if the offset is 99 + zero, however. 100 + 101 + The next function to implement is called, amazingly, next(); its job is to 102 + move the iterator forward to the next position in the sequence. The 103 + example module can simply increment the position by one; more useful 104 + modules will do what is needed to step through some data structure. The 105 + next() function returns a new iterator, or NULL if the sequence is 106 + complete. Here's the example version: 107 + 108 + static void *ct_seq_next(struct seq_file *s, void *v, loff_t *pos) 109 + { 110 + loff_t *spos = v; 111 + *pos = ++*spos; 112 + return spos; 113 + } 114 + 115 + The stop() function is called when iteration is complete; its job, of 116 + course, is to clean up. If dynamic memory is allocated for the iterator, 117 + stop() is the place to free it. 118 + 119 + static void ct_seq_stop(struct seq_file *s, void *v) 120 + { 121 + kfree(v); 122 + } 123 + 124 + Finally, the show() function should format the object currently pointed to 125 + by the iterator for output. It should return zero, or an error code if 126 + something goes wrong. The example module's show() function is: 127 + 128 + static int ct_seq_show(struct seq_file *s, void *v) 129 + { 130 + loff_t *spos = v; 131 + seq_printf(s, "%lld\n", (long long)*spos); 132 + return 0; 133 + } 134 + 135 + We will look at seq_printf() in a moment. But first, the definition of the 136 + seq_file iterator is finished by creating a seq_operations structure with 137 + the four functions we have just defined: 138 + 139 + static const struct seq_operations ct_seq_ops = { 140 + .start = ct_seq_start, 141 + .next = ct_seq_next, 142 + .stop = ct_seq_stop, 143 + .show = ct_seq_show 144 + }; 145 + 146 + This structure will be needed to tie our iterator to the /proc file in 147 + a little bit. 148 + 149 + It's worth noting that the interator value returned by start() and 150 + manipulated by the other functions is considered to be completely opaque by 151 + the seq_file code. It can thus be anything that is useful in stepping 152 + through the data to be output. Counters can be useful, but it could also be 153 + a direct pointer into an array or linked list. Anything goes, as long as 154 + the programmer is aware that things can happen between calls to the 155 + iterator function. However, the seq_file code (by design) will not sleep 156 + between the calls to start() and stop(), so holding a lock during that time 157 + is a reasonable thing to do. The seq_file code will also avoid taking any 158 + other locks while the iterator is active. 159 + 160 + 161 + Formatted output 162 + 163 + The seq_file code manages positioning within the output created by the 164 + iterator and getting it into the user's buffer. But, for that to work, that 165 + output must be passed to the seq_file code. Some utility functions have 166 + been defined which make this task easy. 167 + 168 + Most code will simply use seq_printf(), which works pretty much like 169 + printk(), but which requires the seq_file pointer as an argument. It is 170 + common to ignore the return value from seq_printf(), but a function 171 + producing complicated output may want to check that value and quit if 172 + something non-zero is returned; an error return means that the seq_file 173 + buffer has been filled and further output will be discarded. 174 + 175 + For straight character output, the following functions may be used: 176 + 177 + int seq_putc(struct seq_file *m, char c); 178 + int seq_puts(struct seq_file *m, const char *s); 179 + int seq_escape(struct seq_file *m, const char *s, const char *esc); 180 + 181 + The first two output a single character and a string, just like one would 182 + expect. seq_escape() is like seq_puts(), except that any character in s 183 + which is in the string esc will be represented in octal form in the output. 184 + 185 + There is also a function for printing filenames: 186 + 187 + int seq_path(struct seq_file *m, struct path *path, char *esc); 188 + 189 + Here, path indicates the file of interest, and esc is a set of characters 190 + which should be escaped in the output. 191 + 192 + 193 + Making it all work 194 + 195 + So far, we have a nice set of functions which can produce output within the 196 + seq_file system, but we have not yet turned them into a file that a user 197 + can see. Creating a file within the kernel requires, of course, the 198 + creation of a set of file_operations which implement the operations on that 199 + file. The seq_file interface provides a set of canned operations which do 200 + most of the work. The virtual file author still must implement the open() 201 + method, however, to hook everything up. The open function is often a single 202 + line, as in the example module: 203 + 204 + static int ct_open(struct inode *inode, struct file *file) 205 + { 206 + return seq_open(file, &ct_seq_ops); 207 + } 208 + 209 + Here, the call to seq_open() takes the seq_operations structure we created 210 + before, and gets set up to iterate through the virtual file. 211 + 212 + On a successful open, seq_open() stores the struct seq_file pointer in 213 + file->private_data. If you have an application where the same iterator can 214 + be used for more than one file, you can store an arbitrary pointer in the 215 + private field of the seq_file structure; that value can then be retrieved 216 + by the iterator functions. 217 + 218 + The other operations of interest - read(), llseek(), and release() - are 219 + all implemented by the seq_file code itself. So a virtual file's 220 + file_operations structure will look like: 221 + 222 + static const struct file_operations ct_file_ops = { 223 + .owner = THIS_MODULE, 224 + .open = ct_open, 225 + .read = seq_read, 226 + .llseek = seq_lseek, 227 + .release = seq_release 228 + }; 229 + 230 + There is also a seq_release_private() which passes the contents of the 231 + seq_file private field to kfree() before releasing the structure. 232 + 233 + The final step is the creation of the /proc file itself. In the example 234 + code, that is done in the initialization code in the usual way: 235 + 236 + static int ct_init(void) 237 + { 238 + struct proc_dir_entry *entry; 239 + 240 + entry = create_proc_entry("sequence", 0, NULL); 241 + if (entry) 242 + entry->proc_fops = &ct_file_ops; 243 + return 0; 244 + } 245 + 246 + module_init(ct_init); 247 + 248 + And that is pretty much it. 249 + 250 + 251 + seq_list 252 + 253 + If your file will be iterating through a linked list, you may find these 254 + routines useful: 255 + 256 + struct list_head *seq_list_start(struct list_head *head, 257 + loff_t pos); 258 + struct list_head *seq_list_start_head(struct list_head *head, 259 + loff_t pos); 260 + struct list_head *seq_list_next(void *v, struct list_head *head, 261 + loff_t *ppos); 262 + 263 + These helpers will interpret pos as a position within the list and iterate 264 + accordingly. Your start() and next() functions need only invoke the 265 + seq_list_* helpers with a pointer to the appropriate list_head structure. 266 + 267 + 268 + The extra-simple version 269 + 270 + For extremely simple virtual files, there is an even easier interface. A 271 + module can define only the show() function, which should create all the 272 + output that the virtual file will contain. The file's open() method then 273 + calls: 274 + 275 + int single_open(struct file *file, 276 + int (*show)(struct seq_file *m, void *p), 277 + void *data); 278 + 279 + When output time comes, the show() function will be called once. The data 280 + value given to single_open() can be found in the private field of the 281 + seq_file structure. When using single_open(), the programmer should use 282 + single_release() instead of seq_release() in the file_operations structure 283 + to avoid a memory leak.
+1 -1
Documentation/hrtimers/highres.txt
··· 98 98 event devices are used to provide local CPU functionality such as process 99 99 accounting, profiling, and high resolution timers. 100 100 101 - The management layer assignes one or more of the folliwing functions to a clock 101 + The management layer assigns one or more of the following functions to a clock 102 102 event device: 103 103 - system global periodic tick (jiffies update) 104 104 - cpu local update_process_times
+3 -3
Documentation/kernel-parameters.txt
··· 844 844 arch/alpha/kernel/core_marvel.c. 845 845 846 846 ip= [IP_PNP] 847 - See Documentation/nfsroot.txt. 847 + See Documentation/filesystems/nfsroot.txt. 848 848 849 849 ip2= [HW] Set IO/IRQ pairs for up to 4 IntelliPort boards 850 850 See comment before ip2_setup() in ··· 1198 1198 file if at all. 1199 1199 1200 1200 nfsaddrs= [NFS] 1201 - See Documentation/nfsroot.txt. 1201 + See Documentation/filesystems/nfsroot.txt. 1202 1202 1203 1203 nfsroot= [NFS] nfs root filesystem for disk-less boxes. 1204 - See Documentation/nfsroot.txt. 1204 + See Documentation/filesystems/nfsroot.txt. 1205 1205 1206 1206 nfs.callback_tcpport= 1207 1207 [NFS] set the TCP port on which the NFSv4 callback
Documentation/nfsroot.txt Documentation/filesystems/nfsroot.txt
Documentation/rpc-cache.txt Documentation/filesystems/rpc-cache.txt
Documentation/sched-rt-group.txt Documentation/scheduler/sched-rt-group.txt
+2
Documentation/scheduler/00-INDEX
··· 12 12 - information on scheduling domains. 13 13 sched-nice-design.txt 14 14 - How and why the scheduler's nice levels are implemented. 15 + sched-rt-group.txt 16 + - real-time group scheduling. 15 17 sched-stats.txt 16 18 - information on schedstats (Linux Scheduler Statistics).
+22
Documentation/spinlocks.txt
··· 5 5 __SPIN_LOCK_UNLOCKED()/__RW_LOCK_UNLOCKED() as appropriate for static 6 6 initialization. 7 7 8 + Most of the time, you can simply turn: 9 + 10 + static spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED; 11 + 12 + into: 13 + 14 + static DEFINE_SPINLOCK(xxx_lock); 15 + 16 + Static structure member variables go from: 17 + 18 + struct foo bar { 19 + .lock = SPIN_LOCK_UNLOCKED; 20 + }; 21 + 22 + to: 23 + 24 + struct foo bar { 25 + .lock = __SPIN_LOCK_UNLOCKED(bar.lock); 26 + }; 27 + 28 + Declaration of static rw_locks undergo a similar transformation. 29 + 8 30 Dynamic initialization, when necessary, may be performed as 9 31 demonstrated below. 10 32
+4 -4
fs/Kconfig
··· 1744 1744 If you want your Linux box to mount its whole root file system (the 1745 1745 one containing the directory /) from some other computer over the 1746 1746 net via NFS (presumably because your box doesn't have a hard disk), 1747 - say Y. Read <file:Documentation/nfsroot.txt> for details. It is 1748 - likely that in this case, you also want to say Y to "Kernel level IP 1749 - autoconfiguration" so that your box can discover its network address 1750 - at boot time. 1747 + say Y. Read <file:Documentation/filesystems/nfsroot.txt> for 1748 + details. It is likely that in this case, you also want to say Y to 1749 + "Kernel level IP autoconfiguration" so that your box can discover 1750 + its network address at boot time. 1751 1751 1752 1752 Most people say N here. 1753 1753
+3
include/linux/spinlock.h
··· 341 341 * atomic_dec_and_lock - lock on reaching reference count zero 342 342 * @atomic: the atomic counter 343 343 * @lock: the spinlock in question 344 + * 345 + * Decrements @atomic by 1. If the result is 0, returns true and locks 346 + * @lock. Returns false for all other cases. 344 347 */ 345 348 extern int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock); 346 349 #define atomic_dec_and_lock(atomic, lock) \
+4 -4
net/ipv4/Kconfig
··· 160 160 161 161 If unsure, say Y. Note that if you want to use DHCP, a DHCP server 162 162 must be operating on your network. Read 163 - <file:Documentation/nfsroot.txt> for details. 163 + <file:Documentation/filesystems/nfsroot.txt> for details. 164 164 165 165 config IP_PNP_BOOTP 166 166 bool "IP: BOOTP support" ··· 175 175 does BOOTP itself, providing all necessary information on the kernel 176 176 command line, you can say N here. If unsure, say Y. Note that if you 177 177 want to use BOOTP, a BOOTP server must be operating on your network. 178 - Read <file:Documentation/nfsroot.txt> for details. 178 + Read <file:Documentation/filesystems/nfsroot.txt> for details. 179 179 180 180 config IP_PNP_RARP 181 181 bool "IP: RARP support" ··· 187 187 discovered automatically at boot time using the RARP protocol (an 188 188 older protocol which is being obsoleted by BOOTP and DHCP), say Y 189 189 here. Note that if you want to use RARP, a RARP server must be 190 - operating on your network. Read <file:Documentation/nfsroot.txt> for 191 - details. 190 + operating on your network. Read 191 + <file:Documentation/filesystems/nfsroot.txt> for details. 192 192 193 193 # not yet ready.. 194 194 # bool ' IP: ARP support' CONFIG_IP_PNP_ARP
+1 -1
net/ipv4/ipconfig.c
··· 1411 1411 1412 1412 /* 1413 1413 * Decode any IP configuration options in the "ip=" or "nfsaddrs=" kernel 1414 - * command line parameter. See Documentation/nfsroot.txt. 1414 + * command line parameter. See Documentation/filesystems/nfsroot.txt. 1415 1415 */ 1416 1416 static int __init ic_proto_name(char *name) 1417 1417 {