diff options
| author | Tejun Heo <tj@kernel.org> | 2010-04-04 22:37:28 -0400 |
|---|---|---|
| committer | Tejun Heo <tj@kernel.org> | 2010-04-04 22:37:28 -0400 |
| commit | 336f5899d287f06d8329e208fc14ce50f7ec9698 (patch) | |
| tree | 9b762d450d5eb248a6ff8317badb7e223d93ed58 /kernel | |
| parent | a4ab2773205e8b94c18625455f85e3b6bb9d7ad6 (diff) | |
| parent | db217dece3003df0841bacf9556b5c06aa097dae (diff) | |
Merge branch 'master' into export-slabh
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cgroup_freezer.c | 9 | ||||
| -rw-r--r-- | kernel/cred.c | 6 | ||||
| -rw-r--r-- | kernel/early_res.c | 6 | ||||
| -rw-r--r-- | kernel/kgdb.c | 205 | ||||
| -rw-r--r-- | kernel/perf_event.c | 22 | ||||
| -rw-r--r-- | kernel/power/process.c | 5 | ||||
| -rw-r--r-- | kernel/sched.c | 2 | ||||
| -rw-r--r-- | kernel/sched_debug.c | 4 | ||||
| -rw-r--r-- | kernel/trace/ring_buffer.c | 8 | ||||
| -rw-r--r-- | kernel/trace/trace_clock.c | 4 | ||||
| -rw-r--r-- | kernel/trace/trace_event_perf.c | 11 |
11 files changed, 153 insertions, 129 deletions
diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c index d2ccd2798d7a..da5e13975531 100644 --- a/kernel/cgroup_freezer.c +++ b/kernel/cgroup_freezer.c | |||
| @@ -48,17 +48,20 @@ static inline struct freezer *task_freezer(struct task_struct *task) | |||
| 48 | struct freezer, css); | 48 | struct freezer, css); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | int cgroup_frozen(struct task_struct *task) | 51 | int cgroup_freezing_or_frozen(struct task_struct *task) |
| 52 | { | 52 | { |
| 53 | struct freezer *freezer; | 53 | struct freezer *freezer; |
| 54 | enum freezer_state state; | 54 | enum freezer_state state; |
| 55 | 55 | ||
| 56 | task_lock(task); | 56 | task_lock(task); |
| 57 | freezer = task_freezer(task); | 57 | freezer = task_freezer(task); |
| 58 | state = freezer->state; | 58 | if (!freezer->css.cgroup->parent) |
| 59 | state = CGROUP_THAWED; /* root cgroup can't be frozen */ | ||
| 60 | else | ||
| 61 | state = freezer->state; | ||
| 59 | task_unlock(task); | 62 | task_unlock(task); |
| 60 | 63 | ||
| 61 | return state == CGROUP_FROZEN; | 64 | return (state == CGROUP_FREEZING) || (state == CGROUP_FROZEN); |
| 62 | } | 65 | } |
| 63 | 66 | ||
| 64 | /* | 67 | /* |
diff --git a/kernel/cred.c b/kernel/cred.c index d84bdef17c9f..e1dbe9eef800 100644 --- a/kernel/cred.c +++ b/kernel/cred.c | |||
| @@ -365,7 +365,7 @@ struct cred *prepare_usermodehelper_creds(void) | |||
| 365 | 365 | ||
| 366 | new = kmem_cache_alloc(cred_jar, GFP_ATOMIC); | 366 | new = kmem_cache_alloc(cred_jar, GFP_ATOMIC); |
| 367 | if (!new) | 367 | if (!new) |
| 368 | return NULL; | 368 | goto free_tgcred; |
| 369 | 369 | ||
| 370 | kdebug("prepare_usermodehelper_creds() alloc %p", new); | 370 | kdebug("prepare_usermodehelper_creds() alloc %p", new); |
| 371 | 371 | ||
| @@ -398,6 +398,10 @@ struct cred *prepare_usermodehelper_creds(void) | |||
| 398 | 398 | ||
| 399 | error: | 399 | error: |
| 400 | put_cred(new); | 400 | put_cred(new); |
| 401 | free_tgcred: | ||
| 402 | #ifdef CONFIG_KEYS | ||
| 403 | kfree(tgcred); | ||
| 404 | #endif | ||
| 401 | return NULL; | 405 | return NULL; |
| 402 | } | 406 | } |
| 403 | 407 | ||
diff --git a/kernel/early_res.c b/kernel/early_res.c index 3cb2c661bb78..31aa9332ef3f 100644 --- a/kernel/early_res.c +++ b/kernel/early_res.c | |||
| @@ -333,6 +333,12 @@ void __init free_early_partial(u64 start, u64 end) | |||
| 333 | struct early_res *r; | 333 | struct early_res *r; |
| 334 | int i; | 334 | int i; |
| 335 | 335 | ||
| 336 | if (start == end) | ||
| 337 | return; | ||
| 338 | |||
| 339 | if (WARN_ONCE(start > end, " wrong range [%#llx, %#llx]\n", start, end)) | ||
| 340 | return; | ||
| 341 | |||
| 336 | try_next: | 342 | try_next: |
| 337 | i = find_overlapped_early(start, end); | 343 | i = find_overlapped_early(start, end); |
| 338 | if (i >= max_early_res) | 344 | if (i >= max_early_res) |
diff --git a/kernel/kgdb.c b/kernel/kgdb.c index 761fdd2b3034..11f3515ca83f 100644 --- a/kernel/kgdb.c +++ b/kernel/kgdb.c | |||
| @@ -69,9 +69,16 @@ struct kgdb_state { | |||
| 69 | struct pt_regs *linux_regs; | 69 | struct pt_regs *linux_regs; |
| 70 | }; | 70 | }; |
| 71 | 71 | ||
| 72 | /* Exception state values */ | ||
| 73 | #define DCPU_WANT_MASTER 0x1 /* Waiting to become a master kgdb cpu */ | ||
| 74 | #define DCPU_NEXT_MASTER 0x2 /* Transition from one master cpu to another */ | ||
| 75 | #define DCPU_IS_SLAVE 0x4 /* Slave cpu enter exception */ | ||
| 76 | #define DCPU_SSTEP 0x8 /* CPU is single stepping */ | ||
| 77 | |||
| 72 | static struct debuggerinfo_struct { | 78 | static struct debuggerinfo_struct { |
| 73 | void *debuggerinfo; | 79 | void *debuggerinfo; |
| 74 | struct task_struct *task; | 80 | struct task_struct *task; |
| 81 | int exception_state; | ||
| 75 | } kgdb_info[NR_CPUS]; | 82 | } kgdb_info[NR_CPUS]; |
| 76 | 83 | ||
| 77 | /** | 84 | /** |
| @@ -391,27 +398,22 @@ int kgdb_mem2hex(char *mem, char *buf, int count) | |||
| 391 | 398 | ||
| 392 | /* | 399 | /* |
| 393 | * Copy the binary array pointed to by buf into mem. Fix $, #, and | 400 | * Copy the binary array pointed to by buf into mem. Fix $, #, and |
| 394 | * 0x7d escaped with 0x7d. Return a pointer to the character after | 401 | * 0x7d escaped with 0x7d. Return -EFAULT on failure or 0 on success. |
| 395 | * the last byte written. | 402 | * The input buf is overwitten with the result to write to mem. |
| 396 | */ | 403 | */ |
| 397 | static int kgdb_ebin2mem(char *buf, char *mem, int count) | 404 | static int kgdb_ebin2mem(char *buf, char *mem, int count) |
| 398 | { | 405 | { |
| 399 | int err = 0; | 406 | int size = 0; |
| 400 | char c; | 407 | char *c = buf; |
| 401 | 408 | ||
| 402 | while (count-- > 0) { | 409 | while (count-- > 0) { |
| 403 | c = *buf++; | 410 | c[size] = *buf++; |
| 404 | if (c == 0x7d) | 411 | if (c[size] == 0x7d) |
| 405 | c = *buf++ ^ 0x20; | 412 | c[size] = *buf++ ^ 0x20; |
| 406 | 413 | size++; | |
| 407 | err = probe_kernel_write(mem, &c, 1); | ||
| 408 | if (err) | ||
| 409 | break; | ||
| 410 | |||
| 411 | mem++; | ||
| 412 | } | 414 | } |
| 413 | 415 | ||
| 414 | return err; | 416 | return probe_kernel_write(mem, c, size); |
| 415 | } | 417 | } |
| 416 | 418 | ||
| 417 | /* | 419 | /* |
| @@ -563,49 +565,6 @@ static struct task_struct *getthread(struct pt_regs *regs, int tid) | |||
| 563 | } | 565 | } |
| 564 | 566 | ||
| 565 | /* | 567 | /* |
| 566 | * CPU debug state control: | ||
| 567 | */ | ||
| 568 | |||
| 569 | #ifdef CONFIG_SMP | ||
| 570 | static void kgdb_wait(struct pt_regs *regs) | ||
| 571 | { | ||
| 572 | unsigned long flags; | ||
| 573 | int cpu; | ||
| 574 | |||
| 575 | local_irq_save(flags); | ||
| 576 | cpu = raw_smp_processor_id(); | ||
| 577 | kgdb_info[cpu].debuggerinfo = regs; | ||
| 578 | kgdb_info[cpu].task = current; | ||
| 579 | /* | ||
| 580 | * Make sure the above info reaches the primary CPU before | ||
| 581 | * our cpu_in_kgdb[] flag setting does: | ||
| 582 | */ | ||
| 583 | smp_wmb(); | ||
| 584 | atomic_set(&cpu_in_kgdb[cpu], 1); | ||
| 585 | |||
| 586 | /* Disable any cpu specific hw breakpoints */ | ||
| 587 | kgdb_disable_hw_debug(regs); | ||
| 588 | |||
| 589 | /* Wait till primary CPU is done with debugging */ | ||
| 590 | while (atomic_read(&passive_cpu_wait[cpu])) | ||
| 591 | cpu_relax(); | ||
| 592 | |||
| 593 | kgdb_info[cpu].debuggerinfo = NULL; | ||
| 594 | kgdb_info[cpu].task = NULL; | ||
| 595 | |||
| 596 | /* fix up hardware debug registers on local cpu */ | ||
| 597 | if (arch_kgdb_ops.correct_hw_break) | ||
| 598 | arch_kgdb_ops.correct_hw_break(); | ||
| 599 | |||
| 600 | /* Signal the primary CPU that we are done: */ | ||
| 601 | atomic_set(&cpu_in_kgdb[cpu], 0); | ||
| 602 | touch_softlockup_watchdog_sync(); | ||
| 603 | clocksource_touch_watchdog(); | ||
| 604 | local_irq_restore(flags); | ||
| 605 | } | ||
| 606 | #endif | ||
| 607 | |||
| 608 | /* | ||
| 609 | * Some architectures need cache flushes when we set/clear a | 568 | * Some architectures need cache flushes when we set/clear a |
| 610 | * breakpoint: | 569 | * breakpoint: |
| 611 | */ | ||
