diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cpuset.c | 10 | ||||
| -rw-r--r-- | kernel/debug/debug_core.c | 53 | ||||
| -rw-r--r-- | kernel/debug/kdb/kdb_io.c | 2 | ||||
| -rw-r--r-- | kernel/irq_work.c | 1 | ||||
| -rw-r--r-- | kernel/kmod.c | 117 | ||||
| -rw-r--r-- | kernel/padata.c | 13 | ||||
| -rw-r--r-- | kernel/power/hibernate.c | 18 | ||||
| -rw-r--r-- | kernel/power/process.c | 8 | ||||
| -rw-r--r-- | kernel/power/qos.c | 50 | ||||
| -rw-r--r-- | kernel/power/suspend.c | 7 | ||||
| -rw-r--r-- | kernel/power/user.c | 10 | ||||
| -rw-r--r-- | kernel/trace/blktrace.c | 18 |
12 files changed, 190 insertions, 117 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index b96ad75b7e64..14f7070b4ba2 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
| @@ -270,11 +270,11 @@ static struct file_system_type cpuset_fs_type = { | |||
| 270 | * are online. If none are online, walk up the cpuset hierarchy | 270 | * are online. If none are online, walk up the cpuset hierarchy |
| 271 | * until we find one that does have some online cpus. If we get | 271 | * until we find one that does have some online cpus. If we get |
| 272 | * all the way to the top and still haven't found any online cpus, | 272 | * all the way to the top and still haven't found any online cpus, |
| 273 | * return cpu_online_map. Or if passed a NULL cs from an exit'ing | 273 | * return cpu_online_mask. Or if passed a NULL cs from an exit'ing |
| 274 | * task, return cpu_online_map. | 274 | * task, return cpu_online_mask. |
| 275 | * | 275 | * |
| 276 | * One way or another, we guarantee to return some non-empty subset | 276 | * One way or another, we guarantee to return some non-empty subset |
| 277 | * of cpu_online_map. | 277 | * of cpu_online_mask. |
| 278 | * | 278 | * |
| 279 | * Call with callback_mutex held. | 279 | * Call with callback_mutex held. |
| 280 | */ | 280 | */ |
| @@ -867,7 +867,7 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, | |||
| 867 | int retval; | 867 | int retval; |
| 868 | int is_load_balanced; | 868 | int is_load_balanced; |
| 869 | 869 | ||
| 870 | /* top_cpuset.cpus_allowed tracks cpu_online_map; it's read-only */ | 870 | /* top_cpuset.cpus_allowed tracks cpu_online_mask; it's read-only */ |
| 871 | if (cs == &top_cpuset) | 871 | if (cs == &top_cpuset) |
| 872 | return -EACCES; | 872 | return -EACCES; |
| 873 | 873 | ||
| @@ -2149,7 +2149,7 @@ void __init cpuset_init_smp(void) | |||
| 2149 | * | 2149 | * |
| 2150 | * Description: Returns the cpumask_var_t cpus_allowed of the cpuset | 2150 | * Description: Returns the cpumask_var_t cpus_allowed of the cpuset |
| 2151 | * attached to the specified @tsk. Guaranteed to return some non-empty | 2151 | * attached to the specified @tsk. Guaranteed to return some non-empty |
| 2152 | * subset of cpu_online_map, even if this means going outside the | 2152 | * subset of cpu_online_mask, even if this means going outside the |
| 2153 | * tasks cpuset. | 2153 | * tasks cpuset. |
| 2154 | **/ | 2154 | **/ |
| 2155 | 2155 | ||
diff --git a/kernel/debug/debug_core.c b/kernel/debug/debug_core.c index 1dc53bae56e1..0557f24c6bca 100644 --- a/kernel/debug/debug_core.c +++ b/kernel/debug/debug_core.c | |||
| @@ -160,37 +160,39 @@ early_param("nokgdbroundup", opt_nokgdbroundup); | |||
| 160 | * Weak aliases for breakpoint management, | 160 | * Weak aliases for breakpoint management, |
| 161 | * can be overriden by architectures when needed: | 161 | * can be overriden by architectures when needed: |
| 162 | */ | 162 | */ |
| 163 | int __weak kgdb_arch_set_breakpoint(unsigned long addr, char *saved_instr) | 163 | int __weak kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt) |
| 164 | { | 164 | { |
| 165 | int err; | 165 | int err; |
| 166 | 166 | ||
| 167 | err = probe_kernel_read(saved_instr, (char *)addr, BREAK_INSTR_SIZE); | 167 | err = probe_kernel_read(bpt->saved_instr, (char *)bpt->bpt_addr, |
| 168 | BREAK_INSTR_SIZE); | ||
| 168 | if (err) | 169 | if (err) |
| 169 | return err; | 170 | return err; |
| 170 | 171 | err = probe_kernel_write((char *)bpt->bpt_addr, | |
| 171 | return probe_kernel_write((char *)addr, arch_kgdb_ops.gdb_bpt_instr, | 172 | arch_kgdb_ops.gdb_bpt_instr, BREAK_INSTR_SIZE); |
| 172 | BREAK_INSTR_SIZE); | 173 | return err; |
| 173 | } | 174 | } |
| 174 | 175 | ||
| 175 | int __weak kgdb_arch_remove_breakpoint(unsigned long addr, char *bundle) | 176 | int __weak kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt) |
| 176 | { | 177 | { |
| 177 | return probe_kernel_write((char *)addr, | 178 | return probe_kernel_write((char *)bpt->bpt_addr, |
| 178 | (char *)bundle, BREAK_INSTR_SIZE); | 179 | (char *)bpt->saved_instr, BREAK_INSTR_SIZE); |
| 179 | } | 180 | } |
| 180 | 181 | ||
| 181 | int __weak kgdb_validate_break_address(unsigned long addr) | 182 | int __weak kgdb_validate_break_address(unsigned long addr) |
| 182 | { | 183 | { |
| 183 | char tmp_variable[BREAK_INSTR_SIZE]; | 184 | struct kgdb_bkpt tmp; |
| 184 | int err; | 185 | int err; |
| 185 | /* Validate setting the breakpoint and then removing it. In the | 186 | /* Validate setting the breakpoint and then removing it. If the |
| 186 | * remove fails, the kernel needs to emit a bad message because we | 187 | * remove fails, the kernel needs to emit a bad message because we |
| 187 | * are deep trouble not being able to put things back the way we | 188 | * are deep trouble not being able to put things back the way we |
| 188 | * found them. | 189 | * found them. |
| 189 | */ | 190 | */ |
| 190 | err = kgdb_arch_set_breakpoint(addr, tmp_variable); | 191 | tmp.bpt_addr = addr; |
| 192 | err = kgdb_arch_set_breakpoint(&tmp); | ||
| 191 | if (err) | 193 | if (err) |
| 192 | return err; | 194 | return err; |
| 193 | err = kgdb_arch_remove_breakpoint(addr, tmp_variable); | 195 | err = kgdb_arch_remove_breakpoint(&tmp); |
| 194 | if (err) | 196 | if (err) |
| 195 | printk(KERN_ERR "KGDB: Critical breakpoint error, kernel " | 197 | printk(KERN_ERR "KGDB: Critical breakpoint error, kernel " |
| 196 | "memory destroyed at: %lx", addr); | 198 | "memory destroyed at: %lx", addr); |
| @@ -234,7 +236,6 @@ static void kgdb_flush_swbreak_addr(unsigned long addr) | |||
| 234 | */ | 236 | */ |
| 235 | int dbg_activate_sw_breakpoints(void) | 237 | int dbg_activate_sw_breakpoints(void) |
| 236 | { | 238 | { |
| 237 | unsigned long addr; | ||
| 238 | int error; | 239 | int error; |
| 239 | int ret = 0; | 240 | int ret = 0; |
| 240 | int i; | 241 | int i; |
| @@ -243,16 +244,15 @@ int dbg_activate_sw_breakpoints(void) | |||
| 243 | if (kgdb_break[i].state != BP_SET) | 244 | if (kgdb_break[i].state != BP_SET) |
| 244 | continue; | 245 | continue; |
| 245 | 246 | ||
| 246 | addr = kgdb_break[i].bpt_addr; | 247 | error = kgdb_arch_set_breakpoint(&kgdb_break[i]); |
| 247 | error = kgdb_arch_set_breakpoint(addr, | ||
| 248 | kgdb_break[i].saved_instr); | ||
| 249 | if (error) { | 248 | if (error) { |
| 250 | ret = error; | 249 | ret = error; |
| 251 | printk(KERN_INFO "KGDB: BP install failed: %lx", addr); | 250 | printk(KERN_INFO "KGDB: BP install failed: %lx", |
| 251 | kgdb_break[i].bpt_addr); | ||
| 252 | continue; | 252 | continue; |
| 253 | } | 253 | } |
| 254 | 254 | ||
| 255 | kgdb_flush_swbreak_addr(addr); | 255 | kgdb_flush_swbreak_addr(kgdb_break[i].bpt_addr); |
| 256 | kgdb_break[i].state = BP_ACTIVE; | 256 | kgdb_break[i].state = BP_ACTIVE; |
| 257 | } | 257 | } |
| 258 | return ret; | 258 | return ret; |
| @@ -301,7 +301,6 @@ int dbg_set_sw_break(unsigned long addr) | |||
| 301 | 301 | ||
| 302 | int dbg_deactivate_sw_breakpoints(void) | 302 | int dbg_deactivate_sw_breakpoints(void) |
| 303 | { | 303 | { |
| 304 | unsigned long addr; | ||
| 305 | int error; | 304 | int error; |
| 306 | int ret = 0; | 305 | int ret = 0; |
| 307 | int i; | 306 | int i; |
| @@ -309,15 +308,14 @@ int dbg_deactivate_sw_breakpoints(void) | |||
| 309 | for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) { | 308 | for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) { |
| 310 | if (kgdb_break[i].state != BP_ACTIVE) | 309 | if (kgdb_break[i].state != BP_ACTIVE) |
| 311 | continue; | 310 | continue; |
| 312 | addr = kgdb_break[i].bpt_addr; | 311 | error = kgdb_arch_remove_breakpoint(&kgdb_break[i]); |
| 313 | error = kgdb_arch_remove_breakpoint(addr, | ||
| 314 | kgdb_break[i].saved_instr); | ||
| 315 | if (error) { | 312 | if (error) { |
| 316 | printk(KERN_INFO "KGDB: BP remove failed: %lx\n", addr); | 313 | printk(KERN_INFO "KGDB: BP remove failed: %lx\n", |
| 314 | kgdb_break[i].bpt_addr); | ||
| 317 | ret = error; | 315 | ret = error; |
| 318 | } | 316 | } |
| 319 | 317 | ||
| 320 | kgdb_flush_swbreak_addr(addr); | 318 | kgdb_flush_swbreak_addr(kgdb_break[i].bpt_addr); |
| 321 | kgdb_break[i].state = BP_SET; | 319 | kgdb_break[i].state = BP_SET; |
| 322 | } | 320 | } |
| 323 | return ret; | 321 | return ret; |
| @@ -351,7 +349,6 @@ int kgdb_isremovedbreak(unsigned long addr) | |||
| 351 | 349 | ||
| 352 | int dbg_remove_all_break(void) | 350 | int dbg_remove_all_break(void) |
| 353 | { | 351 | { |
| 354 | unsigned long addr; | ||
| 355 | int error; | 352 | int error; |
| 356 | int i; | 353 | int i; |
| 357 | 354 | ||
| @@ -359,12 +356,10 @@ int dbg_remove_all_break(void) | |||
| 359 | for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) { | 356 | for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) { |
| 360 | if (kgdb_break[i].state != BP_ACTIVE) | 357 | if (kgdb_break[i].state != BP_ACTIVE) |
| 361 | goto setundefined; | 358 | goto setundefined; |
| 362 | addr = kgdb_break[i].bpt_addr; | 359 | error = kgdb_arch_remove_breakpoint(&kgdb_break[i]); |
| 363 | error = kgdb_arch_remove_breakpoint(addr, | ||
| 364 | kgdb_break[i].saved_instr); | ||
| 365 | if (error) | 360 | if (error) |
| 366 | printk(KERN_ERR "KGDB: breakpoint remove failed: %lx\n", | 361 | printk(KERN_ERR "KGDB: breakpoint remove failed: %lx\n", |
| 367 | addr); | 362 | kgdb_break[i].bpt_addr); |
| 368 | setundefined: | 363 | setundefined: |
| 369 | kgdb_break[i].state = BP_UNDEFINED; | 364 | kgdb_break[i].state = BP_UNDEFINED; |
| 370 | } | 365 | } |
diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c index 9b5f17da1c56..bb9520f0f6ff 100644 --- a/kernel/debug/kdb/kdb_io.c +++ b/kernel/debug/kdb/kdb_io.c | |||
| @@ -743,7 +743,7 @@ kdb_printit: | |||
| 743 | kdb_input_flush(); | 743 | kdb_input_flush(); |
| 744 | c = console_drivers; | 744 | c = console_drivers; |
| 745 | 745 | ||
| 746 | if (!dbg_io_ops->is_console) { | 746 | if (dbg_io_ops && !dbg_io_ops->is_console) { |
| 747 | len = strlen(moreprompt); | 747 | len = strlen(moreprompt); |
| 748 | cp = moreprompt; | 748 | cp = moreprompt; |
| 749 | while (len--) { | 749 | while (len--) { |
diff --git a/kernel/irq_work.c b/kernel/irq_work.c index c3c46c72046e..0c56d44b9fd5 100644 --- a/kernel/irq_work.c +++ b/kernel/irq_work.c | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | * context. The enqueueing is NMI-safe. | 5 | * context. The enqueueing is NMI-safe. |
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | #include <linux/bug.h> | ||
| 8 | #include <linux/kernel.h> | 9 | #include <linux/kernel.h> |
| 9 | #include <linux/export.h> | 10 | #include <linux/export.h> |
| 10 | #include <linux/irq_work.h> | 11 | #include <linux/irq_work.h> |
diff --git a/kernel/kmod.c b/kernel/kmod.c index 957a7aab8ebc..05698a7415fe 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c | |||
| @@ -322,7 +322,7 @@ static void __call_usermodehelper(struct work_struct *work) | |||
| 322 | * land has been frozen during a system-wide hibernation or suspend operation). | 322 | * land has been frozen during a system-wide hibernation or suspend operation). |
| 323 | * Should always be manipulated under umhelper_sem acquired for write. | 323 | * Should always be manipulated under umhelper_sem acquired for write. |
| 324 | */ | 324 | */ |
| 325 | static int usermodehelper_disabled = 1; | 325 | static enum umh_disable_depth usermodehelper_disabled = UMH_DISABLED; |
| 326 | 326 | ||
| 327 | /* Number of helpers running */ | 327 | /* Number of helpers running */ |
| 328 | static atomic_t running_helpers = ATOMIC_INIT(0); | 328 | static atomic_t running_helpers = ATOMIC_INIT(0); |
| @@ -334,32 +334,110 @@ static atomic_t running_helpers = ATOMIC_INIT(0); | |||
| 334 | static DECLARE_WAIT_QUEUE_HEAD(running_helpers_waitq); | 334 | static DECLARE_WAIT_QUEUE_HEAD(running_helpers_waitq); |
| 335 | 335 | ||
| 336 | /* | 336 | /* |
| 337 | * Used by usermodehelper_read_lock_wait() to wait for usermodehelper_disabled | ||
| 338 | * to become 'false'. | ||
| 339 | */ | ||
| 340 | static DECLARE_WAIT_QUEUE_HEAD(usermodehelper_disabled_waitq); | ||
| 341 | |||
| 342 | /* | ||
| 337 | * Time to wait for running_helpers to become zero before the setting of | 343 | * Time to wait for running_helpers to become zero before the setting of |
| 338 | * usermodehelper_disabled in usermodehelper_disable() fails | 344 | * usermodehelper_disabled in usermodehelper_disable() fails |
| 339 | */ | 345 | */ |
| 340 | #define RUNNING_HELPERS_TIMEOUT (5 * HZ) | 346 | #define RUNNING_HELPERS_TIMEOUT (5 * HZ) |
| 341 | 347 | ||
| 342 | void read_lock_usermodehelper(void) | 348 | int usermodehelper_read_trylock(void) |
| 343 | { | 349 | { |
| 350 | DEFINE_WAIT(wait); | ||
| 351 | int ret = 0; | ||
| 352 | |||
| 344 | down_read(&umhelper_sem); | 353 | down_read(&umhelper_sem); |
| 354 | for (;;) { | ||
| 355 | prepare_to_wait(&usermodehelper_disabled_waitq, &wait, | ||
| 356 | TASK_INTERRUPTIBLE); | ||
| 357 | if (!usermodehelper_disabled) | ||
| 358 | break; | ||
| 359 | |||
| 360 | if (usermodehelper_disabled == UMH_DISABLED) | ||
| 361 | ret = -EAGAIN; | ||
| 362 | |||
| 363 | up_read(&umhelper_sem); | ||
| 364 | |||
| 365 | if (ret) | ||
| 366 | break; | ||
| 367 | |||
| 368 | schedule(); | ||
| 369 | try_to_freeze(); | ||
| 370 | |||
| 371 | down_read(&umhelper_sem); | ||
| 372 | } | ||
| 373 | finish_wait(&usermodehelper_disabled_waitq, &wait); | ||
| 374 | return ret; | ||
| 375 | } | ||
| 376 | EXPORT_SYMBOL_GPL(usermodehelper_read_trylock); | ||
| 377 | |||
| 378 | long usermodehelper_read_lock_wait(long timeout) | ||
| 379 | { | ||
| 380 | DEFINE_WAIT(wait); | ||
| 381 | |||
| 382 | if (timeout < 0) | ||
| 383 | return -EINVAL; | ||
| 384 | |||
| 385 | down_read(&umhelper_sem); | ||
| 386 | for (;;) { | ||
| 387 | prepare_to_wait(&usermodehelper_disabled_waitq, &wait, | ||
| 388 | TASK_UNINTERRUPTIBLE); | ||
| 389 | if (!usermodehelper_disabled) | ||
| 390 | break; | ||
| 391 | |||
| 392 | up_read(&umhelper_sem); | ||
| 393 | |||
| 394 | timeout = schedule_timeout(timeout); | ||
| 395 | if (!timeout) | ||
| 396 | break; | ||
| 397 | |||
| 398 | down_read(&umhelper_sem); | ||
| 399 | } | ||
| 400 | finish_wait(&usermodehelper_disabled_waitq, &wait); | ||
| 401 | return timeout; | ||
| 345 | } | 402 | } |
| 346 | EXPORT_SYMBOL_GPL(read_lock_usermodehelper); | 403 | EXPORT_SYMBOL_GPL(usermodehelper_read_lock_wait); |
| 347 | 404 | ||
| 348 | void read_unlock_usermodehelper(void) | 405 | void usermodehelper_read_unlock(void) |
| 349 | { | 406 | { |
| 350 | up_read(&umhelper_sem); | 407 | up_read(&umhelper_sem); |
| 351 | } | 408 | } |
| 352 | EXPORT_SYMBOL_GPL(read_unlock_usermodehelper); | 409 | EXPORT_SYMBOL_GPL(usermodehelper_read_unlock); |
| 353 | 410 | ||
| 354 | /** | 411 | /** |
| 355 | * usermodehelper_disable - prevent new helpers from being started | 412 | * __usermodehelper_set_disable_depth - Modify usermodehelper_disabled. |
| 413 | * depth: New value to assign to usermodehelper_disabled. | ||
| 414 | * | ||
| 415 | * Change the value of usermodehelper_disabled (under umhelper_sem locked for | ||
| 416 | * writing) and wakeup tasks waiting for it to change. | ||
| 356 | */ | 417 | */ |
| 357 | int usermodehelper_disable(void) | 418 | void __usermodehelper_set_disable_depth(enum umh_disable_depth depth) |
| 419 | { | ||
| 420 | down_write(&umhelper_sem); | ||
| 421 | usermodehelper_disabled = depth; | ||
| 422 | wake_up(&usermodehelper_disabled_waitq); | ||
| 423 | up_write(&umhelper_sem); | ||
| 424 | } | ||
| 425 | |||
| 426 | /** | ||
| 427 | * __usermodehelper_disable - Prevent new helpers from being started. | ||
| 428 | * @depth: New value to assign to usermodehelper_disabled. | ||
| 429 | * | ||
| 430 | * Set usermodehelper_disabled to @depth and wait for running helpers to exit. | ||
| 431 | */ | ||
| 432 | int __usermodehelper_disable(enum umh_disable_depth depth) | ||
| 358 | { | 433 | { |
| 359 | long retval; | 434 | long retval; |
| 360 | 435 | ||
| 436 | if (!depth) | ||
| 437 | return -EINVAL; | ||
| 438 | |||
| 361 | down_write(&umhelper_sem); | 439 | down_write(&umhelper_sem); |
| 362 | usermodehelper_disabled = 1; | 440 | usermodehelper_disabled = depth; |
| 363 | up_write(&umhelper_sem); | 441 | up_write(&umhelper_sem); |
| 364 | 442 | ||
| 365 | /* | 443 | /* |
| @@ -374,31 +452,10 @@ int usermodehelper_disable(void) | |||
| 374 | if (retval) | 452 | if (retval) |
| 375 | return 0; | 453 | return 0; |
| 376 | 454 | ||
| 377 | down_write(&umhelper_sem); | 455 | __usermodehelper_set_disable_depth(UMH_ENABLED); |
| 378 | usermodehelper_disabled = 0; | ||
| 379 | up_write(&umhelper_sem); | ||
| 380 | return -EAGAIN; | 456 | return -EAGAIN; |
| 381 | } | 457 | } |
| 382 | 458 | ||
| 383 | /** | ||
| 384 | * usermodehelper_enable - allow new helpers to be started again | ||
| 385 | */ | ||
| 386 | void usermodehelper_enable(void) | ||
| 387 | { | ||
| 388 | down_write(&umhelper_sem); | ||
| 389 | usermodehelper_disabled = 0; | ||
| 390 | up_write(&umhelper_sem); | ||
| 391 | } | ||
| 392 | |||
| 393 | /** | ||
| 394 | * usermodehelper_is_disabled - check if new helpers are allowed to be started | ||
| 395 | */ | ||
| 396 | bool usermodehelper_is_disabled(void) | ||
| 397 | { | ||
| 398 | return usermodehelper_disabled; | ||
| 399 | } | ||
| 400 | EXPORT_SYMBOL_GPL(usermodehelper_is_disabled); | ||
| 401 | |||
| 402 | static void helper_lock(void) | 459 | static void helper_lock(void) |
| 403 | { | 460 | { |
| 404 | atomic_inc(&running_helpers); | 461 | atomic_inc(&running_helpers); |
diff --git a/kernel/padata.c b/kernel/padata.c index 6f10eb285ece..89fe3d1b9efb 100644 --- a/kernel/padata.c +++ b/kernel/padata.c | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * padata.c - generic interface to process data streams in parallel | 2 | * padata.c - generic interface to process data streams in parallel |
| 3 | * | 3 | * |
| 4 | * See Documentation/padata.txt for an api documentation. | ||
| 5 | * | ||
| 4 | * Copyright (C) 2008, 2009 secunet Security Networks AG | 6 | * Copyright (C) 2008, 2009 secunet Security Networks AG |
| 5 | * Copyright (C) 2008, 2009 Steffen Klassert <steffen.klassert@secunet.com> | 7 | * Copyright (C) 2008, 2009 Steffen Klassert <steffen.klassert@secunet.com> |
| 6 | * | 8 | * |
| @@ -354,13 +356,13 @@ static int padata_setup_cpumasks(struct parallel_data *pd, | |||
| 354 | if (!alloc_cpumask_var(&pd->cpumask.pcpu, GFP_KERNEL)) | 356 | if (!alloc_cpumask_var(&pd->cpumask.pcpu, GFP_KERNEL)) |
| 355 | return -ENOMEM; | 357 | return -ENOMEM; |
| 356 | 358 | ||
| 357 | cpumask_and(pd->cpumask.pcpu, pcpumask, cpu_active_mask); | 359 | cpumask_and(pd->cpumask.pcpu, pcpumask, cpu_online_mask); |
| 358 | if (!alloc_cpumask_var(&pd->cpumask.cbcpu, GFP_KERNEL)) { | 360 | if (!alloc_cpumask_var(&pd->cpumask.cbcpu, GFP_KERNEL)) { |
| 359 | free_cpumask_var(pd->cpumask.cbcpu); | 361 | free_cpumask_var(pd->cpumask.cbcpu); |
| 360 | return -ENOMEM; | 362 | return -ENOMEM; |
| 361 | } | 363 | } |
| 362 | 364 | ||
| 363 | cpumask_and(pd->cpumask.cbcpu, cbcpumask, cpu_active_mask); | 365 | cpumask_and(pd->cpumask.cbcpu, cbcpumask, cpu_online_mask); |
| 364 | return 0; | 366 | return 0; |
| 365 | } | 367 | } |
| 366 | 368 | ||
| @@ -564,7 +566,7 @@ EXPORT_SYMBOL(padata_unregister_cpumask_notifier); | |||
| 564 | static bool padata_validate_cpumask(struct padata_instance *pinst, | 566 | static bool padata_validate_cpumask(struct padata_instance *pinst, |
| 565 | const struct cpumask *cpumask) | 567 | const struct cpumask *cpumask) |
| 566 | { | 568 | { |
| 567 | if (!cpumask_intersects(cpumask, cpu_active_mask)) { | 569 | if (!cpumask_intersects(cpumask, cpu_online_mask)) { |
| 568 | pinst->flags |= PADATA_INVALID; | 570 | pinst->flags |= PADATA_INVALID; |
| 569 | return false; | 571 | return false; |
| 570 | } | 572 | } |
| @@ -678,7 +680,7 @@ static int __padata_add_cpu(struct padata_instance *pinst, int cpu) | |||
| 678 | { | 680 | { |
| 679 | struct parallel_data *pd; | 681 | struct parallel_data *pd; |
| 680 | 682 | ||
| 681 | if (cpumask_test_cpu(cpu, cpu_active_mask)) { | 683 | if (cpumask_test_cpu(cpu, cpu_online_mask)) { |
| 682 | pd = padata_alloc_pd(pinst, pinst->cpumask.pcpu, | 684 | pd = padata_alloc_pd(pinst, pinst->cpumask.pcpu, |
| 683 | pinst->cpumask.cbcpu); | 685 | pinst->cpumask.cbcpu); |
| 684 | if (!pd) | 686 | if (!pd) |
| @@ -746,6 +748,9 @@ static int __padata_remove_cpu(struct padata_instance *pinst, int cpu) | |||
| 746 | return -ENOMEM; | 748 | return -ENOMEM; |
| 747 | 749 | ||
| 748 | padata_replace(pinst, pd); | 750 | padata_replace(pinst, pd); |
| 751 | |||
| 752 | cpumask_clear_cpu(cpu, pd->cpumask.cbcpu); | ||
| 753 | cpumask_clear_cpu(cpu, pd->cpumask.pcpu); | ||
| 749 | } | 754 | } |
| 750 | 755 | ||
| 751 | return 0; | 756 | return 0; |
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index 0a186cfde788..e09dfbfeecee 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c | |||
| @@ -16,7 +16,6 @@ | |||
| 16 | #include <linux/string.h> | 16 | #include <linux/string.h> |
| 17 | #include <linux/device.h> | 17 | #include <linux/device.h> |
| 18 | #include <linux/async.h> | 18 | #include <linux/async.h> |
| 19 | #include <linux/kmod.h> | ||
| 20 | #include <linux/delay.h> | 19 | #include <linux/delay.h> |
| 21 | #include <linux/fs.h> | 20 | #include <linux/fs.h> |
| 22 | #include <linux/mount.h> | 21 | #include <linux/mount.h> |
| @@ -611,14 +610,10 @@ int hibernate(void) | |||
| 611 | if (error) | 610 | if (error) |
| 612 | goto Exit; | 611 | goto Exit; |
| 613 | 612 | ||
| 614 | error = usermodehelper_disable(); | ||
| 615 | if (error) | ||
| 616 | goto Exit; | ||
| 617 | |||
| 618 | /* Allocate memory management structures */ | 613 | /* Allocate memory management structures */ |
| 619 | error = create_basic_memory_bitmaps(); | 614 | error = create_basic_memory_bitmaps(); |
| 620 | if (error) | 615 | if (error) |
| 621 | goto Enable_umh; | 616 | goto Exit; |
| 622 | 617 | ||
| 623 | printk(KERN_INFO "PM: Syncing filesystems ... "); | 618 | printk(KERN_INFO "PM: Syncing filesystems ... "); |
| 624 | sys_sync(); | 619 | sys_sync(); |
| @@ -661,8 +656,6 @@ int hibernate(void) | |||
| 661 | 656 | ||
| 662 | Free_bitmaps: | 657 | Free_bitmaps: |
| 663 | free_basic_memory_bitmaps(); | 658 | free_basic_memory_bitmaps(); |
| 664 | Enable_umh: | ||
| 665 | usermodehelper_enable(); | ||
| 666 | Exit: | 659 | Exit: |
| 667 | pm_notifier_call_chain(PM_POST_HIBERNATION); | 660 | pm_notifier_call_chain(PM_POST_HIBERNATION); |
| 668 | pm_restore_console(); | 661 | pm_restore_console(); |
| @@ -777,15 +770,9 @@ static int software_resume(void) | |||
| 777 | if (error) | 770 | if (error) |
| 778 | goto close_finish; | 771 | goto close_finish; |
| 779 | 772 | ||
| 780 | error = usermodehelper_disable(); | ||
| 781 | if (error) | ||
| 782 | goto close_finish; | ||
| 783 | |||
| 784 | error = create_basic_memory_bitmaps(); | 773 | error = create_basic_memory_bitmaps(); |
| 785 | if (error) { | 774 | if (error) |
| 786 | usermodehelper_enable(); | ||
| 787 | goto close_finish; | 775 | goto close_finish; |
| 788 | } | ||
| 789 | 776 | ||
| 790 | pr_debug("PM: Preparing processes for restore.\n"); | 777 | pr_debug("PM: Preparing processes for restore.\n"); |
| 791 | error = freeze_processes(); | 778 | error = freeze_processes(); |
| @@ -806,7 +793,6 @@ static int software_resume(void) | |||
| 806 | thaw_processes(); | 793 | thaw_processes(); |
| 807 | Done: | 794 | Done: |
| 808 | free_basic_memory_bitmaps(); | 795 | free_basic_memory_bitmaps(); |
| 809 | usermodehelper_enable(); | ||
| 810 | Finish: | 796 | Finish: |
| 811 | pm_notifier_call_chain(PM_POST_RESTORE); | 797 | pm_notifier_call_chain(PM_POST_RESTORE); |
| 812 | pm_restore_console(); | 798 | pm_restore_console(); |
diff --git a/kernel/power/process.c b/kernel/power/process.c index 0d2aeb226108..19db29f67558 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/freezer.h> | 16 | #include <linux/freezer.h> |
| 17 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
| 18 | #include <linux/workqueue.h> | 18 | #include <linux/workqueue.h> |
| 19 | #include <linux/kmod.h> | ||
| 19 | 20 | ||
| 20 | /* | 21 | /* |
| 21 | * Timeout for stopping processes | 22 | * Timeout for stopping processes |
| @@ -122,6 +123,10 @@ int freeze_processes(void) | |||
| 122 | { | 123 | { |
| 123 | int error; | 124 | int error; |
| 124 | 125 | ||
| 126 | error = __usermodehelper_disable(UMH_FREEZING); | ||
| 127 | if (error) | ||
| 128 | return error; | ||
| 129 | |||
| 125 | if (!pm_freezing) | 130 | if (!pm_freezing) |
| 126 | atomic_inc(&system_freezing_cnt); | 131 | atomic_inc(&system_freezing_cnt); |
| 127 | 132 | ||
| @@ -130,6 +135,7 @@ int freeze_processes(void) | |||
| 130 | error = try_to_freeze_tasks(true); | 135 | error = try_to_freeze_tasks(true); |
| 131 | if (!error) { | 136 | if (!error) { |
| 132 | printk("done."); | 137 | printk("done."); |
| 138 | __usermodehelper_set_disable_depth(UMH_DISABLED); | ||
| 133 | oom_killer_disable(); | 139 | oom_killer_disable(); |
| 134 | } | 140 | } |
| 135 | printk("\n"); | 141 | printk("\n"); |
| @@ -187,6 +193,8 @@ void thaw_processes(void) | |||
| 187 | } while_each_thread(g, p); | 193 | } while_each_thread(g, p); |
| 188 | read_unlock(&tasklist_lock); | 194 | read_unlock(&tasklist_lock); |
| 189 | 195 | ||
| 196 | usermodehelper_enable(); | ||
| 197 | |||
| 190 | schedule(); | 198 | schedule(); |
| 191 | printk("done.\n"); | 199 | printk("done.\n"); |
| 192 | } | 200 | } |
diff --git a/kernel/power/qos.c b/kernel/power/qos.c index d6d6dbd1ecc0..6a031e684026 100644 --- a/kernel/power/qos.c +++ b/kernel/power/qos.c | |||
| @@ -230,6 +230,21 @@ int pm_qos_request_active(struct pm_qos_request *req) | |||
| 230 | EXPORT_SYMBOL_GPL(pm_qos_request_active); | 230 | EXPORT_SYMBOL_GPL(pm_qos_request_active); |
| 231 | 231 | ||
| 232 | /** | 232 | /** |
| 233 | * pm_qos_work_fn - the timeout handler of pm_qos_update_request_timeout | ||
| 234 | * @work: work struct for the delayed work (timeout) | ||
| 235 | * | ||
| 236 | * This cancels the timeout request by falling back to the default at timeout. | ||
| 237 | */ | ||
| 238 | static void pm_qos_work_fn(struct work_struct *work) | ||
| 239 | { | ||
| 240 | struct pm_qos_request *req = container_of(to_delayed_work(work), | ||
| 241 | struct pm_qos_request, | ||
| 242 | work); | ||
| 243 | |||
| 244 | pm_qos_update_request(req, PM_QOS_DEFAULT_VALUE); | ||
| 245 | } | ||
| 246 | |||
| 247 | /** | ||
| 233 | * pm_qos_add_request - inserts new qos request into the list | 248 | * pm_qos_add_request - inserts new qos request into the list |
| 234 | * @req: pointer to a preallocated handle | 249 | * @req: pointer to a preallocated handle |
| 235 | * @pm_qos_class: identifies which list of qos request to use | 250 | * @pm_qos_class: identifies which list of qos request to use |
| @@ -253,6 +268,7 @@ void pm_qos_add_request(struct pm_qos_request *req, | |||
| 253 | return; | 268 | return; |
| 254 | } | 269 | } |
| 255 | req->pm_qos_class = pm_qos_class; | 270 | req->pm_qos_class = pm_qos_class; |
| 271 | INIT_DELAYED_WORK(&req->work, pm_qos_work_fn); | ||
| 256 | pm_qos_update_target(pm_qos_array[pm_qos_class]->constraints, | 272 | pm_qos_update_target(pm_qos_array[pm_qos_class]->constraints, |
| 257 | &req->node, PM_QOS_ADD_REQ, value); | 273 | &req->node, PM_QOS_ADD_REQ, value); |
| 258 | } | 274 | } |
| @@ -279,6 +295,9 @@ void pm_qos_update_request(struct pm_qos_request *req, | |||
| 279 | return; | 295 | return; |
| 280 | } | 296 | } |
| 281 | 297 | ||
| 298 | if (delayed_work_pending(&req->work)) | ||
| 299 | cancel_delayed_work_sync(&req->work); | ||
| 300 | |||
| 282 | if (new_value != req->node.prio) | 301 | if (new_value != req->node.prio) |
| 283 | pm_qos_update_target( | 302 | pm_qos_update_target( |
| 284 | pm_qos_array[req->pm_qos_class]->constraints, | 303 | pm_qos_array[req->pm_qos_class]->constraints, |
| @@ -287,6 +306,34 @@ void pm_qos_update_request(struct pm_qos_request *req, | |||
| 287 | EXPORT_SYMBOL_GPL(pm_qos_update_request); | 306 | EXPORT_SYMBOL_GPL(pm_qos_update_request); |
| 288 | 307 | ||
| 289 | /** | 308 | /** |
| 309 | * pm_qos_update_request_timeout - modifies an existing qos request temporarily. | ||
| 310 | * @req : handle to list element holding a pm_qos request to use | ||
| 311 | * @new_value: defines the temporal qos request | ||
| 312 | * @timeout_us: the effective duration of this qos request in usecs. | ||
| 313 | * | ||
| 314 | * After timeout_us, this qos request is cancelled automatically. | ||
| 315 | */ | ||
| 316 | void pm_qos_update_request_timeout(struct pm_qos_request *req, s32 new_value, | ||
| 317 | unsigned long timeout_us) | ||
| 318 | { | ||
| 319 | if (!req) | ||
| 320 | return; | ||
| 321 | if (WARN(!pm_qos_request_active(req), | ||
| 322 | "%s called for unknown object.", __func__)) | ||
| 323 | return; | ||
| 324 | |||
| 325 | if (delayed_work_pending(&req->work)) | ||
| 326 | cancel_delayed_work_sync(&req->work); | ||
| 327 | |||
| 328 | if (new_value != req->node.prio) | ||
| 329 | pm_qos_update_target( | ||
| 330 | pm_qos_array[req->pm_qos_class]->constraints, | ||
| 331 | &req->node, PM_QOS_UPDATE_REQ, new_value); | ||
| 332 | |||
| 333 | schedule_delayed_work(&req->work, usecs_to_jiffies(timeout_us)); | ||
| 334 | } | ||
| 335 | |||
| 336 | /** | ||
| 290 | * pm_qos_remove_request - modifies an existing qos request | 337 | * pm_qos_remove_request - modifies an existing qos request |
| 291 | * @req: handle to request list element | 338 | * @req: handle to request list element |
| 292 | * | 339 | * |
| @@ -305,6 +352,9 @@ void pm_qos_remove_request(struct pm_qos_request *req) | |||
| 305 | return; | 352 | return; |
| 306 | } | 353 | } |
| 307 | 354 | ||
| 355 | if (delayed_work_pending(&req->work)) | ||
| 356 | cancel_delayed_work_sync(&req->work); | ||
| 357 | |||
| 308 | pm_qos_update_target(pm_qos_array[req->pm_qos_class]->constraints, | 358 | pm_qos_update_target(pm_qos_array[req->pm_qos_class]->constraints, |
| 309 | &req->node, PM_QOS_REMOVE_REQ, | 359 | &req->node, PM_QOS_REMOVE_REQ, |
| 310 | PM_QOS_DEFAULT_VALUE); | 360 | PM_QOS_DEFAULT_VALUE); |
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index 88e5c967370d..396d262b8fd0 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c | |||
| @@ -12,7 +12,6 @@ | |||
| 12 | #include <linux/delay.h> | 12 | #include <linux/delay.h> |
| 13 | #include <linux/errno.h> | 13 | #include <linux/errno.h> |
| 14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
| 15 | #include <linux/kmod.h> | ||
| 16 | #include <linux/console.h> | 15 | #include <linux/console.h> |
| 17 | #include <linux/cpu.h> | 16 | #include <linux/cpu.h> |
| 18 | #include <linux/syscalls.h> | 17 | #include <linux/syscalls.h> |
| @@ -102,17 +101,12 @@ static int suspend_prepare(void) | |||
| 102 | if (error) | 101 | if (error) |
| 103 | goto Finish; | 102 | goto Finish; |
| 104 | 103 | ||
| 105 | error = usermodehelper_disable(); | ||
| 106 | if (error) | ||
| 107 | goto Finish; | ||
| 108 | |||
| 109 | error = suspend_freeze_processes(); | 104 | error = suspend_freeze_processes(); |
| 110 | if (!error) | 105 | if (!error) |
| 111 | return 0; | 106 | return 0; |
| 112 | 107 | ||
| 113 | suspend_stats.failed_freeze++; | 108 | suspend_stats.failed_freeze++; |
| 114 | dpm_save_failed_step(SUSPEND_FREEZE); | 109 | dpm_save_failed_step(SUSPEND_FREEZE); |
| 115 | usermodehelper_enable(); | ||
| 116 | Finish: | 110 | Finish: |
| 117 | pm_notifier_call_chain(PM_POST_SUSPEND); | 111 | pm_notifier_call_chain(PM_POST_SUSPEND); |
| 118 | pm_restore_console(); | 112 | pm_restore_console(); |
| @@ -259,7 +253,6 @@ int suspend_devices_and_enter(suspend_state_t state) | |||
| 259 | static void suspend_finish(void) | 253 | static void suspend_finish(void) |
| 260 | { | 254 | { |
| 261 | suspend_thaw_processes(); | 255 | suspend_thaw_processes(); |
| 262 | usermodehelper_enable(); | ||
| 263 | pm_notifier_call_chain(PM_POST_SUSPEND); | 256 | pm_notifier_call_chain(PM_POST_SUSPEND); |
| 264 | pm_restore_console(); | 257 | pm_restore_console(); |
| 265 | } | 258 | } |
diff --git a/kernel/power/user.c b/kernel/power/user.c index 33c4329205af..91b0fd021a95 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c | |||
| @@ -12,7 +12,6 @@ | |||
| 12 | #include <linux/suspend.h> | 12 | #include <linux/suspend.h> |
| 13 | #include <linux/syscalls.h> | 13 | #include <linux/syscalls.h> |
| 14 | #include <linux/reboot.h> | 14 | #include <linux/reboot.h> |
| 15 | #include <linux/kmod.h> | ||
| 16 | #include <linux/string.h> | 15 | #include <linux/string.h> |
| 17 | #include <linux/device.h> | 16 | #include <linux/device.h> |
| 18 | #include <linux/miscdevice.h> | 17 | #include <linux/miscdevice.h> |
| @@ -222,14 +221,8 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, | |||
| 222 | sys_sync(); | 221 | sys_sync(); |
| 223 | printk("done.\n"); | 222 | printk("done.\n"); |
| 224 | 223 | ||
| 225 | error = usermodehelper_disable(); | ||
| 226 | if (error) | ||
| 227 | break; | ||
| 228 | |||
| 229 | error = freeze_processes(); | 224 | error = freeze_processes(); |
| 230 | if (error) | 225 | if (!error) |
| 231 | usermodehelper_enable(); | ||
| 232 | else | ||
| 233 | data->frozen = 1; | 226 | data->frozen = 1; |
| 234 | break; | 227 | break; |
| 235 | 228 | ||
| @@ -238,7 +231,6 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, | |||
| 238 | break; | 231 | break; |
| 239 | pm_restore_gfp_mask(); | 232 | pm_restore_gfp_mask(); |
| 240 | thaw_processes(); | 233 | thaw_processes(); |
| 241 | usermodehelper_enable(); | ||
| 242 | data->frozen = 0; | 234 | data->frozen = 0; |
| 243 | break; | 235 | break; |
| 244 | 236 | ||
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index cdea7b56b0c9..c0bd0308741c 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c | |||
| @@ -311,13 +311,6 @@ int blk_trace_remove(struct request_queue *q) | |||
| 311 | } | 311 | } |
| 312 | EXPORT_SYMBOL_GPL(blk_trace_remove); | 312 | EXPORT_SYMBOL_GPL(blk_trace_remove); |
| 313 | 313 | ||
| 314 | static int blk_dropped_open(struct inode *inode, struct file *filp) | ||
| 315 | { | ||
| 316 | filp->private_data = inode->i_private; | ||
| 317 | |||
| 318 | return 0; | ||
| 319 | } | ||
| 320 | |||
| 321 | static ssize_t blk_dropped_read(struct file *filp, char __user *buffer, | 314 | static ssize_t blk_dropped_read(struct file *filp, char __user *buffer, |
| 322 | size_t count, loff_t *ppos) | 315 | size_t count, loff_t *ppos) |
| 323 | { | 316 | { |
| @@ -331,18 +324,11 @@ static ssize_t blk_dropped_read(struct file *filp, char __user *buffer, | |||
| 331 | 324 | ||
| 332 | static const struct file_operations blk_dropped_fops = { | 325 | static const struct file_operations blk_dropped_fops = { |
| 333 | .owner = THIS_MODULE, | 326 | .owner = THIS_MODULE, |
| 334 | .open = blk_dropped_open, | 327 | .open = simple_open, |
| 335 | .read = blk_dropped_read, | 328 | .read = blk_dropped_read, |
| 336 | .llseek = default_llseek, | 329 | .llseek = default_llseek, |
| 337 | }; | 330 | }; |
| 338 | 331 | ||
| 339 | static int blk_msg_open(struct inode *inode, struct file *filp) | ||
| 340 | { | ||
| 341 | filp->private_data = inode->i_private; | ||
| 342 | |||
| 343 | return 0; | ||
| 344 | } | ||
| 345 | |||
| 346 | static ssize_t blk_msg_write(struct file *filp, const char __user *buffer, | 332 | static ssize_t blk_msg_write(struct file *filp, const char __user *buffer, |
| 347 | size_t count, loff_t *ppos) | 333 | size_t count, loff_t *ppos) |
| 348 | { | 334 | { |
| @@ -371,7 +357,7 @@ static ssize_t blk_msg_write(struct file *filp, const char __user *buffer, | |||
| 371 | 357 | ||
| 372 | static const struct file_operations blk_msg_fops = { | 358 | static const struct file_operations blk_msg_fops = { |
| 373 | .owner = THIS_MODULE, | 359 | .owner = THIS_MODULE, |
| 374 | .open = blk_msg_open, | 360 | .open = simple_open, |
| 375 | .write = blk_msg_write, | 361 | .write = blk_msg_write, |
| 376 | .llseek = noop_llseek, | 362 | .llseek = noop_llseek, |
| 377 | }; | 363 | }; |
