diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/dynamic_printk.c | 58 | ||||
-rw-r--r-- | lib/klist.c | 43 | ||||
-rw-r--r-- | lib/kobject_uevent.c | 8 | ||||
-rw-r--r-- | lib/swiotlb.c | 2 |
4 files changed, 72 insertions, 39 deletions
diff --git a/lib/dynamic_printk.c b/lib/dynamic_printk.c index 8e30295e8566..165a19763dc9 100644 --- a/lib/dynamic_printk.c +++ b/lib/dynamic_printk.c | |||
@@ -277,40 +277,34 @@ static ssize_t pr_debug_write(struct file *file, const char __user *buf, | |||
277 | dynamic_enabled = DYNAMIC_ENABLED_NONE; | 277 | dynamic_enabled = DYNAMIC_ENABLED_NONE; |
278 | } | 278 | } |
279 | err = 0; | 279 | err = 0; |
280 | } else { | 280 | } else if (elem) { |
281 | if (elem) { | 281 | if (value && (elem->enable == 0)) { |
282 | if (value && (elem->enable == 0)) { | 282 | dynamic_printk_enabled |= (1LL << elem->hash1); |
283 | dynamic_printk_enabled |= | 283 | dynamic_printk_enabled2 |= (1LL << elem->hash2); |
284 | (1LL << elem->hash1); | 284 | elem->enable = 1; |
285 | dynamic_printk_enabled2 |= | 285 | num_enabled++; |
286 | (1LL << elem->hash2); | 286 | dynamic_enabled = DYNAMIC_ENABLED_SOME; |
287 | elem->enable = 1; | 287 | err = 0; |
288 | num_enabled++; | 288 | printk(KERN_DEBUG |
289 | dynamic_enabled = DYNAMIC_ENABLED_SOME; | 289 | "debugging enabled for module %s\n", |
290 | err = 0; | 290 | elem->name); |
291 | printk(KERN_DEBUG | 291 | } else if (!value && (elem->enable == 1)) { |
292 | "debugging enabled for module %s\n", | 292 | elem->enable = 0; |
293 | elem->name); | 293 | num_enabled--; |
294 | } else if (!value && (elem->enable == 1)) { | 294 | if (disabled_hash(elem->hash1, true)) |
295 | elem->enable = 0; | 295 | dynamic_printk_enabled &= |
296 | num_enabled--; | ||
297 | if (disabled_hash(elem->hash1, true)) | ||
298 | dynamic_printk_enabled &= | ||
299 | ~(1LL << elem->hash1); | 296 | ~(1LL << elem->hash1); |
300 | if (disabled_hash(elem->hash2, false)) | 297 | if (disabled_hash(elem->hash2, false)) |
301 | dynamic_printk_enabled2 &= | 298 | dynamic_printk_enabled2 &= |
302 | ~(1LL << elem->hash2); | 299 | ~(1LL << elem->hash2); |
303 | if (num_enabled) | 300 | if (num_enabled) |
304 | dynamic_enabled = | 301 | dynamic_enabled = DYNAMIC_ENABLED_SOME; |
305 | DYNAMIC_ENABLED_SOME; | 302 | else |
306 | else | 303 | dynamic_enabled = DYNAMIC_ENABLED_NONE; |
307 | dynamic_enabled = | 304 | err = 0; |
308 | DYNAMIC_ENABLED_NONE; | 305 | printk(KERN_DEBUG |
309 | err = 0; | 306 | "debugging disabled for module %s\n", |
310 | printk(KERN_DEBUG | 307 | elem->name); |
311 | "debugging disabled for module " | ||
312 | "%s\n", elem->name); | ||
313 | } | ||
314 | } | 308 | } |
315 | } | 309 | } |
316 | } | 310 | } |
diff --git a/lib/klist.c b/lib/klist.c index bbdd3015c2c7..573d6068a42e 100644 --- a/lib/klist.c +++ b/lib/klist.c | |||
@@ -36,6 +36,7 @@ | |||
36 | 36 | ||
37 | #include <linux/klist.h> | 37 | #include <linux/klist.h> |
38 | #include <linux/module.h> | 38 | #include <linux/module.h> |
39 | #include <linux/sched.h> | ||
39 | 40 | ||
40 | /* | 41 | /* |
41 | * Use the lowest bit of n_klist to mark deleted nodes and exclude | 42 | * Use the lowest bit of n_klist to mark deleted nodes and exclude |
@@ -108,7 +109,6 @@ static void add_tail(struct klist *k, struct klist_node *n) | |||
108 | static void klist_node_init(struct klist *k, struct klist_node *n) | 109 | static void klist_node_init(struct klist *k, struct klist_node *n) |
109 | { | 110 | { |
110 | INIT_LIST_HEAD(&n->n_node); | 111 | INIT_LIST_HEAD(&n->n_node); |
111 | init_completion(&n->n_removed); | ||
112 | kref_init(&n->n_ref); | 112 | kref_init(&n->n_ref); |
113 | knode_set_klist(n, k); | 113 | knode_set_klist(n, k); |
114 | if (k->get) | 114 | if (k->get) |
@@ -171,13 +171,34 @@ void klist_add_before(struct klist_node *n, struct klist_node *pos) | |||
171 | } | 171 | } |
172 | EXPORT_SYMBOL_GPL(klist_add_before); | 172 | EXPORT_SYMBOL_GPL(klist_add_before); |
173 | 173 | ||
174 | struct klist_waiter { | ||
175 | struct list_head list; | ||
176 | struct klist_node *node; | ||
177 | struct task_struct *process; | ||
178 | int woken; | ||
179 | }; | ||
180 | |||
181 | static DEFINE_SPINLOCK(klist_remove_lock); | ||
182 | static LIST_HEAD(klist_remove_waiters); | ||
183 | |||
174 | static void klist_release(struct kref *kref) | 184 | static void klist_release(struct kref *kref) |
175 | { | 185 | { |
186 | struct klist_waiter *waiter, *tmp; | ||
176 | struct klist_node *n = container_of(kref, struct klist_node, n_ref); | 187 | struct klist_node *n = container_of(kref, struct klist_node, n_ref); |
177 | 188 | ||
178 | WARN_ON(!knode_dead(n)); | 189 | WARN_ON(!knode_dead(n)); |
179 | list_del(&n->n_node); | 190 | list_del(&n->n_node); |
180 | complete(&n->n_removed); | 191 | spin_lock(&klist_remove_lock); |
192 | list_for_each_entry_safe(waiter, tmp, &klist_remove_waiters, list) { | ||
193 | if (waiter->node != n) | ||
194 | continue; | ||
195 | |||
196 | waiter->woken = 1; | ||
197 | mb(); | ||
198 | wake_up_process(waiter->process); | ||
199 | list_del(&waiter->list); | ||
200 | } | ||
201 | spin_unlock(&klist_remove_lock); | ||
181 | knode_set_klist(n, NULL); | 202 | knode_set_klist(n, NULL); |
182 | } | 203 | } |
183 | 204 | ||
@@ -217,8 +238,24 @@ EXPORT_SYMBOL_GPL(klist_del); | |||
217 | */ | 238 | */ |
218 | void klist_remove(struct klist_node *n) | 239 | void klist_remove(struct klist_node *n) |
219 | { | 240 | { |
241 | struct klist_waiter waiter; | ||
242 | |||
243 | waiter.node = n; | ||
244 | waiter.process = current; | ||
245 | waiter.woken = 0; | ||
246 | spin_lock(&klist_remove_lock); | ||
247 | list_add(&waiter.list, &klist_remove_waiters); | ||
248 | spin_unlock(&klist_remove_lock); | ||
249 | |||
220 | klist_del(n); | 250 | klist_del(n); |
221 | wait_for_completion(&n->n_removed); | 251 | |
252 | for (;;) { | ||
253 | set_current_state(TASK_UNINTERRUPTIBLE); | ||
254 | if (waiter.woken) | ||
255 | break; | ||
256 | schedule(); | ||
257 | } | ||
258 | __set_current_state(TASK_RUNNING); | ||
222 | } | 259 | } |
223 | EXPORT_SYMBOL_GPL(klist_remove); | 260 | EXPORT_SYMBOL_GPL(klist_remove); |
224 | 261 | ||
diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c index 3f914725bda8..318328ddbd1c 100644 --- a/lib/kobject_uevent.c +++ b/lib/kobject_uevent.c | |||
@@ -165,7 +165,7 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action, | |||
165 | /* keys passed in from the caller */ | 165 | /* keys passed in from the caller */ |
166 | if (envp_ext) { | 166 | if (envp_ext) { |
167 | for (i = 0; envp_ext[i]; i++) { | 167 | for (i = 0; envp_ext[i]; i++) { |
168 | retval = add_uevent_var(env, envp_ext[i]); | 168 | retval = add_uevent_var(env, "%s", envp_ext[i]); |
169 | if (retval) | 169 | if (retval) |
170 | goto exit; | 170 | goto exit; |
171 | } | 171 | } |
@@ -225,8 +225,10 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action, | |||
225 | } | 225 | } |
226 | 226 | ||
227 | NETLINK_CB(skb).dst_group = 1; | 227 | NETLINK_CB(skb).dst_group = 1; |
228 | netlink_broadcast(uevent_sock, skb, 0, 1, GFP_KERNEL); | 228 | retval = netlink_broadcast(uevent_sock, skb, 0, 1, |
229 | } | 229 | GFP_KERNEL); |
230 | } else | ||
231 | retval = -ENOMEM; | ||
230 | } | 232 | } |
231 | #endif | 233 | #endif |
232 | 234 | ||
diff --git a/lib/swiotlb.c b/lib/swiotlb.c index 7f5e21b9c16b..c2a4e6401456 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c | |||
@@ -647,7 +647,7 @@ swiotlb_full(struct device *dev, size_t size, int dir, int do_panic) | |||
647 | * the damage, or panic when the transfer is too big. | 647 | * the damage, or panic when the transfer is too big. |
648 | */ | 648 | */ |
649 | printk(KERN_ERR "DMA: Out of SW-IOMMU space for %zu bytes at " | 649 | printk(KERN_ERR "DMA: Out of SW-IOMMU space for %zu bytes at " |
650 | "device %s\n", size, dev ? dev->bus_id : "?"); | 650 | "device %s\n", size, dev ? dev_name(dev) : "?"); |
651 | 651 | ||
652 | if (size > io_tlb_overflow && do_panic) { | 652 | if (size > io_tlb_overflow && do_panic) { |
653 | if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL) | 653 | if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL) |