|
@@ -12,8 +12,8 @@ where log records can be stored efficiently in memory, where each component
|
|
|
One purpose of this is to inspect the debug logs after a production system crash
|
|
|
in order to analyze the reason for the crash.
|
|
|
If the system still runs but only a subcomponent which uses dbf failes,
|
|
|
-it is possible to look at the debug logs on a live system via the Linux proc
|
|
|
-filesystem.
|
|
|
+it is possible to look at the debug logs on a live system via the Linux
|
|
|
+debugfs filesystem.
|
|
|
The debug feature may also very useful for kernel and driver development.
|
|
|
|
|
|
Design:
|
|
@@ -52,16 +52,18 @@ Each debug entry contains the following data:
|
|
|
- Flag, if entry is an exception or not
|
|
|
|
|
|
The debug logs can be inspected in a live system through entries in
|
|
|
-the proc-filesystem. Under the path /proc/s390dbf there is
|
|
|
+the debugfs-filesystem. Under the toplevel directory "s390dbf" there is
|
|
|
a directory for each registered component, which is named like the
|
|
|
-corresponding component.
|
|
|
+corresponding component. The debugfs normally should be mounted to
|
|
|
+/sys/kernel/debug therefore the debug feature can be accessed unter
|
|
|
+/sys/kernel/debug/s390dbf.
|
|
|
|
|
|
The content of the directories are files which represent different views
|
|
|
to the debug log. Each component can decide which views should be
|
|
|
used through registering them with the function debug_register_view().
|
|
|
Predefined views for hex/ascii, sprintf and raw binary data are provided.
|
|
|
It is also possible to define other views. The content of
|
|
|
-a view can be inspected simply by reading the corresponding proc file.
|
|
|
+a view can be inspected simply by reading the corresponding debugfs file.
|
|
|
|
|
|
All debug logs have an an actual debug level (range from 0 to 6).
|
|
|
The default level is 3. Event and Exception functions have a 'level'
|
|
@@ -69,14 +71,14 @@ parameter. Only debug entries with a level that is lower or equal
|
|
|
than the actual level are written to the log. This means, when
|
|
|
writing events, high priority log entries should have a low level
|
|
|
value whereas low priority entries should have a high one.
|
|
|
-The actual debug level can be changed with the help of the proc-filesystem
|
|
|
-through writing a number string "x" to the 'level' proc file which is
|
|
|
+The actual debug level can be changed with the help of the debugfs-filesystem
|
|
|
+through writing a number string "x" to the 'level' debugfs file which is
|
|
|
provided for every debug log. Debugging can be switched off completely
|
|
|
-by using "-" on the 'level' proc file.
|
|
|
+by using "-" on the 'level' debugfs file.
|
|
|
|
|
|
Example:
|
|
|
|
|
|
-> echo "-" > /proc/s390dbf/dasd/level
|
|
|
+> echo "-" > /sys/kernel/debug/s390dbf/dasd/level
|
|
|
|
|
|
It is also possible to deactivate the debug feature globally for every
|
|
|
debug log. You can change the behavior using 2 sysctl parameters in
|
|
@@ -99,11 +101,11 @@ Kernel Interfaces:
|
|
|
------------------
|
|
|
|
|
|
----------------------------------------------------------------------------
|
|
|
-debug_info_t *debug_register(char *name, int pages_index, int nr_areas,
|
|
|
+debug_info_t *debug_register(char *name, int pages, int nr_areas,
|
|
|
int buf_size);
|
|
|
|
|
|
-Parameter: name: Name of debug log (e.g. used for proc entry)
|
|
|
- pages_index: 2^pages_index pages will be allocated per area
|
|
|
+Parameter: name: Name of debug log (e.g. used for debugfs entry)
|
|
|
+ pages: number of pages, which will be allocated per area
|
|
|
nr_areas: number of debug areas
|
|
|
buf_size: size of data area in each debug entry
|
|
|
|
|
@@ -134,7 +136,7 @@ Return Value: none
|
|
|
Description: Sets new actual debug level if new_level is valid.
|
|
|
|
|
|
---------------------------------------------------------------------------
|
|
|
-+void debug_stop_all(void);
|
|
|
+void debug_stop_all(void);
|
|
|
|
|
|
Parameter: none
|
|
|
|
|
@@ -270,7 +272,7 @@ Parameter: id: handle for debug log
|
|
|
Return Value: 0 : ok
|
|
|
< 0: Error
|
|
|
|
|
|
-Description: registers new debug view and creates proc dir entry
|
|
|
+Description: registers new debug view and creates debugfs dir entry
|
|
|
|
|
|
---------------------------------------------------------------------------
|
|
|
int debug_unregister_view (debug_info_t * id, struct debug_view *view);
|
|
@@ -281,7 +283,7 @@ Parameter: id: handle for debug log
|
|
|
Return Value: 0 : ok
|
|
|
< 0: Error
|
|
|
|
|
|
-Description: unregisters debug view and removes proc dir entry
|
|
|
+Description: unregisters debug view and removes debugfs dir entry
|
|
|
|
|
|
|
|
|
|
|
@@ -308,7 +310,7 @@ static int init(void)
|
|
|
{
|
|
|
/* register 4 debug areas with one page each and 4 byte data field */
|
|
|
|
|
|
- debug_info = debug_register ("test", 0, 4, 4 );
|
|
|
+ debug_info = debug_register ("test", 1, 4, 4 );
|
|
|
debug_register_view(debug_info,&debug_hex_ascii_view);
|
|
|
debug_register_view(debug_info,&debug_raw_view);
|
|
|
|
|
@@ -343,7 +345,7 @@ static int init(void)
|
|
|
/* register 4 debug areas with one page each and data field for */
|
|
|
/* format string pointer + 2 varargs (= 3 * sizeof(long)) */
|
|
|
|
|
|
- debug_info = debug_register ("test", 0, 4, sizeof(long) * 3);
|
|
|
+ debug_info = debug_register ("test", 1, 4, sizeof(long) * 3);
|
|
|
debug_register_view(debug_info,&debug_sprintf_view);
|
|
|
|
|
|
debug_sprintf_event(debug_info, 2 , "first event in %s:%i\n",__FILE__,__LINE__);
|
|
@@ -362,16 +364,16 @@ module_exit(cleanup);
|
|
|
|
|
|
|
|
|
|
|
|
-ProcFS Interface
|
|
|
+Debugfs Interface
|
|
|
----------------
|
|
|
Views to the debug logs can be investigated through reading the corresponding
|
|
|
-proc-files:
|
|
|
+debugfs-files:
|
|
|
|
|
|
Example:
|
|
|
|
|
|
-> ls /proc/s390dbf/dasd
|
|
|
-flush hex_ascii level raw
|
|
|
-> cat /proc/s390dbf/dasd/hex_ascii | sort +1
|
|
|
+> ls /sys/kernel/debug/s390dbf/dasd
|
|
|
+flush hex_ascii level pages raw
|
|
|
+> cat /sys/kernel/debug/s390dbf/dasd/hex_ascii | sort +1
|
|
|
00 00974733272:680099 2 - 02 0006ad7e 07 ea 4a 90 | ....
|
|
|
00 00974733272:682210 2 - 02 0006ade6 46 52 45 45 | FREE
|
|
|
00 00974733272:682213 2 - 02 0006adf6 07 ea 4a 90 | ....
|
|
@@ -391,25 +393,36 @@ Changing the debug level
|
|
|
Example:
|
|
|
|
|
|
|
|
|
-> cat /proc/s390dbf/dasd/level
|
|
|
+> cat /sys/kernel/debug/s390dbf/dasd/level
|
|
|
3
|
|
|
-> echo "5" > /proc/s390dbf/dasd/level
|
|
|
-> cat /proc/s390dbf/dasd/level
|
|
|
+> echo "5" > /sys/kernel/debug/s390dbf/dasd/level
|
|
|
+> cat /sys/kernel/debug/s390dbf/dasd/level
|
|
|
5
|
|
|
|
|
|
Flushing debug areas
|
|
|
--------------------
|
|
|
Debug areas can be flushed with piping the number of the desired
|
|
|
-area (0...n) to the proc file "flush". When using "-" all debug areas
|
|
|
+area (0...n) to the debugfs file "flush". When using "-" all debug areas
|
|
|
are flushed.
|
|
|
|
|
|
Examples:
|
|
|
|
|
|
1. Flush debug area 0:
|
|
|
-> echo "0" > /proc/s390dbf/dasd/flush
|
|
|
+> echo "0" > /sys/kernel/debug/s390dbf/dasd/flush
|
|
|
|
|
|
2. Flush all debug areas:
|
|
|
-> echo "-" > /proc/s390dbf/dasd/flush
|
|
|
+> echo "-" > /sys/kernel/debug/s390dbf/dasd/flush
|
|
|
+
|
|
|
+Changing the size of debug areas
|
|
|
+------------------------------------
|
|
|
+It is possible the change the size of debug areas through piping
|
|
|
+the number of pages to the debugfs file "pages". The resize request will
|
|
|
+also flush the debug areas.
|
|
|
+
|
|
|
+Example:
|
|
|
+
|
|
|
+Define 4 pages for the debug areas of debug feature "dasd":
|
|
|
+> echo "4" > /sys/kernel/debug/s390dbf/dasd/pages
|
|
|
|
|
|
Stooping the debug feature
|
|
|
--------------------------
|
|
@@ -491,7 +504,7 @@ Defining views
|
|
|
--------------
|
|
|
|
|
|
Views are specified with the 'debug_view' structure. There are defined
|
|
|
-callback functions which are used for reading and writing the proc files:
|
|
|
+callback functions which are used for reading and writing the debugfs files:
|
|
|
|
|
|
struct debug_view {
|
|
|
char name[DEBUG_MAX_PROCF_LEN];
|
|
@@ -525,7 +538,7 @@ typedef int (debug_input_proc_t) (debug_info_t* id,
|
|
|
The "private_data" member can be used as pointer to view specific data.
|
|
|
It is not used by the debug feature itself.
|
|
|
|
|
|
-The output when reading a debug-proc file is structured like this:
|
|
|
+The output when reading a debugfs file is structured like this:
|
|
|
|
|
|
"prolog_proc output"
|
|
|
|
|
@@ -534,13 +547,13 @@ The output when reading a debug-proc file is structured like this:
|
|
|
"header_proc output 3" "format_proc output 3"
|
|
|
...
|
|
|
|
|
|
-When a view is read from the proc fs, the Debug Feature calls the
|
|
|
+When a view is read from the debugfs, the Debug Feature calls the
|
|
|
'prolog_proc' once for writing the prolog.
|
|
|
Then 'header_proc' and 'format_proc' are called for each
|
|
|
existing debug entry.
|
|
|
|
|
|
The input_proc can be used to implement functionality when it is written to
|
|
|
-the view (e.g. like with 'echo "0" > /proc/s390dbf/dasd/level).
|
|
|
+the view (e.g. like with 'echo "0" > /sys/kernel/debug/s390dbf/dasd/level).
|
|
|
|
|
|
For header_proc there can be used the default function
|
|
|
debug_dflt_header_fn() which is defined in in debug.h.
|
|
@@ -602,7 +615,7 @@ debug_info = debug_register ("test", 0, 4, 4 ));
|
|
|
debug_register_view(debug_info, &debug_test_view);
|
|
|
for(i = 0; i < 10; i ++) debug_int_event(debug_info, 1, i);
|
|
|
|
|
|
-> cat /proc/s390dbf/test/myview
|
|
|
+> cat /sys/kernel/debug/s390dbf/test/myview
|
|
|
00 00964419734:611402 1 - 00 88042ca This error...........
|
|
|
00 00964419734:611405 1 - 00 88042ca That error...........
|
|
|
00 00964419734:611408 1 - 00 88042ca Problem..............
|