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 |