diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/Makefile | 1 | ||||
-rw-r--r-- | kernel/hrtimer.c | 4 | ||||
-rw-r--r-- | kernel/intermodule.c | 184 | ||||
-rw-r--r-- | kernel/power/main.c | 2 | ||||
-rw-r--r-- | kernel/printk.c | 28 |
5 files changed, 31 insertions, 188 deletions
diff --git a/kernel/Makefile b/kernel/Makefile index 58908f9d156a..f6ef00f4f90f 100644 --- a/kernel/Makefile +++ b/kernel/Makefile | |||
@@ -20,7 +20,6 @@ obj-$(CONFIG_SMP) += cpu.o spinlock.o | |||
20 | obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock.o | 20 | obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock.o |
21 | obj-$(CONFIG_UID16) += uid16.o | 21 | obj-$(CONFIG_UID16) += uid16.o |
22 | obj-$(CONFIG_MODULES) += module.o | 22 | obj-$(CONFIG_MODULES) += module.o |
23 | obj-$(CONFIG_OBSOLETE_INTERMODULE) += intermodule.o | ||
24 | obj-$(CONFIG_KALLSYMS) += kallsyms.o | 23 | obj-$(CONFIG_KALLSYMS) += kallsyms.o |
25 | obj-$(CONFIG_PM) += power/ | 24 | obj-$(CONFIG_PM) += power/ |
26 | obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o | 25 | obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o |
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 01fa2ae98a85..18324305724a 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
@@ -393,7 +393,7 @@ static void __remove_hrtimer(struct hrtimer *timer, struct hrtimer_base *base) | |||
393 | if (base->first == &timer->node) | 393 | if (base->first == &timer->node) |
394 | base->first = rb_next(&timer->node); | 394 | base->first = rb_next(&timer->node); |
395 | rb_erase(&timer->node, &base->active); | 395 | rb_erase(&timer->node, &base->active); |
396 | timer->node.rb_parent = HRTIMER_INACTIVE; | 396 | rb_set_parent(&timer->node, &timer->node); |
397 | } | 397 | } |
398 | 398 | ||
399 | /* | 399 | /* |
@@ -582,7 +582,7 @@ void hrtimer_init(struct hrtimer *timer, clockid_t clock_id, | |||
582 | clock_id = CLOCK_MONOTONIC; | 582 | clock_id = CLOCK_MONOTONIC; |
583 | 583 | ||
584 | timer->base = &bases[clock_id]; | 584 | timer->base = &bases[clock_id]; |
585 | timer->node.rb_parent = HRTIMER_INACTIVE; | 585 | rb_set_parent(&timer->node, &timer->node); |
586 | } | 586 | } |
587 | EXPORT_SYMBOL_GPL(hrtimer_init); | 587 | EXPORT_SYMBOL_GPL(hrtimer_init); |
588 | 588 | ||
diff --git a/kernel/intermodule.c b/kernel/intermodule.c deleted file mode 100644 index 55b1e5b85db9..000000000000 --- a/kernel/intermodule.c +++ /dev/null | |||
@@ -1,184 +0,0 @@ | |||
1 | /* Deprecated, do not use. Moved from module.c to here. --RR */ | ||
2 | |||
3 | /* Written by Keith Owens <kaos@ocs.com.au> Oct 2000 */ | ||
4 | #include <linux/module.h> | ||
5 | #include <linux/kmod.h> | ||
6 | #include <linux/spinlock.h> | ||
7 | #include <linux/list.h> | ||
8 | #include <linux/slab.h> | ||
9 | |||
10 | /* inter_module functions are always available, even when the kernel is | ||
11 | * compiled without modules. Consumers of inter_module_xxx routines | ||
12 | * will always work, even when both are built into the kernel, this | ||
13 | * approach removes lots of #ifdefs in mainline code. | ||
14 | */ | ||
15 | |||
16 | static struct list_head ime_list = LIST_HEAD_INIT(ime_list); | ||
17 | static DEFINE_SPINLOCK(ime_lock); | ||
18 | static int kmalloc_failed; | ||
19 | |||
20 | struct inter_module_entry { | ||
21 | struct list_head list; | ||
22 | const char *im_name; | ||
23 | struct module *owner; | ||
24 | const void *userdata; | ||
25 | }; | ||
26 | |||
27 | /** | ||
28 | * inter_module_register - register a new set of inter module data. | ||
29 | * @im_name: an arbitrary string to identify the data, must be unique | ||
30 | * @owner: module that is registering the data, always use THIS_MODULE | ||
31 | * @userdata: pointer to arbitrary userdata to be registered | ||
32 | * | ||
33 | * Description: Check that the im_name has not already been registered, | ||
34 | * complain if it has. For new data, add it to the inter_module_entry | ||
35 | * list. | ||
36 | */ | ||
37 | void inter_module_register(const char *im_name, struct module *owner, const void *userdata) | ||
38 | { | ||
39 | struct list_head *tmp; | ||
40 | struct inter_module_entry *ime, *ime_new; | ||
41 | |||
42 | if (!(ime_new = kzalloc(sizeof(*ime), GFP_KERNEL))) { | ||
43 | /* Overloaded kernel, not fatal */ | ||
44 | printk(KERN_ERR | ||
45 | "Aiee, inter_module_register: cannot kmalloc entry for '%s'\n", | ||
46 | im_name); | ||
47 | kmalloc_failed = 1; | ||
48 | return; | ||
49 | } | ||
50 | ime_new->im_name = im_name; | ||
51 | ime_new->owner = owner; | ||
52 | ime_new->userdata = userdata; | ||
53 | |||
54 | spin_lock(&ime_lock); | ||
55 | list_for_each(tmp, &ime_list) { | ||
56 | ime = list_entry(tmp, struct inter_module_entry, list); | ||
57 | if (strcmp(ime->im_name, im_name) == 0) { | ||
58 | spin_unlock(&ime_lock); | ||
59 | kfree(ime_new); | ||
60 | /* Program logic error, fatal */ | ||
61 | printk(KERN_ERR "inter_module_register: duplicate im_name '%s'", im_name); | ||
62 | BUG(); | ||
63 | } | ||
64 | } | ||
65 | list_add(&(ime_new->list), &ime_list); | ||
66 | spin_unlock(&ime_lock); | ||
67 | } | ||
68 | |||
69 | /** | ||
70 | * inter_module_unregister - unregister a set of inter module data. | ||
71 | * @im_name: an arbitrary string to identify the data, must be unique | ||
72 | * | ||
73 | * Description: Check that the im_name has been registered, complain if | ||
74 | * it has not. For existing data, remove it from the | ||
75 | * inter_module_entry list. | ||
76 | */ | ||
77 | void inter_module_unregister(const char *im_name) | ||
78 | { | ||
79 | struct list_head *tmp; | ||
80 | struct inter_module_entry *ime; | ||
81 | |||
82 | spin_lock(&ime_lock); | ||
83 | list_for_each(tmp, &ime_list) { | ||
84 | ime = list_entry(tmp, struct inter_module_entry, list); | ||
85 | if (strcmp(ime->im_name, im_name) == 0) { | ||
86 | list_del(&(ime->list)); | ||
87 | spin_unlock(&ime_lock); | ||
88 | kfree(ime); | ||
89 | return; | ||
90 | } | ||
91 | } | ||
92 | spin_unlock(&ime_lock); | ||
93 | if (kmalloc_failed) { | ||
94 | printk(KERN_ERR | ||
95 | "inter_module_unregister: no entry for '%s', " | ||
96 | "probably caused by previous kmalloc failure\n", | ||
97 | im_name); | ||
98 | return; | ||
99 | } | ||
100 | else { | ||
101 | /* Program logic error, fatal */ | ||
102 | printk(KERN_ERR "inter_module_unregister: no entry for '%s'", im_name); | ||
103 | BUG(); | ||
104 | } | ||
105 | } | ||
106 | |||
107 | /** | ||
108 | * inter_module_get - return arbitrary userdata from another module. | ||
109 | * @im_name: an arbitrary string to identify the data, must be unique | ||
110 | * | ||
111 | * Description: If the im_name has not been registered, return NULL. | ||
112 | * Try to increment the use count on the owning module, if that fails | ||
113 | * then return NULL. Otherwise return the userdata. | ||
114 | */ | ||
115 | static const void *inter_module_get(const char *im_name) | ||
116 | { | ||
117 | struct list_head *tmp; | ||
118 | struct inter_module_entry *ime; | ||
119 | const void *result = NULL; | ||
120 | |||
121 | spin_lock(&ime_lock); | ||
122 | list_for_each(tmp, &ime_list) { | ||
123 | ime = list_entry(tmp, struct inter_module_entry, list); | ||
124 | if (strcmp(ime->im_name, im_name) == 0) { | ||
125 | if (try_module_get(ime->owner)) | ||
126 | result = ime->userdata; | ||
127 | break; | ||
128 | } | ||
129 | } | ||
130 | spin_unlock(&ime_lock); | ||
131 | return(result); | ||
132 | } | ||
133 | |||
134 | /** | ||
135 | * inter_module_get_request - im get with automatic request_module. | ||
136 | * @im_name: an arbitrary string to identify the data, must be unique | ||
137 | * @modname: module that is expected to register im_name | ||
138 | * | ||
139 | * Description: If inter_module_get fails, do request_module then retry. | ||
140 | */ | ||
141 | const void *inter_module_get_request(const char *im_name, const char *modname) | ||
142 | { | ||
143 | const void *result = inter_module_get(im_name); | ||
144 | if (!result) { | ||
145 | request_module("%s", modname); | ||
146 | result = inter_module_get(im_name); | ||
147 | } | ||
148 | return(result); | ||
149 | } | ||
150 | |||
151 | /** | ||
152 | * inter_module_put - release use of data from another module. | ||
153 | * @im_name: an arbitrary string to identify the data, must be unique | ||
154 | * | ||
155 | * Description: If the im_name has not been registered, complain, | ||
156 | * otherwise decrement the use count on the owning module. | ||
157 | */ | ||
158 | void inter_module_put(const char *im_name) | ||
159 | { | ||
160 | struct list_head *tmp; | ||
161 | struct inter_module_entry *ime; | ||
162 | |||
163 | spin_lock(&ime_lock); | ||
164 | list_for_each(tmp, &ime_list) { | ||
165 | ime = list_entry(tmp, struct inter_module_entry, list); | ||
166 | if (strcmp(ime->im_name, im_name) == 0) { | ||
167 | if (ime->owner) | ||
168 | module_put(ime->owner); | ||
169 | spin_unlock(&ime_lock); | ||
170 | return; | ||
171 | } | ||
172 | } | ||
173 | spin_unlock(&ime_lock); | ||
174 | printk(KERN_ERR "inter_module_put: no entry for '%s'", im_name); | ||
175 | BUG(); | ||
176 | } | ||
177 | |||
178 | EXPORT_SYMBOL(inter_module_register); | ||
179 | EXPORT_SYMBOL(inter_module_unregister); | ||
180 | EXPORT_SYMBOL(inter_module_get_request); | ||
181 | EXPORT_SYMBOL(inter_module_put); | ||
182 | |||
183 | MODULE_LICENSE("GPL"); | ||
184 | |||
diff --git a/kernel/power/main.c b/kernel/power/main.c index a6d9ef46009e..0a907f0dc56b 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c | |||
@@ -86,6 +86,7 @@ static int suspend_prepare(suspend_state_t state) | |||
86 | goto Thaw; | 86 | goto Thaw; |
87 | } | 87 | } |
88 | 88 | ||
89 | suspend_console(); | ||
89 | if ((error = device_suspend(PMSG_SUSPEND))) { | 90 | if ((error = device_suspend(PMSG_SUSPEND))) { |
90 | printk(KERN_ERR "Some devices failed to suspend\n"); | 91 | printk(KERN_ERR "Some devices failed to suspend\n"); |
91 | goto Finish; | 92 | goto Finish; |
@@ -133,6 +134,7 @@ int suspend_enter(suspend_state_t state) | |||
133 | static void suspend_finish(suspend_state_t state) | 134 | static void suspend_finish(suspend_state_t state) |
134 | { | 135 | { |
135 | device_resume(); | 136 | device_resume(); |
137 | resume_console(); | ||
136 | thaw_processes(); | 138 | thaw_processes(); |
137 | enable_nonboot_cpus(); | 139 | enable_nonboot_cpus(); |
138 | if (pm_ops && pm_ops->finish) | 140 | if (pm_ops && pm_ops->finish) |
diff --git a/kernel/printk.c b/kernel/printk.c index c056f3324432..19a955619294 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
@@ -67,6 +67,7 @@ EXPORT_SYMBOL(oops_in_progress); | |||
67 | * driver system. | 67 | * driver system. |
68 | */ | 68 | */ |
69 | static DECLARE_MUTEX(console_sem); | 69 | static DECLARE_MUTEX(console_sem); |
70 | static DECLARE_MUTEX(secondary_console_sem); | ||
70 | struct console *console_drivers; | 71 | struct console *console_drivers; |
71 | /* | 72 | /* |
72 | * This is used for debugging the mess that is the VT code by | 73 | * This is used for debugging the mess that is the VT code by |
@@ -76,7 +77,7 @@ struct console *console_drivers; | |||
76 | * path in the console code where we end up in places I want | 77 | * path in the console code where we end up in places I want |
77 | * locked without the console sempahore held | 78 | * locked without the console sempahore held |
78 | */ | 79 | */ |
79 | static int console_locked; | 80 | static int console_locked, console_suspended; |
80 | 81 | ||
81 | /* | 82 | /* |
82 | * logbuf_lock protects log_buf, log_start, log_end, con_start and logged_chars | 83 | * logbuf_lock protects log_buf, log_start, log_end, con_start and logged_chars |
@@ -698,6 +699,23 @@ int __init add_preferred_console(char *name, int idx, char *options) | |||
698 | } | 699 | } |
699 | 700 | ||
700 | /** | 701 | /** |
702 | * suspend_console - suspend the console subsystem | ||
703 | * | ||
704 | * This disables printk() while we go into suspend states | ||
705 | */ | ||
706 | void suspend_console(void) | ||
707 | { | ||
708 | acquire_console_sem(); | ||
709 | console_suspended = 1; | ||
710 | } | ||
711 | |||
712 | void resume_console(void) | ||
713 | { | ||
714 | console_suspended = 0; | ||
715 | release_console_sem(); | ||
716 | } | ||
717 | |||
718 | /** | ||
701 | * acquire_console_sem - lock the console system for exclusive use. | 719 | * acquire_console_sem - lock the console system for exclusive use. |
702 | * | 720 | * |
703 | * Acquires a semaphore which guarantees that the caller has | 721 | * Acquires a semaphore which guarantees that the caller has |
@@ -708,6 +726,10 @@ int __init add_preferred_console(char *name, int idx, char *options) | |||
708 | void acquire_console_sem(void) | 726 | void acquire_console_sem(void) |
709 | { | 727 | { |
710 | BUG_ON(in_interrupt()); | 728 | BUG_ON(in_interrupt()); |
729 | if (console_suspended) { | ||
730 | down(&secondary_console_sem); | ||
731 | return; | ||
732 | } | ||
711 | down(&console_sem); | 733 | down(&console_sem); |
712 | console_locked = 1; | 734 | console_locked = 1; |
713 | console_may_schedule = 1; | 735 | console_may_schedule = 1; |
@@ -750,6 +772,10 @@ void release_console_sem(void) | |||
750 | unsigned long _con_start, _log_end; | 772 | unsigned long _con_start, _log_end; |
751 | unsigned long wake_klogd = 0; | 773 | unsigned long wake_klogd = 0; |
752 | 774 | ||
775 | if (console_suspended) { | ||
776 | up(&secondary_console_sem); | ||
777 | return; | ||
778 | } | ||
753 | for ( ; ; ) { | 779 | for ( ; ; ) { |
754 | spin_lock_irqsave(&logbuf_lock, flags); | 780 | spin_lock_irqsave(&logbuf_lock, flags); |
755 | wake_klogd |= log_start - log_end; | 781 | wake_klogd |= log_start - log_end; |