diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cpu.c | 2 | ||||
| -rw-r--r-- | kernel/irq/internals.h | 2 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 68 | ||||
| -rw-r--r-- | kernel/irq/migration.c | 11 | ||||
| -rw-r--r-- | kernel/irq/proc.c | 2 | ||||
| -rw-r--r-- | kernel/lockdep.c | 4 | ||||
| -rw-r--r-- | kernel/profile.c | 4 | ||||
| -rw-r--r-- | kernel/ptrace.c | 4 | ||||
| -rw-r--r-- | kernel/trace/ftrace.c | 113 | ||||
| -rw-r--r-- | kernel/trace/ring_buffer.c | 3 | ||||
| -rw-r--r-- | kernel/trace/trace.c | 1 | ||||
| -rw-r--r-- | kernel/trace/trace_mmiotrace.c | 16 | ||||
| -rw-r--r-- | kernel/trace/trace_stack.c | 24 |
13 files changed, 142 insertions, 112 deletions
diff --git a/kernel/cpu.c b/kernel/cpu.c index 5a732c5ef08b..8ea32e8d68b0 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
| @@ -462,7 +462,7 @@ out: | |||
| 462 | * It must be called by the arch code on the new cpu, before the new cpu | 462 | * It must be called by the arch code on the new cpu, before the new cpu |
| 463 | * enables interrupts and before the "boot" cpu returns from __cpu_up(). | 463 | * enables interrupts and before the "boot" cpu returns from __cpu_up(). |
| 464 | */ | 464 | */ |
| 465 | void notify_cpu_starting(unsigned int cpu) | 465 | void __cpuinit notify_cpu_starting(unsigned int cpu) |
| 466 | { | 466 | { |
| 467 | unsigned long val = CPU_STARTING; | 467 | unsigned long val = CPU_STARTING; |
| 468 | 468 | ||
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index c9767e641980..64c1c7253dae 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h | |||
| @@ -25,6 +25,8 @@ static inline void unregister_handler_proc(unsigned int irq, | |||
| 25 | struct irqaction *action) { } | 25 | struct irqaction *action) { } |
| 26 | #endif | 26 | #endif |
| 27 | 27 | ||
| 28 | extern int irq_select_affinity_usr(unsigned int irq); | ||
| 29 | |||
| 28 | /* | 30 | /* |
| 29 | * Debugging printout: | 31 | * Debugging printout: |
| 30 | */ | 32 | */ |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index c498a1b8c621..801addda3c43 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -82,24 +82,27 @@ int irq_can_set_affinity(unsigned int irq) | |||
| 82 | int irq_set_affinity(unsigned int irq, cpumask_t cpumask) | 82 | int irq_set_affinity(unsigned int irq, cpumask_t cpumask) |
| 83 | { | 83 | { |
| 84 | struct irq_desc *desc = irq_to_desc(irq); | 84 | struct irq_desc *desc = irq_to_desc(irq); |
| 85 | unsigned long flags; | ||
| 85 | 86 | ||
| 86 | if (!desc->chip->set_affinity) | 87 | if (!desc->chip->set_affinity) |
| 87 | return -EINVAL; | 88 | return -EINVAL; |
| 88 | 89 | ||
| 90 | spin_lock_irqsave(&desc->lock, flags); | ||
| 91 | |||
| 89 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 92 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
| 90 | if (desc->status & IRQ_MOVE_PCNTXT || desc->status & IRQ_DISABLED) { | 93 | if (desc->status & IRQ_MOVE_PCNTXT || desc->status & IRQ_DISABLED) { |
| 91 | unsigned long flags; | ||
| 92 | |||
| 93 | spin_lock_irqsave(&desc->lock, flags); | ||
| 94 | desc->affinity = cpumask; | 94 | desc->affinity = cpumask; |
| 95 | desc->chip->set_affinity(irq, cpumask); | 95 | desc->chip->set_affinity(irq, cpumask); |
| 96 | spin_unlock_irqrestore(&desc->lock, flags); | 96 | } else { |
| 97 | } else | 97 | desc->status |= IRQ_MOVE_PENDING; |
| 98 | set_pending_irq(irq, cpumask); | 98 | desc->pending_mask = cpumask; |
| 99 | } | ||
| 99 | #else | 100 | #else |
| 100 | desc->affinity = cpumask; | 101 | desc->affinity = cpumask; |
| 101 | desc->chip->set_affinity(irq, cpumask); | 102 | desc->chip->set_affinity(irq, cpumask); |
| 102 | #endif | 103 | #endif |
| 104 | desc->status |= IRQ_AFFINITY_SET; | ||
| 105 | spin_unlock_irqrestore(&desc->lock, flags); | ||
| 103 | return 0; | 106 | return 0; |
| 104 | } | 107 | } |
| 105 | 108 | ||
| @@ -107,24 +110,59 @@ int irq_set_affinity(unsigned int irq, cpumask_t cpumask) | |||
| 107 | /* | 110 | /* |
| 108 | * Generic version of the affinity autoselector. | 111 | * Generic version of the affinity autoselector. |
| 109 | */ | 112 | */ |
| 110 | int irq_select_affinity(unsigned int irq) | 113 | int do_irq_select_affinity(unsigned int irq, struct irq_desc *desc) |
| 111 | { | 114 | { |
| 112 | cpumask_t mask; | 115 | cpumask_t mask; |
| 113 | struct irq_desc *desc; | ||
| 114 | 116 | ||
| 115 | if (!irq_can_set_affinity(irq)) | 117 | if (!irq_can_set_affinity(irq)) |
| 116 | return 0; | 118 | return 0; |
| 117 | 119 | ||
| 118 | cpus_and(mask, cpu_online_map, irq_default_affinity); | 120 | cpus_and(mask, cpu_online_map, irq_default_affinity); |
| 119 | 121 | ||
| 120 | desc = irq_to_desc(irq); | 122 | /* |
| 123 | * Preserve an userspace affinity setup, but make sure that | ||
| 124 | * one of the targets is online. | ||
| 125 | */ | ||
| 126 | if (desc->status & (IRQ_AFFINITY_SET | IRQ_NO_BALANCING)) { | ||
| 127 | if (cpus_intersects(desc->affinity, cpu_online_map)) | ||
| 128 | mask = desc->affinity; | ||
| 129 | else | ||
| 130 | desc->status &= ~IRQ_AFFINITY_SET; | ||
| 131 | } | ||
| 132 | |||
| 121 | desc->affinity = mask; | 133 | desc->affinity = mask; |
| 122 | desc->chip->set_affinity(irq, mask); | 134 | desc->chip->set_affinity(irq, mask); |
| 123 | 135 | ||
| 124 | return 0; | 136 | return 0; |
| 125 | } | 137 | } |
| 138 | #else | ||
| 139 | static inline int do_irq_select_affinity(unsigned int irq, struct irq_desc *d) | ||
| 140 | { | ||
| 141 | return irq_select_affinity(irq); | ||
| 142 | } | ||
| 126 | #endif | 143 | #endif |
| 127 | 144 | ||
| 145 | /* | ||
| 146 | * Called when affinity is set via /proc/irq | ||
| 147 | */ | ||
| 148 | int irq_select_affinity_usr(unsigned int irq) | ||
| 149 | { | ||
| 150 | struct irq_desc *desc = irq_to_desc(irq); | ||
| 151 | unsigned long flags; | ||
| 152 | int ret; | ||
| 153 | |||
| 154 | spin_lock_irqsave(&desc->lock, flags); | ||
| 155 | ret = do_irq_select_affinity(irq, desc); | ||
| 156 | spin_unlock_irqrestore(&desc->lock, flags); | ||
| 157 | |||
| 158 | return ret; | ||
| 159 | } | ||
| 160 | |||
| 161 | #else | ||
| 162 | static inline int do_irq_select_affinity(int irq, struct irq_desc *desc) | ||
| 163 | { | ||
| 164 | return 0; | ||
| 165 | } | ||
| 128 | #endif | 166 | #endif |
| 129 | 167 | ||
| 130 | /** | 168 | /** |
| @@ -327,7 +365,7 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, | |||
| 327 | * IRQF_TRIGGER_* but the PIC does not support multiple | 365 | * IRQF_TRIGGER_* but the PIC does not support multiple |
| 328 | * flow-types? | 366 | * flow-types? |
| 329 | */ | 367 | */ |
| 330 | pr_warning("No set_type function for IRQ %d (%s)\n", irq, | 368 | pr_debug("No set_type function for IRQ %d (%s)\n", irq, |
| 331 | chip ? (chip->name ? : "unknown") : "unknown"); | 369 | chip ? (chip->name ? : "unknown") : "unknown"); |
| 332 | return 0; | 370 | return 0; |
| 333 | } | 371 | } |
| @@ -445,8 +483,12 @@ __setup_irq(unsigned int irq, struct irq_desc * desc, struct irqaction *new) | |||
| 445 | /* Undo nested disables: */ | 483 | /* Undo nested disables: */ |
| 446 | desc->depth = 1; | 484 | desc->depth = 1; |
| 447 | 485 | ||
| 486 | /* Exclude IRQ from balancing if requested */ | ||
| 487 | if (new->flags & IRQF_NOBALANCING) | ||
| 488 | desc->status |= IRQ_NO_BALANCING; | ||
| 489 | |||
| 448 | /* Set default affinity mask once everything is setup */ | 490 | /* Set default affinity mask once everything is setup */ |
| 449 | irq_select_affinity(irq); | 491 | do_irq_select_affinity(irq, desc); |
| 450 | 492 | ||
| 451 | } else if ((new->flags & IRQF_TRIGGER_MASK) | 493 | } else if ((new->flags & IRQF_TRIGGER_MASK) |
| 452 | && (new->flags & IRQF_TRIGGER_MASK) | 494 | && (new->flags & IRQF_TRIGGER_MASK) |
| @@ -459,10 +501,6 @@ __setup_irq(unsigned int irq, struct irq_desc * desc, struct irqaction *new) | |||
| 459 | 501 | ||
| 460 | *p = new; | 502 | *p = new; |
| 461 | 503 | ||
| 462 | /* Exclude IRQ from balancing */ | ||
| 463 | if (new->flags & IRQF_NOBALANCING) | ||
| 464 | desc->status |= IRQ_NO_BALANCING; | ||
| 465 | |||
| 466 | /* Reset broken irq detection when installing new handler */ | 504 | /* Reset broken irq detection when installing new handler */ |
| 467 | desc->irq_count = 0; | 505 | desc->irq_count = 0; |
| 468 | desc->irqs_unhandled = 0; | 506 | desc->irqs_unhandled = 0; |
diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c index 90b920d3f52b..9db681d95814 100644 --- a/kernel/irq/migration.c +++ b/kernel/irq/migration.c | |||
| @@ -1,17 +1,6 @@ | |||
| 1 | 1 | ||
| 2 | #include <linux/irq.h> | 2 | #include <linux/irq.h> |
| 3 | 3 | ||
| 4 | void set_pending_irq(unsigned int irq, cpumask_t mask) | ||
| 5 | { | ||
| 6 | struct irq_desc *desc = irq_to_desc(irq); | ||
| 7 | unsigned long flags; | ||
| 8 | |||
| 9 | spin_lock_irqsave(&desc->lock, flags); | ||
| 10 | desc->status |= IRQ_MOVE_PENDING; | ||
| 11 | desc->pending_mask = mask; | ||
| 12 | spin_unlock_irqrestore(&desc->lock, flags); | ||
| 13 | } | ||
| 14 | |||
| 15 | void move_masked_irq(int irq) | 4 | void move_masked_irq(int irq) |
| 16 | { | 5 | { |
| 17 | struct irq_desc *desc = irq_to_desc(irq); | 6 | struct irq_desc *desc = irq_to_desc(irq); |
diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index 4d161c70ba55..d257e7d6a8a4 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c | |||
| @@ -62,7 +62,7 @@ static ssize_t irq_affinity_proc_write(struct file *file, | |||
| 62 | if (!cpus_intersects(new_value, cpu_online_map)) | 62 | if (!cpus_intersects(new_value, cpu_online_map)) |
| 63 | /* Special case for empty set - allow the architecture | 63 | /* Special case for empty set - allow the architecture |
| 64 | code to set default SMP affinity. */ | 64 | code to set default SMP affinity. */ |
| 65 | return irq_select_affinity(irq) ? -EINVAL : count; | 65 | return irq_select_affinity_usr(irq) ? -EINVAL : count; |
| 66 | 66 | ||
| 67 | irq_set_affinity(irq, new_value); | 67 | irq_set_affinity(irq, new_value); |
| 68 | 68 | ||
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 06e157119d2b..46a404173db2 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
| @@ -3276,10 +3276,10 @@ void __init lockdep_info(void) | |||
| 3276 | { | 3276 | { |
| 3277 | printk("Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar\n"); | 3277 | printk("Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar\n"); |
| 3278 | 3278 | ||
| 3279 | printk("... MAX_LOCKDEP_SUBCLASSES: %lu\n", MAX_LOCKDEP_SUBCLASSES); | 3279 | printk("... MAX_LOCKDEP_SUBCLASSES: %lu\n", MAX_LOCKDEP_SUBCLASSES); |
| 3280 | printk("... MAX_LOCK_DEPTH: %lu\n", MAX_LOCK_DEPTH); | 3280 | printk("... MAX_LOCK_DEPTH: %lu\n", MAX_LOCK_DEPTH); |
| 3281 | printk("... MAX_LOCKDEP_KEYS: %lu\n", MAX_LOCKDEP_KEYS); | 3281 | printk("... MAX_LOCKDEP_KEYS: %lu\n", MAX_LOCKDEP_KEYS); |
| 3282 | printk("... CLASSHASH_SIZE: %lu\n", CLASSHASH_SIZE); | 3282 | printk("... CLASSHASH_SIZE: %lu\n", CLASSHASH_SIZE); |
| 3283 | printk("... MAX_LOCKDEP_ENTRIES: %lu\n", MAX_LOCKDEP_ENTRIES); | 3283 | printk("... MAX_LOCKDEP_ENTRIES: %lu\n", MAX_LOCKDEP_ENTRIES); |
| 3284 | printk("... MAX_LOCKDEP_CHAINS: %lu\n", MAX_LOCKDEP_CHAINS); | 3284 | printk("... MAX_LOCKDEP_CHAINS: %lu\n", MAX_LOCKDEP_CHAINS); |
| 3285 | printk("... CHAINHASH_SIZE: %lu\n", CHAINHASH_SIZE); | 3285 | printk("... CHAINHASH_SIZE: %lu\n", CHAINHASH_SIZE); |
diff --git a/kernel/profile.c b/kernel/profile.c index 5b7d1ac7124c..dc41827fbfee 100644 --- a/kernel/profile.c +++ b/kernel/profile.c | |||
| @@ -351,7 +351,7 @@ out: | |||
| 351 | put_cpu(); | 351 | put_cpu(); |
| 352 | } | 352 | } |
| 353 | 353 | ||
| 354 | static int __devinit profile_cpu_callback(struct notifier_block *info, | 354 | static int __cpuinit profile_cpu_callback(struct notifier_block *info, |
| 355 | unsigned long action, void *__cpu) | 355 | unsigned long action, void *__cpu) |
| 356 | { | 356 | { |
| 357 | int node, cpu = (unsigned long)__cpu; | 357 | int node, cpu = (unsigned long)__cpu; |
| @@ -596,7 +596,7 @@ out_cleanup: | |||
| 596 | #define create_hash_tables() ({ 0; }) | 596 | #define create_hash_tables() ({ 0; }) |
| 597 | #endif | 597 | #endif |
| 598 | 598 | ||
| 599 | int create_proc_profile(void) | 599 | int __ref create_proc_profile(void) /* false positive from hotcpu_notifier */ |
| 600 | { | 600 | { |
| 601 | struct proc_dir_entry *entry; | 601 | struct proc_dir_entry *entry; |
| 602 | 602 | ||
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 1e68e4c39e2c..4c8bcd7dd8e0 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
| @@ -612,7 +612,7 @@ int generic_ptrace_pokedata(struct task_struct *tsk, long addr, long data) | |||
| 612 | return (copied == sizeof(data)) ? 0 : -EIO; | 612 | return (copied == sizeof(data)) ? 0 : -EIO; |
| 613 | } | 613 | } |
| 614 | 614 | ||
| 615 | #if defined CONFIG_COMPAT && defined __ARCH_WANT_COMPAT_SYS_PTRACE | 615 | #if defined CONFIG_COMPAT |
| 616 | #include <linux/compat.h> | 616 | #include <linux/compat.h> |
| 617 | 617 | ||
| 618 | int compat_ptrace_request(struct task_struct *child, compat_long_t request, | 618 | int compat_ptrace_request(struct task_struct *child, compat_long_t request, |
| @@ -709,4 +709,4 @@ asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid, | |||
| 709 | unlock_kernel(); | 709 | unlock_kernel(); |
| 710 | return ret; | 710 | return ret; |
| 711 | } | 711 | } |
| 712 | #endif /* CONFIG_COMPAT && __ARCH_WANT_COMPAT_SYS_PTRACE */ | 712 | #endif /* CONFIG_COMPAT */ |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index e60205722d0c..78db083390f0 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -326,96 +326,89 @@ ftrace_record_ip(unsigned long ip) | |||
| 326 | 326 | ||
| 327 | static int | 327 | static int |
| 328 | __ftrace_replace_code(struct dyn_ftrace *rec, | 328 | __ftrace_replace_code(struct dyn_ftrace *rec, |
| 329 | unsigned char *old, unsigned char *new, int enable) | 329 | unsigned char *nop, int enable) |
| 330 | { | 330 | { |
| 331 | unsigned long ip, fl; | 331 | unsigned long ip, fl; |
| 332 | unsigned char *call, *old, *new; | ||
| 332 | 333 | ||
| 333 | ip = rec->ip; | 334 | ip = rec->ip; |
| 334 | 335 | ||
| 335 | if (ftrace_filtered && enable) { | 336 | /* |
| 337 | * If this record is not to be traced and | ||
| 338 | * it is not enabled then do nothing. | ||
| 339 | * | ||
| 340 | * If this record is not to be traced and | ||
| 341 | * it is enabled then disabled it. | ||
| 342 | * | ||
| 343 | */ | ||
| 344 | if (rec->flags & FTRACE_FL_NOTRACE) { | ||
| 345 | if (rec->flags & FTRACE_FL_ENABLED) | ||
| 346 | rec->flags &= ~FTRACE_FL_ENABLED; | ||
| 347 | else | ||
| 348 | return 0; | ||
| 349 | |||
| 350 | } else if (ftrace_filtered && enable) { | ||
| 336 | /* | 351 | /* |
| 337 | * If filtering is on: | 352 | * Filtering is on: |
| 338 | * | ||
| 339 | * If this record is set to be filtered and | ||
| 340 | * is enabled then do nothing. | ||
| 341 | * | ||
| 342 | * If this record is set to be filtered and | ||
| 343 | * it is not enabled, enable it. | ||
| 344 | * | ||
| 345 | * If this record is not set to be filtered | ||
| 346 | * and it is not enabled do nothing. | ||
| 347 | * | ||
| 348 | * If this record is set not to trace then | ||
| 349 | * do nothing. | ||
| 350 | * | ||
| 351 | * If this record is set not to trace and | ||
| 352 | * it is enabled then disable it. | ||
| 353 | * | ||
| 354 | * If this record is not set to be filtered and | ||
| 355 | * it is enabled, disable it. | ||
| 356 | */ | 353 | */ |
| 357 | 354 | ||
| 358 | fl = rec->flags & (FTRACE_FL_FILTER | FTRACE_FL_NOTRACE | | 355 | fl = rec->flags & (FTRACE_FL_FILTER | FTRACE_FL_ENABLED); |
| 359 | FTRACE_FL_ENABLED); | ||
| 360 | 356 | ||
| 361 | if ((fl == (FTRACE_FL_FILTER | FTRACE_FL_ENABLED)) || | 357 | /* Record is filtered and enabled, do nothing */ |
| 362 | (fl == (FTRACE_FL_FILTER | FTRACE_FL_NOTRACE)) || | 358 | if (fl == (FTRACE_FL_FILTER | FTRACE_FL_ENABLED)) |
| 363 | !fl || (fl == FTRACE_FL_NOTRACE)) | ||
| 364 | return 0; | 359 | return 0; |
| 365 | 360 | ||
| 366 | /* | 361 | /* Record is not filtered and is not enabled do nothing */ |
| 367 | * If it is enabled disable it, | 362 | if (!fl) |
| 368 | * otherwise enable it! | 363 | return 0; |
| 369 | */ | 364 | |
| 370 | if (fl & FTRACE_FL_ENABLED) { | 365 | /* Record is not filtered but enabled, disable it */ |
| 371 | /* swap new and old */ | 366 | if (fl == FTRACE_FL_ENABLED) |
| 372 | new = old; | ||
| 373 | old = ftrace_call_replace(ip, FTRACE_ADDR); | ||
| 374 | rec->flags &= ~FTRACE_FL_ENABLED; | 367 | rec->flags &= ~FTRACE_FL_ENABLED; |
| 375 | } else { | 368 | else |
| 376 | new = ftrace_call_replace(ip, FTRACE_ADDR); | 369 | /* Otherwise record is filtered but not enabled, enable it */ |
| 377 | rec->flags |= FTRACE_FL_ENABLED; | 370 | rec->flags |= FTRACE_FL_ENABLED; |
| 378 | } | ||
| 379 | } else { | 371 | } else { |
| 372 | /* Disable or not filtered */ | ||
| 380 | 373 | ||
| 381 | if (enable) { | 374 | if (enable) { |
| 382 | /* | 375 | /* if record is enabled, do nothing */ |
| 383 | * If this record is set not to trace and is | ||
| 384 | * not enabled, do nothing. | ||
| 385 | */ | ||
| 386 | fl = rec->flags & (FTRACE_FL_NOTRACE | FTRACE_FL_ENABLED); | ||
| 387 | if (fl == FTRACE_FL_NOTRACE) | ||
| 388 | return 0; | ||
| 389 | |||
| 390 | new = ftrace_call_replace(ip, FTRACE_ADDR); | ||
| 391 | } else | ||
| 392 | old = ftrace_call_replace(ip, FTRACE_ADDR); | ||
| 393 | |||
| 394 | if (enable) { | ||
| 395 | if (rec->flags & FTRACE_FL_ENABLED) | 376 | if (rec->flags & FTRACE_FL_ENABLED) |
| 396 | return 0; | 377 | return 0; |
| 378 | |||
| 397 | rec->flags |= FTRACE_FL_ENABLED; | 379 | rec->flags |= FTRACE_FL_ENABLED; |
| 380 | |||
| 398 | } else { | 381 | } else { |
| 382 | |||
| 383 | /* if record is not enabled do nothing */ | ||
| 399 | if (!(rec->flags & FTRACE_FL_ENABLED)) | 384 | if (!(rec->flags & FTRACE_FL_ENABLED)) |
| 400 | return 0; | 385 | return 0; |
| 386 | |||
| 401 | rec->flags &= ~FTRACE_FL_ENABLED; | 387 | rec->flags &= ~FTRACE_FL_ENABLED; |
| 402 | } | 388 | } |
| 403 | } | 389 | } |
| 404 | 390 | ||
| 391 | call = ftrace_call_replace(ip, FTRACE_ADDR); | ||
| 392 | |||
| 393 | if (rec->flags & FTRACE_FL_ENABLED) { | ||
| 394 | old = nop; | ||
| 395 | new = call; | ||
| 396 | } else { | ||
| 397 | old = call; | ||
| 398 | new = nop; | ||
| 399 | } | ||
| 400 | |||
| 405 | return ftrace_modify_code(ip, old, new); | 401 | return ftrace_modify_code(ip, old, new); |
| 406 | } | 402 | } |
| 407 | 403 | ||
| 408 | static void ftrace_replace_code(int enable) | 404 | static void ftrace_replace_code(int enable) |
| 409 | { | 405 | { |
| 410 | int i, failed; | 406 | int i, failed; |
| 411 | unsigned char *new = NULL, *old = NULL; | 407 | unsigned char *nop = NULL; |
| 412 | struct dyn_ftrace *rec; | 408 | struct dyn_ftrace *rec; |
| 413 | struct ftrace_page *pg; | 409 | struct ftrace_page *pg; |
| 414 | 410 | ||
| 415 | if (enable) | 411 | nop = ftrace_nop_replace(); |
| 416 | old = ftrace_nop_replace(); | ||
| 417 | else | ||
| 418 | new = ftrace_nop_replace(); | ||
| 419 | 412 | ||
| 420 | for (pg = ftrace_pages_start; pg; pg = pg->next) { | 413 | for (pg = ftrace_pages_start; pg; pg = pg->next) { |
| 421 | for (i = 0; i < pg->index; i++) { | 414 | for (i = 0; i < pg->index; i++) { |
| @@ -433,7 +426,7 @@ static void ftrace_replace_code(int enable) | |||
| 433 | unfreeze_record(rec); | 426 | unfreeze_record(rec); |
| 434 | } | 427 | } |
| 435 | 428 | ||
| 436 | failed = __ftrace_replace_code(rec, old, new, enable); | 429 | failed = __ftrace_replace_code(rec, nop, enable); |
| 437 | if (failed && (rec->flags & FTRACE_FL_CONVERTED)) { | 430 | if (failed && (rec->flags & FTRACE_FL_CONVERTED)) { |
| 438 | rec->flags |= FTRACE_FL_FAILED; | 431 | rec->flags |= FTRACE_FL_FAILED; |
| 439 | if ((system_state == SYSTEM_BOOTING) || | 432 | if ((system_state == SYSTEM_BOOTING) || |
| @@ -534,8 +527,7 @@ static void ftrace_startup(void) | |||
| 534 | 527 | ||
| 535 | mutex_lock(&ftrace_start_lock); | 528 | mutex_lock(&ftrace_start_lock); |
| 536 | ftrace_start++; | 529 | ftrace_start++; |
| 537 | if (ftrace_start == 1) | 530 | command |= FTRACE_ENABLE_CALLS; |
| 538 | command |= FTRACE_ENABLE_CALLS; | ||
| 539 | 531 | ||
| 540 | if (saved_ftrace_func != ftrace_trace_function) { | 532 | if (saved_ftrace_func != ftrace_trace_function) { |
| 541 | saved_ftrace_func = ftrace_trace_function; | 533 | saved_ftrace_func = ftrace_trace_function; |
| @@ -734,6 +726,9 @@ t_next(struct seq_file *m, void *v, loff_t *pos) | |||
| 734 | ((iter->flags & FTRACE_ITER_FAILURES) && | 726 | ((iter->flags & FTRACE_ITER_FAILURES) && |
| 735 | !(rec->flags & FTRACE_FL_FAILED)) || | 727 | !(rec->flags & FTRACE_FL_FAILED)) || |
| 736 | 728 | ||
| 729 | ((iter->flags & FTRACE_ITER_FILTER) && | ||
| 730 | !(rec->flags & FTRACE_FL_FILTER)) || | ||
| 731 | |||
| 737 | ((iter->flags & FTRACE_ITER_NOTRACE) && | 732 | ((iter->flags & FTRACE_ITER_NOTRACE) && |
| 738 | !(rec->flags & FTRACE_FL_NOTRACE))) { | 733 | !(rec->flags & FTRACE_FL_NOTRACE))) { |
| 739 | rec = NULL; | 734 | rec = NULL; |
| @@ -1186,7 +1181,7 @@ ftrace_regex_release(struct inode *inode, struct file *file, int enable) | |||
| 1186 | 1181 | ||
| 1187 | mutex_lock(&ftrace_sysctl_lock); | 1182 | mutex_lock(&ftrace_sysctl_lock); |
| 1188 | mutex_lock(&ftrace_start_lock); | 1183 | mutex_lock(&ftrace_start_lock); |
| 1189 | if (iter->filtered && ftrace_start && ftrace_enabled) | 1184 | if (ftrace_start && ftrace_enabled) |
| 1190 | ftrace_run_update_code(FTRACE_ENABLE_CALLS); | 1185 | ftrace_run_update_code(FTRACE_ENABLE_CALLS); |
| 1191 | mutex_unlock(&ftrace_start_lock); | 1186 | mutex_unlock(&ftrace_start_lock); |
| 1192 | mutex_unlock(&ftrace_sysctl_lock); | 1187 | mutex_unlock(&ftrace_sysctl_lock); |
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 036456cbb4f7..668bbb5ef2bd 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
| @@ -617,6 +617,7 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size) | |||
| 617 | list_del_init(&page->list); | 617 | list_del_init(&page->list); |
| 618 | free_buffer_page(page); | 618 | free_buffer_page(page); |
| 619 | } | 619 | } |
| 620 | mutex_unlock(&buffer->mutex); | ||
| 620 | return -ENOMEM; | 621 | return -ENOMEM; |
| 621 | } | 622 | } |
| 622 | 623 | ||
| @@ -1214,7 +1215,7 @@ ring_buffer_lock_reserve(struct ring_buffer *buffer, | |||
| 1214 | 1215 | ||
| 1215 | out: | 1216 | out: |
| 1216 | if (resched) | 1217 | if (resched) |
| 1217 | preempt_enable_notrace(); | 1218 | preempt_enable_no_resched_notrace(); |
| 1218 | else | 1219 | else |
| 1219 | preempt_enable_notrace(); | 1220 | preempt_enable_notrace(); |
| 1220 | return NULL; | 1221 | return NULL; |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 697eda36b86a..d86e3252f300 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -1936,6 +1936,7 @@ __tracing_open(struct inode *inode, struct file *file, int *ret) | |||
| 1936 | ring_buffer_read_finish(iter->buffer_iter[cpu]); | 1936 | ring_buffer_read_finish(iter->buffer_iter[cpu]); |
| 1937 | } | 1937 | } |
| 1938 | mutex_unlock(&trace_types_lock); | 1938 | mutex_unlock(&trace_types_lock); |
| 1939 | kfree(iter); | ||
| 1939 | 1940 | ||
| 1940 | return ERR_PTR(-ENOMEM); | 1941 | return ERR_PTR(-ENOMEM); |
| 1941 | } | 1942 | } |
diff --git a/kernel/trace/trace_mmiotrace.c b/kernel/trace/trace_mmiotrace.c index f28484618ff0..e62cbf78eab6 100644 --- a/kernel/trace/trace_mmiotrace.c +++ b/kernel/trace/trace_mmiotrace.c | |||
| @@ -18,12 +18,14 @@ struct header_iter { | |||
| 18 | 18 | ||
| 19 | static struct trace_array *mmio_trace_array; | 19 | static struct trace_array *mmio_trace_array; |
| 20 | static bool overrun_detected; | 20 | static bool overrun_detected; |
| 21 | static unsigned long prev_overruns; | ||
| 21 | 22 | ||
| 22 | static void mmio_reset_data(struct trace_array *tr) | 23 | static void mmio_reset_data(struct trace_array *tr) |
| 23 | { | 24 | { |
| 24 | int cpu; | 25 | int cpu; |
| 25 | 26 | ||
| 26 | overrun_detected = false; | 27 | overrun_detected = false; |
| 28 | prev_overruns = 0; | ||
| 27 | tr->time_start = ftrace_now(tr->cpu); | 29 | tr->time_start = ftrace_now(tr->cpu); |
| 28 | 30 | ||
| 29 | for_each_online_cpu(cpu) | 31 | for_each_online_cpu(cpu) |
| @@ -128,16 +130,12 @@ static void mmio_close(struct trace_iterator *iter) | |||
| 128 | 130 | ||
| 129 | static unsigned long count_overruns(struct trace_iterator *iter) | 131 | static unsigned long count_overruns(struct trace_iterator *iter) |
| 130 | { | 132 | { |
| 131 | int cpu; | ||
| 132 | unsigned long cnt = 0; | 133 | unsigned long cnt = 0; |
| 133 | /* FIXME: */ | 134 | unsigned long over = ring_buffer_overruns(iter->tr->buffer); |
| 134 | #if 0 | 135 | |
| 135 | for_each_online_cpu(cpu) { | 136 | if (over > prev_overruns) |
| 136 | cnt += iter->overrun[cpu]; | 137 | cnt = over - prev_overruns; |
| 137 | iter->overrun[cpu] = 0; | 138 | prev_overruns = over; |
| 138 | } | ||
| 139 | #endif | ||
| 140 | (void)cpu; | ||
| 141 | return cnt; | 139 | return cnt; |
| 142 | } | 140 | } |
| 143 | 141 | ||
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c index be682b62fe58..3bdb44bde4b7 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c | |||
| @@ -184,11 +184,16 @@ static struct file_operations stack_max_size_fops = { | |||
| 184 | static void * | 184 | static void * |
| 185 | t_next(struct seq_file *m, void *v, loff_t *pos) | 185 | t_next(struct seq_file *m, void *v, loff_t *pos) |
| 186 | { | 186 | { |
| 187 | long i = (long)m->private; | 187 | long i; |
| 188 | 188 | ||
| 189 | (*pos)++; | 189 | (*pos)++; |
| 190 | 190 | ||
| 191 | i++; | 191 | if (v == SEQ_START_TOKEN) |
| 192 | i = 0; | ||
| 193 | else { | ||
| 194 | i = *(long *)v; | ||
| 195 | i++; | ||
| 196 | } | ||
| 192 | 197 | ||
| 193 | if (i >= max_stack_trace.nr_entries || | 198 | if (i >= max_stack_trace.nr_entries || |
| 194 | stack_dump_trace[i] == ULONG_MAX) | 199 | stack_dump_trace[i] == ULONG_MAX) |
| @@ -201,12 +206,15 @@ t_next(struct seq_file *m, void *v, loff_t *pos) | |||
| 201 | 206 | ||
| 202 | static void *t_start(struct seq_file *m, loff_t *pos) | 207 | static void *t_start(struct seq_file *m, loff_t *pos) |
| 203 | { | 208 | { |
| 204 | void *t = &m->private; | 209 | void *t = SEQ_START_TOKEN; |
| 205 | loff_t l = 0; | 210 | loff_t l = 0; |
| 206 | 211 | ||
| 207 | local_irq_disable(); | 212 | local_irq_disable(); |
| 208 | __raw_spin_lock(&max_stack_lock); | 213 | __raw_spin_lock(&max_stack_lock); |
| 209 | 214 | ||
| 215 | if (*pos == 0) | ||
| 216 | return SEQ_START_TOKEN; | ||
| 217 | |||
| 210 | for (; t && l < *pos; t = t_next(m, t, &l)) | 218 | for (; t && l < *pos; t = t_next(m, t, &l)) |
| 211 | ; | 219 | ; |
| 212 | 220 | ||
| @@ -235,10 +243,10 @@ static int trace_lookup_stack(struct seq_file *m, long i) | |||
| 235 | 243 | ||
| 236 | static int t_show(struct seq_file *m, void *v) | 244 | static int t_show(struct seq_file *m, void *v) |
| 237 | { | 245 | { |
| 238 | long i = *(long *)v; | 246 | long i; |
| 239 | int size; | 247 | int size; |
| 240 | 248 | ||
| 241 | if (i < 0) { | 249 | if (v == SEQ_START_TOKEN) { |
| 242 | seq_printf(m, " Depth Size Location" | 250 | seq_printf(m, " Depth Size Location" |
| 243 | " (%d entries)\n" | 251 | " (%d entries)\n" |
| 244 | " ----- ---- --------\n", | 252 | " ----- ---- --------\n", |
| @@ -246,6 +254,8 @@ static int t_show(struct seq_file *m, void *v) | |||
| 246 | return 0; | 254 | return 0; |
| 247 | } | 255 | } |
| 248 | 256 | ||
| 257 | i = *(long *)v; | ||
| 258 | |||
| 249 | if (i >= max_stack_trace.nr_entries || | 259 | if (i >= max_stack_trace.nr_entries || |
| 250 | stack_dump_trace[i] == ULONG_MAX) | 260 | stack_dump_trace[i] == ULONG_MAX) |
| 251 | return 0; | 261 | return 0; |
| @@ -275,10 +285,6 @@ static int stack_trace_open(struct inode *inode, struct file *file) | |||
| 275 | int ret; | 285 | int ret; |
| 276 | 286 | ||
| 277 | ret = seq_open(file, &stack_trace_seq_ops); | 287 | ret = seq_open(file, &stack_trace_seq_ops); |
| 278 | if (!ret) { | ||
| 279 | struct seq_file *m = file->private_data; | ||
| 280 | m->private = (void *)-1; | ||
| 281 | } | ||
| 282 | 288 | ||
| 283 | return ret; | 289 | return ret; |
| 284 | } | 290 | } |
