diff options
| -rw-r--r-- | Documentation/lockstat.txt | 120 | ||||
| -rw-r--r-- | Documentation/sysrq.txt | 2 | ||||
| -rw-r--r-- | arch/i386/kernel/cpu/cpufreq/longhaul.c | 60 | ||||
| -rw-r--r-- | drivers/char/vt_ioctl.c | 4 | ||||
| -rw-r--r-- | drivers/serial/serial_cs.c | 1 | ||||
| -rw-r--r-- | include/linux/sched.h | 2 | ||||
| -rw-r--r-- | kernel/signal.c | 22 | ||||
| -rw-r--r-- | kernel/time/timer_stats.c | 5 | ||||
| -rw-r--r-- | lib/Kconfig.debug | 2 | ||||
| -rw-r--r-- | lib/Makefile | 4 |
10 files changed, 200 insertions, 22 deletions
diff --git a/Documentation/lockstat.txt b/Documentation/lockstat.txt new file mode 100644 index 000000000000..4ba4664ce5c3 --- /dev/null +++ b/Documentation/lockstat.txt | |||
| @@ -0,0 +1,120 @@ | |||
| 1 | |||
| 2 | LOCK STATISTICS | ||
| 3 | |||
| 4 | - WHAT | ||
| 5 | |||
| 6 | As the name suggests, it provides statistics on locks. | ||
| 7 | |||
| 8 | - WHY | ||
| 9 | |||
| 10 | Because things like lock contention can severely impact performance. | ||
| 11 | |||
| 12 | - HOW | ||
| 13 | |||
| 14 | Lockdep already has hooks in the lock functions and maps lock instances to | ||
| 15 | lock classes. We build on that. The graph below shows the relation between | ||
| 16 | the lock functions and the various hooks therein. | ||
| 17 | |||
| 18 | __acquire | ||
| 19 | | | ||
| 20 | lock _____ | ||
| 21 | | \ | ||
| 22 | | __contended | ||
| 23 | | | | ||
| 24 | | <wait> | ||
| 25 | | _______/ | ||
| 26 | |/ | ||
| 27 | | | ||
| 28 | __acquired | ||
| 29 | | | ||
| 30 | . | ||
| 31 | <hold> | ||
| 32 | . | ||
| 33 | | | ||
| 34 | __release | ||
| 35 | | | ||
| 36 | unlock | ||
| 37 | |||
| 38 | lock, unlock - the regular lock functions | ||
| 39 | __* - the hooks | ||
| 40 | <> - states | ||
| 41 | |||
| 42 | With these hooks we provide the following statistics: | ||
| 43 | |||
| 44 | con-bounces - number of lock contention that involved x-cpu data | ||
| 45 | contentions - number of lock acquisitions that had to wait | ||
| 46 | wait time min - shortest (non-0) time we ever had to wait for a lock | ||
| 47 | max - longest time we ever had to wait for a lock | ||
| 48 | total - total time we spend waiting on this lock | ||
| 49 | acq-bounces - number of lock acquisitions that involved x-cpu data | ||
| 50 | acquisitions - number of times we took the lock | ||
| 51 | hold time min - shortest (non-0) time we ever held the lock | ||
| 52 | max - longest time we ever held the lock | ||
| 53 | total - total time this lock was held | ||
| 54 | |||
| 55 | From these number various other statistics can be derived, such as: | ||
| 56 | |||
| 57 | hold time average = hold time total / acquisitions | ||
| 58 | |||
| 59 | These numbers are gathered per lock class, per read/write state (when | ||
| 60 | applicable). | ||
| 61 | |||
| 62 | It also tracks 4 contention points per class. A contention point is a call site | ||
| 63 | that had to wait on lock acquisition. | ||
| 64 | |||
| 65 | - USAGE | ||
| 66 | |||
| 67 | Look at the current lock statistics: | ||
| 68 | |||
| 69 | ( line numbers not part of actual output, done for clarity in the explanation | ||
| 70 | below ) | ||
| 71 | |||
| 72 | # less /proc/lock_stat | ||
| 73 | |||
| 74 | 01 lock_stat version 0.2 | ||
| 75 | 02 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
| 76 | 03 class name con-bounces contentions waittime-min waittime-max waittime-total acq-bounces acquisitions holdtime-min holdtime-max holdtime-total | ||
| 77 | 04 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
| 78 | 05 | ||
| 79 | 06 &inode->i_data.tree_lock-W: 15 21657 0.18 1093295.30 11547131054.85 58 10415 0.16 87.51 6387.60 | ||
| 80 | 07 &inode->i_data.tree_lock-R: 0 0 0.00 0.00 0.00 23302 231198 0.25 8.45 98023.38 | ||
| 81 | 08 -------------------------- | ||
| 82 | 09 &inode->i_data.tree_lock 0 [<ffffffff8027c08f>] add_to_page_cache+0x5f/0x190 | ||
| 83 | 10 | ||
| 84 | 11 ............................................................................................................................................................................................... | ||
| 85 | 12 | ||
| 86 | 13 dcache_lock: 1037 1161 0.38 45.32 774.51 6611 243371 0.15 306.48 77387.24 | ||
| 87 | 14 ----------- | ||
| 88 | 15 dcache_lock 180 [<ffffffff802c0d7e>] sys_getcwd+0x11e/0x230 | ||
| 89 | 16 dcache_lock 165 [<ffffffff802c002a>] d_alloc+0x15a/0x210 | ||
| 90 | 17 dcache_lock 33 [<ffffffff8035818d>] _atomic_dec_and_lock+0x4d/0x70 | ||
| 91 | 18 dcache_lock 1 [<ffffffff802beef8>] shrink_dcache_parent+0x18/0x130 | ||
| 92 | |||
| 93 | This excerpt shows the first two lock class statistics. Line 01 shows the | ||
| 94 | output version - each time the format changes this will be updated. Line 02-04 | ||
| 95 | show the header with column descriptions. Lines 05-10 and 13-18 show the actual | ||
| 96 | statistics. These statistics come in two parts; the actual stats separated by a | ||
| 97 | short separator (line 08, 14) from the contention points. | ||
| 98 | |||
| 99 | The first lock (05-10) is a read/write lock, and shows two lines above the | ||
| 100 | short separator. The contention points don't match the column descriptors, | ||
| 101 | they have two: contentions and [<IP>] symbol. | ||
| 102 | |||
| 103 | |||
| 104 | View the top contending locks: | ||
| 105 | |||
| 106 | # grep : /proc/lock_stat | head | ||
| 107 | &inode->i_data.tree_lock-W: 15 21657 0.18 1093295.30 11547131054.85 58 10415 0.16 87.51 6387.60 | ||
| 108 | &inode->i_data.tree_lock-R: 0 0 0.00 0.00 0.00 23302 231198 0.25 8.45 98023.38 | ||
| 109 | dcache_lock: 1037 1161 0.38 45.32 774.51 6611 243371 0.15 306.48 77387.24 | ||
| 110 | &inode->i_mutex: 161 286 18446744073709 62882.54 1244614.55 3653 20598 18446744073709 62318.60 1693822.74 | ||
| 111 | &zone->lru_lock: 94 94 0.53 7.33 92.10 4366 32690 0.29 59.81 16350.06 | ||
| 112 | &inode->i_data.i_mmap_lock: 79 79 0.40 3.77 53.03 11779 87755 0.28 116.93 29898.44 | ||
| 113 | &q->__queue_lock: 48 50 0.52 31.62 86.31 774 13131 0.17 113.08 12277.52 | ||
| 114 | &rq->rq_lock_key: 43 47 0.74 68.50 170.63 3706 33929 0.22 107.99 17460.62 | ||
| 115 | &rq->rq_lock_key#2: 39 46 0.75 6.68 49.03 2979 32292 0.17 125.17 17137.63 | ||
| 116 | tasklist_lock-W: 15 15 1.45 10.87 32.70 1201 7390 0.58 62.55 13648.47 | ||
| 117 | |||
| 118 | Clear the statistics: | ||
| 119 | |||
| 120 | # echo 0 > /proc/lock_stat | ||
diff --git a/Documentation/sysrq.txt b/Documentation/sysrq.txt index ef19142896ca..10c8f6922ef4 100644 --- a/Documentation/sysrq.txt +++ b/Documentation/sysrq.txt | |||
| @@ -43,7 +43,7 @@ On x86 - You press the key combo 'ALT-SysRq-<command key>'. Note - Some | |||
| 43 | keyboards may not have a key labeled 'SysRq'. The 'SysRq' key is | 43 | keyboards may not have a key labeled 'SysRq'. The 'SysRq' key is |
| 44 | also known as the 'Print Screen' key. Also some keyboards cannot | 44 | also known as the 'Print Screen' key. Also some keyboards cannot |
| 45 | handle so many keys being pressed at the same time, so you might | 45 | handle so many keys being pressed at the same time, so you might |
| 46 | have better luck with "press Alt", "press SysRq", "release Alt", | 46 | have better luck with "press Alt", "press SysRq", "release SysRq", |
| 47 | "press <command key>", release everything. | 47 | "press <command key>", release everything. |
| 48 | 48 | ||
| 49 | On SPARC - You press 'ALT-STOP-<command key>', I believe. | 49 | On SPARC - You press 'ALT-STOP-<command key>', I believe. |
diff --git a/arch/i386/kernel/cpu/cpufreq/longhaul.c b/arch/i386/kernel/cpu/cpufreq/longhaul.c index ef8f0bc3fc71..f0cce3c2dc3a 100644 --- a/arch/i386/kernel/cpu/cpufreq/longhaul.c +++ b/arch/i386/kernel/cpu/cpufreq/longhaul.c | |||
| @@ -76,6 +76,7 @@ static unsigned int longhaul_index; | |||
| 76 | /* Module parameters */ | 76 | /* Module parameters */ |
| 77 | static int scale_voltage; | 77 | static int scale_voltage; |
| 78 | static int disable_acpi_c3; | 78 | static int disable_acpi_c3; |
| 79 | static int revid_errata; | ||
| 79 | 80 | ||
| 80 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "longhaul", msg) | 81 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "longhaul", msg) |
| 81 | 82 | ||
| @@ -168,7 +169,10 @@ static void do_powersaver(int cx_address, unsigned int clock_ratio_index, | |||
| 168 | 169 | ||
| 169 | rdmsrl(MSR_VIA_LONGHAUL, longhaul.val); | 170 | rdmsrl(MSR_VIA_LONGHAUL, longhaul.val); |
| 170 | /* Setup new frequency */ | 171 | /* Setup new frequency */ |
| 171 | longhaul.bits.RevisionKey = longhaul.bits.RevisionID; | 172 | if (!revid_errata) |
| 173 | longhaul.bits.RevisionKey = longhaul.bits.RevisionID; | ||
| 174 | else | ||
| 175 | longhaul.bits.RevisionKey = 0; | ||
| 172 | longhaul.bits.SoftBusRatio = clock_ratio_index & 0xf; | 176 | longhaul.bits.SoftBusRatio = clock_ratio_index & 0xf; |
| 173 | longhaul.bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4; | 177 | longhaul.bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4; |
| 174 | /* Setup new voltage */ | 178 | /* Setup new voltage */ |
| @@ -272,7 +276,7 @@ static void longhaul_setstate(unsigned int table_index) | |||
| 272 | 276 | ||
| 273 | dprintk ("Setting to FSB:%dMHz Mult:%d.%dx (%s)\n", | 277 | dprintk ("Setting to FSB:%dMHz Mult:%d.%dx (%s)\n", |
| 274 | fsb, mult/10, mult%10, print_speed(speed/1000)); | 278 | fsb, mult/10, mult%10, print_speed(speed/1000)); |
| 275 | 279 | retry_loop: | |
| 276 | preempt_disable(); | 280 | preempt_disable(); |
| 277 | local_irq_save(flags); | 281 | local_irq_save(flags); |
| 278 | 282 | ||
| @@ -344,6 +348,47 @@ static void longhaul_setstate(unsigned int table_index) | |||
| 344 | preempt_enable(); | 348 | preempt_enable(); |
| 345 | 349 | ||
| 346 | freqs.new = calc_speed(longhaul_get_cpu_mult()); | 350 | freqs.new = calc_speed(longhaul_get_cpu_mult()); |
| 351 | /* Check if requested frequency is set. */ | ||
| 352 | if (unlikely(freqs.new != speed)) { | ||
| 353 | printk(KERN_INFO PFX "Failed to set requested frequency!\n"); | ||
| 354 | /* Revision ID = 1 but processor is expecting revision key | ||
| 355 | * equal to 0. Jumpers at the bottom of processor will change | ||
| 356 | * multiplier and FSB, but will not change bits in Longhaul | ||
| 357 | * MSR nor enable voltage scaling. */ | ||
| 358 | if (!revid_errata) { | ||
| 359 | printk(KERN_INFO PFX "Enabling \"Ignore Revision ID\" " | ||
| 360 | "option.\n"); | ||
| 361 | revid_errata = 1; | ||
| 362 | msleep(200); | ||
| 363 | goto retry_loop; | ||
| 364 | } | ||
| 365 | /* Why ACPI C3 sometimes doesn't work is a mystery for me. | ||
| 366 | * But it does happen. Processor is entering ACPI C3 state, | ||
| 367 | * but it doesn't change frequency. I tried poking various | ||
| 368 | * bits in northbridge registers, but without success. */ | ||
| 369 | if (longhaul_flags & USE_ACPI_C3) { | ||
| 370 | printk(KERN_INFO PFX "Disabling ACPI C3 support.\n"); | ||
| 371 | longhaul_flags &= ~USE_ACPI_C3; | ||
| 372 | if (revid_errata) { | ||
| 373 | printk(KERN_INFO PFX "Disabling \"Ignore " | ||
| 374 | "Revision ID\" option.\n"); | ||
| 375 | revid_errata = 0; | ||
| 376 | } | ||
| 377 | msleep(200); | ||
| 378 | goto retry_loop; | ||
| 379 | } | ||
| 380 | /* This shouldn't happen. Longhaul ver. 2 was reported not | ||
| 381 | * working on processors without voltage scaling, but with | ||
| 382 | * RevID = 1. RevID errata will make things right. Just | ||
| 383 | * to be 100% sure. */ | ||
| 384 | if (longhaul_version == TYPE_LONGHAUL_V2) { | ||
| 385 | printk(KERN_INFO PFX "Switching to Longhaul ver. 1\n"); | ||
| 386 | longhaul_version = TYPE_LONGHAUL_V1; | ||
| 387 | msleep(200); | ||
| 388 | goto retry_loop; | ||
| 389 | } | ||
| 390 | } | ||
| 391 | /* Report true CPU frequency */ | ||
| 347 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | 392 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); |
| 348 | 393 | ||
| 349 | if (!bm_timeout) | 394 | if (!bm_timeout) |
| @@ -956,11 +1001,20 @@ static void __exit longhaul_exit(void) | |||
| 956 | kfree(longhaul_table); | 1001 | kfree(longhaul_table); |
| 957 | } | 1002 | } |
| 958 | 1003 | ||
| 1004 | /* Even if BIOS is exporting ACPI C3 state, and it is used | ||
| 1005 | * with success when CPU is idle, this state doesn't | ||
| 1006 | * trigger frequency transition in some cases. */ | ||
| 959 | module_param (disable_acpi_c3, int, 0644); | 1007 | module_param (disable_acpi_c3, int, 0644); |
| 960 | MODULE_PARM_DESC(disable_acpi_c3, "Don't use ACPI C3 support"); | 1008 | MODULE_PARM_DESC(disable_acpi_c3, "Don't use ACPI C3 support"); |
| 961 | 1009 | /* Change CPU voltage with frequency. Very usefull to save | |
| 1010 | * power, but most VIA C3 processors aren't supporting it. */ | ||
| 962 | module_param (scale_voltage, int, 0644); | 1011 | module_param (scale_voltage, int, 0644); |
| 963 | MODULE_PARM_DESC(scale_voltage, "Scale voltage of processor"); | 1012 | MODULE_PARM_DESC(scale_voltage, "Scale voltage of processor"); |
| 1013 | /* Force revision key to 0 for processors which doesn't | ||
| 1014 | * support voltage scaling, but are introducing itself as | ||
| 1015 | * such. */ | ||
| 1016 | module_param(revid_errata, int, 0644); | ||
| 1017 | MODULE_PARM_DESC(revid_errata, "Ignore CPU Revision ID"); | ||
| 964 | 1018 | ||
| 965 | MODULE_AUTHOR ("Dave Jones <davej@codemonkey.org.uk>"); | 1019 | MODULE_AUTHOR ("Dave Jones <davej@codemonkey.org.uk>"); |
| 966 | MODULE_DESCRIPTION ("Longhaul driver for VIA Cyrix processors."); | 1020 | MODULE_DESCRIPTION ("Longhaul driver for VIA Cyrix processors."); |
diff --git a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c index c799b7f7bbb3..7a61a2a9aafe 100644 --- a/drivers/char/vt_ioctl.c +++ b/drivers/char/vt_ioctl.c | |||
| @@ -1032,7 +1032,7 @@ static DECLARE_WAIT_QUEUE_HEAD(vt_activate_queue); | |||
| 1032 | 1032 | ||
| 1033 | /* | 1033 | /* |
| 1034 | * Sleeps until a vt is activated, or the task is interrupted. Returns | 1034 | * Sleeps until a vt is activated, or the task is interrupted. Returns |
| 1035 | * 0 if activation, -EINTR if interrupted. | 1035 | * 0 if activation, -EINTR if interrupted by a signal handler. |
| 1036 | */ | 1036 | */ |
| 1037 | int vt_waitactive(int vt) | 1037 | int vt_waitactive(int vt) |
| 1038 | { | 1038 | { |
| @@ -1057,7 +1057,7 @@ int vt_waitactive(int vt) | |||
| 1057 | break; | 1057 | break; |
| 1058 | } | 1058 | } |
| 1059 | release_console_sem(); | 1059 | release_console_sem(); |
| 1060 | retval = -EINTR; | 1060 | retval = -ERESTARTNOHAND; |
| 1061 | if (signal_pending(current)) | 1061 | if (signal_pending(current)) |
| 1062 | break; | 1062 | break; |
| 1063 | schedule(); | 1063 | schedule(); |
diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index a0ea43598515..7c8d78fbbbfb 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c | |||
| @@ -943,6 +943,7 @@ static struct pcmcia_device_id serial_ids[] = { | |||
| 943 | PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4), | 943 | PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4), |
| 944 | PCMCIA_MFC_DEVICE_PROD_ID12(2,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4), | 944 | PCMCIA_MFC_DEVICE_PROD_ID12(2,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4), |
| 945 | PCMCIA_MFC_DEVICE_PROD_ID12(3,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4), | 945 | PCMCIA_MFC_DEVICE_PROD_ID12(3,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4), |
| 946 | PCMCIA_DEVICE_MANF_CARD(0x0279, 0x950b), | ||
| 946 | /* too generic */ | 947 | /* too generic */ |
| 947 | /* PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0160, 0x0002), */ | 948 | /* PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0160, 0x0002), */ |
| 948 | /* PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0160, 0x0002), */ | 949 | /* PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0160, 0x0002), */ |
diff --git a/include/linux/sched.h b/include/linux/sched.h index a01ac6dd5f5e..313c6b6e774f 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -113,7 +113,7 @@ extern unsigned long avenrun[]; /* Load averages */ | |||
| 113 | 113 | ||
| 114 | #define FSHIFT 11 /* nr of bits of precision */ | 114 | #define FSHIFT 11 /* nr of bits of precision */ |
| 115 | #define FIXED_1 (1<<FSHIFT) /* 1.0 as fixed-point */ | 115 | #define FIXED_1 (1<<FSHIFT) /* 1.0 as fixed-point */ |
| 116 | #define LOAD_FREQ (5*HZ) /* 5 sec intervals */ | 116 | #define LOAD_FREQ (5*HZ+1) /* 5 sec intervals */ |
| 117 | #define EXP_1 1884 /* 1/exp(5sec/1min) as fixed-point */ | 117 | #define EXP_1 1884 /* 1/exp(5sec/1min) as fixed-point */ |
| 118 | #define EXP_5 2014 /* 1/exp(5sec/5min) */ | 118 | #define EXP_5 2014 /* 1/exp(5sec/5min) */ |
| 119 | #define EXP_15 2037 /* 1/exp(5sec/15min) */ | 119 | #define EXP_15 2037 /* 1/exp(5sec/15min) */ |
diff --git a/kernel/signal.c b/kernel/signal.c index 9fb91a32edda..792952381092 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
| @@ -531,18 +531,18 @@ static int check_kill_permission(int sig, struct siginfo *info, | |||
| 531 | if (!valid_signal(sig)) | 531 | if (!valid_signal(sig)) |
| 532 | return error; | 532 | return error; |
| 533 | 533 | ||
| 534 | error = audit_signal_info(sig, t); /* Let audit system see the signal */ | 534 | if (info == SEND_SIG_NOINFO || (!is_si_special(info) && SI_FROMUSER(info))) { |
| 535 | if (error) | 535 | error = audit_signal_info(sig, t); /* Let audit system see the signal */ |
| 536 | return error; | 536 | if (error) |
| 537 | 537 | return error; | |
| 538 | error = -EPERM; | 538 | error = -EPERM; |
| 539 | if ((info == SEND_SIG_NOINFO || (!is_si_special(info) && SI_FROMUSER(info))) | 539 | if (((sig != SIGCONT) || |
| 540 | && ((sig != SIGCONT) || | 540 | (process_session(current) != process_session(t))) |
| 541 | (process_session(current) != process_session(t))) | 541 | && (current->euid ^ t->suid) && (current->euid ^ t->uid) |
| 542 | && (current->euid ^ t->suid) && (current->euid ^ t->uid) | 542 | && (current->uid ^ t->suid) && (current->uid ^ t->uid) |
| 543 | && (current->uid ^ t->suid) && (current->uid ^ t->uid) | 543 | && !capable(CAP_KILL)) |
| 544 | && !capable(CAP_KILL)) | ||
| 545 | return error; | 544 | return error; |
| 545 | } | ||
| 546 | 546 | ||
| 547 | return security_task_kill(t, info, sig, 0); | 547 | return security_task_kill(t, info, sig, 0); |
| 548 | } | 548 | } |
diff --git a/kernel/time/timer_stats.c b/kernel/time/timer_stats.c index 3c38fb5eae1b..c36bb7ed0301 100644 --- a/kernel/time/timer_stats.c +++ b/kernel/time/timer_stats.c | |||
| @@ -327,8 +327,9 @@ static int tstats_show(struct seq_file *m, void *v) | |||
| 327 | ms = 1; | 327 | ms = 1; |
| 328 | 328 | ||
| 329 | if (events && period.tv_sec) | 329 | if (events && period.tv_sec) |
| 330 | seq_printf(m, "%ld total events, %ld.%ld events/sec\n", events, | 330 | seq_printf(m, "%ld total events, %ld.%03ld events/sec\n", |
| 331 | events / period.tv_sec, events * 1000 / ms); | 331 | events, events * 1000 / ms, |
| 332 | (events * 1000000 / ms) % 1000); | ||
| 332 | else | 333 | else |
| 333 | seq_printf(m, "%ld total events\n", events); | 334 | seq_printf(m, "%ld total events\n", events); |
| 334 | 335 | ||
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 495863a500cd..cdc9b099e620 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
| @@ -294,6 +294,8 @@ config LOCK_STAT | |||
| 294 | help | 294 | help |
| 295 | This feature enables tracking lock contention points | 295 | This feature enables tracking lock contention points |
| 296 | 296 | ||
| 297 | For more details, see Documentation/lockstat.txt | ||
| 298 | |||
| 297 | config DEBUG_LOCKDEP | 299 | config DEBUG_LOCKDEP |
| 298 | bool "Lock dependency engine debugging" | 300 | bool "Lock dependency engine debugging" |
| 299 | depends on DEBUG_KERNEL && LOCKDEP | 301 | depends on DEBUG_KERNEL && LOCKDEP |
diff --git a/lib/Makefile b/lib/Makefile index 6b0ba8cf4e5f..4f3f3e256501 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | # Makefile for some libs needed in the kernel. | 2 | # Makefile for some libs needed in the kernel. |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | lib-y := ctype.o string.o vsprintf.o kasprintf.o cmdline.o \ | 5 | lib-y := ctype.o string.o vsprintf.o cmdline.o \ |
| 6 | rbtree.o radix-tree.o dump_stack.o \ | 6 | rbtree.o radix-tree.o dump_stack.o \ |
| 7 | idr.o int_sqrt.o bitmap.o extable.o prio_tree.o \ | 7 | idr.o int_sqrt.o bitmap.o extable.o prio_tree.o \ |
| 8 | sha1.o irq_regs.o reciprocal_div.o argv_split.o | 8 | sha1.o irq_regs.o reciprocal_div.o argv_split.o |
| @@ -13,7 +13,7 @@ lib-$(CONFIG_SMP) += cpumask.o | |||
| 13 | lib-y += kobject.o kref.o kobject_uevent.o klist.o | 13 | lib-y += kobject.o kref.o kobject_uevent.o klist.o |
| 14 | 14 | ||
| 15 | obj-y += div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \ | 15 | obj-y += div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \ |
| 16 | bust_spinlocks.o hexdump.o | 16 | bust_spinlocks.o hexdump.o kasprintf.o |
| 17 | 17 | ||
| 18 | ifeq ($(CONFIG_DEBUG_KOBJECT),y) | 18 | ifeq ($(CONFIG_DEBUG_KOBJECT),y) |
| 19 | CFLAGS_kobject.o += -DDEBUG | 19 | CFLAGS_kobject.o += -DDEBUG |
