Loading Documentation/cciss.txt +3 −0 Original line number Diff line number Diff line Loading @@ -21,11 +21,14 @@ This driver is known to work with the following cards: * SA E200 * SA E200i * SA E500 * SA P700m * SA P212 * SA P410 * SA P410i * SA P411 * SA P812 * SA P712m * SA P711m Detecting drive failures: ------------------------- Loading Documentation/email-clients.txt +25 −0 Original line number Diff line number Diff line Loading @@ -213,4 +213,29 @@ TkRat (GUI) Works. Use "Insert file..." or external editor. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Gmail (Web GUI) If you just have to use Gmail to send patches, it CAN be made to work. It requires a bit of external help, though. The first problem is that Gmail converts tabs to spaces. This will totally break your patches. To prevent this, you have to use a different editor. There is a firefox extension called "ViewSourceWith" (https://addons.mozilla.org/en-US/firefox/addon/394) which allows you to edit any text box in the editor of your choice. Configure it to launch your favorite editor. When you want to send a patch, use this technique. Once you have crafted your messsage + patch, save and exit the editor, which should reload the Gmail edit box. GMAIL WILL PRESERVE THE TABS. Hoorah. Apparently you can cut-n-paste literal tabs, but Gmail will convert those to spaces upon sending! The second problem is that Gmail converts tabs to spaces on replies. If you reply to a patch, don't expect to be able to apply it as a patch. The last problem is that Gmail will base64-encode any message that has a non-ASCII character. That includes things like European names. Be aware. Gmail is not convenient for lkml patches, but CAN be made to work. ### Documentation/feature-removal-schedule.txt +0 −24 Original line number Diff line number Diff line Loading @@ -56,30 +56,6 @@ Who: Mauro Carvalho Chehab <mchehab@infradead.org> --------------------------- What: old tuner-3036 i2c driver When: 2.6.28 Why: This driver is for VERY old i2c-over-parallel port teletext receiver boxes. Rather then spending effort on converting this driver to V4L2, and since it is extremely unlikely that anyone still uses one of these devices, it was decided to drop it. Who: Hans Verkuil <hverkuil@xs4all.nl> Mauro Carvalho Chehab <mchehab@infradead.org> --------------------------- What: V4L2 dpc7146 driver When: 2.6.28 Why: Old driver for the dpc7146 demonstration board that is no longer relevant. The last time this was tested on actual hardware was probably around 2002. Since this is a driver for a demonstration board the decision was made to remove it rather than spending a lot of effort continually updating this driver to stay in sync with the latest internal V4L2 or I2C API. Who: Hans Verkuil <hverkuil@xs4all.nl> Mauro Carvalho Chehab <mchehab@infradead.org> --------------------------- What: PCMCIA control ioctl (needed for pcmcia-cs [cardmgr, cardctl]) When: November 2005 Files: drivers/pcmcia/: pcmcia_ioctl.c Loading Documentation/filesystems/vfat.txt +30 −2 Original line number Diff line number Diff line Loading @@ -8,6 +8,12 @@ if you want to format from within Linux. VFAT MOUNT OPTIONS ---------------------------------------------------------------------- uid=### -- Set the owner of all files on this filesystem. The default is the uid of current process. gid=### -- Set the group of all files on this filesystem. The default is the gid of current process. umask=### -- The permission mask (for files and directories, see umask(1)). The default is the umask of current process. Loading Loading @@ -36,7 +42,7 @@ codepage=### -- Sets the codepage number for converting to shortname characters on FAT filesystem. By default, FAT_DEFAULT_CODEPAGE setting is used. iocharset=name -- Character set to use for converting between the iocharset=<name> -- Character set to use for converting between the encoding is used for user visible filename and 16 bit Unicode characters. Long filenames are stored on disk in Unicode format, but Unix for the most part doesn't Loading Loading @@ -86,6 +92,8 @@ check=s|r|n -- Case sensitivity checking setting. r: relaxed, case insensitive n: normal, default setting, currently case insensitive nocase -- This was deprecated for vfat. Use shortname=win95 instead. shortname=lower|win95|winnt|mixed -- Shortname display/create setting. lower: convert to lowercase for display, Loading @@ -99,11 +107,31 @@ shortname=lower|win95|winnt|mixed tz=UTC -- Interpret timestamps as UTC rather than local time. This option disables the conversion of timestamps between local time (as used by Windows on FAT) and UTC (which Linux uses internally). This is particuluarly (which Linux uses internally). This is particularly useful when mounting devices (like digital cameras) that are set to UTC in order to avoid the pitfalls of local time. showexec -- If set, the execute permission bits of the file will be allowed only if the extension part of the name is .EXE, .COM, or .BAT. Not set by default. debug -- Can be set, but unused by the current implementation. sys_immutable -- If set, ATTR_SYS attribute on FAT is handled as IMMUTABLE flag on Linux. Not set by default. flush -- If set, the filesystem will try to flush to disk more early than normal. Not set by default. rodir -- FAT has the ATTR_RO (read-only) attribute. But on Windows, the ATTR_RO of the directory will be just ignored actually, and is used by only applications as flag. E.g. it's setted for the customized folder. If you want to use ATTR_RO as read-only flag even for the directory, set this option. <bool>: 0,1,yes,no,true,false TODO Loading Documentation/ftrace.txt +73 −98 Original line number Diff line number Diff line Loading @@ -8,7 +8,7 @@ Copyright 2008 Red Hat Inc. Reviewers: Elias Oltmanns, Randy Dunlap, Andrew Morton, John Kacur, and David Teigland. Written for: 2.6.27-rc1 Written for: 2.6.28-rc2 Introduction ------------ Loading Loading @@ -94,23 +94,20 @@ of ftrace. Here is a list of some of the key files: only be recorded if the latency is greater than the value in this file. (in microseconds) trace_entries : This sets or displays the number of trace entries each CPU buffer can hold. The tracer buffers are the same size for each CPU. The displayed number is the size of the CPU buffer and not total size. The trace_entries: This sets or displays the number of bytes each CPU buffer can hold. The tracer buffers are the same size for each CPU. The displayed number is the size of the CPU buffer and not total size of all buffers. The trace buffers are allocated in pages (blocks of memory that the kernel uses for allocation, usually 4 KB in size). Since each entry is smaller than a page, if the last allocated page has room for more entries than were requested, the rest of the page is used to allocate entries. If the last page allocated has room for more bytes than requested, the rest of the page will be used, making the actual allocation bigger than requested. (Note, the size may not be a multiple of the page size due to buffer managment overhead.) This can only be updated when the current_tracer is set to "none". NOTE: It is planned on changing the allocated buffers from being the number of possible CPUS to the number of online CPUS. is set to "nop". tracing_cpumask: This is a mask that lets the user only trace on specified CPUS. The format is a hex string Loading @@ -130,14 +127,11 @@ of ftrace. Here is a list of some of the key files: be traced. If a function exists in both set_ftrace_filter and set_ftrace_notrace, the function will _not_ be traced. available_filter_functions : When a function is encountered the first time by the dynamic tracer, it is recorded and later the call is converted into a nop. This file lists the functions that have been recorded by the dynamic tracer and these functions can be used to set the ftrace filter by the above "set_ftrace_filter" file. (See the section "dynamic ftrace" below for more details). available_filter_functions: This lists the functions that ftrace has processed and can trace. These are the function names that you can pass to "set_ftrace_filter" or "set_ftrace_notrace". (See the section "dynamic ftrace" below for more details.) The Tracers Loading @@ -145,7 +139,7 @@ The Tracers Here is the list of current tracers that may be configured. ftrace - function tracer that uses mcount to trace all functions. function - function tracer that uses mcount to trace all functions. sched_switch - traces the context switches between tasks. Loading @@ -166,8 +160,8 @@ Here is the list of current tracers that may be configured. the highest priority task to get scheduled after it has been woken up. none - This is not a tracer. To remove all tracers from tracing simply echo "none" into current_tracer. nop - This is not a tracer. To remove all tracers from tracing simply echo "nop" into current_tracer. Examples of using the tracer Loading @@ -182,7 +176,7 @@ Output format: Here is an example of the output format of the file "trace" -------- # tracer: ftrace # tracer: function # # TASK-PID CPU# TIMESTAMP FUNCTION # | | | | | Loading @@ -192,7 +186,7 @@ Here is an example of the output format of the file "trace" -------- A header is printed with the tracer name that is represented by the trace. In this case the tracer is "ftrace". Then a header showing the format. Task In this case the tracer is "function". Then a header showing the format. Task name "bash", the task PID "4251", the CPU that it was running on "01", the timestamp in <secs>.<usecs> format, the function name that was traced "path_put" and the parent function that called this function Loading Loading @@ -1003,22 +997,20 @@ is the stack for the hard interrupt. This hides the fact that NEED_RESCHED has been set. We do not see the 'N' until we switch back to the task's assigned stack. ftrace ------ function -------- ftrace is not only the name of the tracing infrastructure, but it is also a name of one of the tracers. The tracer is the function tracer. Enabling the function tracer can be done from the debug file system. Make sure the ftrace_enabled is set otherwise this tracer is a nop. This tracer is the function tracer. Enabling the function tracer can be done from the debug file system. Make sure the ftrace_enabled is set; otherwise this tracer is a nop. # sysctl kernel.ftrace_enabled=1 # echo ftrace > /debug/tracing/current_tracer # echo function > /debug/tracing/current_tracer # echo 1 > /debug/tracing/tracing_enabled # usleep 1 # echo 0 > /debug/tracing/tracing_enabled # cat /debug/tracing/trace # tracer: ftrace # tracer: function # # TASK-PID CPU# TIMESTAMP FUNCTION # | | | | | Loading @@ -1040,10 +1032,10 @@ this tracer is a nop. [...] Note: ftrace uses ring buffers to store the above entries. The newest data may overwrite the oldest data. Sometimes using echo to stop the trace is not sufficient because the tracing could have overwritten the data that you wanted to record. For this reason, it is sometimes better to Note: function tracer uses ring buffers to store the above entries. The newest data may overwrite the oldest data. Sometimes using echo to stop the trace is not sufficient because the tracing could have overwritten the data that you wanted to record. For this reason, it is sometimes better to disable tracing directly from a program. This allows you to stop the tracing at the point that you hit the part that you are interested in. To disable the tracing directly from a C program, something like following Loading Loading @@ -1077,18 +1069,31 @@ every kernel function, produced by the -pg switch in gcc), starts of pointing to a simple return. (Enabling FTRACE will include the -pg switch in the compiling of the kernel.) When dynamic ftrace is initialized, it calls kstop_machine to make the machine act like a uniprocessor so that it can freely modify code without worrying about other processors executing that same code. At initialization, the mcount calls are changed to call a "record_ip" function. After this, the first time a kernel function is called, it has the calling address saved in a hash table. Later on the ftraced kernel thread is awoken and will again call kstop_machine if new functions have been recorded. The ftraced thread will change all calls to mcount to "nop". Just calling mcount and having mcount return has shown a 10% overhead. By converting it to a nop, there is no measurable overhead to the system. At compile time every C file object is run through the recordmcount.pl script (located in the scripts directory). This script will process the C object using objdump to find all the locations in the .text section that call mcount. (Note, only the .text section is processed, since processing other sections like .init.text may cause races due to those sections being freed). A new section called "__mcount_loc" is created that holds references to all the mcount call sites in the .text section. This section is compiled back into the original object. The final linker will add all these references into a single table. On boot up, before SMP is initialized, the dynamic ftrace code scans this table and updates all the locations into nops. It also records the locations, which are added to the available_filter_functions list. Modules are processed as they are loaded and before they are executed. When a module is unloaded, it also removes its functions from the ftrace function list. This is automatic in the module unload code, and the module author does not need to worry about it. When tracing is enabled, kstop_machine is called to prevent races with the CPUS executing code being modified (which can cause the CPU to do undesireable things), and the nops are patched back to calls. But this time, they do not call mcount (which is just a function stub). They now call into the ftrace infrastructure. One special side-effect to the recording of the functions being traced is that we can now selectively choose which functions we Loading Loading @@ -1251,36 +1256,6 @@ Produces: We can see that there's no more lock or preempt tracing. ftraced ------- As mentioned above, when dynamic ftrace is configured in, a kernel thread wakes up once a second and checks to see if there are mcount calls that need to be converted into nops. If there are not any, then it simply goes back to sleep. But if there are some, it will call kstop_machine to convert the calls to nops. There may be a case in which you do not want this added latency. Perhaps you are doing some audio recording and this activity might cause skips in the playback. There is an interface to disable and enable the "ftraced" kernel thread. # echo 0 > /debug/tracing/ftraced_enabled This will disable the calling of kstop_machine to update the mcount calls to nops. Remember that there is a large overhead to calling mcount. Without this kernel thread, that overhead will exist. If there are recorded calls to mcount, any write to the ftraced_enabled file will cause the kstop_machine to run. This means that a user can manually perform the updates when they want to by simply echoing a '0' into the ftraced_enabled file. The updates are also done at the beginning of enabling a tracer that uses ftrace function recording. trace_pipe ---------- Loading @@ -1289,14 +1264,14 @@ on the tracing is different. Every read from trace_pipe is consumed. This means that subsequent reads will be different. The trace is live. # echo ftrace > /debug/tracing/current_tracer # echo function > /debug/tracing/current_tracer # cat /debug/tracing/trace_pipe > /tmp/trace.out & [1] 4153 # echo 1 > /debug/tracing/tracing_enabled # usleep 1 # echo 0 > /debug/tracing/tracing_enabled # cat /debug/tracing/trace # tracer: ftrace # tracer: function # # TASK-PID CPU# TIMESTAMP FUNCTION # | | | | | Loading @@ -1317,7 +1292,7 @@ is live. Note, reading the trace_pipe file will block until more input is added. By changing the tracer, trace_pipe will issue an EOF. We needed to set the ftrace tracer _before_ cating the trace_pipe file. to set the function tracer _before_ we "cat" the trace_pipe file. trace entries Loading @@ -1334,10 +1309,10 @@ number of entries. 65620 Note, to modify this, you must have tracing completely disabled. To do that, echo "none" into the current_tracer. If the current_tracer is not set to "none", an EINVAL error will be returned. echo "nop" into the current_tracer. If the current_tracer is not set to "nop", an EINVAL error will be returned. # echo none > /debug/tracing/current_tracer # echo nop > /debug/tracing/current_tracer # echo 100000 > /debug/tracing/trace_entries # cat /debug/tracing/trace_entries 100045 Loading Loading
Documentation/cciss.txt +3 −0 Original line number Diff line number Diff line Loading @@ -21,11 +21,14 @@ This driver is known to work with the following cards: * SA E200 * SA E200i * SA E500 * SA P700m * SA P212 * SA P410 * SA P410i * SA P411 * SA P812 * SA P712m * SA P711m Detecting drive failures: ------------------------- Loading
Documentation/email-clients.txt +25 −0 Original line number Diff line number Diff line Loading @@ -213,4 +213,29 @@ TkRat (GUI) Works. Use "Insert file..." or external editor. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Gmail (Web GUI) If you just have to use Gmail to send patches, it CAN be made to work. It requires a bit of external help, though. The first problem is that Gmail converts tabs to spaces. This will totally break your patches. To prevent this, you have to use a different editor. There is a firefox extension called "ViewSourceWith" (https://addons.mozilla.org/en-US/firefox/addon/394) which allows you to edit any text box in the editor of your choice. Configure it to launch your favorite editor. When you want to send a patch, use this technique. Once you have crafted your messsage + patch, save and exit the editor, which should reload the Gmail edit box. GMAIL WILL PRESERVE THE TABS. Hoorah. Apparently you can cut-n-paste literal tabs, but Gmail will convert those to spaces upon sending! The second problem is that Gmail converts tabs to spaces on replies. If you reply to a patch, don't expect to be able to apply it as a patch. The last problem is that Gmail will base64-encode any message that has a non-ASCII character. That includes things like European names. Be aware. Gmail is not convenient for lkml patches, but CAN be made to work. ###
Documentation/feature-removal-schedule.txt +0 −24 Original line number Diff line number Diff line Loading @@ -56,30 +56,6 @@ Who: Mauro Carvalho Chehab <mchehab@infradead.org> --------------------------- What: old tuner-3036 i2c driver When: 2.6.28 Why: This driver is for VERY old i2c-over-parallel port teletext receiver boxes. Rather then spending effort on converting this driver to V4L2, and since it is extremely unlikely that anyone still uses one of these devices, it was decided to drop it. Who: Hans Verkuil <hverkuil@xs4all.nl> Mauro Carvalho Chehab <mchehab@infradead.org> --------------------------- What: V4L2 dpc7146 driver When: 2.6.28 Why: Old driver for the dpc7146 demonstration board that is no longer relevant. The last time this was tested on actual hardware was probably around 2002. Since this is a driver for a demonstration board the decision was made to remove it rather than spending a lot of effort continually updating this driver to stay in sync with the latest internal V4L2 or I2C API. Who: Hans Verkuil <hverkuil@xs4all.nl> Mauro Carvalho Chehab <mchehab@infradead.org> --------------------------- What: PCMCIA control ioctl (needed for pcmcia-cs [cardmgr, cardctl]) When: November 2005 Files: drivers/pcmcia/: pcmcia_ioctl.c Loading
Documentation/filesystems/vfat.txt +30 −2 Original line number Diff line number Diff line Loading @@ -8,6 +8,12 @@ if you want to format from within Linux. VFAT MOUNT OPTIONS ---------------------------------------------------------------------- uid=### -- Set the owner of all files on this filesystem. The default is the uid of current process. gid=### -- Set the group of all files on this filesystem. The default is the gid of current process. umask=### -- The permission mask (for files and directories, see umask(1)). The default is the umask of current process. Loading Loading @@ -36,7 +42,7 @@ codepage=### -- Sets the codepage number for converting to shortname characters on FAT filesystem. By default, FAT_DEFAULT_CODEPAGE setting is used. iocharset=name -- Character set to use for converting between the iocharset=<name> -- Character set to use for converting between the encoding is used for user visible filename and 16 bit Unicode characters. Long filenames are stored on disk in Unicode format, but Unix for the most part doesn't Loading Loading @@ -86,6 +92,8 @@ check=s|r|n -- Case sensitivity checking setting. r: relaxed, case insensitive n: normal, default setting, currently case insensitive nocase -- This was deprecated for vfat. Use shortname=win95 instead. shortname=lower|win95|winnt|mixed -- Shortname display/create setting. lower: convert to lowercase for display, Loading @@ -99,11 +107,31 @@ shortname=lower|win95|winnt|mixed tz=UTC -- Interpret timestamps as UTC rather than local time. This option disables the conversion of timestamps between local time (as used by Windows on FAT) and UTC (which Linux uses internally). This is particuluarly (which Linux uses internally). This is particularly useful when mounting devices (like digital cameras) that are set to UTC in order to avoid the pitfalls of local time. showexec -- If set, the execute permission bits of the file will be allowed only if the extension part of the name is .EXE, .COM, or .BAT. Not set by default. debug -- Can be set, but unused by the current implementation. sys_immutable -- If set, ATTR_SYS attribute on FAT is handled as IMMUTABLE flag on Linux. Not set by default. flush -- If set, the filesystem will try to flush to disk more early than normal. Not set by default. rodir -- FAT has the ATTR_RO (read-only) attribute. But on Windows, the ATTR_RO of the directory will be just ignored actually, and is used by only applications as flag. E.g. it's setted for the customized folder. If you want to use ATTR_RO as read-only flag even for the directory, set this option. <bool>: 0,1,yes,no,true,false TODO Loading
Documentation/ftrace.txt +73 −98 Original line number Diff line number Diff line Loading @@ -8,7 +8,7 @@ Copyright 2008 Red Hat Inc. Reviewers: Elias Oltmanns, Randy Dunlap, Andrew Morton, John Kacur, and David Teigland. Written for: 2.6.27-rc1 Written for: 2.6.28-rc2 Introduction ------------ Loading Loading @@ -94,23 +94,20 @@ of ftrace. Here is a list of some of the key files: only be recorded if the latency is greater than the value in this file. (in microseconds) trace_entries : This sets or displays the number of trace entries each CPU buffer can hold. The tracer buffers are the same size for each CPU. The displayed number is the size of the CPU buffer and not total size. The trace_entries: This sets or displays the number of bytes each CPU buffer can hold. The tracer buffers are the same size for each CPU. The displayed number is the size of the CPU buffer and not total size of all buffers. The trace buffers are allocated in pages (blocks of memory that the kernel uses for allocation, usually 4 KB in size). Since each entry is smaller than a page, if the last allocated page has room for more entries than were requested, the rest of the page is used to allocate entries. If the last page allocated has room for more bytes than requested, the rest of the page will be used, making the actual allocation bigger than requested. (Note, the size may not be a multiple of the page size due to buffer managment overhead.) This can only be updated when the current_tracer is set to "none". NOTE: It is planned on changing the allocated buffers from being the number of possible CPUS to the number of online CPUS. is set to "nop". tracing_cpumask: This is a mask that lets the user only trace on specified CPUS. The format is a hex string Loading @@ -130,14 +127,11 @@ of ftrace. Here is a list of some of the key files: be traced. If a function exists in both set_ftrace_filter and set_ftrace_notrace, the function will _not_ be traced. available_filter_functions : When a function is encountered the first time by the dynamic tracer, it is recorded and later the call is converted into a nop. This file lists the functions that have been recorded by the dynamic tracer and these functions can be used to set the ftrace filter by the above "set_ftrace_filter" file. (See the section "dynamic ftrace" below for more details). available_filter_functions: This lists the functions that ftrace has processed and can trace. These are the function names that you can pass to "set_ftrace_filter" or "set_ftrace_notrace". (See the section "dynamic ftrace" below for more details.) The Tracers Loading @@ -145,7 +139,7 @@ The Tracers Here is the list of current tracers that may be configured. ftrace - function tracer that uses mcount to trace all functions. function - function tracer that uses mcount to trace all functions. sched_switch - traces the context switches between tasks. Loading @@ -166,8 +160,8 @@ Here is the list of current tracers that may be configured. the highest priority task to get scheduled after it has been woken up. none - This is not a tracer. To remove all tracers from tracing simply echo "none" into current_tracer. nop - This is not a tracer. To remove all tracers from tracing simply echo "nop" into current_tracer. Examples of using the tracer Loading @@ -182,7 +176,7 @@ Output format: Here is an example of the output format of the file "trace" -------- # tracer: ftrace # tracer: function # # TASK-PID CPU# TIMESTAMP FUNCTION # | | | | | Loading @@ -192,7 +186,7 @@ Here is an example of the output format of the file "trace" -------- A header is printed with the tracer name that is represented by the trace. In this case the tracer is "ftrace". Then a header showing the format. Task In this case the tracer is "function". Then a header showing the format. Task name "bash", the task PID "4251", the CPU that it was running on "01", the timestamp in <secs>.<usecs> format, the function name that was traced "path_put" and the parent function that called this function Loading Loading @@ -1003,22 +997,20 @@ is the stack for the hard interrupt. This hides the fact that NEED_RESCHED has been set. We do not see the 'N' until we switch back to the task's assigned stack. ftrace ------ function -------- ftrace is not only the name of the tracing infrastructure, but it is also a name of one of the tracers. The tracer is the function tracer. Enabling the function tracer can be done from the debug file system. Make sure the ftrace_enabled is set otherwise this tracer is a nop. This tracer is the function tracer. Enabling the function tracer can be done from the debug file system. Make sure the ftrace_enabled is set; otherwise this tracer is a nop. # sysctl kernel.ftrace_enabled=1 # echo ftrace > /debug/tracing/current_tracer # echo function > /debug/tracing/current_tracer # echo 1 > /debug/tracing/tracing_enabled # usleep 1 # echo 0 > /debug/tracing/tracing_enabled # cat /debug/tracing/trace # tracer: ftrace # tracer: function # # TASK-PID CPU# TIMESTAMP FUNCTION # | | | | | Loading @@ -1040,10 +1032,10 @@ this tracer is a nop. [...] Note: ftrace uses ring buffers to store the above entries. The newest data may overwrite the oldest data. Sometimes using echo to stop the trace is not sufficient because the tracing could have overwritten the data that you wanted to record. For this reason, it is sometimes better to Note: function tracer uses ring buffers to store the above entries. The newest data may overwrite the oldest data. Sometimes using echo to stop the trace is not sufficient because the tracing could have overwritten the data that you wanted to record. For this reason, it is sometimes better to disable tracing directly from a program. This allows you to stop the tracing at the point that you hit the part that you are interested in. To disable the tracing directly from a C program, something like following Loading Loading @@ -1077,18 +1069,31 @@ every kernel function, produced by the -pg switch in gcc), starts of pointing to a simple return. (Enabling FTRACE will include the -pg switch in the compiling of the kernel.) When dynamic ftrace is initialized, it calls kstop_machine to make the machine act like a uniprocessor so that it can freely modify code without worrying about other processors executing that same code. At initialization, the mcount calls are changed to call a "record_ip" function. After this, the first time a kernel function is called, it has the calling address saved in a hash table. Later on the ftraced kernel thread is awoken and will again call kstop_machine if new functions have been recorded. The ftraced thread will change all calls to mcount to "nop". Just calling mcount and having mcount return has shown a 10% overhead. By converting it to a nop, there is no measurable overhead to the system. At compile time every C file object is run through the recordmcount.pl script (located in the scripts directory). This script will process the C object using objdump to find all the locations in the .text section that call mcount. (Note, only the .text section is processed, since processing other sections like .init.text may cause races due to those sections being freed). A new section called "__mcount_loc" is created that holds references to all the mcount call sites in the .text section. This section is compiled back into the original object. The final linker will add all these references into a single table. On boot up, before SMP is initialized, the dynamic ftrace code scans this table and updates all the locations into nops. It also records the locations, which are added to the available_filter_functions list. Modules are processed as they are loaded and before they are executed. When a module is unloaded, it also removes its functions from the ftrace function list. This is automatic in the module unload code, and the module author does not need to worry about it. When tracing is enabled, kstop_machine is called to prevent races with the CPUS executing code being modified (which can cause the CPU to do undesireable things), and the nops are patched back to calls. But this time, they do not call mcount (which is just a function stub). They now call into the ftrace infrastructure. One special side-effect to the recording of the functions being traced is that we can now selectively choose which functions we Loading Loading @@ -1251,36 +1256,6 @@ Produces: We can see that there's no more lock or preempt tracing. ftraced ------- As mentioned above, when dynamic ftrace is configured in, a kernel thread wakes up once a second and checks to see if there are mcount calls that need to be converted into nops. If there are not any, then it simply goes back to sleep. But if there are some, it will call kstop_machine to convert the calls to nops. There may be a case in which you do not want this added latency. Perhaps you are doing some audio recording and this activity might cause skips in the playback. There is an interface to disable and enable the "ftraced" kernel thread. # echo 0 > /debug/tracing/ftraced_enabled This will disable the calling of kstop_machine to update the mcount calls to nops. Remember that there is a large overhead to calling mcount. Without this kernel thread, that overhead will exist. If there are recorded calls to mcount, any write to the ftraced_enabled file will cause the kstop_machine to run. This means that a user can manually perform the updates when they want to by simply echoing a '0' into the ftraced_enabled file. The updates are also done at the beginning of enabling a tracer that uses ftrace function recording. trace_pipe ---------- Loading @@ -1289,14 +1264,14 @@ on the tracing is different. Every read from trace_pipe is consumed. This means that subsequent reads will be different. The trace is live. # echo ftrace > /debug/tracing/current_tracer # echo function > /debug/tracing/current_tracer # cat /debug/tracing/trace_pipe > /tmp/trace.out & [1] 4153 # echo 1 > /debug/tracing/tracing_enabled # usleep 1 # echo 0 > /debug/tracing/tracing_enabled # cat /debug/tracing/trace # tracer: ftrace # tracer: function # # TASK-PID CPU# TIMESTAMP FUNCTION # | | | | | Loading @@ -1317,7 +1292,7 @@ is live. Note, reading the trace_pipe file will block until more input is added. By changing the tracer, trace_pipe will issue an EOF. We needed to set the ftrace tracer _before_ cating the trace_pipe file. to set the function tracer _before_ we "cat" the trace_pipe file. trace entries Loading @@ -1334,10 +1309,10 @@ number of entries. 65620 Note, to modify this, you must have tracing completely disabled. To do that, echo "none" into the current_tracer. If the current_tracer is not set to "none", an EINVAL error will be returned. echo "nop" into the current_tracer. If the current_tracer is not set to "nop", an EINVAL error will be returned. # echo none > /debug/tracing/current_tracer # echo nop > /debug/tracing/current_tracer # echo 100000 > /debug/tracing/trace_entries # cat /debug/tracing/trace_entries 100045 Loading