diff options
| author | Ingo Molnar <mingo@elte.hu> | 2012-03-13 11:32:54 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2012-03-13 11:33:03 -0400 |
| commit | ef15eda98217f5183f457e7a2de8b79555ef908b (patch) | |
| tree | f8f22b48f7bb237c9aa6646175f3e17eeac4af0e /kernel | |
| parent | 5cb4ac3a583d4ee18c8682ab857e093c4a0d0895 (diff) | |
| parent | ef334a20d84f52407a8a2afd02ddeaecbef0ad3d (diff) | |
Merge branch 'x86/cleanups' into perf/uprobes
Merge reason: We want to merge a dependent patch.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/compat.c | 68 | ||||
| -rw-r--r-- | kernel/events/core.c | 19 | ||||
| -rw-r--r-- | kernel/events/hw_breakpoint.c | 4 | ||||
| -rw-r--r-- | kernel/exit.c | 2 | ||||
| -rw-r--r-- | kernel/fork.c | 7 | ||||
| -rw-r--r-- | kernel/irq/autoprobe.c | 4 | ||||
| -rw-r--r-- | kernel/irq/chip.c | 42 | ||||
| -rw-r--r-- | kernel/irq/internals.h | 2 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 2 | ||||
| -rw-r--r-- | kernel/kprobes.c | 6 | ||||
| -rw-r--r-- | kernel/params.c | 3 | ||||
| -rw-r--r-- | kernel/pid.c | 4 | ||||
| -rw-r--r-- | kernel/power/power.h | 24 | ||||
| -rw-r--r-- | kernel/power/process.c | 7 | ||||
| -rw-r--r-- | kernel/power/user.c | 6 | ||||
| -rw-r--r-- | kernel/relay.c | 10 | ||||
| -rw-r--r-- | kernel/sched/core.c | 5 | ||||
| -rw-r--r-- | kernel/sched/fair.c | 2 |
18 files changed, 171 insertions, 46 deletions
diff --git a/kernel/compat.c b/kernel/compat.c index f346cedfe24d..74ff8498809a 100644 --- a/kernel/compat.c +++ b/kernel/compat.c | |||
| @@ -31,11 +31,10 @@ | |||
| 31 | #include <asm/uaccess.h> | 31 | #include <asm/uaccess.h> |
| 32 | 32 | ||
| 33 | /* | 33 | /* |
| 34 | * Note that the native side is already converted to a timespec, because | 34 | * Get/set struct timeval with struct timespec on the native side |
| 35 | * that's what we want anyway. | ||
| 36 | */ | 35 | */ |
| 37 | static int compat_get_timeval(struct timespec *o, | 36 | static int compat_get_timeval_convert(struct timespec *o, |
| 38 | struct compat_timeval __user *i) | 37 | struct compat_timeval __user *i) |
| 39 | { | 38 | { |
| 40 | long usec; | 39 | long usec; |
| 41 | 40 | ||
| @@ -46,8 +45,8 @@ static int compat_get_timeval(struct timespec *o, | |||
| 46 | return 0; | 45 | return 0; |
| 47 | } | 46 | } |
| 48 | 47 | ||
| 49 | static int compat_put_timeval(struct compat_timeval __user *o, | 48 | static int compat_put_timeval_convert(struct compat_timeval __user *o, |
| 50 | struct timeval *i) | 49 | struct timeval *i) |
| 51 | { | 50 | { |
| 52 | return (put_user(i->tv_sec, &o->tv_sec) || | 51 | return (put_user(i->tv_sec, &o->tv_sec) || |
| 53 | put_user(i->tv_usec, &o->tv_usec)) ? -EFAULT : 0; | 52 | put_user(i->tv_usec, &o->tv_usec)) ? -EFAULT : 0; |
| @@ -117,7 +116,7 @@ asmlinkage long compat_sys_gettimeofday(struct compat_timeval __user *tv, | |||
| 117 | if (tv) { | 116 | if (tv) { |
| 118 | struct timeval ktv; | 117 | struct timeval ktv; |
| 119 | do_gettimeofday(&ktv); | 118 | do_gettimeofday(&ktv); |
| 120 | if (compat_put_timeval(tv, &ktv)) | 119 | if (compat_put_timeval_convert(tv, &ktv)) |
| 121 | return -EFAULT; | 120 | return -EFAULT; |
| 122 | } | 121 | } |
| 123 | if (tz) { | 122 | if (tz) { |
| @@ -135,7 +134,7 @@ asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv, | |||
| 135 | struct timezone ktz; | 134 | struct timezone ktz; |
| 136 | 135 | ||
| 137 | if (tv) { | 136 | if (tv) { |
| 138 | if (compat_get_timeval(&kts, tv)) | 137 | if (compat_get_timeval_convert(&kts, tv)) |
| 139 | return -EFAULT; | 138 | return -EFAULT; |
| 140 | } | 139 | } |
| 141 | if (tz) { | 140 | if (tz) { |
| @@ -146,12 +145,29 @@ asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv, | |||
| 146 | return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL); | 145 | return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL); |
| 147 | } | 146 | } |
| 148 | 147 | ||
| 148 | int get_compat_timeval(struct timeval *tv, const struct compat_timeval __user *ctv) | ||
| 149 | { | ||
| 150 | return (!access_ok(VERIFY_READ, ctv, sizeof(*ctv)) || | ||
| 151 | __get_user(tv->tv_sec, &ctv->tv_sec) || | ||
| 152 | __get_user(tv->tv_usec, &ctv->tv_usec)) ? -EFAULT : 0; | ||
| 153 | } | ||
| 154 | EXPORT_SYMBOL_GPL(get_compat_timeval); | ||
| 155 | |||
| 156 | int put_compat_timeval(const struct timeval *tv, struct compat_timeval __user *ctv) | ||
| 157 | { | ||
| 158 | return (!access_ok(VERIFY_WRITE, ctv, sizeof(*ctv)) || | ||
| 159 | __put_user(tv->tv_sec, &ctv->tv_sec) || | ||
| 160 | __put_user(tv->tv_usec, &ctv->tv_usec)) ? -EFAULT : 0; | ||
| 161 | } | ||
| 162 | EXPORT_SYMBOL_GPL(put_compat_timeval); | ||
| 163 | |||
| 149 | int get_compat_timespec(struct timespec *ts, const struct compat_timespec __user *cts) | 164 | int get_compat_timespec(struct timespec *ts, const struct compat_timespec __user *cts) |
| 150 | { | 165 | { |
| 151 | return (!access_ok(VERIFY_READ, cts, sizeof(*cts)) || | 166 | return (!access_ok(VERIFY_READ, cts, sizeof(*cts)) || |
| 152 | __get_user(ts->tv_sec, &cts->tv_sec) || | 167 | __get_user(ts->tv_sec, &cts->tv_sec) || |
| 153 | __get_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0; | 168 | __get_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0; |
| 154 | } | 169 | } |
| 170 | EXPORT_SYMBOL_GPL(get_compat_timespec); | ||
| 155 | 171 | ||
| 156 | int put_compat_timespec(const struct timespec *ts, struct compat_timespec __user *cts) | 172 | int put_compat_timespec(const struct timespec *ts, struct compat_timespec __user *cts) |
| 157 | { | 173 | { |
| @@ -161,6 +177,42 @@ int put_compat_timespec(const struct timespec *ts, struct compat_timespec __user | |||
| 161 | } | 177 | } |
| 162 | EXPORT_SYMBOL_GPL(put_compat_timespec); | 178 | EXPORT_SYMBOL_GPL(put_compat_timespec); |
| 163 | 179 | ||
| 180 | int compat_get_timeval(struct timeval *tv, const void __user *utv) | ||
| 181 | { | ||
| 182 | if (COMPAT_USE_64BIT_TIME) | ||
| 183 | return copy_from_user(tv, utv, sizeof *tv) ? -EFAULT : 0; | ||
| 184 | else | ||
| 185 | return get_compat_timeval(tv, utv); | ||
| 186 | } | ||
| 187 | EXPORT_SYMBOL_GPL(compat_get_timeval); | ||
| 188 | |||
| 189 | int compat_put_timeval(const struct timeval *tv, void __user *utv) | ||
| 190 | { | ||
| 191 | if (COMPAT_USE_64BIT_TIME) | ||
| 192 | return copy_to_user(utv, tv, sizeof *tv) ? -EFAULT : 0; | ||
| 193 | else | ||
| 194 | return put_compat_timeval(tv, utv); | ||
| 195 | } | ||
| 196 | EXPORT_SYMBOL_GPL(compat_put_timeval); | ||
| 197 | |||
| 198 | int compat_get_timespec(struct timespec *ts, const void __user *uts) | ||
| 199 | { | ||
| 200 | if (COMPAT_USE_64BIT_TIME) | ||
| 201 | return copy_from_user(ts, uts, sizeof *ts) ? -EFAULT : 0; | ||
| 202 | else | ||
| 203 | return get_compat_timespec(ts, uts); | ||
| 204 | } | ||
| 205 | EXPORT_SYMBOL_GPL(compat_get_timespec); | ||
| 206 | |||
| 207 | int compat_put_timespec(const struct timespec *ts, void __user *uts) | ||
| 208 | { | ||
| 209 | if (COMPAT_USE_64BIT_TIME) | ||
| 210 | return copy_to_user(uts, ts, sizeof *ts) ? -EFAULT : 0; | ||
| 211 | else | ||
| 212 | return put_compat_timespec(ts, uts); | ||
| 213 | } | ||
| 214 | EXPORT_SYMBOL_GPL(compat_put_timespec); | ||
| 215 | |||
| 164 | static long compat_nanosleep_restart(struct restart_block *restart) | 216 | static long compat_nanosleep_restart(struct restart_block *restart) |
| 165 | { | 217 | { |
| 166 | struct compat_timespec __user *rmtp; | 218 | struct compat_timespec __user *rmtp; |
diff --git a/kernel/events/core.c b/kernel/events/core.c index 7c3b9de55f6b..94afe5b91c6a 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -2303,7 +2303,7 @@ do { \ | |||
| 2303 | static DEFINE_PER_CPU(int, perf_throttled_count); | 2303 | static DEFINE_PER_CPU(int, perf_throttled_count); |
| 2304 | static DEFINE_PER_CPU(u64, perf_throttled_seq); | 2304 | static DEFINE_PER_CPU(u64, perf_throttled_seq); |
| 2305 | 2305 | ||
| 2306 | static void perf_adjust_period(struct perf_event *event, u64 nsec, u64 count) | 2306 | static void perf_adjust_period(struct perf_event *event, u64 nsec, u64 count, bool disable) |
| 2307 | { | 2307 | { |
| 2308 | struct hw_perf_event *hwc = &event->hw; | 2308 | struct hw_perf_event *hwc = &event->hw; |
| 2309 | s64 period, sample_period; | 2309 | s64 period, sample_period; |
| @@ -2322,9 +2322,13 @@ static void perf_adjust_period(struct perf_event *event, u64 nsec, u64 count) | |||
| 2322 | hwc->sample_period = sample_period; | 2322 | hwc->sample_period = sample_period; |
| 2323 | 2323 | ||
| 2324 | if (local64_read(&hwc->period_left) > 8*sample_period) { | 2324 | if (local64_read(&hwc->period_left) > 8*sample_period) { |
| 2325 | event->pmu->stop(event, PERF_EF_UPDATE); | 2325 | if (disable) |
| 2326 | event->pmu->stop(event, PERF_EF_UPDATE); | ||
| 2327 | |||
| 2326 | local64_set(&hwc->period_left, 0); | 2328 | local64_set(&hwc->period_left, 0); |
| 2327 | event->pmu->start(event, PERF_EF_RELOAD); | 2329 | |
| 2330 | if (disable) | ||
| 2331 | event->pmu->start(event, PERF_EF_RELOAD); | ||
| 2328 | } | 2332 | } |
| 2329 | } | 2333 | } |
| 2330 | 2334 | ||
| @@ -2350,6 +2354,7 @@ static void perf_adjust_freq_unthr_context(struct perf_event_context *ctx, | |||
| 2350 | return; | 2354 | return; |
| 2351 | 2355 | ||
| 2352 | raw_spin_lock(&ctx->lock); | 2356 | raw_spin_lock(&ctx->lock); |
| 2357 | perf_pmu_disable(ctx->pmu); | ||
| 2353 | 2358 | ||
| 2354 | list_for_each_entry_rcu(event, &ctx->event_list, event_entry) { | 2359 | list_for_each_entry_rcu(event, &ctx->event_list, event_entry) { |
| 2355 | if (event->state != PERF_EVENT_STATE_ACTIVE) | 2360 | if (event->state != PERF_EVENT_STATE_ACTIVE) |
| @@ -2381,13 +2386,17 @@ static void perf_adjust_freq_unthr_context(struct perf_event_context *ctx, | |||
| 2381 | /* | 2386 | /* |
| 2382 | * restart the event | 2387 | * restart the event |
| 2383 | * reload only if value has changed | 2388 | * reload only if value has changed |
| 2389 | * we have stopped the event so tell that | ||
| 2390 | * to perf_adjust_period() to avoid stopping it | ||
| 2391 | * twice. | ||
| 2384 | */ | 2392 | */ |
| 2385 | if (delta > 0) | 2393 | if (delta > 0) |
| 2386 | perf_adjust_period(event, period, delta); | 2394 | perf_adjust_period(event, period, delta, false); |
| 2387 | 2395 | ||
| 2388 | event->pmu->start(event, delta > 0 ? PERF_EF_RELOAD : 0); | 2396 | event->pmu->start(event, delta > 0 ? PERF_EF_RELOAD : 0); |
| 2389 | } | 2397 | } |
| 2390 | 2398 | ||
| 2399 | perf_pmu_enable(ctx->pmu); | ||
| 2391 | raw_spin_unlock(&ctx->lock); | 2400 | raw_spin_unlock(&ctx->lock); |
| 2392 | } | 2401 | } |
| 2393 | 2402 | ||
| @@ -4567,7 +4576,7 @@ static int __perf_event_overflow(struct perf_event *event, | |||
| 4567 | hwc->freq_time_stamp = now; | 4576 | hwc->freq_time_stamp = now; |
| 4568 | 4577 | ||
| 4569 | if (delta > 0 && delta < 2*TICK_NSEC) | 4578 | if (delta > 0 && delta < 2*TICK_NSEC) |
| 4570 | perf_adjust_period(event, delta, hwc->last_period); | 4579 | perf_adjust_period(event, delta, hwc->last_period, true); |
| 4571 | } | 4580 | } |
| 4572 | 4581 | ||
| 4573 | /* | 4582 | /* |
diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c index b0309f76d777..3330022a7ac1 100644 --- a/kernel/events/hw_breakpoint.c +++ b/kernel/events/hw_breakpoint.c | |||
| @@ -658,10 +658,10 @@ int __init init_hw_breakpoint(void) | |||
| 658 | 658 | ||
| 659 | err_alloc: | 659 | err_alloc: |
| 660 | for_each_possible_cpu(err_cpu) { | 660 | for_each_possible_cpu(err_cpu) { |
| 661 | if (err_cpu == cpu) | ||
| 662 | break; | ||
| 663 | for (i = 0; i < TYPE_MAX; i++) | 661 | for (i = 0; i < TYPE_MAX; i++) |
| 664 | kfree(per_cpu(nr_task_bp_pinned[i], cpu)); | 662 | kfree(per_cpu(nr_task_bp_pinned[i], cpu)); |
| 663 | if (err_cpu == cpu) | ||
| 664 | break; | ||
| 665 | } | 665 | } |
| 666 | 666 | ||
| 667 | return -ENOMEM; | 667 | return -ENOMEM; |
diff --git a/kernel/exit.c b/kernel/exit.c index 4b4042f9bc6a..4db020015f14 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -473,7 +473,7 @@ static void close_files(struct files_struct * files) | |||
| 473 | i = j * __NFDBITS; | 473 | i = j * __NFDBITS; |
| 474 | if (i >= fdt->max_fds) | 474 | if (i >= fdt->max_fds) |
| 475 | break; | 475 | break; |
| 476 | set = fdt->open_fds->fds_bits[j++]; | 476 | set = fdt->open_fds[j++]; |
| 477 | while (set) { | 477 | while (set) { |
| 478 | if (set & 1) { | 478 | if (set & 1) { |
| 479 | struct file * file = xchg(&fdt->fd[i], NULL); | 479 | struct file * file = xchg(&fdt->fd[i], NULL); |
diff --git a/kernel/fork.c b/kernel/fork.c index 1b2ef3c23ae4..e2cd3e2a5ae8 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -66,6 +66,7 @@ | |||
| 66 | #include <linux/user-return-notifier.h> | 66 | #include <linux/user-return-notifier.h> |
| 67 | #include <linux/oom.h> | 67 | #include <linux/oom.h> |
| 68 | #include <linux/khugepaged.h> | 68 | #include <linux/khugepaged.h> |
| 69 | #include <linux/signalfd.h> | ||
| 69 | 70 | ||
| 70 | #include <asm/pgtable.h> | 71 | #include <asm/pgtable.h> |
| 71 | #include <asm/pgalloc.h> | 72 | #include <asm/pgalloc.h> |
| @@ -910,7 +911,7 @@ static int copy_io(unsigned long clone_flags, struct task_struct *tsk) | |||
| 910 | return -ENOMEM; | 911 | return -ENOMEM; |
| 911 | 912 | ||
| 912 | new_ioc->ioprio = ioc->ioprio; | 913 | new_ioc->ioprio = ioc->ioprio; |
| 913 | put_io_context(new_ioc, NULL); | 914 | put_io_context(new_ioc); |
| 914 | } | 915 | } |
| 915 | #endif | 916 | #endif |
| 916 | return 0; | 917 | return 0; |
| @@ -935,8 +936,10 @@ static int copy_sighand(unsigned long clone_flags, struct task_struct *tsk) | |||
| 935 | 936 | ||
| 936 | void __cleanup_sighand(struct sighand_struct *sighand) | 937 | void __cleanup_sighand(struct sighand_struct *sighand) |
| 937 | { | 938 | { |
| 938 | if (atomic_dec_and_test(&sighand->count)) | 939 | if (atomic_dec_and_test(&sighand->count)) { |
| 940 | signalfd_cleanup(sighand); | ||
| 939 | kmem_cache_free(sighand_cachep, sighand); | 941 | kmem_cache_free(sighand_cachep, sighand); |
| 942 | } | ||
| 940 | } | 943 | } |
| 941 | 944 | ||
| 942 | 945 | ||
diff --git a/kernel/irq/autoprobe.c b/kernel/irq/autoprobe.c index 342d8f44e401..0119b9d467ae 100644 --- a/kernel/irq/autoprobe.c +++ b/kernel/irq/autoprobe.c | |||
| @@ -53,7 +53,7 @@ unsigned long probe_irq_on(void) | |||
| 53 | if (desc->irq_data.chip->irq_set_type) | 53 | if (desc->irq_data.chip->irq_set_type) |
| 54 | desc->irq_data.chip->irq_set_type(&desc->irq_data, | 54 | desc->irq_data.chip->irq_set_type(&desc->irq_data, |
| 55 | IRQ_TYPE_PROBE); | 55 | IRQ_TYPE_PROBE); |
| 56 | irq_startup(desc); | 56 | irq_startup(desc, false); |
| 57 | } | 57 | } |
| 58 | raw_spin_unlock_irq(&desc->lock); | 58 | raw_spin_unlock_irq(&desc->lock); |
| 59 | } | 59 | } |
| @@ -70,7 +70,7 @@ unsigned long probe_irq_on(void) | |||
| 70 | raw_spin_lock_irq(&desc->lock); | 70 | raw_spin_lock_irq(&desc->lock); |
| 71 | if (!desc->action && irq_settings_can_probe(desc)) { | 71 | if (!desc->action && irq_settings_can_probe(desc)) { |
| 72 | desc->istate |= IRQS_AUTODETECT | IRQS_WAITING; | 72 | desc->istate |= IRQS_AUTODETECT | IRQS_WAITING; |
| 73 | if (irq_startup(desc)) | 73 | if (irq_startup(desc, false)) |
| 74 | desc->istate |= IRQS_PENDING; | 74 | desc->istate |= IRQS_PENDING; |
| 75 | } | 75 | } |
| 76 | raw_spin_unlock_irq(&desc->lock); | 76 | raw_spin_unlock_irq(&desc->lock); |
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index f7c543a801d9..fb7db75ee0c8 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
| @@ -157,19 +157,22 @@ static void irq_state_set_masked(struct irq_desc *desc) | |||
| 157 | irqd_set(&desc->irq_data, IRQD_IRQ_MASKED); | 157 | irqd_set(&desc->irq_data, IRQD_IRQ_MASKED); |
| 158 | } | 158 | } |
| 159 | 159 | ||
| 160 | int irq_startup(struct irq_desc *desc) | 160 | int irq_startup(struct irq_desc *desc, bool resend) |
| 161 | { | 161 | { |
| 162 | int ret = 0; | ||
| 163 | |||
| 162 | irq_state_clr_disabled(desc); | 164 | irq_state_clr_disabled(desc); |
| 163 | desc->depth = 0; | 165 | desc->depth = 0; |
| 164 | 166 | ||
| 165 | if (desc->irq_data.chip->irq_startup) { | 167 | if (desc->irq_data.chip->irq_startup) { |
| 166 | int ret = desc->irq_data.chip->irq_startup(&desc->irq_data); | 168 | ret = desc->irq_data.chip->irq_startup(&desc->irq_data); |
| 167 | irq_state_clr_masked(desc); | 169 | irq_state_clr_masked(desc); |
| 168 | return ret; | 170 | } else { |
| 171 | irq_enable(desc); | ||
| 169 | } | 172 | } |
| 170 | 173 | if (resend) | |
| 171 | irq_enable(desc); | 174 | check_irq_resend(desc, desc->irq_data.irq); |
| 172 | return 0; | 175 | return ret; |
| 173 | } | 176 | } |
| 174 | 177 | ||
| 175 | void irq_shutdown(struct irq_desc *desc) | 178 | void irq_shutdown(struct irq_desc *desc) |
| @@ -330,6 +333,24 @@ out_unlock: | |||
| 330 | } | 333 | } |
| 331 | EXPORT_SYMBOL_GPL(handle_simple_irq); | 334 | EXPORT_SYMBOL_GPL(handle_simple_irq); |
| 332 | 335 | ||
| 336 | /* | ||
| 337 | * Called unconditionally from handle_level_irq() and only for oneshot | ||
| 338 | * interrupts from handle_fasteoi_irq() | ||
| 339 | */ | ||
| 340 | static void cond_unmask_irq(struct irq_desc *desc) | ||
| 341 | { | ||
| 342 | /* | ||
| 343 | * We need to unmask in the following cases: | ||
| 344 | * - Standard level irq (IRQF_ONESHOT is not set) | ||
| 345 | * - Oneshot irq which did not wake the thread (caused by a | ||
| 346 | * spurious interrupt or a primary handler handling it | ||
| 347 | * completely). | ||
| 348 | */ | ||
| 349 | if (!irqd_irq_disabled(&desc->irq_data) && | ||
| 350 | irqd_irq_masked(&desc->irq_data) && !desc->threads_oneshot) | ||
| 351 | unmask_irq(desc); | ||
| 352 | } | ||
| 353 | |||
| 333 | /** | 354 | /** |
| 334 | * handle_level_irq - Level type irq handler | 355 | * handle_level_irq - Level type irq handler |
| 335 | * @irq: the interrupt number | 356 | * @irq: the interrupt number |
| @@ -362,8 +383,8 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc) | |||
| 362 | 383 | ||
| 363 | handle_irq_event(desc); | 384 | handle_irq_event(desc); |
| 364 | 385 | ||
| 365 | if (!irqd_irq_disabled(&desc->irq_data) && !(desc->istate & IRQS_ONESHOT)) | 386 | cond_unmask_irq(desc); |
| 366 | unmask_irq(desc); | 387 | |
| 367 | out_unlock: | 388 | out_unlock: |
| 368 | raw_spin_unlock(&desc->lock); | 389 | raw_spin_unlock(&desc->lock); |
| 369 | } | 390 | } |
| @@ -417,6 +438,9 @@ handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc) | |||
| 417 | preflow_handler(desc); | 438 | preflow_handler(desc); |
| 418 | handle_irq_event(desc); | 439 | handle_irq_event(desc); |
| 419 | 440 | ||
| 441 | if (desc->istate & IRQS_ONESHOT) | ||
| 442 | cond_unmask_irq(desc); | ||
| 443 | |||
| 420 | out_eoi: | 444 | out_eoi: |
| 421 | desc->irq_data.chip->irq_eoi(&desc->irq_data); | 445 | desc->irq_data.chip->irq_eoi(&desc->irq_data); |
| 422 | out_unlock: | 446 | out_unlock: |
| @@ -625,7 +649,7 @@ __irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, | |||
| 625 | irq_settings_set_noprobe(desc); | 649 | irq_settings_set_noprobe(desc); |
| 626 | irq_settings_set_norequest(desc); | 650 | irq_settings_set_norequest(desc); |
| 627 | irq_settings_set_nothread(desc); | 651 | irq_settings_set_nothread(desc); |
| 628 | irq_startup(desc); | 652 | irq_startup(desc, true); |
| 629 | } | 653 | } |
| 630 | out: | 654 | out: |
| 631 | irq_put_desc_busunlock(desc, flags); | 655 | irq_put_desc_busunlock(desc, flags); |
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index b7952316016a..40378ff877e7 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h | |||
| @@ -67,7 +67,7 @@ extern int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, | |||
| 67 | extern void __disable_irq(struct irq_desc *desc, unsigned int irq, bool susp); | 67 | extern void __disable_irq(struct irq_desc *desc, unsigned int irq, bool susp); |
| 68 | extern void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume); | 68 | extern void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume); |
| 69 | 69 | ||
| 70 | extern int irq_startup(struct irq_desc *desc); | 70 | extern int irq_startup(struct irq_desc *desc, bool resend); |
| 71 | extern void irq_shutdown(struct irq_desc *desc); | 71 | extern void irq_shutdown(struct irq_desc *desc); |
| 72 | extern void irq_enable(struct irq_desc *desc); | 72 | extern void irq_enable(struct irq_desc *desc); |
| 73 | extern void irq_disable(struct irq_desc *desc); | 73 | extern void irq_disable(struct irq_desc *desc); |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index a9a9dbe49fea..32313c084442 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -1027,7 +1027,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) | |||
| 1027 | desc->istate |= IRQS_ONESHOT; | 1027 | desc->istate |= IRQS_ONESHOT; |
| 1028 | 1028 | ||
| 1029 | if (irq_settings_can_autoenable(desc)) | 1029 | if (irq_settings_can_autoenable(desc)) |
| 1030 | irq_startup(desc); | 1030 | irq_startup(desc, true); |
| 1031 | else | 1031 | else |
| 1032 | /* Undo nested disables: */ | 1032 | /* Undo nested disables: */ |
| 1033 | desc->depth = 1; | 1033 | desc->depth = 1; |
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 29f5b65bee29..9788c0ec6f43 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
| @@ -1673,8 +1673,12 @@ static int __kprobes pre_handler_kretprobe(struct kprobe *p, | |||
| 1673 | ri->rp = rp; | 1673 | ri->rp = rp; |
| 1674 | ri->task = current; | 1674 | ri->task = current; |
| 1675 | 1675 | ||
| 1676 | if (rp->entry_handler && rp->entry_handler(ri, regs)) | 1676 | if (rp->entry_handler && rp->entry_handler(ri, regs)) { |
| 1677 | raw_spin_lock_irqsave(&rp->lock, flags); | ||
| 1678 | hlist_add_head(&ri->hlist, &rp->free_instances); | ||
| 1679 | raw_spin_unlock_irqrestore(&rp->lock, flags); | ||
| 1677 | return 0; | 1680 | return 0; |
| 1681 | } | ||
| 1678 | 1682 | ||
| 1679 | arch_prepare_kretprobe(ri, regs); | 1683 | arch_prepare_kretprobe(ri, regs); |
| 1680 | 1684 | ||
diff --git a/kernel/params.c b/kernel/params.c index 32ee04308285..4bc965d8a1fe 100644 --- a/kernel/params.c +++ b/kernel/params.c | |||
| @@ -97,7 +97,8 @@ static int parse_one(char *param, | |||
| 97 | for (i = 0; i < num_params; i++) { | 97 | for (i = 0; i < num_params; i++) { |
| 98 | if (parameq(param, params[i].name)) { | 98 | if (parameq(param, params[i].name)) { |
| 99 | /* No one handled NULL, so do it here. */ | 99 | /* No one handled NULL, so do it here. */ |
| 100 | if (!val && params[i].ops->set != param_set_bool) | 100 | if (!val && params[i].ops->set != param_set_bool |
| 101 | && params[i].ops->set != param_set_bint) | ||
| 101 | return -EINVAL; | 102 | return -EINVAL; |
| 102 | pr_debug("They are equal! Calling %p\n", | 103 | pr_debug("They are equal! Calling %p\n", |
| 103 | params[i].ops->set); | 104 | params[i].ops->set); |
diff --git a/kernel/pid.c b/kernel/pid.c index ce8e00deaccb..9f08dfabaf13 100644 --- a/kernel/pid.c +++ b/kernel/pid.c | |||
| @@ -543,12 +543,12 @@ struct pid *find_ge_pid(int nr, struct pid_namespace *ns) | |||
| 543 | */ | 543 | */ |
| 544 | void __init pidhash_init(void) | 544 | void __init pidhash_init(void) |
| 545 | { | 545 | { |
| 546 | int i, pidhash_size; | 546 | unsigned int i, pidhash_size; |
| 547 | 547 | ||
| 548 | pid_hash = alloc_large_system_hash("PID", sizeof(*pid_hash), 0, 18, | 548 | pid_hash = alloc_large_system_hash("PID", sizeof(*pid_hash), 0, 18, |
| 549 | HASH_EARLY | HASH_SMALL, | 549 | HASH_EARLY | HASH_SMALL, |
| 550 | &pidhash_shift, NULL, 4096); | 550 | &pidhash_shift, NULL, 4096); |
| 551 | pidhash_size = 1 << pidhash_shift; | 551 | pidhash_size = 1U << pidhash_shift; |
| 552 | 552 | ||
| 553 | for (i = 0; i < pidhash_size; i++) | 553 | for (i = 0; i < pidhash_size; i++) |
| 554 | INIT_HLIST_HEAD(&pid_hash[i]); | 554 | INIT_HLIST_HEAD(&pid_hash[i]); |
diff --git a/kernel/power/power.h b/kernel/power/power.h index 0c4defe6d3b8..21724eee5206 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h | |||
| @@ -231,8 +231,28 @@ extern int pm_test_level; | |||
| 231 | #ifdef CONFIG_SUSPEND_FREEZER | 231 | #ifdef CONFIG_SUSPEND_FREEZER |
| 232 | static inline int suspend_freeze_processes(void) | 232 | static inline int suspend_freeze_processes(void) |
| 233 | { | 233 | { |
| 234 | int error = freeze_processes(); | 234 | int error; |
| 235 | return error ? : freeze_kernel_threads(); | 235 | |
| 236 | error = freeze_processes(); | ||
| 237 | |||
| 238 | /* | ||
| 239 | * freeze_processes() automatically thaws every task if freezing | ||
| 240 | * fails. So we need not do anything extra upon error. | ||
| 241 | */ | ||
| 242 | if (error) | ||
| 243 | goto Finish; | ||
| 244 | |||
| 245 | error = freeze_kernel_threads(); | ||
| 246 | |||
| 247 | /* | ||
| 248 | * freeze_kernel_threads() thaws only kernel threads upon freezing | ||
| 249 | * failure. So we have to thaw the userspace tasks ourselves. | ||
| 250 | */ | ||
| 251 | if (error) | ||
| 252 | thaw_processes(); | ||
| 253 | |||
| 254 | Finish: | ||
| 255 | return error; | ||
| 236 | } | 256 | } |
| 237 | 257 | ||
| 238 | static inline void suspend_thaw_processes(void) | 258 | static inline void suspend_thaw_processes(void) |
diff --git a/kernel/power/process.c b/kernel/power/process.c index eeca00311f39..7e426459e60a 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c | |||
| @@ -143,7 +143,10 @@ int freeze_processes(void) | |||
| 143 | /** | 143 | /** |
| 144 | * freeze_kernel_threads - Make freezable kernel threads go to the refrigerator. | 144 | * freeze_kernel_threads - Make freezable kernel threads go to the refrigerator. |
| 145 | * | 145 | * |
| 146 | * On success, returns 0. On failure, -errno and system is fully thawed. | 146 | * On success, returns 0. On failure, -errno and only the kernel threads are |
| 147 | * thawed, so as to give a chance to the caller to do additional cleanups | ||
| 148 | * (if any) before thawing the userspace tasks. So, it is the responsibility | ||
| 149 | * of the caller to thaw the userspace tasks, when the time is right. | ||
| 147 | */ | 150 | */ |
| 148 | int freeze_kernel_threads(void) | 151 | int freeze_kernel_threads(void) |
| 149 | { | 152 | { |
| @@ -159,7 +162,7 @@ int freeze_kernel_threads(void) | |||
| 159 | BUG_ON(in_atomic()); | 162 | BUG_ON(in_atomic()); |
| 160 | 163 | ||
| 161 | if (error) | 164 | if (error) |
| 162 | thaw_processes(); | 165 | thaw_kernel_threads(); |
| 163 | return error; | 166 | return error; |
| 164 | } | 167 | } |
| 165 | 168 | ||
diff --git a/kernel/power/user.c b/kernel/power/user.c index e5a21a857302..3e100075b13c 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c | |||
| @@ -249,13 +249,15 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, | |||
| 249 | } | 249 | } |
| 250 | pm_restore_gfp_mask(); | 250 | pm_restore_gfp_mask(); |
| 251 | error = hibernation_snapshot(data->platform_support); | 251 | error = hibernation_snapshot(data->platform_support); |
| 252 | if (!error) { | 252 | if (error) { |
| 253 | thaw_kernel_threads(); | ||
| 254 | } else { | ||
| 253 | error = put_user(in_suspend, (int __user *)arg); | 255 | error = put_user(in_suspend, (int __user *)arg); |
| 254 | if (!error && !freezer_test_done) | 256 | if (!error && !freezer_test_done) |
| 255 | data->ready = 1; | 257 | data->ready = 1; |
| 256 | if (freezer_test_done) { | 258 | if (freezer_test_done) { |
| 257 | freezer_test_done = false; | 259 | freezer_test_done = false; |
| 258 | thaw_processes(); | 260 | thaw_kernel_threads(); |
| 259 | } | 261 | } |
| 260 | } | 262 | } |
| 261 | break; | 263 | break; |
diff --git a/kernel/relay.c b/kernel/relay.c index 4335e1d7ee2d..ab56a1764d4d 100644 --- a/kernel/relay.c +++ b/kernel/relay.c | |||
| @@ -164,10 +164,14 @@ depopulate: | |||
| 164 | */ | 164 | */ |
| 165 | static struct rchan_buf *relay_create_buf(struct rchan *chan) | 165 | static struct rchan_buf *relay_create_buf(struct rchan *chan) |
| 166 | { | 166 | { |
| 167 | struct rchan_buf *buf = kzalloc(sizeof(struct rchan_buf), GFP_KERNEL); | 167 | struct rchan_buf *buf; |
| 168 | if (!buf) | 168 | |
| 169 | if (chan->n_subbufs > UINT_MAX / sizeof(size_t *)) | ||
| 169 | return NULL; | 170 | return NULL; |
| 170 | 171 | ||
| 172 | buf = kzalloc(sizeof(struct rchan_buf), GFP_KERNEL); | ||
| 173 | if (!buf) | ||
| 174 | return NULL; | ||
| 171 | buf->padding = kmalloc(chan->n_subbufs * sizeof(size_t *), GFP_KERNEL); | 175 | buf->padding = kmalloc(chan->n_subbufs * sizeof(size_t *), GFP_KERNEL); |
| 172 | if (!buf->padding) | 176 | if (!buf->padding) |
| 173 | goto free_buf; | 177 | goto free_buf; |
| @@ -574,6 +578,8 @@ struct rchan *relay_open(const char *base_filename, | |||
| 574 | 578 | ||
| 575 | if (!(subbuf_size && n_subbufs)) | 579 | if (!(subbuf_size && n_subbufs)) |
| 576 | return NULL; | 580 | return NULL; |
| 581 | if (subbuf_size > UINT_MAX / n_subbufs) | ||
| 582 | return NULL; | ||
| 577 | 583 | ||
| 578 | chan = kzalloc(sizeof(struct rchan), GFP_KERNEL); | 584 | chan = kzalloc(sizeof(struct rchan), GFP_KERNEL); |
| 579 | if (!chan) | 585 | if (!chan) |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 5255c9d2e053..33a0676ea744 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
| @@ -1932,7 +1932,6 @@ static void finish_task_switch(struct rq *rq, struct task_struct *prev) | |||
| 1932 | local_irq_enable(); | 1932 | local_irq_enable(); |
| 1933 | #endif /* __ARCH_WANT_INTERRUPTS_ON_CTXSW */ | 1933 | #endif /* __ARCH_WANT_INTERRUPTS_ON_CTXSW */ |
| 1934 | finish_lock_switch(rq, prev); | 1934 | finish_lock_switch(rq, prev); |
| 1935 | trace_sched_stat_sleeptime(current, rq->clock); | ||
| 1936 | 1935 | ||
| 1937 | fire_sched_in_preempt_notifiers(current); | 1936 | fire_sched_in_preempt_notifiers(current); |
| 1938 | if (mm) | 1937 | if (mm) |
| @@ -6729,7 +6728,7 @@ int __init sched_create_sysfs_power_savings_entries(struct device *dev) | |||
| 6729 | static int cpuset_cpu_active(struct notifier_block *nfb, unsigned long action, | 6728 | static int cpuset_cpu_active(struct notifier_block *nfb, unsigned long action, |
| 6730 | void *hcpu) | 6729 | void *hcpu) |
| 6731 | { | 6730 | { |
| 6732 | switch (action & ~CPU_TASKS_FROZEN) { | 6731 | switch (action) { |
| 6733 | case CPU_ONLINE: | 6732 | case CPU_ONLINE: |
| 6734 | case CPU_DOWN_FAILED: | 6733 | case CPU_DOWN_FAILED: |
| 6735 | cpuset_update_active_cpus(); | 6734 | cpuset_update_active_cpus(); |
| @@ -6742,7 +6741,7 @@ static int cpuset_cpu_active(struct notifier_block *nfb, unsigned long action, | |||
| 6742 | static int cpuset_cpu_inactive(struct notifier_block *nfb, unsigned long action, | 6741 | static int cpuset_cpu_inactive(struct notifier_block *nfb, unsigned long action, |
| 6743 | void *hcpu) | 6742 | void *hcpu) |
| 6744 | { | 6743 | { |
| 6745 | switch (action & ~CPU_TASKS_FROZEN) { | 6744 | switch (action) { |
| 6746 | case CPU_DOWN_PREPARE: | 6745 | case CPU_DOWN_PREPARE: |
| 6747 | cpuset_update_active_cpus(); | 6746 | cpuset_update_active_cpus(); |
| 6748 | return NOTIFY_OK; | 6747 | return NOTIFY_OK; |
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 7c6414fc669d..aca16b843b7e 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
| @@ -1003,6 +1003,7 @@ static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
| 1003 | if (unlikely(delta > se->statistics.sleep_max)) | 1003 | if (unlikely(delta > se->statistics.sleep_max)) |
| 1004 | se->statistics.sleep_max = delta; | 1004 | se->statistics.sleep_max = delta; |
| 1005 | 1005 | ||
| 1006 | se->statistics.sleep_start = 0; | ||
| 1006 | se->statistics.sum_sleep_runtime += delta; | 1007 | se->statistics.sum_sleep_runtime += delta; |
| 1007 | 1008 | ||
| 1008 | if (tsk) { | 1009 | if (tsk) { |
| @@ -1019,6 +1020,7 @@ static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
| 1019 | if (unlikely(delta > se->statistics.block_max)) | 1020 | if (unlikely(delta > se->statistics.block_max)) |
| 1020 | se->statistics.block_max = delta; | 1021 | se->statistics.block_max = delta; |
| 1021 | 1022 | ||
| 1023 | se->statistics.block_start = 0; | ||
| 1022 | se->statistics.sum_sleep_runtime += delta; | 1024 | se->statistics.sum_sleep_runtime += delta; |
| 1023 | 1025 | ||
| 1024 | if (tsk) { | 1026 | if (tsk) { |
