diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cgroup.c | 6 | ||||
| -rw-r--r-- | kernel/fork.c | 21 | ||||
| -rw-r--r-- | kernel/module.c | 5 | ||||
| -rw-r--r-- | kernel/panic.c | 2 | ||||
| -rw-r--r-- | kernel/pid.c | 15 | ||||
| -rw-r--r-- | kernel/power/process.c | 1 | ||||
| -rw-r--r-- | kernel/power/snapshot.c | 2 | ||||
| -rw-r--r-- | kernel/sched.c | 13 | ||||
| -rw-r--r-- | kernel/trace/Kconfig | 2 | ||||
| -rw-r--r-- | kernel/trace/trace_hw_branches.c | 2 | ||||
| -rw-r--r-- | kernel/tracepoint.c | 2 |
11 files changed, 51 insertions, 20 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index c7ece8f027f2..213b7f92fcdd 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
| @@ -596,7 +596,7 @@ void cgroup_unlock(void) | |||
| 596 | static int cgroup_mkdir(struct inode *dir, struct dentry *dentry, int mode); | 596 | static int cgroup_mkdir(struct inode *dir, struct dentry *dentry, int mode); |
| 597 | static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry); | 597 | static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry); |
| 598 | static int cgroup_populate_dir(struct cgroup *cgrp); | 598 | static int cgroup_populate_dir(struct cgroup *cgrp); |
| 599 | static struct inode_operations cgroup_dir_inode_operations; | 599 | static const struct inode_operations cgroup_dir_inode_operations; |
| 600 | static struct file_operations proc_cgroupstats_operations; | 600 | static struct file_operations proc_cgroupstats_operations; |
| 601 | 601 | ||
| 602 | static struct backing_dev_info cgroup_backing_dev_info = { | 602 | static struct backing_dev_info cgroup_backing_dev_info = { |
| @@ -961,7 +961,7 @@ static int cgroup_remount(struct super_block *sb, int *flags, char *data) | |||
| 961 | return ret; | 961 | return ret; |
| 962 | } | 962 | } |
| 963 | 963 | ||
| 964 | static struct super_operations cgroup_ops = { | 964 | static const struct super_operations cgroup_ops = { |
| 965 | .statfs = simple_statfs, | 965 | .statfs = simple_statfs, |
| 966 | .drop_inode = generic_delete_inode, | 966 | .drop_inode = generic_delete_inode, |
| 967 | .show_options = cgroup_show_options, | 967 | .show_options = cgroup_show_options, |
| @@ -1711,7 +1711,7 @@ static struct file_operations cgroup_file_operations = { | |||
| 1711 | .release = cgroup_file_release, | 1711 | .release = cgroup_file_release, |
| 1712 | }; | 1712 | }; |
| 1713 | 1713 | ||
| 1714 | static struct inode_operations cgroup_dir_inode_operations = { | 1714 | static const struct inode_operations cgroup_dir_inode_operations = { |
| 1715 | .lookup = simple_lookup, | 1715 | .lookup = simple_lookup, |
| 1716 | .mkdir = cgroup_mkdir, | 1716 | .mkdir = cgroup_mkdir, |
| 1717 | .rmdir = cgroup_rmdir, | 1717 | .rmdir = cgroup_rmdir, |
diff --git a/kernel/fork.c b/kernel/fork.c index 2cebfb23b0b8..1020977b57ca 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -49,6 +49,7 @@ | |||
| 49 | #include <linux/ftrace.h> | 49 | #include <linux/ftrace.h> |
| 50 | #include <linux/profile.h> | 50 | #include <linux/profile.h> |
| 51 | #include <linux/rmap.h> | 51 | #include <linux/rmap.h> |
| 52 | #include <linux/ksm.h> | ||
| 52 | #include <linux/acct.h> | 53 | #include <linux/acct.h> |
| 53 | #include <linux/tsacct_kern.h> | 54 | #include <linux/tsacct_kern.h> |
| 54 | #include <linux/cn_proc.h> | 55 | #include <linux/cn_proc.h> |
| @@ -136,9 +137,17 @@ struct kmem_cache *vm_area_cachep; | |||
| 136 | /* SLAB cache for mm_struct structures (tsk->mm) */ | 137 | /* SLAB cache for mm_struct structures (tsk->mm) */ |
| 137 | static struct kmem_cache *mm_cachep; | 138 | static struct kmem_cache *mm_cachep; |
| 138 | 139 | ||
| 140 | static void account_kernel_stack(struct thread_info *ti, int account) | ||
| 141 | { | ||
| 142 | struct zone *zone = page_zone(virt_to_page(ti)); | ||
| 143 | |||
| 144 | mod_zone_page_state(zone, NR_KERNEL_STACK, account); | ||
| 145 | } | ||
| 146 | |||
| 139 | void free_task(struct task_struct *tsk) | 147 | void free_task(struct task_struct *tsk) |
| 140 | { | 148 | { |
| 141 | prop_local_destroy_single(&tsk->dirties); | 149 | prop_local_destroy_single(&tsk->dirties); |
| 150 | account_kernel_stack(tsk->stack, -1); | ||
| 142 | free_thread_info(tsk->stack); | 151 | free_thread_info(tsk->stack); |
| 143 | rt_mutex_debug_task_free(tsk); | 152 | rt_mutex_debug_task_free(tsk); |
| 144 | ftrace_graph_exit_task(tsk); | 153 | ftrace_graph_exit_task(tsk); |
| @@ -253,6 +262,9 @@ static struct task_struct *dup_task_struct(struct task_struct *orig) | |||
| 253 | tsk->btrace_seq = 0; | 262 | tsk->btrace_seq = 0; |
| 254 | #endif | 263 | #endif |
| 255 | tsk->splice_pipe = NULL; | 264 | tsk->splice_pipe = NULL; |
| 265 | |||
| 266 | account_kernel_stack(ti, 1); | ||
| 267 | |||
| 256 | return tsk; | 268 | return tsk; |
| 257 | 269 | ||
| 258 | out: | 270 | out: |
| @@ -288,6 +300,9 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) | |||
| 288 | rb_link = &mm->mm_rb.rb_node; | 300 | rb_link = &mm->mm_rb.rb_node; |
| 289 | rb_parent = NULL; | 301 | rb_parent = NULL; |
| 290 | pprev = &mm->mmap; | 302 | pprev = &mm->mmap; |
| 303 | retval = ksm_fork(mm, oldmm); | ||
| 304 | if (retval) | ||
| 305 | goto out; | ||
| 291 | 306 | ||
| 292 | for (mpnt = oldmm->mmap; mpnt; mpnt = mpnt->vm_next) { | 307 | for (mpnt = oldmm->mmap; mpnt; mpnt = mpnt->vm_next) { |
| 293 | struct file *file; | 308 | struct file *file; |
| @@ -424,7 +439,8 @@ static struct mm_struct * mm_init(struct mm_struct * mm, struct task_struct *p) | |||
| 424 | atomic_set(&mm->mm_count, 1); | 439 | atomic_set(&mm->mm_count, 1); |
| 425 | init_rwsem(&mm->mmap_sem); | 440 | init_rwsem(&mm->mmap_sem); |
| 426 | INIT_LIST_HEAD(&mm->mmlist); | 441 | INIT_LIST_HEAD(&mm->mmlist); |
| 427 | mm->flags = (current->mm) ? current->mm->flags : default_dump_filter; | 442 | mm->flags = (current->mm) ? |
| 443 | (current->mm->flags & MMF_INIT_MASK) : default_dump_filter; | ||
| 428 | mm->core_state = NULL; | 444 | mm->core_state = NULL; |
| 429 | mm->nr_ptes = 0; | 445 | mm->nr_ptes = 0; |
| 430 | set_mm_counter(mm, file_rss, 0); | 446 | set_mm_counter(mm, file_rss, 0); |
| @@ -485,6 +501,7 @@ void mmput(struct mm_struct *mm) | |||
| 485 | 501 | ||
| 486 | if (atomic_dec_and_test(&mm->mm_users)) { | 502 | if (atomic_dec_and_test(&mm->mm_users)) { |
| 487 | exit_aio(mm); | 503 | exit_aio(mm); |
| 504 | ksm_exit(mm); | ||
| 488 | exit_mmap(mm); | 505 | exit_mmap(mm); |
| 489 | set_mm_exe_file(mm, NULL); | 506 | set_mm_exe_file(mm, NULL); |
| 490 | if (!list_empty(&mm->mmlist)) { | 507 | if (!list_empty(&mm->mmlist)) { |
| @@ -863,6 +880,8 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk) | |||
| 863 | 880 | ||
| 864 | tty_audit_fork(sig); | 881 | tty_audit_fork(sig); |
| 865 | 882 | ||
| 883 | sig->oom_adj = current->signal->oom_adj; | ||
| 884 | |||
| 866 | return 0; | 885 | return 0; |
| 867 | } | 886 | } |
| 868 | 887 | ||
diff --git a/kernel/module.c b/kernel/module.c index b6ee424245dd..e6bc4b28aa62 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
| @@ -47,6 +47,7 @@ | |||
| 47 | #include <linux/rculist.h> | 47 | #include <linux/rculist.h> |
| 48 | #include <asm/uaccess.h> | 48 | #include <asm/uaccess.h> |
| 49 | #include <asm/cacheflush.h> | 49 | #include <asm/cacheflush.h> |
| 50 | #include <asm/mmu_context.h> | ||
| 50 | #include <linux/license.h> | 51 | #include <linux/license.h> |
| 51 | #include <asm/sections.h> | 52 | #include <asm/sections.h> |
| 52 | #include <linux/tracepoint.h> | 53 | #include <linux/tracepoint.h> |
| @@ -1535,6 +1536,10 @@ static void free_module(struct module *mod) | |||
| 1535 | 1536 | ||
| 1536 | /* Finally, free the core (containing the module structure) */ | 1537 | /* Finally, free the core (containing the module structure) */ |
| 1537 | module_free(mod, mod->module_core); | 1538 | module_free(mod, mod->module_core); |
| 1539 | |||
| 1540 | #ifdef CONFIG_MPU | ||
| 1541 | update_protections(current->mm); | ||
| 1542 | #endif | ||
| 1538 | } | 1543 | } |
| 1539 | 1544 | ||
| 1540 | void *__symbol_get(const char *symbol) | 1545 | void *__symbol_get(const char *symbol) |
diff --git a/kernel/panic.c b/kernel/panic.c index 512ab73b0ca3..bcdef26e3332 100644 --- a/kernel/panic.c +++ b/kernel/panic.c | |||
| @@ -177,7 +177,7 @@ static const struct tnt tnts[] = { | |||
| 177 | * 'W' - Taint on warning. | 177 | * 'W' - Taint on warning. |
| 178 | * 'C' - modules from drivers/staging are loaded. | 178 | * 'C' - modules from drivers/staging are loaded. |
| 179 | * | 179 | * |
| 180 | * The string is overwritten by the next call to print_taint(). | 180 | * The string is overwritten by the next call to print_tainted(). |
| 181 | */ | 181 | */ |
| 182 | const char *print_tainted(void) | 182 | const char *print_tainted(void) |
| 183 | { | 183 | { |
diff --git a/kernel/pid.c b/kernel/pid.c index 31310b5d3f50..d3f722d20f9c 100644 --- a/kernel/pid.c +++ b/kernel/pid.c | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | #define pid_hashfn(nr, ns) \ | 40 | #define pid_hashfn(nr, ns) \ |
| 41 | hash_long((unsigned long)nr + (unsigned long)ns, pidhash_shift) | 41 | hash_long((unsigned long)nr + (unsigned long)ns, pidhash_shift) |
| 42 | static struct hlist_head *pid_hash; | 42 | static struct hlist_head *pid_hash; |
| 43 | static int pidhash_shift; | 43 | static unsigned int pidhash_shift = 4; |
| 44 | struct pid init_struct_pid = INIT_STRUCT_PID; | 44 | struct pid init_struct_pid = INIT_STRUCT_PID; |
| 45 | 45 | ||
| 46 | int pid_max = PID_MAX_DEFAULT; | 46 | int pid_max = PID_MAX_DEFAULT; |
| @@ -499,19 +499,12 @@ struct pid *find_ge_pid(int nr, struct pid_namespace *ns) | |||
| 499 | void __init pidhash_init(void) | 499 | void __init pidhash_init(void) |
| 500 | { | 500 | { |
| 501 | int i, pidhash_size; | 501 | int i, pidhash_size; |
| 502 | unsigned long megabytes = nr_kernel_pages >> (20 - PAGE_SHIFT); | ||
| 503 | 502 | ||
| 504 | pidhash_shift = max(4, fls(megabytes * 4)); | 503 | pid_hash = alloc_large_system_hash("PID", sizeof(*pid_hash), 0, 18, |
| 505 | pidhash_shift = min(12, pidhash_shift); | 504 | HASH_EARLY | HASH_SMALL, |
| 505 | &pidhash_shift, NULL, 4096); | ||
| 506 | pidhash_size = 1 << pidhash_shift; | 506 | pidhash_size = 1 << pidhash_shift; |
| 507 | 507 | ||
| 508 | printk("PID hash table entries: %d (order: %d, %Zd bytes)\n", | ||
| 509 | pidhash_size, pidhash_shift, | ||
| 510 | pidhash_size * sizeof(struct hlist_head)); | ||
| 511 | |||
| 512 | pid_hash = alloc_bootmem(pidhash_size * sizeof(*(pid_hash))); | ||
| 513 | if (!pid_hash) | ||
| 514 | panic("Could not alloc pidhash!\n"); | ||
| 515 | for (i = 0; i < pidhash_size; i++) | 508 | for (i = 0; i < pidhash_size; i++) |
| 516 | INIT_HLIST_HEAD(&pid_hash[i]); | 509 | INIT_HLIST_HEAD(&pid_hash[i]); |
| 517 | } | 510 | } |
diff --git a/kernel/power/process.c b/kernel/power/process.c index da2072d73811..cc2e55373b68 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #undef DEBUG | 9 | #undef DEBUG |
| 10 | 10 | ||
| 11 | #include <linux/interrupt.h> | 11 | #include <linux/interrupt.h> |
| 12 | #include <linux/oom.h> | ||
| 12 | #include <linux/suspend.h> | 13 | #include <linux/suspend.h> |
| 13 | #include <linux/module.h> | 14 | #include <linux/module.h> |
| 14 | #include <linux/syscalls.h> | 15 | #include <linux/syscalls.h> |
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c index 97955b0e44f4..36cb168e4330 100644 --- a/kernel/power/snapshot.c +++ b/kernel/power/snapshot.c | |||
| @@ -619,7 +619,7 @@ __register_nosave_region(unsigned long start_pfn, unsigned long end_pfn, | |||
| 619 | BUG_ON(!region); | 619 | BUG_ON(!region); |
| 620 | } else | 620 | } else |
| 621 | /* This allocation cannot fail */ | 621 | /* This allocation cannot fail */ |
| 622 | region = alloc_bootmem_low(sizeof(struct nosave_region)); | 622 | region = alloc_bootmem(sizeof(struct nosave_region)); |
| 623 | region->start_pfn = start_pfn; | 623 | region->start_pfn = start_pfn; |
| 624 | region->end_pfn = end_pfn; | 624 | region->end_pfn = end_pfn; |
| 625 | list_add_tail(®ion->list, &nosave_regions); | 625 | list_add_tail(®ion->list, &nosave_regions); |
diff --git a/kernel/sched.c b/kernel/sched.c index 91843ba7f237..0ac9053c21d6 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -2904,6 +2904,19 @@ unsigned long nr_iowait(void) | |||
| 2904 | return sum; | 2904 | return sum; |
| 2905 | } | 2905 | } |
| 2906 | 2906 | ||
| 2907 | unsigned long nr_iowait_cpu(void) | ||
| 2908 | { | ||
| 2909 | struct rq *this = this_rq(); | ||
| 2910 | return atomic_read(&this->nr_iowait); | ||
| 2911 | } | ||
| 2912 | |||
| 2913 | unsigned long this_cpu_load(void) | ||
| 2914 | { | ||
| 2915 | struct rq *this = this_rq(); | ||
| 2916 | return this->cpu_load[0]; | ||
| 2917 | } | ||
| 2918 | |||
| 2919 | |||
| 2907 | /* Variables and functions for calc_load */ | 2920 | /* Variables and functions for calc_load */ |
| 2908 | static atomic_long_t calc_load_tasks; | 2921 | static atomic_long_t calc_load_tasks; |
| 2909 | static unsigned long calc_load_update; | 2922 | static unsigned long calc_load_update; |
diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig index e71634604400..b416512ad17f 100644 --- a/kernel/trace/Kconfig +++ b/kernel/trace/Kconfig | |||
| @@ -83,7 +83,7 @@ config RING_BUFFER_ALLOW_SWAP | |||
| 83 | # This allows those options to appear when no other tracer is selected. But the | 83 | # This allows those options to appear when no other tracer is selected. But the |
| 84 | # options do not appear when something else selects it. We need the two options | 84 | # options do not appear when something else selects it. We need the two options |
| 85 | # GENERIC_TRACER and TRACING to avoid circular dependencies to accomplish the | 85 | # GENERIC_TRACER and TRACING to avoid circular dependencies to accomplish the |
| 86 | # hidding of the automatic options options. | 86 | # hidding of the automatic options. |
| 87 | 87 | ||
| 88 | config TRACING | 88 | config TRACING |
| 89 | bool | 89 | bool |
diff --git a/kernel/trace/trace_hw_branches.c b/kernel/trace/trace_hw_branches.c index ca7d7c4d0c2a..23b63859130e 100644 --- a/kernel/trace/trace_hw_branches.c +++ b/kernel/trace/trace_hw_branches.c | |||
| @@ -155,7 +155,7 @@ static enum print_line_t bts_trace_print_line(struct trace_iterator *iter) | |||
| 155 | seq_print_ip_sym(seq, it->from, symflags) && | 155 | seq_print_ip_sym(seq, it->from, symflags) && |
| 156 | trace_seq_printf(seq, "\n")) | 156 | trace_seq_printf(seq, "\n")) |
| 157 | return TRACE_TYPE_HANDLED; | 157 | return TRACE_TYPE_HANDLED; |
| 158 | return TRACE_TYPE_PARTIAL_LINE;; | 158 | return TRACE_TYPE_PARTIAL_LINE; |
| 159 | } | 159 | } |
| 160 | return TRACE_TYPE_UNHANDLED; | 160 | return TRACE_TYPE_UNHANDLED; |
| 161 | } | 161 | } |
diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c index 9489a0a9b1be..cc89be5bc0f8 100644 --- a/kernel/tracepoint.c +++ b/kernel/tracepoint.c | |||
| @@ -48,7 +48,7 @@ static struct hlist_head tracepoint_table[TRACEPOINT_TABLE_SIZE]; | |||
| 48 | 48 | ||
| 49 | /* | 49 | /* |
| 50 | * Note about RCU : | 50 | * Note about RCU : |
| 51 | * It is used to to delay the free of multiple probes array until a quiescent | 51 | * It is used to delay the free of multiple probes array until a quiescent |
| 52 | * state is reached. | 52 | * state is reached. |
| 53 | * Tracepoint entries modifications are protected by the tracepoints_mutex. | 53 | * Tracepoint entries modifications are protected by the tracepoints_mutex. |
| 54 | */ | 54 | */ |
