diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/params.c | 65 | ||||
-rw-r--r-- | kernel/perf_event.c | 46 | ||||
-rw-r--r-- | kernel/printk.c | 100 | ||||
-rw-r--r-- | kernel/sched_fair.c | 91 | ||||
-rw-r--r-- | kernel/sysctl.c | 3 | ||||
-rw-r--r-- | kernel/time/tick-sched.c | 7 |
6 files changed, 199 insertions, 113 deletions
diff --git a/kernel/params.c b/kernel/params.c index 08107d181758..0da1411222b9 100644 --- a/kernel/params.c +++ b/kernel/params.c | |||
@@ -719,9 +719,7 @@ void destroy_params(const struct kernel_param *params, unsigned num) | |||
719 | params[i].ops->free(params[i].arg); | 719 | params[i].ops->free(params[i].arg); |
720 | } | 720 | } |
721 | 721 | ||
722 | static void __init kernel_add_sysfs_param(const char *name, | 722 | static struct module_kobject * __init locate_module_kobject(const char *name) |
723 | struct kernel_param *kparam, | ||
724 | unsigned int name_skip) | ||
725 | { | 723 | { |
726 | struct module_kobject *mk; | 724 | struct module_kobject *mk; |
727 | struct kobject *kobj; | 725 | struct kobject *kobj; |
@@ -729,10 +727,7 @@ static void __init kernel_add_sysfs_param(const char *name, | |||
729 | 727 | ||
730 | kobj = kset_find_obj(module_kset, name); | 728 | kobj = kset_find_obj(module_kset, name); |
731 | if (kobj) { | 729 | if (kobj) { |
732 | /* We already have one. Remove params so we can add more. */ | ||
733 | mk = to_module_kobject(kobj); | 730 | mk = to_module_kobject(kobj); |
734 | /* We need to remove it before adding parameters. */ | ||
735 | sysfs_remove_group(&mk->kobj, &mk->mp->grp); | ||
736 | } else { | 731 | } else { |
737 | mk = kzalloc(sizeof(struct module_kobject), GFP_KERNEL); | 732 | mk = kzalloc(sizeof(struct module_kobject), GFP_KERNEL); |
738 | BUG_ON(!mk); | 733 | BUG_ON(!mk); |
@@ -743,15 +738,36 @@ static void __init kernel_add_sysfs_param(const char *name, | |||
743 | "%s", name); | 738 | "%s", name); |
744 | if (err) { | 739 | if (err) { |
745 | kobject_put(&mk->kobj); | 740 | kobject_put(&mk->kobj); |
746 | printk(KERN_ERR "Module '%s' failed add to sysfs, " | 741 | printk(KERN_ERR |
747 | "error number %d\n", name, err); | 742 | "Module '%s' failed add to sysfs, error number %d\n", |
748 | printk(KERN_ERR "The system will be unstable now.\n"); | 743 | name, err); |
749 | return; | 744 | printk(KERN_ERR |
745 | "The system will be unstable now.\n"); | ||
746 | return NULL; | ||
750 | } | 747 | } |
751 | /* So that exit path is even. */ | 748 | |
749 | /* So that we hold reference in both cases. */ | ||
752 | kobject_get(&mk->kobj); | 750 | kobject_get(&mk->kobj); |
753 | } | 751 | } |
754 | 752 | ||
753 | return mk; | ||
754 | } | ||
755 | |||
756 | static void __init kernel_add_sysfs_param(const char *name, | ||
757 | struct kernel_param *kparam, | ||
758 | unsigned int name_skip) | ||
759 | { | ||
760 | struct module_kobject *mk; | ||
761 | int err; | ||
762 | |||
763 | mk = locate_module_kobject(name); | ||
764 | if (!mk) | ||
765 | return; | ||
766 | |||
767 | /* We need to remove old parameters before adding more. */ | ||
768 | if (mk->mp) | ||
769 | sysfs_remove_group(&mk->kobj, &mk->mp->grp); | ||
770 | |||
755 | /* These should not fail at boot. */ | 771 | /* These should not fail at boot. */ |
756 | err = add_sysfs_param(mk, kparam, kparam->name + name_skip); | 772 | err = add_sysfs_param(mk, kparam, kparam->name + name_skip); |
757 | BUG_ON(err); | 773 | BUG_ON(err); |
@@ -796,6 +812,32 @@ static void __init param_sysfs_builtin(void) | |||
796 | } | 812 | } |
797 | } | 813 | } |
798 | 814 | ||
815 | ssize_t __modver_version_show(struct module_attribute *mattr, | ||
816 | struct module *mod, char *buf) | ||
817 | { | ||
818 | struct module_version_attribute *vattr = | ||
819 | container_of(mattr, struct module_version_attribute, mattr); | ||
820 | |||
821 | return sprintf(buf, "%s\n", vattr->version); | ||
822 | } | ||
823 | |||
824 | extern struct module_version_attribute __start___modver[], __stop___modver[]; | ||
825 | |||
826 | static void __init version_sysfs_builtin(void) | ||
827 | { | ||
828 | const struct module_version_attribute *vattr; | ||
829 | struct module_kobject *mk; | ||
830 | int err; | ||
831 | |||
832 | for (vattr = __start___modver; vattr < __stop___modver; vattr++) { | ||
833 | mk = locate_module_kobject(vattr->module_name); | ||
834 | if (mk) { | ||
835 | err = sysfs_create_file(&mk->kobj, &vattr->mattr.attr); | ||
836 | kobject_uevent(&mk->kobj, KOBJ_ADD); | ||
837 | kobject_put(&mk->kobj); | ||
838 | } | ||
839 | } | ||
840 | } | ||
799 | 841 | ||
800 | /* module-related sysfs stuff */ | 842 | /* module-related sysfs stuff */ |
801 | 843 | ||
@@ -875,6 +917,7 @@ static int __init param_sysfs_init(void) | |||
875 | } | 917 | } |
876 | module_sysfs_initialized = 1; | 918 | module_sysfs_initialized = 1; |
877 | 919 | ||
920 | version_sysfs_builtin(); | ||
878 | param_sysfs_builtin(); | 921 | param_sysfs_builtin(); |
879 | 922 | ||
880 | return 0; | 923 | return 0; |
diff --git a/kernel/perf_event.c b/kernel/perf_event.c index 84522c796987..126a302c481c 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c | |||
@@ -2201,13 +2201,6 @@ find_lively_task_by_vpid(pid_t vpid) | |||
2201 | if (!task) | 2201 | if (!task) |
2202 | return ERR_PTR(-ESRCH); | 2202 | return ERR_PTR(-ESRCH); |
2203 | 2203 | ||
2204 | /* | ||
2205 | * Can't attach events to a dying task. | ||
2206 | */ | ||
2207 | err = -ESRCH; | ||
2208 | if (task->flags & PF_EXITING) | ||
2209 | goto errout; | ||
2210 | |||
2211 | /* Reuse ptrace permission checks for now. */ | 2204 | /* Reuse ptrace permission checks for now. */ |
2212 | err = -EACCES; | 2205 | err = -EACCES; |
2213 | if (!ptrace_may_access(task, PTRACE_MODE_READ)) | 2206 | if (!ptrace_may_access(task, PTRACE_MODE_READ)) |
@@ -2268,14 +2261,27 @@ retry: | |||
2268 | 2261 | ||
2269 | get_ctx(ctx); | 2262 | get_ctx(ctx); |
2270 | 2263 | ||
2271 | if (cmpxchg(&task->perf_event_ctxp[ctxn], NULL, ctx)) { | 2264 | err = 0; |
2272 | /* | 2265 | mutex_lock(&task->perf_event_mutex); |
2273 | * We raced with some other task; use | 2266 | /* |
2274 | * the context they set. | 2267 | * If it has already passed perf_event_exit_task(). |
2275 | */ | 2268 | * we must see PF_EXITING, it takes this mutex too. |
2269 | */ | ||
2270 | if (task->flags & PF_EXITING) | ||
2271 | err = -ESRCH; | ||
2272 | else if (task->perf_event_ctxp[ctxn]) | ||
2273 | err = -EAGAIN; | ||
2274 | else | ||
2275 | rcu_assign_pointer(task->perf_event_ctxp[ctxn], ctx); | ||
2276 | mutex_unlock(&task->perf_event_mutex); | ||
2277 | |||
2278 | if (unlikely(err)) { | ||
2276 | put_task_struct(task); | 2279 | put_task_struct(task); |
2277 | kfree(ctx); | 2280 | kfree(ctx); |
2278 | goto retry; | 2281 | |
2282 | if (err == -EAGAIN) | ||
2283 | goto retry; | ||
2284 | goto errout; | ||
2279 | } | 2285 | } |
2280 | } | 2286 | } |
2281 | 2287 | ||
@@ -5374,6 +5380,8 @@ free_dev: | |||
5374 | goto out; | 5380 | goto out; |
5375 | } | 5381 | } |
5376 | 5382 | ||
5383 | static struct lock_class_key cpuctx_mutex; | ||
5384 | |||
5377 | int perf_pmu_register(struct pmu *pmu, char *name, int type) | 5385 | int perf_pmu_register(struct pmu *pmu, char *name, int type) |
5378 | { | 5386 | { |
5379 | int cpu, ret; | 5387 | int cpu, ret; |
@@ -5422,6 +5430,7 @@ skip_type: | |||
5422 | 5430 | ||
5423 | cpuctx = per_cpu_ptr(pmu->pmu_cpu_context, cpu); | 5431 | cpuctx = per_cpu_ptr(pmu->pmu_cpu_context, cpu); |
5424 | __perf_event_init_context(&cpuctx->ctx); | 5432 | __perf_event_init_context(&cpuctx->ctx); |
5433 | lockdep_set_class(&cpuctx->ctx.mutex, &cpuctx_mutex); | ||
5425 | cpuctx->ctx.type = cpu_context; | 5434 | cpuctx->ctx.type = cpu_context; |
5426 | cpuctx->ctx.pmu = pmu; | 5435 | cpuctx->ctx.pmu = pmu; |
5427 | cpuctx->jiffies_interval = 1; | 5436 | cpuctx->jiffies_interval = 1; |
@@ -6127,7 +6136,7 @@ static void perf_event_exit_task_context(struct task_struct *child, int ctxn) | |||
6127 | * scheduled, so we are now safe from rescheduling changing | 6136 | * scheduled, so we are now safe from rescheduling changing |
6128 | * our context. | 6137 | * our context. |
6129 | */ | 6138 | */ |
6130 | child_ctx = child->perf_event_ctxp[ctxn]; | 6139 | child_ctx = rcu_dereference_raw(child->perf_event_ctxp[ctxn]); |
6131 | task_ctx_sched_out(child_ctx, EVENT_ALL); | 6140 | task_ctx_sched_out(child_ctx, EVENT_ALL); |
6132 | 6141 | ||
6133 | /* | 6142 | /* |
@@ -6440,11 +6449,6 @@ int perf_event_init_context(struct task_struct *child, int ctxn) | |||
6440 | unsigned long flags; | 6449 | unsigned long flags; |
6441 | int ret = 0; | 6450 | int ret = 0; |
6442 | 6451 | ||
6443 | child->perf_event_ctxp[ctxn] = NULL; | ||
6444 | |||
6445 | mutex_init(&child->perf_event_mutex); | ||
6446 | INIT_LIST_HEAD(&child->perf_event_list); | ||
6447 | |||
6448 | if (likely(!parent->perf_event_ctxp[ctxn])) | 6452 | if (likely(!parent->perf_event_ctxp[ctxn])) |
6449 | return 0; | 6453 | return 0; |
6450 | 6454 | ||
@@ -6533,6 +6537,10 @@ int perf_event_init_task(struct task_struct *child) | |||
6533 | { | 6537 | { |
6534 | int ctxn, ret; | 6538 | int ctxn, ret; |
6535 | 6539 | ||
6540 | memset(child->perf_event_ctxp, 0, sizeof(child->perf_event_ctxp)); | ||
6541 | mutex_init(&child->perf_event_mutex); | ||
6542 | INIT_LIST_HEAD(&child->perf_event_list); | ||
6543 | |||
6536 | for_each_task_context_nr(ctxn) { | 6544 | for_each_task_context_nr(ctxn) { |
6537 | ret = perf_event_init_context(child, ctxn); | 6545 | ret = perf_event_init_context(child, ctxn); |
6538 | if (ret) | 6546 | if (ret) |
diff --git a/kernel/printk.c b/kernel/printk.c index 53d9a9ec88e6..2ddbdc73aade 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
@@ -97,7 +97,7 @@ static int console_locked, console_suspended; | |||
97 | /* | 97 | /* |
98 | * logbuf_lock protects log_buf, log_start, log_end, con_start and logged_chars | 98 | * logbuf_lock protects log_buf, log_start, log_end, con_start and logged_chars |
99 | * It is also used in interesting ways to provide interlocking in | 99 | * It is also used in interesting ways to provide interlocking in |
100 | * release_console_sem(). | 100 | * console_unlock();. |
101 | */ | 101 | */ |
102 | static DEFINE_SPINLOCK(logbuf_lock); | 102 | static DEFINE_SPINLOCK(logbuf_lock); |
103 | 103 | ||
@@ -501,7 +501,7 @@ static void _call_console_drivers(unsigned start, | |||
501 | /* | 501 | /* |
502 | * Call the console drivers, asking them to write out | 502 | * Call the console drivers, asking them to write out |
503 | * log_buf[start] to log_buf[end - 1]. | 503 | * log_buf[start] to log_buf[end - 1]. |
504 | * The console_sem must be held. | 504 | * The console_lock must be held. |
505 | */ | 505 | */ |
506 | static void call_console_drivers(unsigned start, unsigned end) | 506 | static void call_console_drivers(unsigned start, unsigned end) |
507 | { | 507 | { |
@@ -604,11 +604,11 @@ static int have_callable_console(void) | |||
604 | * | 604 | * |
605 | * This is printk(). It can be called from any context. We want it to work. | 605 | * This is printk(). It can be called from any context. We want it to work. |
606 | * | 606 | * |
607 | * We try to grab the console_sem. If we succeed, it's easy - we log the output and | 607 | * We try to grab the console_lock. If we succeed, it's easy - we log the output and |
608 | * call the console drivers. If we fail to get the semaphore we place the output | 608 | * call the console drivers. If we fail to get the semaphore we place the output |
609 | * into the log buffer and return. The current holder of the console_sem will | 609 | * into the log buffer and return. The current holder of the console_sem will |
610 | * notice the new output in release_console_sem() and will send it to the | 610 | * notice the new output in console_unlock(); and will send it to the |
611 | * consoles before releasing the semaphore. | 611 | * consoles before releasing the lock. |
612 | * | 612 | * |
613 | * One effect of this deferred printing is that code which calls printk() and | 613 | * One effect of this deferred printing is that code which calls printk() and |
614 | * then changes console_loglevel may break. This is because console_loglevel | 614 | * then changes console_loglevel may break. This is because console_loglevel |
@@ -659,19 +659,19 @@ static inline int can_use_console(unsigned int cpu) | |||
659 | /* | 659 | /* |
660 | * Try to get console ownership to actually show the kernel | 660 | * Try to get console ownership to actually show the kernel |
661 | * messages from a 'printk'. Return true (and with the | 661 | * messages from a 'printk'. Return true (and with the |
662 | * console_semaphore held, and 'console_locked' set) if it | 662 | * console_lock held, and 'console_locked' set) if it |
663 | * is successful, false otherwise. | 663 | * is successful, false otherwise. |
664 | * | 664 | * |
665 | * This gets called with the 'logbuf_lock' spinlock held and | 665 | * This gets called with the 'logbuf_lock' spinlock held and |
666 | * interrupts disabled. It should return with 'lockbuf_lock' | 666 | * interrupts disabled. It should return with 'lockbuf_lock' |
667 | * released but interrupts still disabled. | 667 | * released but interrupts still disabled. |
668 | */ | 668 | */ |
669 | static int acquire_console_semaphore_for_printk(unsigned int cpu) | 669 | static int console_trylock_for_printk(unsigned int cpu) |
670 | __releases(&logbuf_lock) | 670 | __releases(&logbuf_lock) |
671 | { | 671 | { |
672 | int retval = 0; | 672 | int retval = 0; |
673 | 673 | ||
674 | if (!try_acquire_console_sem()) { | 674 | if (console_trylock()) { |
675 | retval = 1; | 675 | retval = 1; |
676 | 676 | ||
677 | /* | 677 | /* |
@@ -827,12 +827,12 @@ asmlinkage int vprintk(const char *fmt, va_list args) | |||
827 | * actual magic (print out buffers, wake up klogd, | 827 | * actual magic (print out buffers, wake up klogd, |
828 | * etc). | 828 | * etc). |
829 | * | 829 | * |
830 | * The acquire_console_semaphore_for_printk() function | 830 | * The console_trylock_for_printk() function |
831 | * will release 'logbuf_lock' regardless of whether it | 831 | * will release 'logbuf_lock' regardless of whether it |
832 | * actually gets the semaphore or not. | 832 | * actually gets the semaphore or not. |
833 | */ | 833 | */ |
834 | if (acquire_console_semaphore_for_printk(this_cpu)) | 834 | if (console_trylock_for_printk(this_cpu)) |
835 | release_console_sem(); | 835 | console_unlock(); |
836 | 836 | ||
837 | lockdep_on(); | 837 | lockdep_on(); |
838 | out_restore_irqs: | 838 | out_restore_irqs: |
@@ -993,7 +993,7 @@ void suspend_console(void) | |||
993 | if (!console_suspend_enabled) | 993 | if (!console_suspend_enabled) |
994 | return; | 994 | return; |
995 | printk("Suspending console(s) (use no_console_suspend to debug)\n"); | 995 | printk("Suspending console(s) (use no_console_suspend to debug)\n"); |
996 | acquire_console_sem(); | 996 | console_lock(); |
997 | console_suspended = 1; | 997 | console_suspended = 1; |
998 | up(&console_sem); | 998 | up(&console_sem); |
999 | } | 999 | } |
@@ -1004,7 +1004,7 @@ void resume_console(void) | |||
1004 | return; | 1004 | return; |
1005 | down(&console_sem); | 1005 | down(&console_sem); |
1006 | console_suspended = 0; | 1006 | console_suspended = 0; |
1007 | release_console_sem(); | 1007 | console_unlock(); |
1008 | } | 1008 | } |
1009 | 1009 | ||
1010 | /** | 1010 | /** |
@@ -1027,21 +1027,21 @@ static int __cpuinit console_cpu_notify(struct notifier_block *self, | |||
1027 | case CPU_DYING: | 1027 | case CPU_DYING: |
1028 | case CPU_DOWN_FAILED: | 1028 | case CPU_DOWN_FAILED: |
1029 | case CPU_UP_CANCELED: | 1029 | case CPU_UP_CANCELED: |
1030 | acquire_console_sem(); | 1030 | console_lock(); |
1031 | release_console_sem(); | 1031 | console_unlock(); |
1032 | } | 1032 | } |
1033 | return NOTIFY_OK; | 1033 | return NOTIFY_OK; |
1034 | } | 1034 | } |
1035 | 1035 | ||
1036 | /** | 1036 | /** |
1037 | * acquire_console_sem - lock the console system for exclusive use. | 1037 | * console_lock - lock the console system for exclusive use. |
1038 | * | 1038 | * |
1039 | * Acquires a semaphore which guarantees that the caller has | 1039 | * Acquires a lock which guarantees that the caller has |
1040 | * exclusive access to the console system and the console_drivers list. | 1040 | * exclusive access to the console system and the console_drivers list. |
1041 | * | 1041 | * |
1042 | * Can sleep, returns nothing. | 1042 | * Can sleep, returns nothing. |
1043 | */ | 1043 | */ |
1044 | void acquire_console_sem(void) | 1044 | void console_lock(void) |
1045 | { | 1045 | { |
1046 | BUG_ON(in_interrupt()); | 1046 | BUG_ON(in_interrupt()); |
1047 | down(&console_sem); | 1047 | down(&console_sem); |
@@ -1050,21 +1050,29 @@ void acquire_console_sem(void) | |||
1050 | console_locked = 1; | 1050 | console_locked = 1; |
1051 | console_may_schedule = 1; | 1051 | console_may_schedule = 1; |
1052 | } | 1052 | } |
1053 | EXPORT_SYMBOL(acquire_console_sem); | 1053 | EXPORT_SYMBOL(console_lock); |
1054 | 1054 | ||
1055 | int try_acquire_console_sem(void) | 1055 | /** |
1056 | * console_trylock - try to lock the console system for exclusive use. | ||
1057 | * | ||
1058 | * Tried to acquire a lock which guarantees that the caller has | ||
1059 | * exclusive access to the console system and the console_drivers list. | ||
1060 | * | ||
1061 | * returns 1 on success, and 0 on failure to acquire the lock. | ||
1062 | */ | ||
1063 | int console_trylock(void) | ||
1056 | { | 1064 | { |
1057 | if (down_trylock(&console_sem)) | 1065 | if (down_trylock(&console_sem)) |
1058 | return -1; | 1066 | return 0; |
1059 | if (console_suspended) { | 1067 | if (console_suspended) { |
1060 | up(&console_sem); | 1068 | up(&console_sem); |
1061 | return -1; | 1069 | return 0; |
1062 | } | 1070 | } |
1063 | console_locked = 1; | 1071 | console_locked = 1; |
1064 | console_may_schedule = 0; | 1072 | console_may_schedule = 0; |
1065 | return 0; | 1073 | return 1; |
1066 | } | 1074 | } |
1067 | EXPORT_SYMBOL(try_acquire_console_sem); | 1075 | EXPORT_SYMBOL(console_trylock); |
1068 | 1076 | ||
1069 | int is_console_locked(void) | 1077 | int is_console_locked(void) |
1070 | { | 1078 | { |
@@ -1095,20 +1103,20 @@ void wake_up_klogd(void) | |||
1095 | } | 1103 | } |
1096 | 1104 | ||
1097 | /** | 1105 | /** |
1098 | * release_console_sem - unlock the console system | 1106 | * console_unlock - unlock the console system |
1099 | * | 1107 | * |
1100 | * Releases the semaphore which the caller holds on the console system | 1108 | * Releases the console_lock which the caller holds on the console system |
1101 | * and the console driver list. | 1109 | * and the console driver list. |
1102 | * | 1110 | * |
1103 | * While the semaphore was held, console output may have been buffered | 1111 | * While the console_lock was held, console output may have been buffered |
1104 | * by printk(). If this is the case, release_console_sem() emits | 1112 | * by printk(). If this is the case, console_unlock(); emits |
1105 | * the output prior to releasing the semaphore. | 1113 | * the output prior to releasing the lock. |
1106 | * | 1114 | * |
1107 | * If there is output waiting for klogd, we wake it up. | 1115 | * If there is output waiting for klogd, we wake it up. |
1108 | * | 1116 | * |
1109 | * release_console_sem() may be called from any context. | 1117 | * console_unlock(); may be called from any context. |
1110 | */ | 1118 | */ |
1111 | void release_console_sem(void) | 1119 | void console_unlock(void) |
1112 | { | 1120 | { |
1113 | unsigned long flags; | 1121 | unsigned long flags; |
1114 | unsigned _con_start, _log_end; | 1122 | unsigned _con_start, _log_end; |
@@ -1141,7 +1149,7 @@ void release_console_sem(void) | |||
1141 | if (wake_klogd) | 1149 | if (wake_klogd) |
1142 | wake_up_klogd(); | 1150 | wake_up_klogd(); |
1143 | } | 1151 | } |
1144 | EXPORT_SYMBOL(release_console_sem); | 1152 | EXPORT_SYMBOL(console_unlock); |
1145 | 1153 | ||
1146 | /** | 1154 | /** |
1147 | * console_conditional_schedule - yield the CPU if required | 1155 | * console_conditional_schedule - yield the CPU if required |
@@ -1150,7 +1158,7 @@ EXPORT_SYMBOL(release_console_sem); | |||
1150 | * if this CPU should yield the CPU to another task, do | 1158 | * if this CPU should yield the CPU to another task, do |
1151 | * so here. | 1159 | * so here. |
1152 | * | 1160 | * |
1153 | * Must be called within acquire_console_sem(). | 1161 | * Must be called within console_lock();. |
1154 | */ | 1162 | */ |
1155 | void __sched console_conditional_schedule(void) | 1163 | void __sched console_conditional_schedule(void) |
1156 | { | 1164 | { |
@@ -1171,14 +1179,14 @@ void console_unblank(void) | |||
1171 | if (down_trylock(&console_sem) != 0) | 1179 | if (down_trylock(&console_sem) != 0) |
1172 | return; | 1180 | return; |
1173 | } else | 1181 | } else |
1174 | acquire_console_sem(); | 1182 | console_lock(); |
1175 | 1183 | ||
1176 | console_locked = 1; | 1184 | console_locked = 1; |
1177 | console_may_schedule = 0; | 1185 | console_may_schedule = 0; |
1178 | for_each_console(c) | 1186 | for_each_console(c) |
1179 | if ((c->flags & CON_ENABLED) && c->unblank) | 1187 | if ((c->flags & CON_ENABLED) && c->unblank) |
1180 | c->unblank(); | 1188 | c->unblank(); |
1181 | release_console_sem(); | 1189 | console_unlock(); |
1182 | } | 1190 | } |
1183 | 1191 | ||
1184 | /* | 1192 | /* |
@@ -1189,7 +1197,7 @@ struct tty_driver *console_device(int *index) | |||
1189 | struct console *c; | 1197 | struct console *c; |
1190 | struct tty_driver *driver = NULL; | 1198 | struct tty_driver *driver = NULL; |
1191 | 1199 | ||
1192 | acquire_console_sem(); | 1200 | console_lock(); |
1193 | for_each_console(c) { | 1201 | for_each_console(c) { |
1194 | if (!c->device) | 1202 | if (!c->device) |
1195 | continue; | 1203 | continue; |
@@ -1197,7 +1205,7 @@ struct tty_driver *console_device(int *index) | |||
1197 | if (driver) | 1205 | if (driver) |
1198 | break; | 1206 | break; |
1199 | } | 1207 | } |
1200 | release_console_sem(); | 1208 | console_unlock(); |
1201 | return driver; | 1209 | return driver; |
1202 | } | 1210 | } |
1203 | 1211 | ||
@@ -1208,17 +1216,17 @@ struct tty_driver *console_device(int *index) | |||
1208 | */ | 1216 | */ |
1209 | void console_stop(struct console *console) | 1217 | void console_stop(struct console *console) |
1210 | { | 1218 | { |
1211 | acquire_console_sem(); | 1219 | console_lock(); |
1212 | console->flags &= ~CON_ENABLED; | 1220 | console->flags &= ~CON_ENABLED; |
1213 | release_console_sem(); | 1221 | console_unlock(); |
1214 | } | 1222 | } |
1215 | EXPORT_SYMBOL(console_stop); | 1223 | EXPORT_SYMBOL(console_stop); |
1216 | 1224 | ||
1217 | void console_start(struct console *console) | 1225 | void console_start(struct console *console) |
1218 | { | 1226 | { |
1219 | acquire_console_sem(); | 1227 | console_lock(); |
1220 | console->flags |= CON_ENABLED; | 1228 | console->flags |= CON_ENABLED; |
1221 | release_console_sem(); | 1229 | console_unlock(); |
1222 | } | 1230 | } |
1223 | EXPORT_SYMBOL(console_start); | 1231 | EXPORT_SYMBOL(console_start); |
1224 | 1232 | ||
@@ -1340,7 +1348,7 @@ void register_console(struct console *newcon) | |||
1340 | * Put this console in the list - keep the | 1348 | * Put this console in the list - keep the |
1341 | * preferred driver at the head of the list. | 1349 | * preferred driver at the head of the list. |
1342 | */ | 1350 | */ |
1343 | acquire_console_sem(); | 1351 | console_lock(); |
1344 | if ((newcon->flags & CON_CONSDEV) || console_drivers == NULL) { | 1352 | if ((newcon->flags & CON_CONSDEV) || console_drivers == NULL) { |
1345 | newcon->next = console_drivers; | 1353 | newcon->next = console_drivers; |
1346 | console_drivers = newcon; | 1354 | console_drivers = newcon; |
@@ -1352,14 +1360,14 @@ void register_console(struct console *newcon) | |||
1352 | } | 1360 | } |
1353 | if (newcon->flags & CON_PRINTBUFFER) { | 1361 | if (newcon->flags & CON_PRINTBUFFER) { |
1354 | /* | 1362 | /* |
1355 | * release_console_sem() will print out the buffered messages | 1363 | * console_unlock(); will print out the buffered messages |
1356 | * for us. | 1364 | * for us. |
1357 | */ | 1365 | */ |
1358 | spin_lock_irqsave(&logbuf_lock, flags); | 1366 | spin_lock_irqsave(&logbuf_lock, flags); |
1359 | con_start = log_start; | 1367 | con_start = log_start; |
1360 | spin_unlock_irqrestore(&logbuf_lock, flags); | 1368 | spin_unlock_irqrestore(&logbuf_lock, flags); |
1361 | } | 1369 | } |
1362 | release_console_sem(); | 1370 | console_unlock(); |
1363 | console_sysfs_notify(); | 1371 | console_sysfs_notify(); |
1364 | 1372 | ||
1365 | /* | 1373 | /* |
@@ -1396,7 +1404,7 @@ int unregister_console(struct console *console) | |||
1396 | return braille_unregister_console(console); | 1404 | return braille_unregister_console(console); |
1397 | #endif | 1405 | #endif |
1398 | 1406 | ||
1399 | acquire_console_sem(); | 1407 | console_lock(); |
1400 | if (console_drivers == console) { | 1408 | if (console_drivers == console) { |
1401 | console_drivers=console->next; | 1409 | console_drivers=console->next; |
1402 | res = 0; | 1410 | res = 0; |
@@ -1418,7 +1426,7 @@ int unregister_console(struct console *console) | |||
1418 | if (console_drivers != NULL && console->flags & CON_CONSDEV) | 1426 | if (console_drivers != NULL && console->flags & CON_CONSDEV) |
1419 | console_drivers->flags |= CON_CONSDEV; | 1427 | console_drivers->flags |= CON_CONSDEV; |
1420 | 1428 | ||
1421 | release_console_sem(); | 1429 | console_unlock(); |
1422 | console_sysfs_notify(); | 1430 | console_sysfs_notify(); |
1423 | return res; | 1431 | return res; |
1424 | } | 1432 | } |
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index 77e9166d7bbf..0c26e2df450e 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
@@ -699,7 +699,8 @@ account_entity_dequeue(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
699 | cfs_rq->nr_running--; | 699 | cfs_rq->nr_running--; |
700 | } | 700 | } |
701 | 701 | ||
702 | #if defined CONFIG_SMP && defined CONFIG_FAIR_GROUP_SCHED | 702 | #ifdef CONFIG_FAIR_GROUP_SCHED |
703 | # ifdef CONFIG_SMP | ||
703 | static void update_cfs_rq_load_contribution(struct cfs_rq *cfs_rq, | 704 | static void update_cfs_rq_load_contribution(struct cfs_rq *cfs_rq, |
704 | int global_update) | 705 | int global_update) |
705 | { | 706 | { |
@@ -721,10 +722,10 @@ static void update_cfs_load(struct cfs_rq *cfs_rq, int global_update) | |||
721 | u64 now, delta; | 722 | u64 now, delta; |
722 | unsigned long load = cfs_rq->load.weight; | 723 | unsigned long load = cfs_rq->load.weight; |
723 | 724 | ||
724 | if (!cfs_rq) | 725 | if (cfs_rq->tg == &root_task_group) |
725 | return; | 726 | return; |
726 | 727 | ||
727 | now = rq_of(cfs_rq)->clock; | 728 | now = rq_of(cfs_rq)->clock_task; |
728 | delta = now - cfs_rq->load_stamp; | 729 | delta = now - cfs_rq->load_stamp; |
729 | 730 | ||
730 | /* truncate load history at 4 idle periods */ | 731 | /* truncate load history at 4 idle periods */ |
@@ -762,6 +763,51 @@ static void update_cfs_load(struct cfs_rq *cfs_rq, int global_update) | |||
762 | list_del_leaf_cfs_rq(cfs_rq); | 763 | list_del_leaf_cfs_rq(cfs_rq); |
763 | } | 764 | } |
764 | 765 | ||
766 | static long calc_cfs_shares(struct cfs_rq *cfs_rq, struct task_group *tg, | ||
767 | long weight_delta) | ||
768 | { | ||
769 | long load_weight, load, shares; | ||
770 | |||
771 | load = cfs_rq->load.weight + weight_delta; | ||
772 | |||
773 | load_weight = atomic_read(&tg->load_weight); | ||
774 | load_weight -= cfs_rq->load_contribution; | ||
775 | load_weight += load; | ||
776 | |||
777 | shares = (tg->shares * load); | ||
778 | if (load_weight) | ||
779 | shares /= load_weight; | ||
780 | |||
781 | if (shares < MIN_SHARES) | ||
782 | shares = MIN_SHARES; | ||
783 | if (shares > tg->shares) | ||
784 | shares = tg->shares; | ||
785 | |||
786 | return shares; | ||
787 | } | ||
788 | |||
789 | static void update_entity_shares_tick(struct cfs_rq *cfs_rq) | ||
790 | { | ||
791 | if (cfs_rq->load_unacc_exec_time > sysctl_sched_shares_window) { | ||
792 | update_cfs_load(cfs_rq, 0); | ||
793 | update_cfs_shares(cfs_rq, 0); | ||
794 | } | ||
795 | } | ||
796 | # else /* CONFIG_SMP */ | ||
797 | static void update_cfs_load(struct cfs_rq *cfs_rq, int global_update) | ||
798 | { | ||
799 | } | ||
800 | |||
801 | static inline long calc_cfs_shares(struct cfs_rq *cfs_rq, struct task_group *tg, | ||
802 | long weight_delta) | ||
803 | { | ||
804 | return tg->shares; | ||
805 | } | ||
806 | |||
807 | static inline void update_entity_shares_tick(struct cfs_rq *cfs_rq) | ||
808 | { | ||
809 | } | ||
810 | # endif /* CONFIG_SMP */ | ||
765 | static void reweight_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, | 811 | static void reweight_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, |
766 | unsigned long weight) | 812 | unsigned long weight) |
767 | { | 813 | { |
@@ -782,41 +828,20 @@ static void update_cfs_shares(struct cfs_rq *cfs_rq, long weight_delta) | |||
782 | { | 828 | { |
783 | struct task_group *tg; | 829 | struct task_group *tg; |
784 | struct sched_entity *se; | 830 | struct sched_entity *se; |
785 | long load_weight, load, shares; | 831 | long shares; |
786 | |||
787 | if (!cfs_rq) | ||
788 | return; | ||
789 | 832 | ||
790 | tg = cfs_rq->tg; | 833 | tg = cfs_rq->tg; |
791 | se = tg->se[cpu_of(rq_of(cfs_rq))]; | 834 | se = tg->se[cpu_of(rq_of(cfs_rq))]; |
792 | if (!se) | 835 | if (!se) |
793 | return; | 836 | return; |
794 | 837 | #ifndef CONFIG_SMP | |
795 | load = cfs_rq->load.weight + weight_delta; | 838 | if (likely(se->load.weight == tg->shares)) |
796 | 839 | return; | |
797 | load_weight = atomic_read(&tg->load_weight); | 840 | #endif |
798 | load_weight -= cfs_rq->load_contribution; | 841 | shares = calc_cfs_shares(cfs_rq, tg, weight_delta); |
799 | load_weight += load; | ||
800 | |||
801 | shares = (tg->shares * load); | ||
802 | if (load_weight) | ||
803 | shares /= load_weight; | ||
804 | |||
805 | if (shares < MIN_SHARES) | ||
806 | shares = MIN_SHARES; | ||
807 | if (shares > tg->shares) | ||
808 | shares = tg->shares; | ||
809 | 842 | ||
810 | reweight_entity(cfs_rq_of(se), se, shares); | 843 | reweight_entity(cfs_rq_of(se), se, shares); |
811 | } | 844 | } |
812 | |||
813 | static void update_entity_shares_tick(struct cfs_rq *cfs_rq) | ||
814 | { | ||
815 | if (cfs_rq->load_unacc_exec_time > sysctl_sched_shares_window) { | ||
816 | update_cfs_load(cfs_rq, 0); | ||
817 | update_cfs_shares(cfs_rq, 0); | ||
818 | } | ||
819 | } | ||
820 | #else /* CONFIG_FAIR_GROUP_SCHED */ | 845 | #else /* CONFIG_FAIR_GROUP_SCHED */ |
821 | static void update_cfs_load(struct cfs_rq *cfs_rq, int global_update) | 846 | static void update_cfs_load(struct cfs_rq *cfs_rq, int global_update) |
822 | { | 847 | { |
@@ -1404,7 +1429,7 @@ static inline unsigned long effective_load(struct task_group *tg, int cpu, | |||
1404 | 1429 | ||
1405 | static int wake_affine(struct sched_domain *sd, struct task_struct *p, int sync) | 1430 | static int wake_affine(struct sched_domain *sd, struct task_struct *p, int sync) |
1406 | { | 1431 | { |
1407 | unsigned long this_load, load; | 1432 | s64 this_load, load; |
1408 | int idx, this_cpu, prev_cpu; | 1433 | int idx, this_cpu, prev_cpu; |
1409 | unsigned long tl_per_task; | 1434 | unsigned long tl_per_task; |
1410 | struct task_group *tg; | 1435 | struct task_group *tg; |
@@ -1443,8 +1468,8 @@ static int wake_affine(struct sched_domain *sd, struct task_struct *p, int sync) | |||
1443 | * Otherwise check if either cpus are near enough in load to allow this | 1468 | * Otherwise check if either cpus are near enough in load to allow this |
1444 | * task to be woken on this_cpu. | 1469 | * task to be woken on this_cpu. |
1445 | */ | 1470 | */ |
1446 | if (this_load) { | 1471 | if (this_load > 0) { |
1447 | unsigned long this_eff_load, prev_eff_load; | 1472 | s64 this_eff_load, prev_eff_load; |
1448 | 1473 | ||
1449 | this_eff_load = 100; | 1474 | this_eff_load = 100; |
1450 | this_eff_load *= power_of(prev_cpu); | 1475 | this_eff_load *= power_of(prev_cpu); |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index bc86bb32e126..0f1bd83db985 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -170,7 +170,8 @@ static int proc_taint(struct ctl_table *table, int write, | |||
170 | #endif | 170 | #endif |
171 | 171 | ||
172 | #ifdef CONFIG_MAGIC_SYSRQ | 172 | #ifdef CONFIG_MAGIC_SYSRQ |
173 | static int __sysrq_enabled; /* Note: sysrq code ises it's own private copy */ | 173 | /* Note: sysrq code uses it's own private copy */ |
174 | static int __sysrq_enabled = SYSRQ_DEFAULT_ENABLE; | ||
174 | 175 | ||
175 | static int sysrq_sysctl_handler(ctl_table *table, int write, | 176 | static int sysrq_sysctl_handler(ctl_table *table, int write, |
176 | void __user *buffer, size_t *lenp, | 177 | void __user *buffer, size_t *lenp, |
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 3e216e01bbd1..c55ea2433471 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
@@ -642,8 +642,7 @@ static void tick_nohz_switch_to_nohz(void) | |||
642 | } | 642 | } |
643 | local_irq_enable(); | 643 | local_irq_enable(); |
644 | 644 | ||
645 | printk(KERN_INFO "Switched to NOHz mode on CPU #%d\n", | 645 | printk(KERN_INFO "Switched to NOHz mode on CPU #%d\n", smp_processor_id()); |
646 | smp_processor_id()); | ||
647 | } | 646 | } |
648 | 647 | ||
649 | /* | 648 | /* |
@@ -795,8 +794,10 @@ void tick_setup_sched_timer(void) | |||
795 | } | 794 | } |
796 | 795 | ||
797 | #ifdef CONFIG_NO_HZ | 796 | #ifdef CONFIG_NO_HZ |
798 | if (tick_nohz_enabled) | 797 | if (tick_nohz_enabled) { |
799 | ts->nohz_mode = NOHZ_MODE_HIGHRES; | 798 | ts->nohz_mode = NOHZ_MODE_HIGHRES; |
799 | printk(KERN_INFO "Switched to NOHz mode on CPU #%d\n", smp_processor_id()); | ||
800 | } | ||
800 | #endif | 801 | #endif |
801 | } | 802 | } |
802 | #endif /* HIGH_RES_TIMERS */ | 803 | #endif /* HIGH_RES_TIMERS */ |