diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/compat.c | 63 | ||||
| -rw-r--r-- | kernel/cred.c | 2 | ||||
| -rw-r--r-- | kernel/events/core.c | 2 | ||||
| -rw-r--r-- | kernel/fork.c | 3 | ||||
| -rw-r--r-- | kernel/irq/Kconfig | 2 | ||||
| -rw-r--r-- | kernel/irq/chip.c | 1 | ||||
| -rw-r--r-- | kernel/irq/debug.h | 38 | ||||
| -rw-r--r-- | kernel/irq/irqdesc.c | 1 | ||||
| -rw-r--r-- | kernel/irq/irqdomain.c | 47 | ||||
| -rw-r--r-- | kernel/irq_work.c | 1 | ||||
| -rw-r--r-- | kernel/itimer.c | 8 | ||||
| -rw-r--r-- | kernel/panic.c | 2 | ||||
| -rw-r--r-- | kernel/power/swap.c | 28 | ||||
| -rw-r--r-- | kernel/rcutree.c | 1 | ||||
| -rw-r--r-- | kernel/sched/core.c | 24 | ||||
| -rw-r--r-- | kernel/sched/fair.c | 18 | ||||
| -rw-r--r-- | kernel/sched/features.h | 1 | ||||
| -rw-r--r-- | kernel/time/Kconfig | 4 | ||||
| -rw-r--r-- | kernel/time/tick-broadcast.c | 11 | ||||
| -rw-r--r-- | kernel/time/tick-sched.c | 4 | ||||
| -rw-r--r-- | kernel/trace/trace.c | 8 | ||||
| -rw-r--r-- | kernel/trace/trace.h | 4 | ||||
| -rw-r--r-- | kernel/trace/trace_events.c | 5 | ||||
| -rw-r--r-- | kernel/trace/trace_export.c | 1 | ||||
| -rw-r--r-- | kernel/trace/trace_output.c | 5 |
25 files changed, 179 insertions, 105 deletions
diff --git a/kernel/compat.c b/kernel/compat.c index 74ff8498809a..d2c67aa49ae6 100644 --- a/kernel/compat.c +++ b/kernel/compat.c | |||
| @@ -372,25 +372,54 @@ asmlinkage long compat_sys_sigpending(compat_old_sigset_t __user *set) | |||
| 372 | 372 | ||
| 373 | #ifdef __ARCH_WANT_SYS_SIGPROCMASK | 373 | #ifdef __ARCH_WANT_SYS_SIGPROCMASK |
| 374 | 374 | ||
| 375 | asmlinkage long compat_sys_sigprocmask(int how, compat_old_sigset_t __user *set, | 375 | /* |
| 376 | compat_old_sigset_t __user *oset) | 376 | * sys_sigprocmask SIG_SETMASK sets the first (compat) word of the |
| 377 | * blocked set of signals to the supplied signal set | ||
| 378 | */ | ||
| 379 | static inline void compat_sig_setmask(sigset_t *blocked, compat_sigset_word set) | ||
| 377 | { | 380 | { |
| 378 | old_sigset_t s; | 381 | memcpy(blocked->sig, &set, sizeof(set)); |
| 379 | long ret; | 382 | } |
| 380 | mm_segment_t old_fs; | ||
| 381 | 383 | ||
| 382 | if (set && get_user(s, set)) | 384 | asmlinkage long compat_sys_sigprocmask(int how, |
| 383 | return -EFAULT; | 385 | compat_old_sigset_t __user *nset, |
| 384 | old_fs = get_fs(); | 386 | compat_old_sigset_t __user *oset) |
| 385 | set_fs(KERNEL_DS); | 387 | { |
| 386 | ret = sys_sigprocmask(how, | 388 | old_sigset_t old_set, new_set; |
| 387 | set ? (old_sigset_t __user *) &s : NULL, | 389 | sigset_t new_blocked; |
| 388 | oset ? (old_sigset_t __user *) &s : NULL); | 390 | |
| 389 | set_fs(old_fs); | 391 | old_set = current->blocked.sig[0]; |
| 390 | if (ret == 0) | 392 | |
| 391 | if (oset) | 393 | if (nset) { |
| 392 | ret = put_user(s, oset); | 394 | if (get_user(new_set, nset)) |
| 393 | return ret; | 395 | return -EFAULT; |
| 396 | new_set &= ~(sigmask(SIGKILL) | sigmask(SIGSTOP)); | ||
| 397 | |||
| 398 | new_blocked = current->blocked; | ||
| 399 | |||
| 400 | switch (how) { | ||
| 401 | case SIG_BLOCK: | ||
| 402 | sigaddsetmask(&new_blocked, new_set); | ||
| 403 | break; | ||
| 404 | case SIG_UNBLOCK: | ||
| 405 | sigdelsetmask(&new_blocked, new_set); | ||
| 406 | break; | ||
| 407 | case SIG_SETMASK: | ||
| 408 | compat_sig_setmask(&new_blocked, new_set); | ||
| 409 | break; | ||
| 410 | default: | ||
| 411 | return -EINVAL; | ||
| 412 | } | ||
| 413 | |||
| 414 | set_current_blocked(&new_blocked); | ||
| 415 | } | ||
| 416 | |||
| 417 | if (oset) { | ||
| 418 | if (put_user(old_set, oset)) | ||
| 419 | return -EFAULT; | ||
| 420 | } | ||
| 421 | |||
| 422 | return 0; | ||
| 394 | } | 423 | } |
| 395 | 424 | ||
| 396 | #endif | 425 | #endif |
diff --git a/kernel/cred.c b/kernel/cred.c index 97b36eeca4c9..e70683d9ec32 100644 --- a/kernel/cred.c +++ b/kernel/cred.c | |||
| @@ -386,6 +386,8 @@ int copy_creds(struct task_struct *p, unsigned long clone_flags) | |||
| 386 | struct cred *new; | 386 | struct cred *new; |
| 387 | int ret; | 387 | int ret; |
| 388 | 388 | ||
| 389 | p->replacement_session_keyring = NULL; | ||
| 390 | |||
| 389 | if ( | 391 | if ( |
| 390 | #ifdef CONFIG_KEYS | 392 | #ifdef CONFIG_KEYS |
| 391 | !p->cred->thread_keyring && | 393 | !p->cred->thread_keyring && |
diff --git a/kernel/events/core.c b/kernel/events/core.c index a6a9ec4cd8f5..fd126f82b57c 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -3183,7 +3183,7 @@ static void perf_event_for_each(struct perf_event *event, | |||
| 3183 | perf_event_for_each_child(event, func); | 3183 | perf_event_for_each_child(event, func); |
| 3184 | func(event); | 3184 | func(event); |
| 3185 | list_for_each_entry(sibling, &event->sibling_list, group_entry) | 3185 | list_for_each_entry(sibling, &event->sibling_list, group_entry) |
| 3186 | perf_event_for_each_child(event, func); | 3186 | perf_event_for_each_child(sibling, func); |
| 3187 | mutex_unlock(&ctx->mutex); | 3187 | mutex_unlock(&ctx->mutex); |
| 3188 | } | 3188 | } |
| 3189 | 3189 | ||
diff --git a/kernel/fork.c b/kernel/fork.c index b9372a0bff18..687a15d56243 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -47,6 +47,7 @@ | |||
| 47 | #include <linux/audit.h> | 47 | #include <linux/audit.h> |
| 48 | #include <linux/memcontrol.h> | 48 | #include <linux/memcontrol.h> |
| 49 | #include <linux/ftrace.h> | 49 | #include <linux/ftrace.h> |
| 50 | #include <linux/proc_fs.h> | ||
| 50 | #include <linux/profile.h> | 51 | #include <linux/profile.h> |
| 51 | #include <linux/rmap.h> | 52 | #include <linux/rmap.h> |
| 52 | #include <linux/ksm.h> | 53 | #include <linux/ksm.h> |
| @@ -1464,6 +1465,8 @@ bad_fork_cleanup_io: | |||
| 1464 | if (p->io_context) | 1465 | if (p->io_context) |
| 1465 | exit_io_context(p); | 1466 | exit_io_context(p); |
| 1466 | bad_fork_cleanup_namespaces: | 1467 | bad_fork_cleanup_namespaces: |
| 1468 | if (unlikely(clone_flags & CLONE_NEWPID)) | ||
| 1469 | pid_ns_release_proc(p->nsproxy->pid_ns); | ||
| 1467 | exit_task_namespaces(p); | 1470 | exit_task_namespaces(p); |
| 1468 | bad_fork_cleanup_mm: | 1471 | bad_fork_cleanup_mm: |
| 1469 | if (p->mm) | 1472 | if (p->mm) |
diff --git a/kernel/irq/Kconfig b/kernel/irq/Kconfig index cf1a4a68ce44..d1a758bc972a 100644 --- a/kernel/irq/Kconfig +++ b/kernel/irq/Kconfig | |||
| @@ -62,7 +62,7 @@ config IRQ_DOMAIN_DEBUG | |||
| 62 | help | 62 | help |
| 63 | This option will show the mapping relationship between hardware irq | 63 | This option will show the mapping relationship between hardware irq |
| 64 | numbers and Linux irq numbers. The mapping is exposed via debugfs | 64 | numbers and Linux irq numbers. The mapping is exposed via debugfs |
| 65 | in the file "virq_mapping". | 65 | in the file "irq_domain_mapping". |
| 66 | 66 | ||
| 67 | If you don't know what this means you don't need it. | 67 | If you don't know what this means you don't need it. |
| 68 | 68 | ||
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 6080f6bc8c33..3914c1e03cff 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
| @@ -518,6 +518,7 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) | |||
| 518 | out_unlock: | 518 | out_unlock: |
| 519 | raw_spin_unlock(&desc->lock); | 519 | raw_spin_unlock(&desc->lock); |
| 520 | } | 520 | } |
| 521 | EXPORT_SYMBOL(handle_edge_irq); | ||
| 521 | 522 | ||
| 522 | #ifdef CONFIG_IRQ_EDGE_EOI_HANDLER | 523 | #ifdef CONFIG_IRQ_EDGE_EOI_HANDLER |
| 523 | /** | 524 | /** |
diff --git a/kernel/irq/debug.h b/kernel/irq/debug.h index 97a8bfadc88a..e75e29e4434a 100644 --- a/kernel/irq/debug.h +++ b/kernel/irq/debug.h | |||
| @@ -4,10 +4,10 @@ | |||
| 4 | 4 | ||
| 5 | #include <linux/kallsyms.h> | 5 | #include <linux/kallsyms.h> |
| 6 | 6 | ||
| 7 | #define P(f) if (desc->status_use_accessors & f) printk("%14s set\n", #f) | 7 | #define ___P(f) if (desc->status_use_accessors & f) printk("%14s set\n", #f) |
| 8 | #define PS(f) if (desc->istate & f) printk("%14s set\n", #f) | 8 | #define ___PS(f) if (desc->istate & f) printk("%14s set\n", #f) |
| 9 | /* FIXME */ | 9 | /* FIXME */ |
| 10 | #define PD(f) do { } while (0) | 10 | #define ___PD(f) do { } while (0) |
| 11 | 11 | ||
| 12 | static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc) | 12 | static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc) |
| 13 | { | 13 | { |
| @@ -23,23 +23,23 @@ static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc) | |||
| 23 | print_symbol("%s\n", (unsigned long)desc->action->handler); | 23 | print_symbol("%s\n", (unsigned long)desc->action->handler); |
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | P(IRQ_LEVEL); | 26 | ___P(IRQ_LEVEL); |
| 27 | P(IRQ_PER_CPU); | 27 | ___P(IRQ_PER_CPU); |
| 28 | P(IRQ_NOPROBE); | 28 | ___P(IRQ_NOPROBE); |
| 29 | P(IRQ_NOREQUEST); | 29 | ___P(IRQ_NOREQUEST); |
| 30 | P(IRQ_NOTHREAD); | 30 | ___P(IRQ_NOTHREAD); |
| 31 | P(IRQ_NOAUTOEN); | 31 | ___P(IRQ_NOAUTOEN); |
| 32 | 32 | ||
| 33 | PS(IRQS_AUTODETECT); | 33 | ___PS(IRQS_AUTODETECT); |
| 34 | PS(IRQS_REPLAY); | 34 | ___PS(IRQS_REPLAY); |
| 35 | PS(IRQS_WAITING); | 35 | ___PS(IRQS_WAITING); |
| 36 | PS(IRQS_PENDING); | 36 | ___PS(IRQS_PENDING); |
| 37 | 37 | ||
| 38 | PD(IRQS_INPROGRESS); | 38 | ___PD(IRQS_INPROGRESS); |
| 39 | PD(IRQS_DISABLED); | 39 | ___PD(IRQS_DISABLED); |
| 40 | PD(IRQS_MASKED); | 40 | ___PD(IRQS_MASKED); |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | #undef P | 43 | #undef ___P |
| 44 | #undef PS | 44 | #undef ___PS |
| 45 | #undef PD | 45 | #undef ___PD |
diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index d86e254b95eb..192a302d6cfd 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c | |||
| @@ -112,6 +112,7 @@ struct irq_desc *irq_to_desc(unsigned int irq) | |||
| 112 | { | 112 | { |
| 113 | return radix_tree_lookup(&irq_desc_tree, irq); | 113 | return radix_tree_lookup(&irq_desc_tree, irq); |
| 114 | } | 114 | } |
| 115 | EXPORT_SYMBOL(irq_to_desc); | ||
| 115 | 116 | ||
| 116 | static void delete_irq_desc(unsigned int irq) | 117 | static void delete_irq_desc(unsigned int irq) |
| 117 | { | 118 | { |
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index 3601f3fbf67c..0e0ba5f840b2 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c | |||
| @@ -23,7 +23,6 @@ static LIST_HEAD(irq_domain_list); | |||
| 23 | static DEFINE_MUTEX(irq_domain_mutex); | 23 | static DEFINE_MUTEX(irq_domain_mutex); |
| 24 | 24 | ||
| 25 | static DEFINE_MUTEX(revmap_trees_mutex); | 25 | static DEFINE_MUTEX(revmap_trees_mutex); |
| 26 | static unsigned int irq_virq_count = NR_IRQS; | ||
| 27 | static struct irq_domain *irq_default_domain; | 26 | static struct irq_domain *irq_default_domain; |
| 28 | 27 | ||
| 29 | /** | 28 | /** |
| @@ -184,13 +183,16 @@ struct irq_domain *irq_domain_add_linear(struct device_node *of_node, | |||
| 184 | } | 183 | } |
| 185 | 184 | ||
| 186 | struct irq_domain *irq_domain_add_nomap(struct device_node *of_node, | 185 | struct irq_domain *irq_domain_add_nomap(struct device_node *of_node, |
| 186 | unsigned int max_irq, | ||
| 187 | const struct irq_domain_ops *ops, | 187 | const struct irq_domain_ops *ops, |
| 188 | void *host_data) | 188 | void *host_data) |
| 189 | { | 189 | { |
| 190 | struct irq_domain *domain = irq_domain_alloc(of_node, | 190 | struct irq_domain *domain = irq_domain_alloc(of_node, |
| 191 | IRQ_DOMAIN_MAP_NOMAP, ops, host_data); | 191 | IRQ_DOMAIN_MAP_NOMAP, ops, host_data); |
| 192 | if (domain) | 192 | if (domain) { |
| 193 | domain->revmap_data.nomap.max_irq = max_irq ? max_irq : ~0; | ||
| 193 | irq_domain_add(domain); | 194 | irq_domain_add(domain); |
| 195 | } | ||
| 194 | return domain; | 196 | return domain; |
| 195 | } | 197 | } |
| 196 | 198 | ||
| @@ -262,22 +264,6 @@ void irq_set_default_host(struct irq_domain *domain) | |||
| 262 | irq_default_domain = domain; | 264 | irq_default_domain = domain; |
| 263 | } | 265 | } |
| 264 | 266 | ||
| 265 | /** | ||
| 266 | * irq_set_virq_count() - Set the maximum number of linux irqs | ||
| 267 | * @count: number of linux irqs, capped with NR_IRQS | ||
| 268 | * | ||
| 269 | * This is mainly for use by platforms like iSeries who want to program | ||
| 270 | * the virtual irq number in the controller to avoid the reverse mapping | ||
| 271 | */ | ||
| 272 | void irq_set_virq_count(unsigned int count) | ||
| 273 | { | ||
| 274 | pr_debug("irq: Trying to set virq count to %d\n", count); | ||
| 275 | |||
| 276 | BUG_ON(count < NUM_ISA_INTERRUPTS); | ||
| 277 | if (count < NR_IRQS) | ||
| 278 | irq_virq_count = count; | ||
| 279 | } | ||
| 280 | |||
| 281 | static int irq_setup_virq(struct irq_domain *domain, unsigned int virq, | 267 | static int irq_setup_virq(struct irq_domain *domain, unsigned int virq, |
| 282 | irq_hw_number_t hwirq) | 268 | irq_hw_number_t hwirq) |
| 283 | { | 269 | { |
| @@ -320,13 +306,12 @@ unsigned int irq_create_direct_mapping(struct irq_domain *domain) | |||
| 320 | pr_debug("irq: create_direct virq allocation failed\n"); | 306 | pr_debug("irq: create_direct virq allocation failed\n"); |
| 321 | return 0; | 307 | return 0; |
| 322 | } | 308 | } |
| 323 | if (virq >= irq_virq_count) { | 309 | if (virq >= domain->revmap_data.nomap.max_irq) { |
| 324 | pr_err("ERROR: no free irqs available below %i maximum\n", | 310 | pr_err("ERROR: no free irqs available below %i maximum\n", |
| 325 | irq_virq_count); | 311 | domain->revmap_data.nomap.max_irq); |
| 326 | irq_free_desc(virq); | 312 | irq_free_desc(virq); |
| 327 | return 0; | 313 | return 0; |
| 328 | } | 314 | } |
| 329 | |||
| 330 | pr_debug("irq: create_direct obtained virq %d\n", virq); | 315 | pr_debug("irq: create_direct obtained virq %d\n", virq); |
| 331 | 316 | ||
| 332 | if (irq_setup_virq(domain, virq, virq)) { | 317 | if (irq_setup_virq(domain, virq, virq)) { |
| @@ -350,7 +335,8 @@ unsigned int irq_create_direct_mapping(struct irq_domain *domain) | |||
| 350 | unsigned int irq_create_mapping(struct irq_domain *domain, | 335 | unsigned int irq_create_mapping(struct irq_domain *domain, |
| 351 | irq_hw_number_t hwirq) | 336 | irq_hw_number_t hwirq) |
| 352 | { | 337 | { |
| 353 | unsigned int virq, hint; | 338 | unsigned int hint; |
| 339 | int virq; | ||
| 354 | 340 | ||
| 355 | pr_debug("irq: irq_create_mapping(0x%p, 0x%lx)\n", domain, hwirq); | 341 | pr_debug("irq: irq_create_mapping(0x%p, 0x%lx)\n", domain, hwirq); |
| 356 | 342 | ||
| @@ -377,13 +363,13 @@ unsigned int irq_create_mapping(struct irq_domain *domain, | |||
| 377 | return irq_domain_legacy_revmap(domain, hwirq); | 363 | return irq_domain_legacy_revmap(domain, hwirq); |
| 378 | 364 | ||
| 379 | /* Allocate a virtual interrupt number */ | 365 | /* Allocate a virtual interrupt number */ |
| 380 | hint = hwirq % irq_virq_count; | 366 | hint = hwirq % nr_irqs; |
| 381 | if (hint == 0) | 367 | if (hint == 0) |
| 382 | hint++; | 368 | hint++; |
| 383 | virq = irq_alloc_desc_from(hint, 0); | 369 | virq = irq_alloc_desc_from(hint, 0); |
| 384 | if (!virq) | 370 | if (virq <= 0) |
| 385 | virq = irq_alloc_desc_from(1, 0); | 371 | virq = irq_alloc_desc_from(1, 0); |
| 386 | if (!virq) { | 372 | if (virq <= 0) { |
| 387 | pr_debug("irq: -> virq allocation failed\n"); | 373 | pr_debug("irq: -> virq allocation failed\n"); |
| 388 | return 0; | 374 | return 0; |
| 389 | } | 375 | } |
| @@ -515,7 +501,7 @@ unsigned int irq_find_mapping(struct irq_domain *domain, | |||
| 515 | irq_hw_number_t hwirq) | 501 | irq_hw_number_t hwirq) |
| 516 | { | 502 | { |
| 517 | unsigned int i; | 503 | unsigned int i; |
| 518 | unsigned int hint = hwirq % irq_virq_count; | 504 | unsigned int hint = hwirq % nr_irqs; |
| 519 | 505 | ||
| 520 | /* Look for default domain if nececssary */ | 506 | /* Look for default domain if nececssary */ |
| 521 | if (domain == NULL) | 507 | if (domain == NULL) |
| @@ -536,7 +522,7 @@ unsigned int irq_find_mapping(struct irq_domain *domain, | |||
| 536 | if (data && (data->domain == domain) && (data->hwirq == hwirq)) | 522 | if (data && (data->domain == domain) && (data->hwirq == hwirq)) |
| 537 | return i; | 523 | return i; |
| 538 | i++; | 524 | i++; |
| 539 | if (i >= irq_virq_count) | 525 | if (i >= nr_irqs) |
| 540 | i = 1; | 526 | i = 1; |
| 541 | } while(i != hint); | 527 | } while(i != hint); |
| 542 | return 0; | 528 | return 0; |
| @@ -642,8 +628,9 @@ static int virq_debug_show(struct seq_file *m, void *private) | |||
| 642 | void *data; | 628 | void *data; |
| 643 | int i; | 629 | int i; |
| 644 | 630 | ||
| 645 | seq_printf(m, "%-5s %-7s %-15s %-18s %s\n", "virq", "hwirq", | 631 | seq_printf(m, "%-5s %-7s %-15s %-*s %s\n", "irq", "hwirq", |
| 646 | "chip name", "chip data", "domain name"); | 632 | "chip name", (int)(2 * sizeof(void *) + 2), "chip data", |
| 633 | "domain name"); | ||
| 647 | 634 | ||
| 648 | for (i = 1; i < nr_irqs; i++) { | 635 | for (i = 1; i < nr_irqs; i++) { |
| 649 | desc = irq_to_desc(i); | 636 | desc = irq_to_desc(i); |
| @@ -666,7 +653,7 @@ static int virq_debug_show(struct seq_file *m, void *private) | |||
| 666 | seq_printf(m, "%-15s ", p); | 653 | seq_printf(m, "%-15s ", p); |
| 667 | 654 | ||
| 668 | data = irq_desc_get_chip_data(desc); | 655 | data = irq_desc_get_chip_data(desc); |
| 669 | seq_printf(m, "0x%16p ", data); | 656 | seq_printf(m, data ? "0x%p " : " %p ", data); |
| 670 | 657 | ||
| 671 | if (desc->irq_data.domain && desc->irq_data.domain->of_node) | 658 | if (desc->irq_data.domain && desc->irq_data.domain->of_node) |
| 672 | p = desc->irq_data.domain->of_node->full_name; | 659 | p = desc->irq_data.domain->of_node->full_name; |
diff --git a/kernel/irq_work.c b/kernel/irq_work.c index 0c56d44b9fd5..1588e3b2871b 100644 --- a/kernel/irq_work.c +++ b/kernel/irq_work.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <linux/irq_work.h> | 11 | #include <linux/irq_work.h> |
| 12 | #include <linux/percpu.h> | 12 | #include <linux/percpu.h> |
| 13 | #include <linux/hardirq.h> | 13 | #include <linux/hardirq.h> |
| 14 | #include <linux/irqflags.h> | ||
| 14 | #include <asm/processor.h> | 15 | #include <asm/processor.h> |
| 15 | 16 | ||
| 16 | /* | 17 | /* |
diff --git a/kernel/itimer.c b/kernel/itimer.c index 22000c3db0dd..8d262b467573 100644 --- a/kernel/itimer.c +++ b/kernel/itimer.c | |||
| @@ -284,8 +284,12 @@ SYSCALL_DEFINE3(setitimer, int, which, struct itimerval __user *, value, | |||
| 284 | if (value) { | 284 | if (value) { |
| 285 | if(copy_from_user(&set_buffer, value, sizeof(set_buffer))) | 285 | if(copy_from_user(&set_buffer, value, sizeof(set_buffer))) |
| 286 | return -EFAULT; | 286 | return -EFAULT; |
| 287 | } else | 287 | } else { |
| 288 | memset((char *) &set_buffer, 0, sizeof(set_buffer)); | 288 | memset(&set_buffer, 0, sizeof(set_buffer)); |
| 289 | printk_once(KERN_WARNING "%s calls setitimer() with new_value NULL pointer." | ||
| 290 | " Misfeature support will be removed\n", | ||
| 291 | current->comm); | ||
| 292 | } | ||
| 289 | 293 | ||
| 290 | error = do_setitimer(which, &set_buffer, ovalue ? &get_buffer : NULL); | 294 | error = do_setitimer(which, &set_buffer, ovalue ? &get_buffer : NULL); |
| 291 | if (error || !ovalue) | 295 | if (error || !ovalue) |
diff --git a/kernel/panic.c b/kernel/panic.c index 80aed44e345a..8ed89a175d79 100644 --- a/kernel/panic.c +++ b/kernel/panic.c | |||
| @@ -97,7 +97,7 @@ void panic(const char *fmt, ...) | |||
| 97 | /* | 97 | /* |
| 98 | * Avoid nested stack-dumping if a panic occurs during oops processing | 98 | * Avoid nested stack-dumping if a panic occurs during oops processing |
| 99 | */ | 99 | */ |
| 100 | if (!oops_in_progress) | 100 | if (!test_taint(TAINT_DIE) && oops_in_progress <= 1) |
| 101 | dump_stack(); | 101 | dump_stack(); |
| 102 | #endif | 102 | #endif |
| 103 | 103 | ||
diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 8742fd013a94..eef311a58a64 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c | |||
| @@ -51,6 +51,23 @@ | |||
| 51 | 51 | ||
| 52 | #define MAP_PAGE_ENTRIES (PAGE_SIZE / sizeof(sector_t) - 1) | 52 | #define MAP_PAGE_ENTRIES (PAGE_SIZE / sizeof(sector_t) - 1) |
| 53 | 53 | ||
| 54 | /* | ||
| 55 | * Number of free pages that are not high. | ||
| 56 | */ | ||
| 57 | static inline unsigned long low_free_pages(void) | ||
| 58 | { | ||
| 59 | return nr_free_pages() - nr_free_highpages(); | ||
| 60 | } | ||
| 61 | |||
| 62 | /* | ||
| 63 | * Number of pages required to be kept free while writing the image. Always | ||
| 64 | * half of all available low pages before the writing starts. | ||
| 65 | */ | ||
| 66 | static inline unsigned long reqd_free_pages(void) | ||
| 67 | { | ||
| 68 | return low_free_pages() / 2; | ||
| 69 | } | ||
| 70 | |||
| 54 | struct swap_map_page { | 71 | struct swap_map_page { |
| 55 | sector_t entries[MAP_PAGE_ENTRIES]; | 72 | sector_t entries[MAP_PAGE_ENTRIES]; |
| 56 | sector_t next_swap; | 73 | sector_t next_swap; |
| @@ -72,7 +89,7 @@ struct swap_map_handle { | |||
| 72 | sector_t cur_swap; | 89 | sector_t cur_swap; |
| 73 | sector_t first_sector; | 90 | sector_t first_sector; |
| 74 | unsigned int k; | 91 | unsigned int k; |
| 75 | unsigned long nr_free_pages, written; | 92 | unsigned long reqd_free_pages; |
| 76 | u32 crc32; | 93 | u32 crc32; |
| 77 | }; | 94 | }; |
| 78 | 95 | ||
| @@ -316,8 +333,7 @@ static int get_swap_writer(struct swap_map_handle *handle) | |||
| 316 | goto err_rel; | 333 | goto err_rel; |
| 317 | } | 334 | } |
| 318 | handle->k = 0; | 335 | handle->k = 0; |
| 319 | handle->nr_free_pages = nr_free_pages() >> 1; | 336 | handle->reqd_free_pages = reqd_free_pages(); |
| 320 | handle->written = 0; | ||
| 321 | handle->first_sector = handle->cur_swap; | 337 | handle->first_sector = handle->cur_swap; |
| 322 | return 0; | 338 | return 0; |
| 323 | err_rel: | 339 | err_rel: |
| @@ -352,11 +368,11 @@ static int swap_write_page(struct swap_map_handle *handle, void *buf, | |||
| 352 | handle->cur_swap = offset; | 368 | handle->cur_swap = offset; |
| 353 | handle->k = 0; | 369 | handle->k = 0; |
| 354 | } | 370 | } |
| 355 | if (bio_chain && ++handle->written > handle->nr_free_pages) { | 371 | if (bio_chain && low_free_pages() <= handle->reqd_free_pages) { |
| 356 | error = hib_wait_on_bio_chain(bio_chain); | 372 | error = hib_wait_on_bio_chain(bio_chain); |
| 357 | if (error) | 373 | if (error) |
| 358 | goto out; | 374 | goto out; |
| 359 | handle->written = 0; | 375 | handle->reqd_free_pages = reqd_free_pages(); |
| 360 | } | 376 | } |
| 361 | out: | 377 | out: |
| 362 | return error; | 378 | return error; |
| @@ -618,7 +634,7 @@ static int save_image_lzo(struct swap_map_handle *handle, | |||
| 618 | * Adjust number of free pages after all allocations have been done. | 634 | * Adjust number of free pages after all allocations have been done. |
| 619 | * We don't want to run out of pages when writing. | 635 | * We don't want to run out of pages when writing. |
| 620 | */ | 636 | */ |
| 621 | handle->nr_free_pages = nr_free_pages() >> 1; | 637 | handle->reqd_free_pages = reqd_free_pages(); |
| 622 | 638 | ||
| 623 | /* | 639 | /* |
| 624 | * Start the CRC32 thread. | 640 | * Start the CRC32 thread. |
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 1050d6d3922c..d0c5baf1ab18 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
| @@ -1820,7 +1820,6 @@ __call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu), | |||
| 1820 | * a quiescent state betweentimes. | 1820 | * a quiescent state betweentimes. |
| 1821 | */ | 1821 | */ |
| 1822 | local_irq_save(flags); | 1822 | local_irq_save(flags); |
| 1823 | WARN_ON_ONCE(cpu_is_offline(smp_processor_id())); | ||
| 1824 | rdp = this_cpu_ptr(rsp->rda); | 1823 | rdp = this_cpu_ptr(rsp->rda); |
| 1825 | 1824 | ||
| 1826 | /* Add the callback to our list. */ | 1825 | /* Add the callback to our list. */ |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 4603b9d8f30a..e5212ae294f6 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
| @@ -6382,6 +6382,8 @@ static int __sdt_alloc(const struct cpumask *cpu_map) | |||
| 6382 | if (!sg) | 6382 | if (!sg) |
| 6383 | return -ENOMEM; | 6383 | return -ENOMEM; |
| 6384 | 6384 | ||
| 6385 | sg->next = sg; | ||
| 6386 | |||
| 6385 | *per_cpu_ptr(sdd->sg, j) = sg; | 6387 | *per_cpu_ptr(sdd->sg, j) = sg; |
| 6386 | 6388 | ||
| 6387 | sgp = kzalloc_node(sizeof(struct sched_group_power), | 6389 | sgp = kzalloc_node(sizeof(struct sched_group_power), |
| @@ -6405,16 +6407,26 @@ static void __sdt_free(const struct cpumask *cpu_map) | |||
| 6405 | struct sd_data *sdd = &tl->data; | 6407 | struct sd_data *sdd = &tl->data; |
| 6406 | 6408 | ||
| 6407 | for_each_cpu(j, cpu_map) { | 6409 | for_each_cpu(j, cpu_map) { |
| 6408 | struct sched_domain *sd = *per_cpu_ptr(sdd->sd, j); | 6410 | struct sched_domain *sd; |
| 6409 | if (sd && (sd->flags & SD_OVERLAP)) | 6411 | |
| 6410 | free_sched_groups(sd->groups, 0); | 6412 | if (sdd->sd) { |
| 6411 | kfree(*per_cpu_ptr(sdd->sd, j)); | 6413 | sd = *per_cpu_ptr(sdd->sd, j); |
| 6412 | kfree(*per_cpu_ptr(sdd->sg, j)); | 6414 | if (sd && (sd->flags & SD_OVERLAP)) |
| 6413 | kfree(*per_cpu_ptr(sdd->sgp, j)); | 6415 | free_sched_groups(sd->groups, 0); |
| 6416 | kfree(*per_cpu_ptr(sdd->sd, j)); | ||
| 6417 | } | ||
| 6418 | |||
| 6419 | if (sdd->sg) | ||
| 6420 | kfree(*per_cpu_ptr(sdd->sg, j)); | ||
| 6421 | if (sdd->sgp) | ||
| 6422 | kfree(*per_cpu_ptr(sdd->sgp, j)); | ||
| 6414 | } | 6423 | } |
| 6415 | free_percpu(sdd->sd); | 6424 | free_percpu(sdd->sd); |
| 6425 | sdd->sd = NULL; | ||
| 6416 | free_percpu(sdd->sg); | 6426 | free_percpu(sdd->sg); |
| 6427 | sdd->sg = NULL; | ||
| 6417 | free_percpu(sdd->sgp); | 6428 | free_percpu(sdd->sgp); |
| 6429 | sdd->sgp = NULL; | ||
| 6418 | } | 6430 | } |
| 6419 | } | 6431 | } |
| 6420 | 6432 | ||
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 0d97ebdc58f0..e9553640c1c3 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
| @@ -784,7 +784,7 @@ account_entity_enqueue(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
| 784 | update_load_add(&rq_of(cfs_rq)->load, se->load.weight); | 784 | update_load_add(&rq_of(cfs_rq)->load, se->load.weight); |
| 785 | #ifdef CONFIG_SMP | 785 | #ifdef CONFIG_SMP |
| 786 | if (entity_is_task(se)) | 786 | if (entity_is_task(se)) |
| 787 | list_add_tail(&se->group_node, &rq_of(cfs_rq)->cfs_tasks); | 787 | list_add(&se->group_node, &rq_of(cfs_rq)->cfs_tasks); |
| 788 | #endif | 788 | #endif |
| 789 | cfs_rq->nr_running++; | 789 | cfs_rq->nr_running++; |
| 790 | } | 790 | } |
| @@ -3215,6 +3215,8 @@ static int move_one_task(struct lb_env *env) | |||
| 3215 | 3215 | ||
| 3216 | static unsigned long task_h_load(struct task_struct *p); | 3216 | static unsigned long task_h_load(struct task_struct *p); |
| 3217 | 3217 | ||
| 3218 | static const unsigned int sched_nr_migrate_break = 32; | ||
| 3219 | |||
| 3218 | /* | 3220 | /* |
| 3219 | * move_tasks tries to move up to load_move weighted load from busiest to | 3221 | * move_tasks tries to move up to load_move weighted load from busiest to |
| 3220 | * this_rq, as part of a balancing operation within domain "sd". | 3222 | * this_rq, as part of a balancing operation within domain "sd". |
| @@ -3242,7 +3244,7 @@ static int move_tasks(struct lb_env *env) | |||
| 3242 | 3244 | ||
| 3243 | /* take a breather every nr_migrate tasks */ | 3245 | /* take a breather every nr_migrate tasks */ |
| 3244 | if (env->loop > env->loop_break) { | 3246 | if (env->loop > env->loop_break) { |
| 3245 | env->loop_break += sysctl_sched_nr_migrate; | 3247 | env->loop_break += sched_nr_migrate_break; |
| 3246 | env->flags |= LBF_NEED_BREAK; | 3248 | env->flags |= LBF_NEED_BREAK; |
| 3247 | break; | 3249 | break; |
| 3248 | } | 3250 | } |
| @@ -3252,7 +3254,7 @@ static int move_tasks(struct lb_env *env) | |||
| 3252 | 3254 | ||
| 3253 | load = task_h_load(p); | 3255 | load = task_h_load(p); |
| 3254 | 3256 | ||
| 3255 | if (load < 16 && !env->sd->nr_balance_failed) | 3257 | if (sched_feat(LB_MIN) && load < 16 && !env->sd->nr_balance_failed) |
| 3256 | goto next; | 3258 | goto next; |
| 3257 | 3259 | ||
| 3258 | if ((load / 2) > env->load_move) | 3260 | if ((load / 2) > env->load_move) |
| @@ -4407,7 +4409,7 @@ static int load_balance(int this_cpu, struct rq *this_rq, | |||
| 4407 | .dst_cpu = this_cpu, | 4409 | .dst_cpu = this_cpu, |
| 4408 | .dst_rq = this_rq, | 4410 | .dst_rq = this_rq, |
| 4409 | .idle = idle, | 4411 | .idle = idle, |
| 4410 | .loop_break = sysctl_sched_nr_migrate, | 4412 | .loop_break = sched_nr_migrate_break, |
| 4411 | }; | 4413 | }; |
| 4412 | 4414 | ||
| 4413 | cpumask_copy(cpus, cpu_active_mask); | 4415 | cpumask_copy(cpus, cpu_active_mask); |
| @@ -4445,10 +4447,10 @@ redo: | |||
| 4445 | * correctly treated as an imbalance. | 4447 | * correctly treated as an imbalance. |
| 4446 | */ | 4448 | */ |
| 4447 | env.flags |= LBF_ALL_PINNED; | 4449 | env.flags |= LBF_ALL_PINNED; |
| 4448 | env.load_move = imbalance; | 4450 | env.load_move = imbalance; |
| 4449 | env.src_cpu = busiest->cpu; | 4451 | env.src_cpu = busiest->cpu; |
| 4450 | env.src_rq = busiest; | 4452 | env.src_rq = busiest; |
| 4451 | env.loop_max = busiest->nr_running; | 4453 | env.loop_max = min_t(unsigned long, sysctl_sched_nr_migrate, busiest->nr_running); |
| 4452 | 4454 | ||
| 4453 | more_balance: | 4455 | more_balance: |
| 4454 | local_irq_save(flags); | 4456 | local_irq_save(flags); |
diff --git a/kernel/sched/features.h b/kernel/sched/features.h index e61fd73913d0..de00a486c5c6 100644 --- a/kernel/sched/features.h +++ b/kernel/sched/features.h | |||
| @@ -68,3 +68,4 @@ SCHED_FEAT(TTWU_QUEUE, true) | |||
| 68 | 68 | ||
| 69 | SCHED_FEAT(FORCE_SD_OVERLAP, false) | 69 | SCHED_FEAT(FORCE_SD_OVERLAP, false) |
| 70 | SCHED_FEAT(RT_RUNTIME_SHARE, true) | 70 | SCHED_FEAT(RT_RUNTIME_SHARE, true) |
| 71 | SCHED_FEAT(LB_MIN, false) | ||
diff --git a/kernel/time/Kconfig b/kernel/time/Kconfig index 2cf9cc7aa103..a20dc8a3c949 100644 --- a/kernel/time/Kconfig +++ b/kernel/time/Kconfig | |||
| @@ -1,6 +1,10 @@ | |||
| 1 | # | 1 | # |
| 2 | # Timer subsystem related configuration options | 2 | # Timer subsystem related configuration options |
| 3 | # | 3 | # |
| 4 | |||
| 5 | # Core internal switch. Selected by NO_HZ / HIGH_RES_TIMERS. This is | ||
| 6 | # only related to the tick functionality. Oneshot clockevent devices | ||
| 7 | # are supported independ of this. | ||
| 4 | config TICK_ONESHOT | 8 | config TICK_ONESHOT |
| 5 | bool | 9 | bool |
| 6 | 10 | ||
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index e883f57a3cd3..f113755695e2 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c | |||
| @@ -346,7 +346,8 @@ int tick_resume_broadcast(void) | |||
| 346 | tick_get_broadcast_mask()); | 346 | tick_get_broadcast_mask()); |
| 347 | break; | 347 | break; |
| 348 | case TICKDEV_MODE_ONESHOT: | 348 | case TICKDEV_MODE_ONESHOT: |
| 349 | broadcast = tick_resume_broadcast_oneshot(bc); | 349 | if (!cpumask_empty(tick_get_broadcast_mask())) |
| 350 | broadcast = tick_resume_broadcast_oneshot(bc); | ||
| 350 | break; | 351 | break; |
| 351 | } | 352 | } |
| 352 | } | 353 | } |
| @@ -373,6 +374,9 @@ static int tick_broadcast_set_event(ktime_t expires, int force) | |||
| 373 | { | 374 | { |
| 374 | struct clock_event_device *bc = tick_broadcast_device.evtdev; | 375 | struct clock_event_device *bc = tick_broadcast_device.evtdev; |
| 375 | 376 | ||
| 377 | if (bc->mode != CLOCK_EVT_MODE_ONESHOT) | ||
| 378 | clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); | ||
| 379 | |||
| 376 | return clockevents_program_event(bc, expires, force); | 380 | return clockevents_program_event(bc, expires, force); |
| 377 | } | 381 | } |
| 378 | 382 | ||
| @@ -531,7 +535,6 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc) | |||
| 531 | int was_periodic = bc->mode == CLOCK_EVT_MODE_PERIODIC; | 535 | int was_periodic = bc->mode == CLOCK_EVT_MODE_PERIODIC; |
| 532 | 536 | ||
| 533 | bc->event_handler = tick_handle_oneshot_broadcast; | 537 | bc->event_handler = tick_handle_oneshot_broadcast; |
| 534 | clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); | ||
| 535 | 538 | ||
| 536 | /* Take the do_timer update */ | 539 | /* Take the do_timer update */ |
| 537 | tick_do_timer_cpu = cpu; | 540 | tick_do_timer_cpu = cpu; |
| @@ -549,6 +552,7 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc) | |||
| 549 | to_cpumask(tmpmask)); | 552 | to_cpumask(tmpmask)); |
| 550 | 553 | ||
| 551 | if (was_periodic && !cpumask_empty(to_cpumask(tmpmask))) { | 554 | if (was_periodic && !cpumask_empty(to_cpumask(tmpmask))) { |
| 555 | clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); | ||
| 552 | tick_broadcast_init_next_event(to_cpumask(tmpmask), | 556 | tick_broadcast_init_next_event(to_cpumask(tmpmask), |
| 553 | tick_next_period); | 557 | tick_next_period); |
| 554 | tick_broadcast_set_event(tick_next_period, 1); | 558 | tick_broadcast_set_event(tick_next_period, 1); |
| @@ -575,15 +579,12 @@ void tick_broadcast_switch_to_oneshot(void) | |||
| 575 | unsigned long flags; | 579 | unsigned long flags; |
| 576 | 580 | ||
| 577 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); | 581 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); |
| 578 | if (cpumask_empty(tick_get_broadcast_mask())) | ||
| 579 | goto end; | ||
| 580 | 582 | ||
| 581 | tick_broadcast_device.mode = TICKDEV_MODE_ONESHOT; | 583 | tick_broadcast_device.mode = TICKDEV_MODE_ONESHOT; |
| 582 | bc = tick_broadcast_device.evtdev; | 584 | bc = tick_broadcast_device.evtdev; |
| 583 | if (bc) | 585 | if (bc) |
| 584 | tick_broadcast_setup_oneshot(bc); | 586 | tick_broadcast_setup_oneshot(bc); |
| 585 | 587 | ||
| 586 | end: | ||
| 587 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); | 588 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); |
| 588 | } | 589 | } |
| 589 | 590 | ||
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 3526038f2836..6a3a5b9ff561 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
| @@ -534,9 +534,9 @@ static void tick_nohz_restart(struct tick_sched *ts, ktime_t now) | |||
| 534 | hrtimer_get_expires(&ts->sched_timer), 0)) | 534 | hrtimer_get_expires(&ts->sched_timer), 0)) |
| 535 | break; | 535 | break; |
| 536 | } | 536 | } |
| 537 | /* Update jiffies and reread time */ | 537 | /* Reread time and update jiffies */ |
| 538 | tick_do_update_jiffies64(now); | ||
| 539 | now = ktime_get(); | 538 | now = ktime_get(); |
| 539 | tick_do_update_jiffies64(now); | ||
| 540 | } | 540 | } |
| 541 | } | 541 | } |
| 542 | 542 | ||
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index ed7b5d1e12f4..2a22255c1010 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -4629,7 +4629,8 @@ static ssize_t | |||
| 4629 | rb_simple_read(struct file *filp, char __user *ubuf, | 4629 | rb_simple_read(struct file *filp, char __user *ubuf, |
| 4630 | size_t cnt, loff_t *ppos) | 4630 | size_t cnt, loff_t *ppos) |
| 4631 | { | 4631 | { |
| 4632 | struct ring_buffer *buffer = filp->private_data; | 4632 | struct trace_array *tr = filp->private_data; |
| 4633 | struct ring_buffer *buffer = tr->buffer; | ||
| 4633 | char buf[64]; | 4634 | char buf[64]; |
| 4634 | int r; | 4635 | int r; |
| 4635 | 4636 | ||
| @@ -4647,7 +4648,8 @@ static ssize_t | |||
| 4647 | rb_simple_write(struct file *filp, const char __user *ubuf, | 4648 | rb_simple_write(struct file *filp, const char __user *ubuf, |
| 4648 | size_t cnt, loff_t *ppos) | 4649 | size_t cnt, loff_t *ppos) |
| 4649 | { | 4650 | { |
| 4650 | struct ring_buffer *buffer = filp->private_data; | 4651 | struct trace_array *tr = filp->private_data; |
| 4652 | struct ring_buffer *buffer = tr->buffer; | ||
| 4651 | unsigned long val; | 4653 | unsigned long val; |
| 4652 | int ret; | 4654 | int ret; |
| 4653 | 4655 | ||
| @@ -4734,7 +4736,7 @@ static __init int tracer_init_debugfs(void) | |||
| 4734 | &trace_clock_fops); | 4736 | &trace_clock_fops); |
| 4735 | 4737 | ||
| 4736 | trace_create_file("tracing_on", 0644, d_tracer, | 4738 | trace_create_file("tracing_on", 0644, d_tracer, |
| 4737 | global_trace.buffer, &rb_simple_fops); | 4739 | &global_trace, &rb_simple_fops); |
| 4738 | 4740 | ||
| 4739 | #ifdef CONFIG_DYNAMIC_FTRACE | 4741 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 4740 | trace_create_file("dyn_ftrace_total_info", 0444, d_tracer, | 4742 | trace_create_file("dyn_ftrace_total_info", 0444, d_tracer, |
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 95059f091a24..f95d65da6db8 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
| @@ -836,11 +836,11 @@ extern const char *__stop___trace_bprintk_fmt[]; | |||
| 836 | filter) | 836 | filter) |
| 837 | #include "trace_entries.h" | 837 | #include "trace_entries.h" |
| 838 | 838 | ||
| 839 | #ifdef CONFIG_FUNCTION_TRACER | 839 | #if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_FUNCTION_TRACER) |
| 840 | int perf_ftrace_event_register(struct ftrace_event_call *call, | 840 | int perf_ftrace_event_register(struct ftrace_event_call *call, |
| 841 | enum trace_reg type, void *data); | 841 | enum trace_reg type, void *data); |
| 842 | #else | 842 | #else |
| 843 | #define perf_ftrace_event_register NULL | 843 | #define perf_ftrace_event_register NULL |
| 844 | #endif /* CONFIG_FUNCTION_TRACER */ | 844 | #endif |
| 845 | 845 | ||
| 846 | #endif /* _LINUX_KERNEL_TRACE_H */ | 846 | #endif /* _LINUX_KERNEL_TRACE_H */ |
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 079a93ae8a9d..29111da1d100 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
| @@ -294,6 +294,9 @@ static int __ftrace_set_clr_event(const char *match, const char *sub, | |||
| 294 | if (!call->name || !call->class || !call->class->reg) | 294 | if (!call->name || !call->class || !call->class->reg) |
| 295 | continue; | 295 | continue; |
| 296 | 296 | ||
| 297 | if (call->flags & TRACE_EVENT_FL_IGNORE_ENABLE) | ||
| 298 | continue; | ||
| 299 | |||
| 297 | if (match && | 300 | if (match && |
| 298 | strcmp(match, call->name) != 0 && | 301 | strcmp(match, call->name) != 0 && |
| 299 | strcmp(match, call->class->system) != 0) | 302 | strcmp(match, call->class->system) != 0) |
| @@ -1164,7 +1167,7 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events, | |||
| 1164 | return -1; | 1167 | return -1; |
| 1165 | } | 1168 | } |
| 1166 | 1169 | ||
| 1167 | if (call->class->reg) | 1170 | if (call->class->reg && !(call->flags & TRACE_EVENT_FL_IGNORE_ENABLE)) |
| 1168 | trace_create_file("enable", 0644, call->dir, call, | 1171 | trace_create_file("enable", 0644, call->dir, call, |
| 1169 | enable); | 1172 | enable); |
| 1170 | 1173 | ||
diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c index 3dd15e8bc856..e039906b037d 100644 --- a/kernel/trace/trace_export.c +++ b/kernel/trace/trace_export.c | |||
| @@ -180,6 +180,7 @@ struct ftrace_event_call __used event_##call = { \ | |||
| 180 | .event.type = etype, \ | 180 | .event.type = etype, \ |
| 181 | .class = &event_class_ftrace_##call, \ | 181 | .class = &event_class_ftrace_##call, \ |
| 182 | .print_fmt = print, \ | 182 | .print_fmt = print, \ |
| 183 | .flags = TRACE_EVENT_FL_IGNORE_ENABLE, \ | ||
| 183 | }; \ | 184 | }; \ |
| 184 | struct ftrace_event_call __used \ | 185 | struct ftrace_event_call __used \ |
| 185 | __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call; | 186 | __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call; |
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index 859fae6b1825..df611a0e76c5 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c | |||
| @@ -652,6 +652,8 @@ int trace_print_lat_context(struct trace_iterator *iter) | |||
| 652 | { | 652 | { |
| 653 | u64 next_ts; | 653 | u64 next_ts; |
| 654 | int ret; | 654 | int ret; |
| 655 | /* trace_find_next_entry will reset ent_size */ | ||
| 656 | int ent_size = iter->ent_size; | ||
| 655 | struct trace_seq *s = &iter->seq; | 657 | struct trace_seq *s = &iter->seq; |
| 656 | struct trace_entry *entry = iter->ent, | 658 | struct trace_entry *entry = iter->ent, |
| 657 | *next_entry = trace_find_next_entry(iter, NULL, | 659 | *next_entry = trace_find_next_entry(iter, NULL, |
| @@ -660,6 +662,9 @@ int trace_print_lat_context(struct trace_iterator *iter) | |||
| 660 | unsigned long abs_usecs = ns2usecs(iter->ts - iter->tr->time_start); | 662 | unsigned long abs_usecs = ns2usecs(iter->ts - iter->tr->time_start); |
| 661 | unsigned long rel_usecs; | 663 | unsigned long rel_usecs; |
| 662 | 664 | ||
| 665 | /* Restore the original ent_size */ | ||
| 666 | iter->ent_size = ent_size; | ||
| 667 | |||
| 663 | if (!next_entry) | 668 | if (!next_entry) |
| 664 | next_ts = iter->ts; | 669 | next_ts = iter->ts; |
| 665 | rel_usecs = ns2usecs(next_ts - iter->ts); | 670 | rel_usecs = ns2usecs(next_ts - iter->ts); |
