diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/fork.c | 1 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 27 | ||||
| -rw-r--r-- | kernel/perf_counter.c | 15 | ||||
| -rw-r--r-- | kernel/sysctl.c | 7 |
4 files changed, 34 insertions, 16 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 021e1138556e..144326b7af50 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -426,7 +426,6 @@ static struct mm_struct * mm_init(struct mm_struct * mm, struct task_struct *p) | |||
| 426 | init_rwsem(&mm->mmap_sem); | 426 | init_rwsem(&mm->mmap_sem); |
| 427 | INIT_LIST_HEAD(&mm->mmlist); | 427 | INIT_LIST_HEAD(&mm->mmlist); |
| 428 | mm->flags = (current->mm) ? current->mm->flags : default_dump_filter; | 428 | mm->flags = (current->mm) ? current->mm->flags : default_dump_filter; |
| 429 | mm->oom_adj = (current->mm) ? current->mm->oom_adj : 0; | ||
| 430 | mm->core_state = NULL; | 429 | mm->core_state = NULL; |
| 431 | mm->nr_ptes = 0; | 430 | mm->nr_ptes = 0; |
| 432 | set_mm_counter(mm, file_rss, 0); | 431 | set_mm_counter(mm, file_rss, 0); |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 61c679db4687..0ec9ed831737 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -607,7 +607,6 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) | |||
| 607 | */ | 607 | */ |
| 608 | get_task_struct(t); | 608 | get_task_struct(t); |
| 609 | new->thread = t; | 609 | new->thread = t; |
| 610 | wake_up_process(t); | ||
| 611 | } | 610 | } |
| 612 | 611 | ||
| 613 | /* | 612 | /* |
| @@ -690,6 +689,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) | |||
| 690 | (int)(new->flags & IRQF_TRIGGER_MASK)); | 689 | (int)(new->flags & IRQF_TRIGGER_MASK)); |
| 691 | } | 690 | } |
| 692 | 691 | ||
| 692 | new->irq = irq; | ||
| 693 | *old_ptr = new; | 693 | *old_ptr = new; |
| 694 | 694 | ||
| 695 | /* Reset broken irq detection when installing new handler */ | 695 | /* Reset broken irq detection when installing new handler */ |
| @@ -707,7 +707,13 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) | |||
| 707 | 707 | ||
| 708 | spin_unlock_irqrestore(&desc->lock, flags); | 708 | spin_unlock_irqrestore(&desc->lock, flags); |
| 709 | 709 | ||
| 710 | new->irq = irq; | 710 | /* |
| 711 | * Strictly no need to wake it up, but hung_task complains | ||
| 712 | * when no hard interrupt wakes the thread up. | ||
| 713 | */ | ||
| 714 | if (new->thread) | ||
| 715 | wake_up_process(new->thread); | ||
| 716 | |||
| 711 | register_irq_proc(irq, desc); | 717 | register_irq_proc(irq, desc); |
| 712 | new->dir = NULL; | 718 | new->dir = NULL; |
| 713 | register_handler_proc(irq, new); | 719 | register_handler_proc(irq, new); |
| @@ -761,7 +767,6 @@ static struct irqaction *__free_irq(unsigned int irq, void *dev_id) | |||
| 761 | { | 767 | { |
| 762 | struct irq_desc *desc = irq_to_desc(irq); | 768 | struct irq_desc *desc = irq_to_desc(irq); |
| 763 | struct irqaction *action, **action_ptr; | 769 | struct irqaction *action, **action_ptr; |
| 764 | struct task_struct *irqthread; | ||
| 765 | unsigned long flags; | 770 | unsigned long flags; |
| 766 | 771 | ||
| 767 | WARN(in_interrupt(), "Trying to free IRQ %d from IRQ context!\n", irq); | 772 | WARN(in_interrupt(), "Trying to free IRQ %d from IRQ context!\n", irq); |
| @@ -809,9 +814,6 @@ static struct irqaction *__free_irq(unsigned int irq, void *dev_id) | |||
| 809 | desc->chip->disable(irq); | 814 | desc->chip->disable(irq); |
| 810 | } | 815 | } |
| 811 | 816 | ||
| 812 | irqthread = action->thread; | ||
| 813 | action->thread = NULL; | ||
| 814 | |||
| 815 | spin_unlock_irqrestore(&desc->lock, flags); | 817 | spin_unlock_irqrestore(&desc->lock, flags); |
| 816 | 818 | ||
| 817 | unregister_handler_proc(irq, action); | 819 | unregister_handler_proc(irq, action); |
| @@ -819,12 +821,6 @@ static struct irqaction *__free_irq(unsigned int irq, void *dev_id) | |||
| 819 | /* Make sure it's not being used on another CPU: */ | 821 | /* Make sure it's not being used on another CPU: */ |
| 820 | synchronize_irq(irq); | 822 | synchronize_irq(irq); |
| 821 | 823 | ||
| 822 | if (irqthread) { | ||
| 823 | if (!test_bit(IRQTF_DIED, &action->thread_flags)) | ||
| 824 | kthread_stop(irqthread); | ||
| 825 | put_task_struct(irqthread); | ||
| 826 | } | ||
| 827 | |||
| 828 | #ifdef CONFIG_DEBUG_SHIRQ | 824 | #ifdef CONFIG_DEBUG_SHIRQ |
| 829 | /* | 825 | /* |
| 830 | * It's a shared IRQ -- the driver ought to be prepared for an IRQ | 826 | * It's a shared IRQ -- the driver ought to be prepared for an IRQ |
| @@ -840,6 +836,13 @@ static struct irqaction *__free_irq(unsigned int irq, void *dev_id) | |||
| 840 | local_irq_restore(flags); | 836 | local_irq_restore(flags); |
| 841 | } | 837 | } |
| 842 | #endif | 838 | #endif |
| 839 | |||
| 840 | if (action->thread) { | ||
| 841 | if (!test_bit(IRQTF_DIED, &action->thread_flags)) | ||
| 842 | kthread_stop(action->thread); | ||
| 843 | put_task_struct(action->thread); | ||
| 844 | } | ||
| 845 | |||
| 843 | return action; | 846 | return action; |
| 844 | } | 847 | } |
| 845 | 848 | ||
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c index 534e20d14d63..36f65e2b8b57 100644 --- a/kernel/perf_counter.c +++ b/kernel/perf_counter.c | |||
| @@ -1503,10 +1503,21 @@ static void perf_counter_enable_on_exec(struct task_struct *task) | |||
| 1503 | */ | 1503 | */ |
| 1504 | static void __perf_counter_read(void *info) | 1504 | static void __perf_counter_read(void *info) |
| 1505 | { | 1505 | { |
| 1506 | struct perf_cpu_context *cpuctx = &__get_cpu_var(perf_cpu_context); | ||
| 1506 | struct perf_counter *counter = info; | 1507 | struct perf_counter *counter = info; |
| 1507 | struct perf_counter_context *ctx = counter->ctx; | 1508 | struct perf_counter_context *ctx = counter->ctx; |
| 1508 | unsigned long flags; | 1509 | unsigned long flags; |
| 1509 | 1510 | ||
| 1511 | /* | ||
| 1512 | * If this is a task context, we need to check whether it is | ||
| 1513 | * the current task context of this cpu. If not it has been | ||
| 1514 | * scheduled out before the smp call arrived. In that case | ||
| 1515 | * counter->count would have been updated to a recent sample | ||
| 1516 | * when the counter was scheduled out. | ||
| 1517 | */ | ||
| 1518 | if (ctx->task && cpuctx->task_ctx != ctx) | ||
| 1519 | return; | ||
| 1520 | |||
| 1510 | local_irq_save(flags); | 1521 | local_irq_save(flags); |
| 1511 | if (ctx->is_active) | 1522 | if (ctx->is_active) |
| 1512 | update_context_time(ctx); | 1523 | update_context_time(ctx); |
| @@ -2008,6 +2019,10 @@ int perf_counter_task_disable(void) | |||
| 2008 | return 0; | 2019 | return 0; |
| 2009 | } | 2020 | } |
| 2010 | 2021 | ||
| 2022 | #ifndef PERF_COUNTER_INDEX_OFFSET | ||
| 2023 | # define PERF_COUNTER_INDEX_OFFSET 0 | ||
| 2024 | #endif | ||
| 2025 | |||
| 2011 | static int perf_counter_index(struct perf_counter *counter) | 2026 | static int perf_counter_index(struct perf_counter *counter) |
| 2012 | { | 2027 | { |
| 2013 | if (counter->state != PERF_COUNTER_STATE_ACTIVE) | 2028 | if (counter->state != PERF_COUNTER_STATE_ACTIVE) |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 98e02328c67d..58be76017fd0 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
| @@ -49,6 +49,7 @@ | |||
| 49 | #include <linux/acpi.h> | 49 | #include <linux/acpi.h> |
| 50 | #include <linux/reboot.h> | 50 | #include <linux/reboot.h> |
| 51 | #include <linux/ftrace.h> | 51 | #include <linux/ftrace.h> |
| 52 | #include <linux/security.h> | ||
| 52 | #include <linux/slow-work.h> | 53 | #include <linux/slow-work.h> |
| 53 | #include <linux/perf_counter.h> | 54 | #include <linux/perf_counter.h> |
| 54 | 55 | ||
| @@ -1306,10 +1307,10 @@ static struct ctl_table vm_table[] = { | |||
| 1306 | { | 1307 | { |
| 1307 | .ctl_name = CTL_UNNUMBERED, | 1308 | .ctl_name = CTL_UNNUMBERED, |
| 1308 | .procname = "mmap_min_addr", | 1309 | .procname = "mmap_min_addr", |
| 1309 | .data = &mmap_min_addr, | 1310 | .data = &dac_mmap_min_addr, |
| 1310 | .maxlen = sizeof(unsigned long), | 1311 | .maxlen = sizeof(unsigned long), |
| 1311 | .mode = 0644, | 1312 | .mode = 0644, |
| 1312 | .proc_handler = &proc_doulongvec_minmax, | 1313 | .proc_handler = &mmap_min_addr_handler, |
| 1313 | }, | 1314 | }, |
| 1314 | #ifdef CONFIG_NUMA | 1315 | #ifdef CONFIG_NUMA |
| 1315 | { | 1316 | { |
