diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cgroup.c | 19 | ||||
| -rw-r--r-- | kernel/fork.c | 41 | ||||
| -rw-r--r-- | kernel/futex.c | 62 | ||||
| -rw-r--r-- | kernel/irq/irqdesc.c | 40 | ||||
| -rw-r--r-- | kernel/panic.c | 1 | ||||
| -rw-r--r-- | kernel/perf_event.c | 23 | ||||
| -rw-r--r-- | kernel/power/Kconfig | 5 | ||||
| -rw-r--r-- | kernel/power/Makefile | 1 | ||||
| -rw-r--r-- | kernel/power/nvs.c | 136 | ||||
| -rw-r--r-- | kernel/rcutiny.c | 3 | ||||
| -rw-r--r-- | kernel/srcu.c | 15 | ||||
| -rw-r--r-- | kernel/time/clocksource.c | 8 | ||||
| -rw-r--r-- | kernel/time/timekeeping.c | 4 | ||||
| -rw-r--r-- | kernel/trace/trace_syscalls.c | 33 |
14 files changed, 155 insertions, 236 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 5c5f4cc2e99..b24d7027b83 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
| @@ -764,6 +764,7 @@ EXPORT_SYMBOL_GPL(cgroup_unlock); | |||
| 764 | */ | 764 | */ |
| 765 | 765 | ||
| 766 | static int cgroup_mkdir(struct inode *dir, struct dentry *dentry, int mode); | 766 | static int cgroup_mkdir(struct inode *dir, struct dentry *dentry, int mode); |
| 767 | static struct dentry *cgroup_lookup(struct inode *, struct dentry *, struct nameidata *); | ||
| 767 | static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry); | 768 | static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry); |
| 768 | static int cgroup_populate_dir(struct cgroup *cgrp); | 769 | static int cgroup_populate_dir(struct cgroup *cgrp); |
| 769 | static const struct inode_operations cgroup_dir_inode_operations; | 770 | static const struct inode_operations cgroup_dir_inode_operations; |
| @@ -860,6 +861,11 @@ static void cgroup_diput(struct dentry *dentry, struct inode *inode) | |||
| 860 | iput(inode); | 861 | iput(inode); |
| 861 | } | 862 | } |
| 862 | 863 | ||
| 864 | static int cgroup_delete(const struct dentry *d) | ||
| 865 | { | ||
| 866 | return 1; | ||
| 867 | } | ||
| 868 | |||
| 863 | static void remove_dir(struct dentry *d) | 869 | static void remove_dir(struct dentry *d) |
| 864 | { | 870 | { |
| 865 | struct dentry *parent = dget(d->d_parent); | 871 | struct dentry *parent = dget(d->d_parent); |
| @@ -910,7 +916,7 @@ static void cgroup_d_remove_dir(struct dentry *dentry) | |||
| 910 | 916 | ||
| 911 | parent = dentry->d_parent; | 917 | parent = dentry->d_parent; |
| 912 | spin_lock(&parent->d_lock); | 918 | spin_lock(&parent->d_lock); |
| 913 | spin_lock(&dentry->d_lock); | 919 | spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); |
| 914 | list_del_init(&dentry->d_u.d_child); | 920 | list_del_init(&dentry->d_u.d_child); |
| 915 | spin_unlock(&dentry->d_lock); | 921 | spin_unlock(&dentry->d_lock); |
| 916 | spin_unlock(&parent->d_lock); | 922 | spin_unlock(&parent->d_lock); |
| @@ -1451,6 +1457,7 @@ static int cgroup_get_rootdir(struct super_block *sb) | |||
| 1451 | { | 1457 | { |
| 1452 | static const struct dentry_operations cgroup_dops = { | 1458 | static const struct dentry_operations cgroup_dops = { |
| 1453 | .d_iput = cgroup_diput, | 1459 | .d_iput = cgroup_diput, |
| 1460 | .d_delete = cgroup_delete, | ||
| 1454 | }; | 1461 | }; |
| 1455 | 1462 | ||
| 1456 | struct inode *inode = | 1463 | struct inode *inode = |
| @@ -2195,12 +2202,20 @@ static const struct file_operations cgroup_file_operations = { | |||
| 2195 | }; | 2202 | }; |
| 2196 | 2203 | ||
| 2197 | static const struct inode_operations cgroup_dir_inode_operations = { | 2204 | static const struct inode_operations cgroup_dir_inode_operations = { |
| 2198 | .lookup = simple_lookup, | 2205 | .lookup = cgroup_lookup, |
| 2199 | .mkdir = cgroup_mkdir, | 2206 | .mkdir = cgroup_mkdir, |
| 2200 | .rmdir = cgroup_rmdir, | 2207 | .rmdir = cgroup_rmdir, |
| 2201 | .rename = cgroup_rename, | 2208 | .rename = cgroup_rename, |
| 2202 | }; | 2209 | }; |
| 2203 | 2210 | ||
| 2211 | static struct dentry *cgroup_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) | ||
| 2212 | { | ||
| 2213 | if (dentry->d_name.len > NAME_MAX) | ||
| 2214 | return ERR_PTR(-ENAMETOOLONG); | ||
| 2215 | d_add(dentry, NULL); | ||
| 2216 | return NULL; | ||
| 2217 | } | ||
| 2218 | |||
| 2204 | /* | 2219 | /* |
| 2205 | * Check if a file is a control file | 2220 | * Check if a file is a control file |
| 2206 | */ | 2221 | */ |
diff --git a/kernel/fork.c b/kernel/fork.c index d9b44f20b6b..25e429152dd 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -66,6 +66,7 @@ | |||
| 66 | #include <linux/posix-timers.h> | 66 | #include <linux/posix-timers.h> |
| 67 | #include <linux/user-return-notifier.h> | 67 | #include <linux/user-return-notifier.h> |
| 68 | #include <linux/oom.h> | 68 | #include <linux/oom.h> |
| 69 | #include <linux/khugepaged.h> | ||
| 69 | 70 | ||
| 70 | #include <asm/pgtable.h> | 71 | #include <asm/pgtable.h> |
| 71 | #include <asm/pgalloc.h> | 72 | #include <asm/pgalloc.h> |
| @@ -330,6 +331,9 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) | |||
| 330 | retval = ksm_fork(mm, oldmm); | 331 | retval = ksm_fork(mm, oldmm); |
| 331 | if (retval) | 332 | if (retval) |
| 332 | goto out; | 333 | goto out; |
| 334 | retval = khugepaged_fork(mm, oldmm); | ||
| 335 | if (retval) | ||
| 336 | goto out; | ||
| 333 | 337 | ||
| 334 | prev = NULL; | 338 | prev = NULL; |
| 335 | for (mpnt = oldmm->mmap; mpnt; mpnt = mpnt->vm_next) { | 339 | for (mpnt = oldmm->mmap; mpnt; mpnt = mpnt->vm_next) { |
| @@ -529,6 +533,9 @@ void __mmdrop(struct mm_struct *mm) | |||
| 529 | mm_free_pgd(mm); | 533 | mm_free_pgd(mm); |
| 530 | destroy_context(mm); | 534 | destroy_context(mm); |
| 531 | mmu_notifier_mm_destroy(mm); | 535 | mmu_notifier_mm_destroy(mm); |
| 536 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
| 537 | VM_BUG_ON(mm->pmd_huge_pte); | ||
| 538 | #endif | ||
| 532 | free_mm(mm); | 539 | free_mm(mm); |
| 533 | } | 540 | } |
| 534 | EXPORT_SYMBOL_GPL(__mmdrop); | 541 | EXPORT_SYMBOL_GPL(__mmdrop); |
| @@ -543,6 +550,7 @@ void mmput(struct mm_struct *mm) | |||
| 543 | if (atomic_dec_and_test(&mm->mm_users)) { | 550 | if (atomic_dec_and_test(&mm->mm_users)) { |
| 544 | exit_aio(mm); | 551 | exit_aio(mm); |
| 545 | ksm_exit(mm); | 552 | ksm_exit(mm); |
| 553 | khugepaged_exit(mm); /* must run before exit_mmap */ | ||
| 546 | exit_mmap(mm); | 554 | exit_mmap(mm); |
| 547 | set_mm_exe_file(mm, NULL); | 555 | set_mm_exe_file(mm, NULL); |
| 548 | if (!list_empty(&mm->mmlist)) { | 556 | if (!list_empty(&mm->mmlist)) { |
| @@ -669,6 +677,10 @@ struct mm_struct *dup_mm(struct task_struct *tsk) | |||
| 669 | mm->token_priority = 0; | 677 | mm->token_priority = 0; |
| 670 | mm->last_interval = 0; | 678 | mm->last_interval = 0; |
| 671 | 679 | ||
| 680 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
| 681 | mm->pmd_huge_pte = NULL; | ||
| 682 | #endif | ||
| 683 | |||
| 672 | if (!mm_init(mm, tsk)) | 684 | if (!mm_init(mm, tsk)) |
| 673 | goto fail_nomem; | 685 | goto fail_nomem; |
| 674 | 686 | ||
| @@ -910,6 +922,7 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk) | |||
| 910 | 922 | ||
| 911 | sig->oom_adj = current->signal->oom_adj; | 923 | sig->oom_adj = current->signal->oom_adj; |
| 912 | sig->oom_score_adj = current->signal->oom_score_adj; | 924 | sig->oom_score_adj = current->signal->oom_score_adj; |
| 925 | sig->oom_score_adj_min = current->signal->oom_score_adj_min; | ||
| 913 | 926 | ||
| 914 | mutex_init(&sig->cred_guard_mutex); | 927 | mutex_init(&sig->cred_guard_mutex); |
| 915 | 928 | ||
| @@ -1410,23 +1423,6 @@ long do_fork(unsigned long clone_flags, | |||
| 1410 | } | 1423 | } |
| 1411 | 1424 | ||
| 1412 | /* | 1425 | /* |
| 1413 | * We hope to recycle these flags after 2.6.26 | ||
| 1414 | */ | ||
| 1415 | if (unlikely(clone_flags & CLONE_STOPPED)) { | ||
| 1416 | static int __read_mostly count = 100; | ||
| 1417 | |||
| 1418 | if (count > 0 && printk_ratelimit()) { | ||
| 1419 | char comm[TASK_COMM_LEN]; | ||
| 1420 | |||
| 1421 | count--; | ||
| 1422 | printk(KERN_INFO "fork(): process `%s' used deprecated " | ||
| 1423 | "clone flags 0x%lx\n", | ||
| 1424 | get_task_comm(comm, current), | ||
| 1425 | clone_flags & CLONE_STOPPED); | ||
| 1426 | } | ||
| 1427 | } | ||
| 1428 | |||
| 1429 | /* | ||
| 1430 | * When called from kernel_thread, don't do user tracing stuff. | 1426 | * When called from kernel_thread, don't do user tracing stuff. |
| 1431 | */ | 1427 | */ |
| 1432 | if (likely(user_mode(regs))) | 1428 | if (likely(user_mode(regs))) |
| @@ -1464,16 +1460,7 @@ long do_fork(unsigned long clone_flags, | |||
| 1464 | */ | 1460 | */ |
| 1465 | p->flags &= ~PF_STARTING; | 1461 | p->flags &= ~PF_STARTING; |
| 1466 | 1462 | ||
| 1467 | if (unlikely(clone_flags & CLONE_STOPPED)) { | 1463 | wake_up_new_task(p, clone_flags); |
| 1468 | /* | ||
| 1469 | * We'll start up with an immediate SIGSTOP. | ||
| 1470 | */ | ||
| 1471 | sigaddset(&p->pending.signal, SIGSTOP); | ||
| 1472 | set_tsk_thread_flag(p, TIF_SIGPENDING); | ||
| 1473 | __set_task_state(p, TASK_STOPPED); | ||
| 1474 | } else { | ||
| 1475 | wake_up_new_task(p, clone_flags); | ||
| 1476 | } | ||
| 1477 | 1464 | ||
| 1478 | tracehook_report_clone_complete(trace, regs, | 1465 | tracehook_report_clone_complete(trace, regs, |
| 1479 | clone_flags, nr, p); | 1466 | clone_flags, nr, p); |
diff --git a/kernel/futex.c b/kernel/futex.c index 3019b92e691..b766d28accd 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
| @@ -233,7 +233,7 @@ get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key) | |||
| 233 | { | 233 | { |
| 234 | unsigned long address = (unsigned long)uaddr; | 234 | unsigned long address = (unsigned long)uaddr; |
| 235 | struct mm_struct *mm = current->mm; | 235 | struct mm_struct *mm = current->mm; |
| 236 | struct page *page; | 236 | struct page *page, *page_head; |
| 237 | int err; | 237 | int err; |
| 238 | 238 | ||
| 239 | /* | 239 | /* |
| @@ -265,11 +265,46 @@ again: | |||
| 265 | if (err < 0) | 265 | if (err < 0) |
| 266 | return err; | 266 | return err; |
| 267 | 267 | ||
| 268 | page = compound_head(page); | 268 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
| 269 | lock_page(page); | 269 | page_head = page; |
| 270 | if (!page->mapping) { | 270 | if (unlikely(PageTail(page))) { |
| 271 | unlock_page(page); | ||
| 272 | put_page(page); | 271 | put_page(page); |
| 272 | /* serialize against __split_huge_page_splitting() */ | ||
| 273 | local_irq_disable(); | ||
| 274 | if (likely(__get_user_pages_fast(address, 1, 1, &page) == 1)) { | ||
| 275 | page_head = compound_head(page); | ||
| 276 | /* | ||
| 277 | * page_head is valid pointer but we must pin | ||
| 278 | * it before taking the PG_lock and/or | ||
| 279 | * PG_compound_lock. The moment we re-enable | ||
| 280 | * irqs __split_huge_page_splitting() can | ||
| 281 | * return and the head page can be freed from | ||
| 282 | * under us. We can't take the PG_lock and/or | ||
| 283 | * PG_compound_lock on a page that could be | ||
| 284 | * freed from under us. | ||
| 285 | */ | ||
| 286 | if (page != page_head) { | ||
| 287 | get_page(page_head); | ||
| 288 | put_page(page); | ||
| 289 | } | ||
| 290 | local_irq_enable(); | ||
| 291 | } else { | ||
| 292 | local_irq_enable(); | ||
| 293 | goto again; | ||
| 294 | } | ||
| 295 | } | ||
| 296 | #else | ||
| 297 | page_head = compound_head(page); | ||
| 298 | if (page != page_head) { | ||
| 299 | get_page(page_head); | ||
| 300 | put_page(page); | ||
| 301 | } | ||
| 302 | #endif | ||
| 303 | |||
| 304 | lock_page(page_head); | ||
| 305 | if (!page_head->mapping) { | ||
| 306 | unlock_page(page_head); | ||
| 307 | put_page(page_head); | ||
| 273 | goto again; | 308 | goto again; |
| 274 | } | 309 | } |
| 275 | 310 | ||
| @@ -280,20 +315,20 @@ again: | |||
| 280 | * it's a read-only handle, it's expected that futexes attach to | 315 | * it's a read-only handle, it's expected that futexes attach to |
| 281 | * the object not the particular process. | 316 | * the object not the particular process. |
| 282 | */ | 317 | */ |
| 283 | if (PageAnon(page)) { | 318 | if (PageAnon(page_head)) { |
| 284 | key->both.offset |= FUT_OFF_MMSHARED; /* ref taken on mm */ | 319 | key->both.offset |= FUT_OFF_MMSHARED; /* ref taken on mm */ |
| 285 | key->private.mm = mm; | 320 | key->private.mm = mm; |
| 286 | key->private.address = address; | 321 | key->private.address = address; |
| 287 | } else { | 322 | } else { |
| 288 | key->both.offset |= FUT_OFF_INODE; /* inode-based key */ | 323 | key->both.offset |= FUT_OFF_INODE; /* inode-based key */ |
| 289 | key->shared.inode = page->mapping->host; | 324 | key->shared.inode = page_head->mapping->host; |
| 290 | key->shared.pgoff = page->index; | 325 | key->shared.pgoff = page_head->index; |
| 291 | } | 326 | } |
| 292 | 327 | ||
| 293 | get_futex_key_refs(key); | 328 | get_futex_key_refs(key); |
| 294 | 329 | ||
| 295 | unlock_page(page); | 330 | unlock_page(page_head); |
| 296 | put_page(page); | 331 | put_page(page_head); |
| 297 | return 0; | 332 | return 0; |
| 298 | } | 333 | } |
| 299 | 334 | ||
| @@ -791,10 +826,9 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this) | |||
| 791 | new_owner = rt_mutex_next_owner(&pi_state->pi_mutex); | 826 | new_owner = rt_mutex_next_owner(&pi_state->pi_mutex); |
| 792 | 827 | ||
| 793 | /* | 828 | /* |
| 794 | * This happens when we have stolen the lock and the original | 829 | * It is possible that the next waiter (the one that brought |
| 795 | * pending owner did not enqueue itself back on the rt_mutex. | 830 | * this owner to the kernel) timed out and is no longer |
| 796 | * Thats not a tragedy. We know that way, that a lock waiter | 831 | * waiting on the lock. |
| 797 | * is on the fly. We make the futex_q waiter the pending owner. | ||
| 798 | */ | 832 | */ |
| 799 | if (!new_owner) | 833 | if (!new_owner) |
| 800 | new_owner = this->task; | 834 | new_owner = this->task; |
diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index 9988d03797f..282f20230e6 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c | |||
| @@ -72,6 +72,8 @@ static inline int desc_node(struct irq_desc *desc) { return 0; } | |||
| 72 | 72 | ||
| 73 | static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node) | 73 | static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node) |
| 74 | { | 74 | { |
| 75 | int cpu; | ||
| 76 | |||
| 75 | desc->irq_data.irq = irq; | 77 | desc->irq_data.irq = irq; |
| 76 | desc->irq_data.chip = &no_irq_chip; | 78 | desc->irq_data.chip = &no_irq_chip; |
| 77 | desc->irq_data.chip_data = NULL; | 79 | desc->irq_data.chip_data = NULL; |
| @@ -83,7 +85,8 @@ static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node) | |||
| 83 | desc->irq_count = 0; | 85 | desc->irq_count = 0; |
| 84 | desc->irqs_unhandled = 0; | 86 | desc->irqs_unhandled = 0; |
| 85 | desc->name = NULL; | 87 | desc->name = NULL; |
| 86 | memset(desc->kstat_irqs, 0, nr_cpu_ids * sizeof(*(desc->kstat_irqs))); | 88 | for_each_possible_cpu(cpu) |
| 89 | *per_cpu_ptr(desc->kstat_irqs, cpu) = 0; | ||
| 87 | desc_smp_init(desc, node); | 90 | desc_smp_init(desc, node); |
| 88 | } | 91 | } |
| 89 | 92 | ||
| @@ -133,8 +136,7 @@ static struct irq_desc *alloc_desc(int irq, int node) | |||
| 133 | if (!desc) | 136 | if (!desc) |
| 134 | return NULL; | 137 | return NULL; |
| 135 | /* allocate based on nr_cpu_ids */ | 138 | /* allocate based on nr_cpu_ids */ |
| 136 | desc->kstat_irqs = kzalloc_node(nr_cpu_ids * sizeof(*desc->kstat_irqs), | 139 | desc->kstat_irqs = alloc_percpu(unsigned int); |
| 137 | gfp, node); | ||
| 138 | if (!desc->kstat_irqs) | 140 | if (!desc->kstat_irqs) |
| 139 | goto err_desc; | 141 | goto err_desc; |
| 140 | 142 | ||
| @@ -149,7 +151,7 @@ static struct irq_desc *alloc_desc(int irq, int node) | |||
| 149 | return desc; | 151 | return desc; |
| 150 | 152 | ||
| 151 | err_kstat: | 153 | err_kstat: |
| 152 | kfree(desc->kstat_irqs); | 154 | free_percpu(desc->kstat_irqs); |
| 153 | err_desc: | 155 | err_desc: |
| 154 | kfree(desc); | 156 | kfree(desc); |
| 155 | return NULL; | 157 | return NULL; |
| @@ -166,7 +168,7 @@ static void free_desc(unsigned int irq) | |||
| 166 | mutex_unlock(&sparse_irq_lock); | 168 | mutex_unlock(&sparse_irq_lock); |
| 167 | 169 | ||
| 168 | free_masks(desc); | 170 | free_masks(desc); |
| 169 | kfree(desc->kstat_irqs); | 171 | free_percpu(desc->kstat_irqs); |
| 170 | kfree(desc); | 172 | kfree(desc); |
| 171 | } | 173 | } |
| 172 | 174 | ||
| @@ -234,7 +236,6 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = { | |||
| 234 | } | 236 | } |
| 235 | }; | 237 | }; |
| 236 | 238 | ||
| 237 | static unsigned int kstat_irqs_all[NR_IRQS][NR_CPUS]; | ||
| 238 | int __init early_irq_init(void) | 239 | int __init early_irq_init(void) |
| 239 | { | 240 | { |
| 240 | int count, i, node = first_online_node; | 241 | int count, i, node = first_online_node; |
| @@ -250,7 +251,8 @@ int __init early_irq_init(void) | |||
| 250 | for (i = 0; i < count; i++) { | 251 | for (i = 0; i < count; i++) { |
| 251 | desc[i].irq_data.irq = i; | 252 | desc[i].irq_data.irq = i; |
| 252 | desc[i].irq_data.chip = &no_irq_chip; | 253 | desc[i].irq_data.chip = &no_irq_chip; |
| 253 | desc[i].kstat_irqs = kstat_irqs_all[i]; | 254 | /* TODO : do this allocation on-demand ... */ |
| 255 | desc[i].kstat_irqs = alloc_percpu(unsigned int); | ||
| 254 | alloc_masks(desc + i, GFP_KERNEL, node); | 256 | alloc_masks(desc + i, GFP_KERNEL, node); |
| 255 | desc_smp_init(desc + i, node); | 257 | desc_smp_init(desc + i, node); |
| 256 | lockdep_set_class(&desc[i].lock, &irq_desc_lock_class); | 258 | lockdep_set_class(&desc[i].lock, &irq_desc_lock_class); |
| @@ -275,6 +277,22 @@ static void free_desc(unsigned int irq) | |||
| 275 | 277 | ||
| 276 | static inline int alloc_descs(unsigned int start, unsigned int cnt, int node) | 278 | static inline int alloc_descs(unsigned int start, unsigned int cnt, int node) |
| 277 | { | 279 | { |
| 280 | #if defined(CONFIG_KSTAT_IRQS_ONDEMAND) | ||
| 281 | struct irq_desc *desc; | ||
| 282 | unsigned int i; | ||
| 283 | |||
| 284 | for (i = 0; i < cnt; i++) { | ||
| 285 | desc = irq_to_desc(start + i); | ||
| 286 | if (desc && !desc->kstat_irqs) { | ||
| 287 | unsigned int __percpu *stats = alloc_percpu(unsigned int); | ||
| 288 | |||
| 289 | if (!stats) | ||
| 290 | return -1; | ||
| 291 | if (cmpxchg(&desc->kstat_irqs, NULL, stats) != NULL) | ||
| 292 | free_percpu(stats); | ||
| 293 | } | ||
| 294 | } | ||
| 295 | #endif | ||
| 278 | return start; | 296 | return start; |
| 279 | } | 297 | } |
| 280 | #endif /* !CONFIG_SPARSE_IRQ */ | 298 | #endif /* !CONFIG_SPARSE_IRQ */ |
| @@ -391,7 +409,9 @@ void dynamic_irq_cleanup(unsigned int irq) | |||
| 391 | unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) | 409 | unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) |
| 392 | { | 410 | { |
| 393 | struct irq_desc *desc = irq_to_desc(irq); | 411 | struct irq_desc *desc = irq_to_desc(irq); |
| 394 | return desc ? desc->kstat_irqs[cpu] : 0; | 412 | |
| 413 | return desc && desc->kstat_irqs ? | ||
| 414 | *per_cpu_ptr(desc->kstat_irqs, cpu) : 0; | ||
| 395 | } | 415 | } |
| 396 | 416 | ||
| 397 | #ifdef CONFIG_GENERIC_HARDIRQS | 417 | #ifdef CONFIG_GENERIC_HARDIRQS |
| @@ -401,10 +421,10 @@ unsigned int kstat_irqs(unsigned int irq) | |||
| 401 | int cpu; | 421 | int cpu; |
| 402 | int sum = 0; | 422 | int sum = 0; |
| 403 | 423 | ||
| 404 | if (!desc) | 424 | if (!desc || !desc->kstat_irqs) |
| 405 | return 0; | 425 | return 0; |
| 406 | for_each_possible_cpu(cpu) | 426 | for_each_possible_cpu(cpu) |
| 407 | sum += desc->kstat_irqs[cpu]; | 427 | sum += *per_cpu_ptr(desc->kstat_irqs, cpu); |
| 408 | return sum; | 428 | return sum; |
| 409 | } | 429 | } |
| 410 | #endif /* CONFIG_GENERIC_HARDIRQS */ | 430 | #endif /* CONFIG_GENERIC_HARDIRQS */ |
diff --git a/kernel/panic.c b/kernel/panic.c index 4c13b1a88eb..991bb87a170 100644 --- a/kernel/panic.c +++ b/kernel/panic.c | |||
| @@ -34,6 +34,7 @@ static int pause_on_oops_flag; | |||
| 34 | static DEFINE_SPINLOCK(pause_on_oops_lock); | 34 | static DEFINE_SPINLOCK(pause_on_oops_lock); |
| 35 | 35 | ||
| 36 | int panic_timeout; | 36 | int panic_timeout; |
| 37 | EXPORT_SYMBOL_GPL(panic_timeout); | ||
| 37 | 38 | ||
| 38 | ATOMIC_NOTIFIER_HEAD(panic_notifier_list); | 39 | ATOMIC_NOTIFIER_HEAD(panic_notifier_list); |
| 39 | 40 | ||
diff --git a/kernel/perf_event.c b/kernel/perf_event.c index 05ebe841270..84522c79698 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c | |||
| @@ -2228,14 +2228,11 @@ find_get_context(struct pmu *pmu, struct task_struct *task, int cpu) | |||
| 2228 | unsigned long flags; | 2228 | unsigned long flags; |
| 2229 | int ctxn, err; | 2229 | int ctxn, err; |
| 2230 | 2230 | ||
| 2231 | if (!task && cpu != -1) { | 2231 | if (!task) { |
| 2232 | /* Must be root to operate on a CPU event: */ | 2232 | /* Must be root to operate on a CPU event: */ |
| 2233 | if (perf_paranoid_cpu() && !capable(CAP_SYS_ADMIN)) | 2233 | if (perf_paranoid_cpu() && !capable(CAP_SYS_ADMIN)) |
| 2234 | return ERR_PTR(-EACCES); | 2234 | return ERR_PTR(-EACCES); |
| 2235 | 2235 | ||
| 2236 | if (cpu < 0 || cpu >= nr_cpumask_bits) | ||
| 2237 | return ERR_PTR(-EINVAL); | ||
| 2238 | |||
| 2239 | /* | 2236 | /* |
| 2240 | * We could be clever and allow to attach a event to an | 2237 | * We could be clever and allow to attach a event to an |
| 2241 | * offline CPU and activate it when the CPU comes up, but | 2238 | * offline CPU and activate it when the CPU comes up, but |
| @@ -5541,6 +5538,11 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu, | |||
| 5541 | struct hw_perf_event *hwc; | 5538 | struct hw_perf_event *hwc; |
| 5542 | long err; | 5539 | long err; |
| 5543 | 5540 | ||
| 5541 | if ((unsigned)cpu >= nr_cpu_ids) { | ||
| 5542 | if (!task || cpu != -1) | ||
| 5543 | return ERR_PTR(-EINVAL); | ||
| 5544 | } | ||
| 5545 | |||
| 5544 | event = kzalloc(sizeof(*event), GFP_KERNEL); | 5546 | event = kzalloc(sizeof(*event), GFP_KERNEL); |
| 5545 | if (!event) | 5547 | if (!event) |
| 5546 | return ERR_PTR(-ENOMEM); | 5548 | return ERR_PTR(-ENOMEM); |
| @@ -5589,7 +5591,7 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu, | |||
| 5589 | 5591 | ||
| 5590 | if (!overflow_handler && parent_event) | 5592 | if (!overflow_handler && parent_event) |
| 5591 | overflow_handler = parent_event->overflow_handler; | 5593 | overflow_handler = parent_event->overflow_handler; |
| 5592 | 5594 | ||
| 5593 | event->overflow_handler = overflow_handler; | 5595 | event->overflow_handler = overflow_handler; |
| 5594 | 5596 | ||
| 5595 | if (attr->disabled) | 5597 | if (attr->disabled) |
| @@ -6494,7 +6496,6 @@ int perf_event_init_context(struct task_struct *child, int ctxn) | |||
| 6494 | 6496 | ||
| 6495 | raw_spin_lock_irqsave(&parent_ctx->lock, flags); | 6497 | raw_spin_lock_irqsave(&parent_ctx->lock, flags); |
| 6496 | parent_ctx->rotate_disable = 0; | 6498 | parent_ctx->rotate_disable = 0; |
| 6497 | raw_spin_unlock_irqrestore(&parent_ctx->lock, flags); | ||
| 6498 | 6499 | ||
| 6499 | child_ctx = child->perf_event_ctxp[ctxn]; | 6500 | child_ctx = child->perf_event_ctxp[ctxn]; |
| 6500 | 6501 | ||
| @@ -6502,12 +6503,11 @@ int perf_event_init_context(struct task_struct *child, int ctxn) | |||
| 6502 | /* | 6503 | /* |
| 6503 | * Mark the child context as a clone of the parent | 6504 | * Mark the child context as a clone of the parent |
| 6504 | * context, or of whatever the parent is a clone of. | 6505 | * context, or of whatever the parent is a clone of. |
| 6505 | * Note that if the parent is a clone, it could get | 6506 | * |
| 6506 | * uncloned at any point, but that doesn't matter | 6507 | * Note that if the parent is a clone, the holding of |
| 6507 | * because the list of events and the generation | 6508 | * parent_ctx->lock avoids it from being uncloned. |
| 6508 | * count can't have changed since we took the mutex. | ||
| 6509 | */ | 6509 | */ |
| 6510 | cloned_ctx = rcu_dereference(parent_ctx->parent_ctx); | 6510 | cloned_ctx = parent_ctx->parent_ctx; |
| 6511 | if (cloned_ctx) { | 6511 | if (cloned_ctx) { |
| 6512 | child_ctx->parent_ctx = cloned_ctx; | 6512 | child_ctx->parent_ctx = cloned_ctx; |
| 6513 | child_ctx->parent_gen = parent_ctx->parent_gen; | 6513 | child_ctx->parent_gen = parent_ctx->parent_gen; |
| @@ -6518,6 +6518,7 @@ int perf_event_init_context(struct task_struct *child, int ctxn) | |||
| 6518 | get_ctx(child_ctx->parent_ctx); | 6518 | get_ctx(child_ctx->parent_ctx); |
| 6519 | } | 6519 | } |
| 6520 | 6520 | ||
| 6521 | raw_spin_unlock_irqrestore(&parent_ctx->lock, flags); | ||
| 6521 | mutex_unlock(&parent_ctx->mutex); | 6522 | mutex_unlock(&parent_ctx->mutex); |
| 6522 | 6523 | ||
| 6523 | perf_unpin_context(parent_ctx); | 6524 | perf_unpin_context(parent_ctx); |
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig index a5aff3ebad3..265729966ec 100644 --- a/kernel/power/Kconfig +++ b/kernel/power/Kconfig | |||
| @@ -100,13 +100,9 @@ config PM_SLEEP_ADVANCED_DEBUG | |||
| 100 | depends on PM_ADVANCED_DEBUG | 100 | depends on PM_ADVANCED_DEBUG |
| 101 | default n | 101 | default n |
| 102 | 102 | ||
| 103 | config SUSPEND_NVS | ||
| 104 | bool | ||
| 105 | |||
| 106 | config SUSPEND | 103 | config SUSPEND |
| 107 | bool "Suspend to RAM and standby" | 104 | bool "Suspend to RAM and standby" |
| 108 | depends on PM && ARCH_SUSPEND_POSSIBLE | 105 | depends on PM && ARCH_SUSPEND_POSSIBLE |
| 109 | select SUSPEND_NVS if HAS_IOMEM | ||
| 110 | default y | 106 | default y |
| 111 | ---help--- | 107 | ---help--- |
| 112 | Allow the system to enter sleep states in which main memory is | 108 | Allow the system to enter sleep states in which main memory is |
| @@ -140,7 +136,6 @@ config HIBERNATION | |||
| 140 | depends on PM && SWAP && ARCH_HIBERNATION_POSSIBLE | 136 | depends on PM && SWAP && ARCH_HIBERNATION_POSSIBLE |
| 141 | select LZO_COMPRESS | 137 | select LZO_COMPRESS |
| 142 | select LZO_DECOMPRESS | 138 | select LZO_DECOMPRESS |
| 143 | select SUSPEND_NVS if HAS_IOMEM | ||
| 144 | ---help--- | 139 | ---help--- |
| 145 | Enable the suspend to disk (STD) functionality, which is usually | 140 | Enable the suspend to disk (STD) functionality, which is usually |
| 146 | called "hibernation" in user interfaces. STD checkpoints the | 141 | called "hibernation" in user interfaces. STD checkpoints the |
diff --git a/kernel/power/Makefile b/kernel/power/Makefile index b75597235d8..c350e18b53e 100644 --- a/kernel/power/Makefile +++ b/kernel/power/Makefile | |||
| @@ -7,6 +7,5 @@ obj-$(CONFIG_SUSPEND) += suspend.o | |||
| 7 | obj-$(CONFIG_PM_TEST_SUSPEND) += suspend_test.o | 7 | obj-$(CONFIG_PM_TEST_SUSPEND) += suspend_test.o |
| 8 | obj-$(CONFIG_HIBERNATION) += hibernate.o snapshot.o swap.o user.o \ | 8 | obj-$(CONFIG_HIBERNATION) += hibernate.o snapshot.o swap.o user.o \ |
| 9 | block_io.o | 9 | block_io.o |
| 10 | obj-$(CONFIG_SUSPEND_NVS) += nvs.o | ||
| 11 | 10 | ||
| 12 | obj-$(CONFIG_MAGIC_SYSRQ) += poweroff.o | 11 | obj-$(CONFIG_MAGIC_SYSRQ) += poweroff.o |
diff --git a/kernel/power/nvs.c b/kernel/power/nvs.c deleted file mode 100644 index 1836db60bbb..00000000000 --- a/kernel/power/nvs.c +++ /dev/null | |||
| @@ -1,136 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/kernel/power/hibernate_nvs.c - Routines for handling NVS memory | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008,2009 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc. | ||
| 5 | * | ||
| 6 | * This file is released under the GPLv2. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include <linux/io.h> | ||
| 10 | #include <linux/kernel.h> | ||
| 11 | #include <linux/list.h> | ||
| 12 | #include <linux/mm.h> | ||
| 13 | #include <linux/slab.h> | ||
| 14 | #include <linux/suspend.h> | ||
| 15 | |||
| 16 | /* | ||
| 17 | * Platforms, like ACPI, may want us to save some memory used by them during | ||
| 18 | * suspend and to restore the contents of this memory during the subsequent | ||
| 19 | * resume. The code below implements a mechanism allowing us to do that. | ||
| 20 | */ | ||
| 21 | |||
| 22 | struct nvs_page { | ||
| 23 | unsigned long phys_start; | ||
| 24 | unsigned int size; | ||
| 25 | void *kaddr; | ||
| 26 | void *data; | ||
| 27 | struct list_head node; | ||
| 28 | }; | ||
| 29 | |||
| 30 | static LIST_HEAD(nvs_list); | ||
| 31 | |||
| 32 | /** | ||
| 33 | * suspend_nvs_register - register platform NVS memory region to save | ||
| 34 | * @start - physical address of the region | ||
| 35 | * @size - size of the region | ||
| 36 | * | ||
| 37 | * The NVS region need not be page-aligned (both ends) and we arrange | ||
| 38 | * things so that the data from page-aligned addresses in this region will | ||
| 39 | * be copied into separate RAM pages. | ||
| 40 | */ | ||
| 41 | int suspend_nvs_register(unsigned long start, unsigned long size) | ||
| 42 | { | ||
| 43 | struct nvs_page *entry, *next; | ||
| 44 | |||
| 45 | while (size > 0) { | ||
| 46 | unsigned int nr_bytes; | ||
| 47 | |||
| 48 | entry = kzalloc(sizeof(struct nvs_page), GFP_KERNEL); | ||
| 49 | if (!entry) | ||
| 50 | goto Error; | ||
| 51 | |||
| 52 | list_add_tail(&entry->node, &nvs_list); | ||
| 53 | entry->phys_start = start; | ||
| 54 | nr_bytes = PAGE_SIZE - (start & ~PAGE_MASK); | ||
| 55 | entry->size = (size < nr_bytes) ? size : nr_bytes; | ||
| 56 | |||
| 57 | start += entry->size; | ||
| 58 | size -= entry->size; | ||
| 59 | } | ||
| 60 | return 0; | ||
| 61 | |||
| 62 | Error: | ||
| 63 | list_for_each_entry_safe(entry, next, &nvs_list, node) { | ||
| 64 | list_del(&entry->node); | ||
| 65 | kfree(entry); | ||
| 66 | } | ||
| 67 | return -ENOMEM; | ||
| 68 | } | ||
| 69 | |||
| 70 | /** | ||
| 71 | * suspend_nvs_free - free data pages allocated for saving NVS regions | ||
| 72 | */ | ||
| 73 | void suspend_nvs_free(void) | ||
| 74 | { | ||
| 75 | struct nvs_page *entry; | ||
| 76 | |||
| 77 | list_for_each_entry(entry, &nvs_list, node) | ||
| 78 | if (entry->data) { | ||
| 79 | free_page((unsigned long)entry->data); | ||
| 80 | entry->data = NULL; | ||
| 81 | if (entry->kaddr) { | ||
| 82 | iounmap(entry->kaddr); | ||
| 83 | entry->kaddr = NULL; | ||
| 84 | } | ||
| 85 | } | ||
| 86 | } | ||
| 87 | |||
| 88 | /** | ||
| 89 | * suspend_nvs_alloc - allocate memory necessary for saving NVS regions | ||
| 90 | */ | ||
| 91 | int suspend_nvs_alloc(void) | ||
| 92 | { | ||
| 93 | struct nvs_page *entry; | ||
| 94 | |||
| 95 | list_for_each_entry(entry, &nvs_list, node) { | ||
| 96 | entry->data = (void *)__get_free_page(GFP_KERNEL); | ||
| 97 | if (!entry->data) { | ||
| 98 | suspend_nvs_free(); | ||
| 99 | return -ENOMEM; | ||
| 100 | } | ||
| 101 | } | ||
| 102 | return 0; | ||
| 103 | } | ||
| 104 | |||
| 105 | /** | ||
| 106 | * suspend_nvs_save - save NVS memory regions | ||
| 107 | */ | ||
| 108 | void suspend_nvs_save(void) | ||
| 109 | { | ||
| 110 | struct nvs_page *entry; | ||
| 111 | |||
| 112 | printk(KERN_INFO "PM: Saving platform NVS memory\n"); | ||
| 113 | |||
| 114 | list_for_each_entry(entry, &nvs_list, node) | ||
| 115 | if (entry->data) { | ||
| 116 | entry->kaddr = ioremap(entry->phys_start, entry->size); | ||
| 117 | memcpy(entry->data, entry->kaddr, entry->size); | ||
| 118 | } | ||
| 119 | } | ||
| 120 | |||
| 121 | /** | ||
| 122 | * suspend_nvs_restore - restore NVS memory regions | ||
| 123 | * | ||
| 124 | * This function is going to be called with interrupts disabled, so it | ||
| 125 | * cannot iounmap the virtual addresses used to access the NVS region. | ||
| 126 | */ | ||
| 127 | void suspend_nvs_restore(void) | ||
| 128 | { | ||
| 129 | struct nvs_page *entry; | ||
| 130 | |||
| 131 | printk(KERN_INFO "PM: Restoring platform NVS memory\n"); | ||
| 132 | |||
| 133 | list_for_each_entry(entry, &nvs_list, node) | ||
| 134 | if (entry->data) | ||
| 135 | memcpy(entry->kaddr, entry->data, entry->size); | ||
| 136 | } | ||
diff --git a/kernel/rcutiny.c b/kernel/rcutiny.c index 03449372474..0c343b9a46d 100644 --- a/kernel/rcutiny.c +++ b/kernel/rcutiny.c | |||
| @@ -189,7 +189,8 @@ static int rcu_kthread(void *arg) | |||
| 189 | unsigned long flags; | 189 | unsigned long flags; |
| 190 | 190 | ||
| 191 | for (;;) { | 191 | for (;;) { |
| 192 | wait_event(rcu_kthread_wq, have_rcu_kthread_work != 0); | 192 | wait_event_interruptible(rcu_kthread_wq, |
| 193 | have_rcu_kthread_work != 0); | ||
| 193 | morework = rcu_boost(); | 194 | morework = rcu_boost(); |
| 194 | local_irq_save(flags); | 195 | local_irq_save(flags); |
| 195 | work = have_rcu_kthread_work; | 196 | work = have_rcu_kthread_work; |
diff --git a/kernel/srcu.c b/kernel/srcu.c index 98d8c1e80ed..73ce23feaea 100644 --- a/kernel/srcu.c +++ b/kernel/srcu.c | |||
| @@ -156,6 +156,16 @@ void __srcu_read_unlock(struct srcu_struct *sp, int idx) | |||
| 156 | EXPORT_SYMBOL_GPL(__srcu_read_unlock); | 156 | EXPORT_SYMBOL_GPL(__srcu_read_unlock); |
| 157 | 157 | ||
| 158 | /* | 158 | /* |
| 159 | * We use an adaptive strategy for synchronize_srcu() and especially for | ||
| 160 | * synchronize_srcu_expedited(). We spin for a fixed time period | ||
| 161 | * (defined below) to allow SRCU readers to exit their read-side critical | ||
| 162 | * sections. If there are still some readers after 10 microseconds, | ||
| 163 | * we repeatedly block for 1-millisecond time periods. This approach | ||
| 164 | * has done well in testing, so there is no need for a config parameter. | ||
| 165 | */ | ||
| 166 | #define SYNCHRONIZE_SRCU_READER_DELAY 10 | ||
| 167 | |||
| 168 | /* | ||
| 159 | * Helper function for synchronize_srcu() and synchronize_srcu_expedited(). | 169 | * Helper function for synchronize_srcu() and synchronize_srcu_expedited(). |
| 160 | */ | 170 | */ |
| 161 | static void __synchronize_srcu(struct srcu_struct *sp, void (*sync_func)(void)) | 171 | static void __synchronize_srcu(struct srcu_struct *sp, void (*sync_func)(void)) |
| @@ -207,11 +217,12 @@ static void __synchronize_srcu(struct srcu_struct *sp, void (*sync_func)(void)) | |||
| 207 | * will have finished executing. We initially give readers | 217 | * will have finished executing. We initially give readers |
| 208 | * an arbitrarily chosen 10 microseconds to get out of their | 218 | * an arbitrarily chosen 10 microseconds to get out of their |
| 209 | * SRCU read-side critical sections, then loop waiting 1/HZ | 219 | * SRCU read-side critical sections, then loop waiting 1/HZ |
| 210 | * seconds per iteration. | 220 | * seconds per iteration. The 10-microsecond value has done |
| 221 | * very well in testing. | ||
| 211 | */ | 222 | */ |
| 212 | 223 | ||
| 213 | if (srcu_readers_active_idx(sp, idx)) | 224 | if (srcu_readers_active_idx(sp, idx)) |
| 214 | udelay(CONFIG_SRCU_SYNCHRONIZE_DELAY); | 225 | udelay(SYNCHRONIZE_SRCU_READER_DELAY); |
| 215 | while (srcu_readers_active_idx(sp, idx)) | 226 | while (srcu_readers_active_idx(sp, idx)) |
| 216 | schedule_timeout_interruptible(1); | 227 | schedule_timeout_interruptible(1); |
| 217 | 228 | ||
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index c50a034de30..6519cf62d9c 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c | |||
| @@ -113,7 +113,7 @@ EXPORT_SYMBOL_GPL(timecounter_cyc2time); | |||
| 113 | * @shift: pointer to shift variable | 113 | * @shift: pointer to shift variable |
| 114 | * @from: frequency to convert from | 114 | * @from: frequency to convert from |
| 115 | * @to: frequency to convert to | 115 | * @to: frequency to convert to |
| 116 | * @minsec: guaranteed runtime conversion range in seconds | 116 | * @maxsec: guaranteed runtime conversion range in seconds |
| 117 | * | 117 | * |
| 118 | * The function evaluates the shift/mult pair for the scaled math | 118 | * The function evaluates the shift/mult pair for the scaled math |
| 119 | * operations of clocksources and clockevents. | 119 | * operations of clocksources and clockevents. |
| @@ -122,7 +122,7 @@ EXPORT_SYMBOL_GPL(timecounter_cyc2time); | |||
| 122 | * NSEC_PER_SEC == 1GHz and @from is the counter frequency. For clock | 122 | * NSEC_PER_SEC == 1GHz and @from is the counter frequency. For clock |
| 123 | * event @to is the counter frequency and @from is NSEC_PER_SEC. | 123 | * event @to is the counter frequency and @from is NSEC_PER_SEC. |
| 124 | * | 124 | * |
| 125 | * The @minsec conversion range argument controls the time frame in | 125 | * The @maxsec conversion range argument controls the time frame in |
| 126 | * seconds which must be covered by the runtime conversion with the | 126 | * seconds which must be covered by the runtime conversion with the |
| 127 | * calculated mult and shift factors. This guarantees that no 64bit | 127 | * calculated mult and shift factors. This guarantees that no 64bit |
| 128 | * overflow happens when the input value of the conversion is | 128 | * overflow happens when the input value of the conversion is |
| @@ -131,7 +131,7 @@ EXPORT_SYMBOL_GPL(timecounter_cyc2time); | |||
| 131 | * factors. | 131 | * factors. |
| 132 | */ | 132 | */ |
| 133 | void | 133 | void |
| 134 | clocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 minsec) | 134 | clocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 maxsec) |
| 135 | { | 135 | { |
| 136 | u64 tmp; | 136 | u64 tmp; |
| 137 | u32 sft, sftacc= 32; | 137 | u32 sft, sftacc= 32; |
| @@ -140,7 +140,7 @@ clocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 minsec) | |||
| 140 | * Calculate the shift factor which is limiting the conversion | 140 | * Calculate the shift factor which is limiting the conversion |
| 141 | * range: | 141 | * range: |
| 142 | */ | 142 | */ |
| 143 | tmp = ((u64)minsec * from) >> 32; | 143 | tmp = ((u64)maxsec * from) >> 32; |
| 144 | while (tmp) { | 144 | while (tmp) { |
| 145 | tmp >>=1; | 145 | tmp >>=1; |
| 146 | sftacc--; | 146 | sftacc--; |
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 5536aaf3ba3..d27c7562902 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
| @@ -49,7 +49,7 @@ struct timekeeper { | |||
| 49 | u32 mult; | 49 | u32 mult; |
| 50 | }; | 50 | }; |
| 51 | 51 | ||
| 52 | struct timekeeper timekeeper; | 52 | static struct timekeeper timekeeper; |
| 53 | 53 | ||
| 54 | /** | 54 | /** |
| 55 | * timekeeper_setup_internals - Set up internals to use clocksource clock. | 55 | * timekeeper_setup_internals - Set up internals to use clocksource clock. |
| @@ -164,7 +164,7 @@ static struct timespec total_sleep_time; | |||
| 164 | /* | 164 | /* |
| 165 | * The raw monotonic time for the CLOCK_MONOTONIC_RAW posix clock. | 165 | * The raw monotonic time for the CLOCK_MONOTONIC_RAW posix clock. |
| 166 | */ | 166 | */ |
| 167 | struct timespec raw_time; | 167 | static struct timespec raw_time; |
| 168 | 168 | ||
| 169 | /* flag for if timekeeping is suspended */ | 169 | /* flag for if timekeeping is suspended */ |
| 170 | int __read_mostly timekeeping_suspended; | 170 | int __read_mostly timekeeping_suspended; |
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index bac752f0cfb..b706529b4fc 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c | |||
| @@ -23,9 +23,6 @@ static int syscall_exit_register(struct ftrace_event_call *event, | |||
| 23 | static int syscall_enter_define_fields(struct ftrace_event_call *call); | 23 | static int syscall_enter_define_fields(struct ftrace_event_call *call); |
| 24 | static int syscall_exit_define_fields(struct ftrace_event_call *call); | 24 | static int syscall_exit_define_fields(struct ftrace_event_call *call); |
| 25 | 25 | ||
| 26 | /* All syscall exit events have the same fields */ | ||
| 27 | static LIST_HEAD(syscall_exit_fields); | ||
| 28 | |||
| 29 | static struct list_head * | 26 | static struct list_head * |
| 30 | syscall_get_enter_fields(struct ftrace_event_call *call) | 27 | syscall_get_enter_fields(struct ftrace_event_call *call) |
| 31 | { | 28 | { |
| @@ -34,34 +31,28 @@ syscall_get_enter_fields(struct ftrace_event_call *call) | |||
| 34 | return &entry->enter_fields; | 31 | return &entry->enter_fields; |
| 35 | } | 32 | } |
| 36 | 33 | ||
| 37 | static struct list_head * | ||
| 38 | syscall_get_exit_fields(struct ftrace_event_call *call) | ||
| 39 | { | ||
| 40 | return &syscall_exit_fields; | ||
| 41 | } | ||
| 42 | |||
| 43 | struct trace_event_functions enter_syscall_print_funcs = { | 34 | struct trace_event_functions enter_syscall_print_funcs = { |
| 44 | .trace = print_syscall_enter, | 35 | .trace = print_syscall_enter, |
| 45 | }; | 36 | }; |
| 46 | 37 | ||
| 47 | struct trace_event_functions exit_syscall_print_funcs = { | 38 | struct trace_event_functions exit_syscall_print_funcs = { |
| 48 | .trace = print_syscall_exit, | 39 | .trace = print_syscall_exit, |
| 49 | }; | 40 | }; |
| 50 | 41 | ||
| 51 | struct ftrace_event_class event_class_syscall_enter = { | 42 | struct ftrace_event_class event_class_syscall_enter = { |
| 52 | .system = "syscalls", | 43 | .system = "syscalls", |
| 53 | .reg = syscall_enter_register, | 44 | .reg = syscall_enter_register, |
| 54 | .define_fields = syscall_enter_define_fields, | 45 | .define_fields = syscall_enter_define_fields, |
| 55 | .get_fields = syscall_get_enter_fields, | 46 | .get_fields = syscall_get_enter_fields, |
| 56 | .raw_init = init_syscall_trace, | 47 | .raw_init = init_syscall_trace, |
| 57 | }; | 48 | }; |
| 58 | 49 | ||
| 59 | struct ftrace_event_class event_class_syscall_exit = { | 50 | struct ftrace_event_class event_class_syscall_exit = { |
| 60 | .system = "syscalls", | 51 | .system = "syscalls", |
| 61 | .reg = syscall_exit_register, | 52 | .reg = syscall_exit_register, |
| 62 | .define_fields = syscall_exit_define_fields, | 53 | .define_fields = syscall_exit_define_fields, |
| 63 | .get_fields = syscall_get_exit_fields, | 54 | .fields = LIST_HEAD_INIT(event_class_syscall_exit.fields), |
| 64 | .raw_init = init_syscall_trace, | 55 | .raw_init = init_syscall_trace, |
| 65 | }; | 56 | }; |
| 66 | 57 | ||
| 67 | extern unsigned long __start_syscalls_metadata[]; | 58 | extern unsigned long __start_syscalls_metadata[]; |
