diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/Makefile | 2 | ||||
-rw-r--r-- | kernel/audit.c | 2 | ||||
-rw-r--r-- | kernel/debug/kdb/kdb_main.c | 2 | ||||
-rw-r--r-- | kernel/hrtimer.c | 2 | ||||
-rw-r--r-- | kernel/kexec.c | 2 | ||||
-rw-r--r-- | kernel/latencytop.c | 23 | ||||
-rw-r--r-- | kernel/perf_event.c | 2 | ||||
-rw-r--r-- | kernel/power/hibernate.c | 4 | ||||
-rw-r--r-- | kernel/power/suspend.c | 4 | ||||
-rw-r--r-- | kernel/power/swap.c | 2 | ||||
-rw-r--r-- | kernel/printk.c | 30 | ||||
-rw-r--r-- | kernel/sched.c | 2 | ||||
-rw-r--r-- | kernel/smp.c | 19 | ||||
-rw-r--r-- | kernel/softirq.c | 19 | ||||
-rw-r--r-- | kernel/sys.c | 6 | ||||
-rw-r--r-- | kernel/sysctl.c | 31 | ||||
-rw-r--r-- | kernel/sysctl_binary.c | 2 | ||||
-rw-r--r-- | kernel/taskstats.c | 2 | ||||
-rw-r--r-- | kernel/time.c | 4 | ||||
-rw-r--r-- | kernel/time/clocksource.c | 2 | ||||
-rw-r--r-- | kernel/time/ntp.c | 425 | ||||
-rw-r--r-- | kernel/time/timekeeping.c | 43 | ||||
-rw-r--r-- | kernel/trace/trace_entries.h | 2 | ||||
-rw-r--r-- | kernel/user_namespace.c | 15 |
24 files changed, 536 insertions, 111 deletions
diff --git a/kernel/Makefile b/kernel/Makefile index 5669f71dfdd5..353d3fe8ba33 100644 --- a/kernel/Makefile +++ b/kernel/Makefile | |||
@@ -43,7 +43,7 @@ obj-$(CONFIG_RT_MUTEXES) += rtmutex.o | |||
43 | obj-$(CONFIG_DEBUG_RT_MUTEXES) += rtmutex-debug.o | 43 | obj-$(CONFIG_DEBUG_RT_MUTEXES) += rtmutex-debug.o |
44 | obj-$(CONFIG_RT_MUTEX_TESTER) += rtmutex-tester.o | 44 | obj-$(CONFIG_RT_MUTEX_TESTER) += rtmutex-tester.o |
45 | obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o | 45 | obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o |
46 | obj-$(CONFIG_USE_GENERIC_SMP_HELPERS) += smp.o | 46 | obj-$(CONFIG_SMP) += smp.o |
47 | ifneq ($(CONFIG_SMP),y) | 47 | ifneq ($(CONFIG_SMP),y) |
48 | obj-y += up.o | 48 | obj-y += up.o |
49 | endif | 49 | endif |
diff --git a/kernel/audit.c b/kernel/audit.c index 77770a034d59..e4956244ae50 100644 --- a/kernel/audit.c +++ b/kernel/audit.c | |||
@@ -400,7 +400,7 @@ static void kauditd_send_skb(struct sk_buff *skb) | |||
400 | if (err < 0) { | 400 | if (err < 0) { |
401 | BUG_ON(err != -ECONNREFUSED); /* Shouldn't happen */ | 401 | BUG_ON(err != -ECONNREFUSED); /* Shouldn't happen */ |
402 | printk(KERN_ERR "audit: *NO* daemon at audit_pid=%d\n", audit_pid); | 402 | printk(KERN_ERR "audit: *NO* daemon at audit_pid=%d\n", audit_pid); |
403 | audit_log_lost("auditd dissapeared\n"); | 403 | audit_log_lost("auditd disappeared\n"); |
404 | audit_pid = 0; | 404 | audit_pid = 0; |
405 | /* we might get lucky and get this in the next auditd */ | 405 | /* we might get lucky and get this in the next auditd */ |
406 | audit_hold_skb(skb); | 406 | audit_hold_skb(skb); |
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c index a6e729766821..bd3e8e29caa3 100644 --- a/kernel/debug/kdb/kdb_main.c +++ b/kernel/debug/kdb/kdb_main.c | |||
@@ -2914,7 +2914,7 @@ static void __init kdb_cmd_init(void) | |||
2914 | } | 2914 | } |
2915 | } | 2915 | } |
2916 | 2916 | ||
2917 | /* Intialize kdb_printf, breakpoint tables and kdb state */ | 2917 | /* Initialize kdb_printf, breakpoint tables and kdb state */ |
2918 | void __init kdb_init(int lvl) | 2918 | void __init kdb_init(int lvl) |
2919 | { | 2919 | { |
2920 | static int kdb_init_lvl = KDB_NOT_INITIALIZED; | 2920 | static int kdb_init_lvl = KDB_NOT_INITIALIZED; |
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 45da2b6920ab..0c8d7c048615 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
@@ -1745,7 +1745,7 @@ schedule_hrtimeout_range_clock(ktime_t *expires, unsigned long delta, | |||
1745 | } | 1745 | } |
1746 | 1746 | ||
1747 | /* | 1747 | /* |
1748 | * A NULL parameter means "inifinte" | 1748 | * A NULL parameter means "infinite" |
1749 | */ | 1749 | */ |
1750 | if (!expires) { | 1750 | if (!expires) { |
1751 | schedule(); | 1751 | schedule(); |
diff --git a/kernel/kexec.c b/kernel/kexec.c index b55045bc7563..ec19b92c7ebd 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
@@ -163,7 +163,7 @@ static int do_kimage_alloc(struct kimage **rimage, unsigned long entry, | |||
163 | * just verifies it is an address we can use. | 163 | * just verifies it is an address we can use. |
164 | * | 164 | * |
165 | * Since the kernel does everything in page size chunks ensure | 165 | * Since the kernel does everything in page size chunks ensure |
166 | * the destination addreses are page aligned. Too many | 166 | * the destination addresses are page aligned. Too many |
167 | * special cases crop of when we don't do this. The most | 167 | * special cases crop of when we don't do this. The most |
168 | * insidious is getting overlapping destination addresses | 168 | * insidious is getting overlapping destination addresses |
169 | * simply because addresses are changed to page size | 169 | * simply because addresses are changed to page size |
diff --git a/kernel/latencytop.c b/kernel/latencytop.c index 17110a4a4fc2..ee74b35e528d 100644 --- a/kernel/latencytop.c +++ b/kernel/latencytop.c | |||
@@ -241,24 +241,19 @@ static int lstats_show(struct seq_file *m, void *v) | |||
241 | seq_puts(m, "Latency Top version : v0.1\n"); | 241 | seq_puts(m, "Latency Top version : v0.1\n"); |
242 | 242 | ||
243 | for (i = 0; i < MAXLR; i++) { | 243 | for (i = 0; i < MAXLR; i++) { |
244 | if (latency_record[i].backtrace[0]) { | 244 | struct latency_record *lr = &latency_record[i]; |
245 | |||
246 | if (lr->backtrace[0]) { | ||
245 | int q; | 247 | int q; |
246 | seq_printf(m, "%i %lu %lu ", | 248 | seq_printf(m, "%i %lu %lu", |
247 | latency_record[i].count, | 249 | lr->count, lr->time, lr->max); |
248 | latency_record[i].time, | ||
249 | latency_record[i].max); | ||
250 | for (q = 0; q < LT_BACKTRACEDEPTH; q++) { | 250 | for (q = 0; q < LT_BACKTRACEDEPTH; q++) { |
251 | char sym[KSYM_SYMBOL_LEN]; | 251 | unsigned long bt = lr->backtrace[q]; |
252 | char *c; | 252 | if (!bt) |
253 | if (!latency_record[i].backtrace[q]) | ||
254 | break; | 253 | break; |
255 | if (latency_record[i].backtrace[q] == ULONG_MAX) | 254 | if (bt == ULONG_MAX) |
256 | break; | 255 | break; |
257 | sprint_symbol(sym, latency_record[i].backtrace[q]); | 256 | seq_printf(m, " %ps", (void *)bt); |
258 | c = strchr(sym, '+'); | ||
259 | if (c) | ||
260 | *c = 0; | ||
261 | seq_printf(m, "%s ", sym); | ||
262 | } | 257 | } |
263 | seq_printf(m, "\n"); | 258 | seq_printf(m, "\n"); |
264 | } | 259 | } |
diff --git a/kernel/perf_event.c b/kernel/perf_event.c index b782b7a79f00..05ebe841270b 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c | |||
@@ -4664,7 +4664,7 @@ int perf_swevent_get_recursion_context(void) | |||
4664 | } | 4664 | } |
4665 | EXPORT_SYMBOL_GPL(perf_swevent_get_recursion_context); | 4665 | EXPORT_SYMBOL_GPL(perf_swevent_get_recursion_context); |
4666 | 4666 | ||
4667 | void inline perf_swevent_put_recursion_context(int rctx) | 4667 | inline void perf_swevent_put_recursion_context(int rctx) |
4668 | { | 4668 | { |
4669 | struct swevent_htable *swhash = &__get_cpu_var(swevent_htable); | 4669 | struct swevent_htable *swhash = &__get_cpu_var(swevent_htable); |
4670 | 4670 | ||
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index 870f72bc72ae..1832bd264219 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c | |||
@@ -51,14 +51,14 @@ enum { | |||
51 | 51 | ||
52 | static int hibernation_mode = HIBERNATION_SHUTDOWN; | 52 | static int hibernation_mode = HIBERNATION_SHUTDOWN; |
53 | 53 | ||
54 | static struct platform_hibernation_ops *hibernation_ops; | 54 | static const struct platform_hibernation_ops *hibernation_ops; |
55 | 55 | ||
56 | /** | 56 | /** |
57 | * hibernation_set_ops - set the global hibernate operations | 57 | * hibernation_set_ops - set the global hibernate operations |
58 | * @ops: the hibernation operations to use in subsequent hibernation transitions | 58 | * @ops: the hibernation operations to use in subsequent hibernation transitions |
59 | */ | 59 | */ |
60 | 60 | ||
61 | void hibernation_set_ops(struct platform_hibernation_ops *ops) | 61 | void hibernation_set_ops(const struct platform_hibernation_ops *ops) |
62 | { | 62 | { |
63 | if (ops && !(ops->begin && ops->end && ops->pre_snapshot | 63 | if (ops && !(ops->begin && ops->end && ops->pre_snapshot |
64 | && ops->prepare && ops->finish && ops->enter && ops->pre_restore | 64 | && ops->prepare && ops->finish && ops->enter && ops->pre_restore |
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index 8850df68794d..de6f86bfa303 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c | |||
@@ -31,13 +31,13 @@ const char *const pm_states[PM_SUSPEND_MAX] = { | |||
31 | [PM_SUSPEND_MEM] = "mem", | 31 | [PM_SUSPEND_MEM] = "mem", |
32 | }; | 32 | }; |
33 | 33 | ||
34 | static struct platform_suspend_ops *suspend_ops; | 34 | static const struct platform_suspend_ops *suspend_ops; |
35 | 35 | ||
36 | /** | 36 | /** |
37 | * suspend_set_ops - Set the global suspend method table. | 37 | * suspend_set_ops - Set the global suspend method table. |
38 | * @ops: Pointer to ops structure. | 38 | * @ops: Pointer to ops structure. |
39 | */ | 39 | */ |
40 | void suspend_set_ops(struct platform_suspend_ops *ops) | 40 | void suspend_set_ops(const struct platform_suspend_ops *ops) |
41 | { | 41 | { |
42 | mutex_lock(&pm_mutex); | 42 | mutex_lock(&pm_mutex); |
43 | suspend_ops = ops; | 43 | suspend_ops = ops; |
diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 8c7e4832b9be..69425889bd40 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c | |||
@@ -888,7 +888,7 @@ out_finish: | |||
888 | /** | 888 | /** |
889 | * swsusp_read - read the hibernation image. | 889 | * swsusp_read - read the hibernation image. |
890 | * @flags_p: flags passed by the "frozen" kernel in the image header should | 890 | * @flags_p: flags passed by the "frozen" kernel in the image header should |
891 | * be written into this memeory location | 891 | * be written into this memory location |
892 | */ | 892 | */ |
893 | 893 | ||
894 | int swsusp_read(unsigned int *flags_p) | 894 | int swsusp_read(unsigned int *flags_p) |
diff --git a/kernel/printk.c b/kernel/printk.c index f64b8997fc76..53d9a9ec88e6 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <linux/syslog.h> | 39 | #include <linux/syslog.h> |
40 | #include <linux/cpu.h> | 40 | #include <linux/cpu.h> |
41 | #include <linux/notifier.h> | 41 | #include <linux/notifier.h> |
42 | #include <linux/rculist.h> | ||
42 | 43 | ||
43 | #include <asm/uaccess.h> | 44 | #include <asm/uaccess.h> |
44 | 45 | ||
@@ -1502,7 +1503,7 @@ int kmsg_dump_register(struct kmsg_dumper *dumper) | |||
1502 | /* Don't allow registering multiple times */ | 1503 | /* Don't allow registering multiple times */ |
1503 | if (!dumper->registered) { | 1504 | if (!dumper->registered) { |
1504 | dumper->registered = 1; | 1505 | dumper->registered = 1; |
1505 | list_add_tail(&dumper->list, &dump_list); | 1506 | list_add_tail_rcu(&dumper->list, &dump_list); |
1506 | err = 0; | 1507 | err = 0; |
1507 | } | 1508 | } |
1508 | spin_unlock_irqrestore(&dump_list_lock, flags); | 1509 | spin_unlock_irqrestore(&dump_list_lock, flags); |
@@ -1526,29 +1527,16 @@ int kmsg_dump_unregister(struct kmsg_dumper *dumper) | |||
1526 | spin_lock_irqsave(&dump_list_lock, flags); | 1527 | spin_lock_irqsave(&dump_list_lock, flags); |
1527 | if (dumper->registered) { | 1528 | if (dumper->registered) { |
1528 | dumper->registered = 0; | 1529 | dumper->registered = 0; |
1529 | list_del(&dumper->list); | 1530 | list_del_rcu(&dumper->list); |
1530 | err = 0; | 1531 | err = 0; |
1531 | } | 1532 | } |
1532 | spin_unlock_irqrestore(&dump_list_lock, flags); | 1533 | spin_unlock_irqrestore(&dump_list_lock, flags); |
1534 | synchronize_rcu(); | ||
1533 | 1535 | ||
1534 | return err; | 1536 | return err; |
1535 | } | 1537 | } |
1536 | EXPORT_SYMBOL_GPL(kmsg_dump_unregister); | 1538 | EXPORT_SYMBOL_GPL(kmsg_dump_unregister); |
1537 | 1539 | ||
1538 | static const char * const kmsg_reasons[] = { | ||
1539 | [KMSG_DUMP_OOPS] = "oops", | ||
1540 | [KMSG_DUMP_PANIC] = "panic", | ||
1541 | [KMSG_DUMP_KEXEC] = "kexec", | ||
1542 | }; | ||
1543 | |||
1544 | static const char *kmsg_to_str(enum kmsg_dump_reason reason) | ||
1545 | { | ||
1546 | if (reason >= ARRAY_SIZE(kmsg_reasons) || reason < 0) | ||
1547 | return "unknown"; | ||
1548 | |||
1549 | return kmsg_reasons[reason]; | ||
1550 | } | ||
1551 | |||
1552 | /** | 1540 | /** |
1553 | * kmsg_dump - dump kernel log to kernel message dumpers. | 1541 | * kmsg_dump - dump kernel log to kernel message dumpers. |
1554 | * @reason: the reason (oops, panic etc) for dumping | 1542 | * @reason: the reason (oops, panic etc) for dumping |
@@ -1587,13 +1575,9 @@ void kmsg_dump(enum kmsg_dump_reason reason) | |||
1587 | l2 = chars; | 1575 | l2 = chars; |
1588 | } | 1576 | } |
1589 | 1577 | ||
1590 | if (!spin_trylock_irqsave(&dump_list_lock, flags)) { | 1578 | rcu_read_lock(); |
1591 | printk(KERN_ERR "dump_kmsg: dump list lock is held during %s, skipping dump\n", | 1579 | list_for_each_entry_rcu(dumper, &dump_list, list) |
1592 | kmsg_to_str(reason)); | ||
1593 | return; | ||
1594 | } | ||
1595 | list_for_each_entry(dumper, &dump_list, list) | ||
1596 | dumper->dump(dumper, reason, s1, l1, s2, l2); | 1580 | dumper->dump(dumper, reason, s1, l1, s2, l2); |
1597 | spin_unlock_irqrestore(&dump_list_lock, flags); | 1581 | rcu_read_unlock(); |
1598 | } | 1582 | } |
1599 | #endif | 1583 | #endif |
diff --git a/kernel/sched.c b/kernel/sched.c index a0eb0941fa84..ea3e5eff3878 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -2505,7 +2505,7 @@ out: | |||
2505 | * try_to_wake_up_local - try to wake up a local task with rq lock held | 2505 | * try_to_wake_up_local - try to wake up a local task with rq lock held |
2506 | * @p: the thread to be awakened | 2506 | * @p: the thread to be awakened |
2507 | * | 2507 | * |
2508 | * Put @p on the run-queue if it's not alredy there. The caller must | 2508 | * Put @p on the run-queue if it's not already there. The caller must |
2509 | * ensure that this_rq() is locked, @p is bound to this_rq() and not | 2509 | * ensure that this_rq() is locked, @p is bound to this_rq() and not |
2510 | * the current task. this_rq() stays locked over invocation. | 2510 | * the current task. this_rq() stays locked over invocation. |
2511 | */ | 2511 | */ |
diff --git a/kernel/smp.c b/kernel/smp.c index 12ed8b013e2d..4ec30e069987 100644 --- a/kernel/smp.c +++ b/kernel/smp.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/smp.h> | 13 | #include <linux/smp.h> |
14 | #include <linux/cpu.h> | 14 | #include <linux/cpu.h> |
15 | 15 | ||
16 | #ifdef CONFIG_USE_GENERIC_SMP_HELPERS | ||
16 | static struct { | 17 | static struct { |
17 | struct list_head queue; | 18 | struct list_head queue; |
18 | raw_spinlock_t lock; | 19 | raw_spinlock_t lock; |
@@ -529,3 +530,21 @@ void ipi_call_unlock_irq(void) | |||
529 | { | 530 | { |
530 | raw_spin_unlock_irq(&call_function.lock); | 531 | raw_spin_unlock_irq(&call_function.lock); |
531 | } | 532 | } |
533 | #endif /* USE_GENERIC_SMP_HELPERS */ | ||
534 | |||
535 | /* | ||
536 | * Call a function on all processors | ||
537 | */ | ||
538 | int on_each_cpu(void (*func) (void *info), void *info, int wait) | ||
539 | { | ||
540 | int ret = 0; | ||
541 | |||
542 | preempt_disable(); | ||
543 | ret = smp_call_function(func, info, wait); | ||
544 | local_irq_disable(); | ||
545 | func(info); | ||
546 | local_irq_enable(); | ||
547 | preempt_enable(); | ||
548 | return ret; | ||
549 | } | ||
550 | EXPORT_SYMBOL(on_each_cpu); | ||
diff --git a/kernel/softirq.c b/kernel/softirq.c index 0823778f87fc..68eb5efec388 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c | |||
@@ -885,25 +885,6 @@ static __init int spawn_ksoftirqd(void) | |||
885 | } | 885 | } |
886 | early_initcall(spawn_ksoftirqd); | 886 | early_initcall(spawn_ksoftirqd); |
887 | 887 | ||
888 | #ifdef CONFIG_SMP | ||
889 | /* | ||
890 | * Call a function on all processors | ||
891 | */ | ||
892 | int on_each_cpu(void (*func) (void *info), void *info, int wait) | ||
893 | { | ||
894 | int ret = 0; | ||
895 | |||
896 | preempt_disable(); | ||
897 | ret = smp_call_function(func, info, wait); | ||
898 | local_irq_disable(); | ||
899 | func(info); | ||
900 | local_irq_enable(); | ||
901 | preempt_enable(); | ||
902 | return ret; | ||
903 | } | ||
904 | EXPORT_SYMBOL(on_each_cpu); | ||
905 | #endif | ||
906 | |||
907 | /* | 888 | /* |
908 | * [ These __weak aliases are kept in a separate compilation unit, so that | 889 | * [ These __weak aliases are kept in a separate compilation unit, so that |
909 | * GCC does not inline them incorrectly. ] | 890 | * GCC does not inline them incorrectly. ] |
diff --git a/kernel/sys.c b/kernel/sys.c index 2745dcdb6c6c..31b71a276b40 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
@@ -43,6 +43,8 @@ | |||
43 | #include <linux/kprobes.h> | 43 | #include <linux/kprobes.h> |
44 | #include <linux/user_namespace.h> | 44 | #include <linux/user_namespace.h> |
45 | 45 | ||
46 | #include <linux/kmsg_dump.h> | ||
47 | |||
46 | #include <asm/uaccess.h> | 48 | #include <asm/uaccess.h> |
47 | #include <asm/io.h> | 49 | #include <asm/io.h> |
48 | #include <asm/unistd.h> | 50 | #include <asm/unistd.h> |
@@ -285,6 +287,7 @@ out_unlock: | |||
285 | */ | 287 | */ |
286 | void emergency_restart(void) | 288 | void emergency_restart(void) |
287 | { | 289 | { |
290 | kmsg_dump(KMSG_DUMP_EMERG); | ||
288 | machine_emergency_restart(); | 291 | machine_emergency_restart(); |
289 | } | 292 | } |
290 | EXPORT_SYMBOL_GPL(emergency_restart); | 293 | EXPORT_SYMBOL_GPL(emergency_restart); |
@@ -312,6 +315,7 @@ void kernel_restart(char *cmd) | |||
312 | printk(KERN_EMERG "Restarting system.\n"); | 315 | printk(KERN_EMERG "Restarting system.\n"); |
313 | else | 316 | else |
314 | printk(KERN_EMERG "Restarting system with command '%s'.\n", cmd); | 317 | printk(KERN_EMERG "Restarting system with command '%s'.\n", cmd); |
318 | kmsg_dump(KMSG_DUMP_RESTART); | ||
315 | machine_restart(cmd); | 319 | machine_restart(cmd); |
316 | } | 320 | } |
317 | EXPORT_SYMBOL_GPL(kernel_restart); | 321 | EXPORT_SYMBOL_GPL(kernel_restart); |
@@ -333,6 +337,7 @@ void kernel_halt(void) | |||
333 | kernel_shutdown_prepare(SYSTEM_HALT); | 337 | kernel_shutdown_prepare(SYSTEM_HALT); |
334 | sysdev_shutdown(); | 338 | sysdev_shutdown(); |
335 | printk(KERN_EMERG "System halted.\n"); | 339 | printk(KERN_EMERG "System halted.\n"); |
340 | kmsg_dump(KMSG_DUMP_HALT); | ||
336 | machine_halt(); | 341 | machine_halt(); |
337 | } | 342 | } |
338 | 343 | ||
@@ -351,6 +356,7 @@ void kernel_power_off(void) | |||
351 | disable_nonboot_cpus(); | 356 | disable_nonboot_cpus(); |
352 | sysdev_shutdown(); | 357 | sysdev_shutdown(); |
353 | printk(KERN_EMERG "Power down.\n"); | 358 | printk(KERN_EMERG "Power down.\n"); |
359 | kmsg_dump(KMSG_DUMP_POWEROFF); | ||
354 | machine_power_off(); | 360 | machine_power_off(); |
355 | } | 361 | } |
356 | EXPORT_SYMBOL_GPL(kernel_power_off); | 362 | EXPORT_SYMBOL_GPL(kernel_power_off); |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index ae5cbb1e3ced..bc86bb32e126 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
25 | #include <linux/sysctl.h> | 25 | #include <linux/sysctl.h> |
26 | #include <linux/signal.h> | 26 | #include <linux/signal.h> |
27 | #include <linux/printk.h> | ||
27 | #include <linux/proc_fs.h> | 28 | #include <linux/proc_fs.h> |
28 | #include <linux/security.h> | 29 | #include <linux/security.h> |
29 | #include <linux/ctype.h> | 30 | #include <linux/ctype.h> |
@@ -245,10 +246,6 @@ static struct ctl_table root_table[] = { | |||
245 | .mode = 0555, | 246 | .mode = 0555, |
246 | .child = dev_table, | 247 | .child = dev_table, |
247 | }, | 248 | }, |
248 | /* | ||
249 | * NOTE: do not add new entries to this table unless you have read | ||
250 | * Documentation/sysctl/ctl_unnumbered.txt | ||
251 | */ | ||
252 | { } | 249 | { } |
253 | }; | 250 | }; |
254 | 251 | ||
@@ -710,6 +707,15 @@ static struct ctl_table kern_table[] = { | |||
710 | .extra1 = &zero, | 707 | .extra1 = &zero, |
711 | .extra2 = &one, | 708 | .extra2 = &one, |
712 | }, | 709 | }, |
710 | { | ||
711 | .procname = "kptr_restrict", | ||
712 | .data = &kptr_restrict, | ||
713 | .maxlen = sizeof(int), | ||
714 | .mode = 0644, | ||
715 | .proc_handler = proc_dointvec_minmax, | ||
716 | .extra1 = &zero, | ||
717 | .extra2 = &two, | ||
718 | }, | ||
713 | #endif | 719 | #endif |
714 | { | 720 | { |
715 | .procname = "ngroups_max", | 721 | .procname = "ngroups_max", |
@@ -962,10 +968,6 @@ static struct ctl_table kern_table[] = { | |||
962 | .proc_handler = proc_dointvec, | 968 | .proc_handler = proc_dointvec, |
963 | }, | 969 | }, |
964 | #endif | 970 | #endif |
965 | /* | ||
966 | * NOTE: do not add new entries to this table unless you have read | ||
967 | * Documentation/sysctl/ctl_unnumbered.txt | ||
968 | */ | ||
969 | { } | 971 | { } |
970 | }; | 972 | }; |
971 | 973 | ||
@@ -1326,11 +1328,6 @@ static struct ctl_table vm_table[] = { | |||
1326 | .extra2 = &one, | 1328 | .extra2 = &one, |
1327 | }, | 1329 | }, |
1328 | #endif | 1330 | #endif |
1329 | |||
1330 | /* | ||
1331 | * NOTE: do not add new entries to this table unless you have read | ||
1332 | * Documentation/sysctl/ctl_unnumbered.txt | ||
1333 | */ | ||
1334 | { } | 1331 | { } |
1335 | }; | 1332 | }; |
1336 | 1333 | ||
@@ -1486,10 +1483,6 @@ static struct ctl_table fs_table[] = { | |||
1486 | .proc_handler = &pipe_proc_fn, | 1483 | .proc_handler = &pipe_proc_fn, |
1487 | .extra1 = &pipe_min_size, | 1484 | .extra1 = &pipe_min_size, |
1488 | }, | 1485 | }, |
1489 | /* | ||
1490 | * NOTE: do not add new entries to this table unless you have read | ||
1491 | * Documentation/sysctl/ctl_unnumbered.txt | ||
1492 | */ | ||
1493 | { } | 1486 | { } |
1494 | }; | 1487 | }; |
1495 | 1488 | ||
@@ -2899,7 +2892,7 @@ int proc_do_large_bitmap(struct ctl_table *table, int write, | |||
2899 | } | 2892 | } |
2900 | } | 2893 | } |
2901 | 2894 | ||
2902 | #else /* CONFIG_PROC_FS */ | 2895 | #else /* CONFIG_PROC_SYSCTL */ |
2903 | 2896 | ||
2904 | int proc_dostring(struct ctl_table *table, int write, | 2897 | int proc_dostring(struct ctl_table *table, int write, |
2905 | void __user *buffer, size_t *lenp, loff_t *ppos) | 2898 | void __user *buffer, size_t *lenp, loff_t *ppos) |
@@ -2951,7 +2944,7 @@ int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write, | |||
2951 | } | 2944 | } |
2952 | 2945 | ||
2953 | 2946 | ||
2954 | #endif /* CONFIG_PROC_FS */ | 2947 | #endif /* CONFIG_PROC_SYSCTL */ |
2955 | 2948 | ||
2956 | /* | 2949 | /* |
2957 | * No sense putting this after each symbol definition, twice, | 2950 | * No sense putting this after each symbol definition, twice, |
diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c index 4b2545a136ff..b875bedf7c9a 100644 --- a/kernel/sysctl_binary.c +++ b/kernel/sysctl_binary.c | |||
@@ -1192,7 +1192,7 @@ static ssize_t bin_dn_node_address(struct file *file, | |||
1192 | 1192 | ||
1193 | buf[result] = '\0'; | 1193 | buf[result] = '\0'; |
1194 | 1194 | ||
1195 | /* Convert the decnet addresss to binary */ | 1195 | /* Convert the decnet address to binary */ |
1196 | result = -EIO; | 1196 | result = -EIO; |
1197 | nodep = strchr(buf, '.') + 1; | 1197 | nodep = strchr(buf, '.') + 1; |
1198 | if (!nodep) | 1198 | if (!nodep) |
diff --git a/kernel/taskstats.c b/kernel/taskstats.c index 69691eb4b715..3971c6b9d58d 100644 --- a/kernel/taskstats.c +++ b/kernel/taskstats.c | |||
@@ -348,7 +348,7 @@ static int parse(struct nlattr *na, struct cpumask *mask) | |||
348 | return ret; | 348 | return ret; |
349 | } | 349 | } |
350 | 350 | ||
351 | #ifdef CONFIG_IA64 | 351 | #if defined(CONFIG_64BIT) && !defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) |
352 | #define TASKSTATS_NEEDS_PADDING 1 | 352 | #define TASKSTATS_NEEDS_PADDING 1 |
353 | #endif | 353 | #endif |
354 | 354 | ||
diff --git a/kernel/time.c b/kernel/time.c index ba9b338d1835..32174359576f 100644 --- a/kernel/time.c +++ b/kernel/time.c | |||
@@ -238,7 +238,7 @@ EXPORT_SYMBOL(current_fs_time); | |||
238 | * Avoid unnecessary multiplications/divisions in the | 238 | * Avoid unnecessary multiplications/divisions in the |
239 | * two most common HZ cases: | 239 | * two most common HZ cases: |
240 | */ | 240 | */ |
241 | unsigned int inline jiffies_to_msecs(const unsigned long j) | 241 | inline unsigned int jiffies_to_msecs(const unsigned long j) |
242 | { | 242 | { |
243 | #if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) | 243 | #if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) |
244 | return (MSEC_PER_SEC / HZ) * j; | 244 | return (MSEC_PER_SEC / HZ) * j; |
@@ -254,7 +254,7 @@ unsigned int inline jiffies_to_msecs(const unsigned long j) | |||
254 | } | 254 | } |
255 | EXPORT_SYMBOL(jiffies_to_msecs); | 255 | EXPORT_SYMBOL(jiffies_to_msecs); |
256 | 256 | ||
257 | unsigned int inline jiffies_to_usecs(const unsigned long j) | 257 | inline unsigned int jiffies_to_usecs(const unsigned long j) |
258 | { | 258 | { |
259 | #if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ) | 259 | #if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ) |
260 | return (USEC_PER_SEC / HZ) * j; | 260 | return (USEC_PER_SEC / HZ) * j; |
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index df140cd3ea47..c50a034de30f 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c | |||
@@ -679,7 +679,7 @@ EXPORT_SYMBOL_GPL(__clocksource_updatefreq_scale); | |||
679 | int __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq) | 679 | int __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq) |
680 | { | 680 | { |
681 | 681 | ||
682 | /* Intialize mult/shift and max_idle_ns */ | 682 | /* Initialize mult/shift and max_idle_ns */ |
683 | __clocksource_updatefreq_scale(cs, scale, freq); | 683 | __clocksource_updatefreq_scale(cs, scale, freq); |
684 | 684 | ||
685 | /* Add clocksource to the clcoksource list */ | 685 | /* Add clocksource to the clcoksource list */ |
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index d2321891538f..5c00242fa921 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/timex.h> | 14 | #include <linux/timex.h> |
15 | #include <linux/time.h> | 15 | #include <linux/time.h> |
16 | #include <linux/mm.h> | 16 | #include <linux/mm.h> |
17 | #include <linux/module.h> | ||
17 | 18 | ||
18 | /* | 19 | /* |
19 | * NTP timekeeping variables: | 20 | * NTP timekeeping variables: |
@@ -74,6 +75,162 @@ static long time_adjust; | |||
74 | /* constant (boot-param configurable) NTP tick adjustment (upscaled) */ | 75 | /* constant (boot-param configurable) NTP tick adjustment (upscaled) */ |
75 | static s64 ntp_tick_adj; | 76 | static s64 ntp_tick_adj; |
76 | 77 | ||
78 | #ifdef CONFIG_NTP_PPS | ||
79 | |||
80 | /* | ||
81 | * The following variables are used when a pulse-per-second (PPS) signal | ||
82 | * is available. They establish the engineering parameters of the clock | ||
83 | * discipline loop when controlled by the PPS signal. | ||
84 | */ | ||
85 | #define PPS_VALID 10 /* PPS signal watchdog max (s) */ | ||
86 | #define PPS_POPCORN 4 /* popcorn spike threshold (shift) */ | ||
87 | #define PPS_INTMIN 2 /* min freq interval (s) (shift) */ | ||
88 | #define PPS_INTMAX 8 /* max freq interval (s) (shift) */ | ||
89 | #define PPS_INTCOUNT 4 /* number of consecutive good intervals to | ||
90 | increase pps_shift or consecutive bad | ||
91 | intervals to decrease it */ | ||
92 | #define PPS_MAXWANDER 100000 /* max PPS freq wander (ns/s) */ | ||
93 | |||
94 | static int pps_valid; /* signal watchdog counter */ | ||
95 | static long pps_tf[3]; /* phase median filter */ | ||
96 | static long pps_jitter; /* current jitter (ns) */ | ||
97 | static struct timespec pps_fbase; /* beginning of the last freq interval */ | ||
98 | static int pps_shift; /* current interval duration (s) (shift) */ | ||
99 | static int pps_intcnt; /* interval counter */ | ||
100 | static s64 pps_freq; /* frequency offset (scaled ns/s) */ | ||
101 | static long pps_stabil; /* current stability (scaled ns/s) */ | ||
102 | |||
103 | /* | ||
104 | * PPS signal quality monitors | ||
105 | */ | ||
106 | static long pps_calcnt; /* calibration intervals */ | ||
107 | static long pps_jitcnt; /* jitter limit exceeded */ | ||
108 | static long pps_stbcnt; /* stability limit exceeded */ | ||
109 | static long pps_errcnt; /* calibration errors */ | ||
110 | |||
111 | |||
112 | /* PPS kernel consumer compensates the whole phase error immediately. | ||
113 | * Otherwise, reduce the offset by a fixed factor times the time constant. | ||
114 | */ | ||
115 | static inline s64 ntp_offset_chunk(s64 offset) | ||
116 | { | ||
117 | if (time_status & STA_PPSTIME && time_status & STA_PPSSIGNAL) | ||
118 | return offset; | ||
119 | else | ||
120 | return shift_right(offset, SHIFT_PLL + time_constant); | ||
121 | } | ||
122 | |||
123 | static inline void pps_reset_freq_interval(void) | ||
124 | { | ||
125 | /* the PPS calibration interval may end | ||
126 | surprisingly early */ | ||
127 | pps_shift = PPS_INTMIN; | ||
128 | pps_intcnt = 0; | ||
129 | } | ||
130 | |||
131 | /** | ||
132 | * pps_clear - Clears the PPS state variables | ||
133 | * | ||
134 | * Must be called while holding a write on the xtime_lock | ||
135 | */ | ||
136 | static inline void pps_clear(void) | ||
137 | { | ||
138 | pps_reset_freq_interval(); | ||
139 | pps_tf[0] = 0; | ||
140 | pps_tf[1] = 0; | ||
141 | pps_tf[2] = 0; | ||
142 | pps_fbase.tv_sec = pps_fbase.tv_nsec = 0; | ||
143 | pps_freq = 0; | ||
144 | } | ||
145 | |||
146 | /* Decrease pps_valid to indicate that another second has passed since | ||
147 | * the last PPS signal. When it reaches 0, indicate that PPS signal is | ||
148 | * missing. | ||
149 | * | ||
150 | * Must be called while holding a write on the xtime_lock | ||
151 | */ | ||
152 | static inline void pps_dec_valid(void) | ||
153 | { | ||
154 | if (pps_valid > 0) | ||
155 | pps_valid--; | ||
156 | else { | ||
157 | time_status &= ~(STA_PPSSIGNAL | STA_PPSJITTER | | ||
158 | STA_PPSWANDER | STA_PPSERROR); | ||
159 | pps_clear(); | ||
160 | } | ||
161 | } | ||
162 | |||
163 | static inline void pps_set_freq(s64 freq) | ||
164 | { | ||
165 | pps_freq = freq; | ||
166 | } | ||
167 | |||
168 | static inline int is_error_status(int status) | ||
169 | { | ||
170 | return (time_status & (STA_UNSYNC|STA_CLOCKERR)) | ||
171 | /* PPS signal lost when either PPS time or | ||
172 | * PPS frequency synchronization requested | ||
173 | */ | ||
174 | || ((time_status & (STA_PPSFREQ|STA_PPSTIME)) | ||
175 | && !(time_status & STA_PPSSIGNAL)) | ||
176 | /* PPS jitter exceeded when | ||
177 | * PPS time synchronization requested */ | ||
178 | || ((time_status & (STA_PPSTIME|STA_PPSJITTER)) | ||
179 | == (STA_PPSTIME|STA_PPSJITTER)) | ||
180 | /* PPS wander exceeded or calibration error when | ||
181 | * PPS frequency synchronization requested | ||
182 | */ | ||
183 | || ((time_status & STA_PPSFREQ) | ||
184 | && (time_status & (STA_PPSWANDER|STA_PPSERROR))); | ||
185 | } | ||
186 | |||
187 | static inline void pps_fill_timex(struct timex *txc) | ||
188 | { | ||
189 | txc->ppsfreq = shift_right((pps_freq >> PPM_SCALE_INV_SHIFT) * | ||
190 | PPM_SCALE_INV, NTP_SCALE_SHIFT); | ||
191 | txc->jitter = pps_jitter; | ||
192 | if (!(time_status & STA_NANO)) | ||
193 | txc->jitter /= NSEC_PER_USEC; | ||
194 | txc->shift = pps_shift; | ||
195 | txc->stabil = pps_stabil; | ||
196 | txc->jitcnt = pps_jitcnt; | ||
197 | txc->calcnt = pps_calcnt; | ||
198 | txc->errcnt = pps_errcnt; | ||
199 | txc->stbcnt = pps_stbcnt; | ||
200 | } | ||
201 | |||
202 | #else /* !CONFIG_NTP_PPS */ | ||
203 | |||
204 | static inline s64 ntp_offset_chunk(s64 offset) | ||
205 | { | ||
206 | return shift_right(offset, SHIFT_PLL + time_constant); | ||
207 | } | ||
208 | |||
209 | static inline void pps_reset_freq_interval(void) {} | ||
210 | static inline void pps_clear(void) {} | ||
211 | static inline void pps_dec_valid(void) {} | ||
212 | static inline void pps_set_freq(s64 freq) {} | ||
213 | |||
214 | static inline int is_error_status(int status) | ||
215 | { | ||
216 | return status & (STA_UNSYNC|STA_CLOCKERR); | ||
217 | } | ||
218 | |||
219 | static inline void pps_fill_timex(struct timex *txc) | ||
220 | { | ||
221 | /* PPS is not implemented, so these are zero */ | ||
222 | txc->ppsfreq = 0; | ||
223 | txc->jitter = 0; | ||
224 | txc->shift = 0; | ||
225 | txc->stabil = 0; | ||
226 | txc->jitcnt = 0; | ||
227 | txc->calcnt = 0; | ||
228 | txc->errcnt = 0; | ||
229 | txc->stbcnt = 0; | ||
230 | } | ||
231 | |||
232 | #endif /* CONFIG_NTP_PPS */ | ||
233 | |||
77 | /* | 234 | /* |
78 | * NTP methods: | 235 | * NTP methods: |
79 | */ | 236 | */ |
@@ -185,6 +342,9 @@ void ntp_clear(void) | |||
185 | 342 | ||
186 | tick_length = tick_length_base; | 343 | tick_length = tick_length_base; |
187 | time_offset = 0; | 344 | time_offset = 0; |
345 | |||
346 | /* Clear PPS state variables */ | ||
347 | pps_clear(); | ||
188 | } | 348 | } |
189 | 349 | ||
190 | /* | 350 | /* |
@@ -250,16 +410,16 @@ void second_overflow(void) | |||
250 | time_status |= STA_UNSYNC; | 410 | time_status |= STA_UNSYNC; |
251 | } | 411 | } |
252 | 412 | ||
253 | /* | 413 | /* Compute the phase adjustment for the next second */ |
254 | * Compute the phase adjustment for the next second. The offset is | ||
255 | * reduced by a fixed factor times the time constant. | ||
256 | */ | ||
257 | tick_length = tick_length_base; | 414 | tick_length = tick_length_base; |
258 | 415 | ||
259 | delta = shift_right(time_offset, SHIFT_PLL + time_constant); | 416 | delta = ntp_offset_chunk(time_offset); |
260 | time_offset -= delta; | 417 | time_offset -= delta; |
261 | tick_length += delta; | 418 | tick_length += delta; |
262 | 419 | ||
420 | /* Check PPS signal */ | ||
421 | pps_dec_valid(); | ||
422 | |||
263 | if (!time_adjust) | 423 | if (!time_adjust) |
264 | return; | 424 | return; |
265 | 425 | ||
@@ -369,6 +529,8 @@ static inline void process_adj_status(struct timex *txc, struct timespec *ts) | |||
369 | if ((time_status & STA_PLL) && !(txc->status & STA_PLL)) { | 529 | if ((time_status & STA_PLL) && !(txc->status & STA_PLL)) { |
370 | time_state = TIME_OK; | 530 | time_state = TIME_OK; |
371 | time_status = STA_UNSYNC; | 531 | time_status = STA_UNSYNC; |
532 | /* restart PPS frequency calibration */ | ||
533 | pps_reset_freq_interval(); | ||
372 | } | 534 | } |
373 | 535 | ||
374 | /* | 536 | /* |
@@ -418,6 +580,8 @@ static inline void process_adjtimex_modes(struct timex *txc, struct timespec *ts | |||
418 | time_freq = txc->freq * PPM_SCALE; | 580 | time_freq = txc->freq * PPM_SCALE; |
419 | time_freq = min(time_freq, MAXFREQ_SCALED); | 581 | time_freq = min(time_freq, MAXFREQ_SCALED); |
420 | time_freq = max(time_freq, -MAXFREQ_SCALED); | 582 | time_freq = max(time_freq, -MAXFREQ_SCALED); |
583 | /* update pps_freq */ | ||
584 | pps_set_freq(time_freq); | ||
421 | } | 585 | } |
422 | 586 | ||
423 | if (txc->modes & ADJ_MAXERROR) | 587 | if (txc->modes & ADJ_MAXERROR) |
@@ -508,7 +672,8 @@ int do_adjtimex(struct timex *txc) | |||
508 | } | 672 | } |
509 | 673 | ||
510 | result = time_state; /* mostly `TIME_OK' */ | 674 | result = time_state; /* mostly `TIME_OK' */ |
511 | if (time_status & (STA_UNSYNC|STA_CLOCKERR)) | 675 | /* check for errors */ |
676 | if (is_error_status(time_status)) | ||
512 | result = TIME_ERROR; | 677 | result = TIME_ERROR; |
513 | 678 | ||
514 | txc->freq = shift_right((time_freq >> PPM_SCALE_INV_SHIFT) * | 679 | txc->freq = shift_right((time_freq >> PPM_SCALE_INV_SHIFT) * |
@@ -522,15 +687,8 @@ int do_adjtimex(struct timex *txc) | |||
522 | txc->tick = tick_usec; | 687 | txc->tick = tick_usec; |
523 | txc->tai = time_tai; | 688 | txc->tai = time_tai; |
524 | 689 | ||
525 | /* PPS is not implemented, so these are zero */ | 690 | /* fill PPS status fields */ |
526 | txc->ppsfreq = 0; | 691 | pps_fill_timex(txc); |
527 | txc->jitter = 0; | ||
528 | txc->shift = 0; | ||
529 | txc->stabil = 0; | ||
530 | txc->jitcnt = 0; | ||
531 | txc->calcnt = 0; | ||
532 | txc->errcnt = 0; | ||
533 | txc->stbcnt = 0; | ||
534 | 692 | ||
535 | write_sequnlock_irq(&xtime_lock); | 693 | write_sequnlock_irq(&xtime_lock); |
536 | 694 | ||
@@ -544,6 +702,243 @@ int do_adjtimex(struct timex *txc) | |||
544 | return result; | 702 | return result; |
545 | } | 703 | } |
546 | 704 | ||
705 | #ifdef CONFIG_NTP_PPS | ||
706 | |||
707 | /* actually struct pps_normtime is good old struct timespec, but it is | ||
708 | * semantically different (and it is the reason why it was invented): | ||
709 | * pps_normtime.nsec has a range of ( -NSEC_PER_SEC / 2, NSEC_PER_SEC / 2 ] | ||
710 | * while timespec.tv_nsec has a range of [0, NSEC_PER_SEC) */ | ||
711 | struct pps_normtime { | ||
712 | __kernel_time_t sec; /* seconds */ | ||
713 | long nsec; /* nanoseconds */ | ||
714 | }; | ||
715 | |||
716 | /* normalize the timestamp so that nsec is in the | ||
717 | ( -NSEC_PER_SEC / 2, NSEC_PER_SEC / 2 ] interval */ | ||
718 | static inline struct pps_normtime pps_normalize_ts(struct timespec ts) | ||
719 | { | ||
720 | struct pps_normtime norm = { | ||
721 | .sec = ts.tv_sec, | ||
722 | .nsec = ts.tv_nsec | ||
723 | }; | ||
724 | |||
725 | if (norm.nsec > (NSEC_PER_SEC >> 1)) { | ||
726 | norm.nsec -= NSEC_PER_SEC; | ||
727 | norm.sec++; | ||
728 | } | ||
729 | |||
730 | return norm; | ||
731 | } | ||
732 | |||
733 | /* get current phase correction and jitter */ | ||
734 | static inline long pps_phase_filter_get(long *jitter) | ||
735 | { | ||
736 | *jitter = pps_tf[0] - pps_tf[1]; | ||
737 | if (*jitter < 0) | ||
738 | *jitter = -*jitter; | ||
739 | |||
740 | /* TODO: test various filters */ | ||
741 | return pps_tf[0]; | ||
742 | } | ||
743 | |||
744 | /* add the sample to the phase filter */ | ||
745 | static inline void pps_phase_filter_add(long err) | ||
746 | { | ||
747 | pps_tf[2] = pps_tf[1]; | ||
748 | pps_tf[1] = pps_tf[0]; | ||
749 | pps_tf[0] = err; | ||
750 | } | ||
751 | |||
752 | /* decrease frequency calibration interval length. | ||
753 | * It is halved after four consecutive unstable intervals. | ||
754 | */ | ||
755 | static inline void pps_dec_freq_interval(void) | ||
756 | { | ||
757 | if (--pps_intcnt <= -PPS_INTCOUNT) { | ||
758 | pps_intcnt = -PPS_INTCOUNT; | ||
759 | if (pps_shift > PPS_INTMIN) { | ||
760 | pps_shift--; | ||
761 | pps_intcnt = 0; | ||
762 | } | ||
763 | } | ||
764 | } | ||
765 | |||
766 | /* increase frequency calibration interval length. | ||
767 | * It is doubled after four consecutive stable intervals. | ||
768 | */ | ||
769 | static inline void pps_inc_freq_interval(void) | ||
770 | { | ||
771 | if (++pps_intcnt >= PPS_INTCOUNT) { | ||
772 | pps_intcnt = PPS_INTCOUNT; | ||
773 | if (pps_shift < PPS_INTMAX) { | ||
774 | pps_shift++; | ||
775 | pps_intcnt = 0; | ||
776 | } | ||
777 | } | ||
778 | } | ||
779 | |||
780 | /* update clock frequency based on MONOTONIC_RAW clock PPS signal | ||
781 | * timestamps | ||
782 | * | ||
783 | * At the end of the calibration interval the difference between the | ||
784 | * first and last MONOTONIC_RAW clock timestamps divided by the length | ||
785 | * of the interval becomes the frequency update. If the interval was | ||
786 | * too long, the data are discarded. | ||
787 | * Returns the difference between old and new frequency values. | ||
788 | */ | ||
789 | static long hardpps_update_freq(struct pps_normtime freq_norm) | ||
790 | { | ||
791 | long delta, delta_mod; | ||
792 | s64 ftemp; | ||
793 | |||
794 | /* check if the frequency interval was too long */ | ||
795 | if (freq_norm.sec > (2 << pps_shift)) { | ||
796 | time_status |= STA_PPSERROR; | ||
797 | pps_errcnt++; | ||
798 | pps_dec_freq_interval(); | ||
799 | pr_err("hardpps: PPSERROR: interval too long - %ld s\n", | ||
800 | freq_norm.sec); | ||
801 | return 0; | ||
802 | } | ||
803 | |||
804 | /* here the raw frequency offset and wander (stability) is | ||
805 | * calculated. If the wander is less than the wander threshold | ||
806 | * the interval is increased; otherwise it is decreased. | ||
807 | */ | ||
808 | ftemp = div_s64(((s64)(-freq_norm.nsec)) << NTP_SCALE_SHIFT, | ||
809 | freq_norm.sec); | ||
810 | delta = shift_right(ftemp - pps_freq, NTP_SCALE_SHIFT); | ||
811 | pps_freq = ftemp; | ||
812 | if (delta > PPS_MAXWANDER || delta < -PPS_MAXWANDER) { | ||
813 | pr_warning("hardpps: PPSWANDER: change=%ld\n", delta); | ||
814 | time_status |= STA_PPSWANDER; | ||
815 | pps_stbcnt++; | ||
816 | pps_dec_freq_interval(); | ||
817 | } else { /* good sample */ | ||
818 | pps_inc_freq_interval(); | ||
819 | } | ||
820 | |||
821 | /* the stability metric is calculated as the average of recent | ||
822 | * frequency changes, but is used only for performance | ||
823 | * monitoring | ||
824 | */ | ||
825 | delta_mod = delta; | ||
826 | if (delta_mod < 0) | ||
827 | delta_mod = -delta_mod; | ||
828 | pps_stabil += (div_s64(((s64)delta_mod) << | ||
829 | (NTP_SCALE_SHIFT - SHIFT_USEC), | ||
830 | NSEC_PER_USEC) - pps_stabil) >> PPS_INTMIN; | ||
831 | |||
832 | /* if enabled, the system clock frequency is updated */ | ||
833 | if ((time_status & STA_PPSFREQ) != 0 && | ||
834 | (time_status & STA_FREQHOLD) == 0) { | ||
835 | time_freq = pps_freq; | ||
836 | ntp_update_frequency(); | ||
837 | } | ||
838 | |||
839 | return delta; | ||
840 | } | ||
841 | |||
842 | /* correct REALTIME clock phase error against PPS signal */ | ||
843 | static void hardpps_update_phase(long error) | ||
844 | { | ||
845 | long correction = -error; | ||
846 | long jitter; | ||
847 | |||
848 | /* add the sample to the median filter */ | ||
849 | pps_phase_filter_add(correction); | ||
850 | correction = pps_phase_filter_get(&jitter); | ||
851 | |||
852 | /* Nominal jitter is due to PPS signal noise. If it exceeds the | ||
853 | * threshold, the sample is discarded; otherwise, if so enabled, | ||
854 | * the time offset is updated. | ||
855 | */ | ||
856 | if (jitter > (pps_jitter << PPS_POPCORN)) { | ||
857 | pr_warning("hardpps: PPSJITTER: jitter=%ld, limit=%ld\n", | ||
858 | jitter, (pps_jitter << PPS_POPCORN)); | ||
859 | time_status |= STA_PPSJITTER; | ||
860 | pps_jitcnt++; | ||
861 | } else if (time_status & STA_PPSTIME) { | ||
862 | /* correct the time using the phase offset */ | ||
863 | time_offset = div_s64(((s64)correction) << NTP_SCALE_SHIFT, | ||
864 | NTP_INTERVAL_FREQ); | ||
865 | /* cancel running adjtime() */ | ||
866 | time_adjust = 0; | ||
867 | } | ||
868 | /* update jitter */ | ||
869 | pps_jitter += (jitter - pps_jitter) >> PPS_INTMIN; | ||
870 | } | ||
871 | |||
872 | /* | ||
873 | * hardpps() - discipline CPU clock oscillator to external PPS signal | ||
874 | * | ||
875 | * This routine is called at each PPS signal arrival in order to | ||
876 | * discipline the CPU clock oscillator to the PPS signal. It takes two | ||
877 | * parameters: REALTIME and MONOTONIC_RAW clock timestamps. The former | ||
878 | * is used to correct clock phase error and the latter is used to | ||
879 | * correct the frequency. | ||
880 | * | ||
881 | * This code is based on David Mills's reference nanokernel | ||
882 | * implementation. It was mostly rewritten but keeps the same idea. | ||
883 | */ | ||
884 | void hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts) | ||
885 | { | ||
886 | struct pps_normtime pts_norm, freq_norm; | ||
887 | unsigned long flags; | ||
888 | |||
889 | pts_norm = pps_normalize_ts(*phase_ts); | ||
890 | |||
891 | write_seqlock_irqsave(&xtime_lock, flags); | ||
892 | |||
893 | /* clear the error bits, they will be set again if needed */ | ||
894 | time_status &= ~(STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR); | ||
895 | |||
896 | /* indicate signal presence */ | ||
897 | time_status |= STA_PPSSIGNAL; | ||
898 | pps_valid = PPS_VALID; | ||
899 | |||
900 | /* when called for the first time, | ||
901 | * just start the frequency interval */ | ||
902 | if (unlikely(pps_fbase.tv_sec == 0)) { | ||
903 | pps_fbase = *raw_ts; | ||
904 | write_sequnlock_irqrestore(&xtime_lock, flags); | ||
905 | return; | ||
906 | } | ||
907 | |||
908 | /* ok, now we have a base for frequency calculation */ | ||
909 | freq_norm = pps_normalize_ts(timespec_sub(*raw_ts, pps_fbase)); | ||
910 | |||
911 | /* check that the signal is in the range | ||
912 | * [1s - MAXFREQ us, 1s + MAXFREQ us], otherwise reject it */ | ||
913 | if ((freq_norm.sec == 0) || | ||
914 | (freq_norm.nsec > MAXFREQ * freq_norm.sec) || | ||
915 | (freq_norm.nsec < -MAXFREQ * freq_norm.sec)) { | ||
916 | time_status |= STA_PPSJITTER; | ||
917 | /* restart the frequency calibration interval */ | ||
918 | pps_fbase = *raw_ts; | ||
919 | write_sequnlock_irqrestore(&xtime_lock, flags); | ||
920 | pr_err("hardpps: PPSJITTER: bad pulse\n"); | ||
921 | return; | ||
922 | } | ||
923 | |||
924 | /* signal is ok */ | ||
925 | |||
926 | /* check if the current frequency interval is finished */ | ||
927 | if (freq_norm.sec >= (1 << pps_shift)) { | ||
928 | pps_calcnt++; | ||
929 | /* restart the frequency calibration interval */ | ||
930 | pps_fbase = *raw_ts; | ||
931 | hardpps_update_freq(freq_norm); | ||
932 | } | ||
933 | |||
934 | hardpps_update_phase(pts_norm.nsec); | ||
935 | |||
936 | write_sequnlock_irqrestore(&xtime_lock, flags); | ||
937 | } | ||
938 | EXPORT_SYMBOL(hardpps); | ||
939 | |||
940 | #endif /* CONFIG_NTP_PPS */ | ||
941 | |||
547 | static int __init ntp_tick_adj_setup(char *str) | 942 | static int __init ntp_tick_adj_setup(char *str) |
548 | { | 943 | { |
549 | ntp_tick_adj = simple_strtol(str, NULL, 0); | 944 | ntp_tick_adj = simple_strtol(str, NULL, 0); |
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 5bb86da82003..5536aaf3ba36 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
@@ -288,6 +288,49 @@ void ktime_get_ts(struct timespec *ts) | |||
288 | } | 288 | } |
289 | EXPORT_SYMBOL_GPL(ktime_get_ts); | 289 | EXPORT_SYMBOL_GPL(ktime_get_ts); |
290 | 290 | ||
291 | #ifdef CONFIG_NTP_PPS | ||
292 | |||
293 | /** | ||
294 | * getnstime_raw_and_real - get day and raw monotonic time in timespec format | ||
295 | * @ts_raw: pointer to the timespec to be set to raw monotonic time | ||
296 | * @ts_real: pointer to the timespec to be set to the time of day | ||
297 | * | ||
298 | * This function reads both the time of day and raw monotonic time at the | ||
299 | * same time atomically and stores the resulting timestamps in timespec | ||
300 | * format. | ||
301 | */ | ||
302 | void getnstime_raw_and_real(struct timespec *ts_raw, struct timespec *ts_real) | ||
303 | { | ||
304 | unsigned long seq; | ||
305 | s64 nsecs_raw, nsecs_real; | ||
306 | |||
307 | WARN_ON_ONCE(timekeeping_suspended); | ||
308 | |||
309 | do { | ||
310 | u32 arch_offset; | ||
311 | |||
312 | seq = read_seqbegin(&xtime_lock); | ||
313 | |||
314 | *ts_raw = raw_time; | ||
315 | *ts_real = xtime; | ||
316 | |||
317 | nsecs_raw = timekeeping_get_ns_raw(); | ||
318 | nsecs_real = timekeeping_get_ns(); | ||
319 | |||
320 | /* If arch requires, add in gettimeoffset() */ | ||
321 | arch_offset = arch_gettimeoffset(); | ||
322 | nsecs_raw += arch_offset; | ||
323 | nsecs_real += arch_offset; | ||
324 | |||
325 | } while (read_seqretry(&xtime_lock, seq)); | ||
326 | |||
327 | timespec_add_ns(ts_raw, nsecs_raw); | ||
328 | timespec_add_ns(ts_real, nsecs_real); | ||
329 | } | ||
330 | EXPORT_SYMBOL(getnstime_raw_and_real); | ||
331 | |||
332 | #endif /* CONFIG_NTP_PPS */ | ||
333 | |||
291 | /** | 334 | /** |
292 | * do_gettimeofday - Returns the time of day in a timeval | 335 | * do_gettimeofday - Returns the time of day in a timeval |
293 | * @tv: pointer to the timeval to be set | 336 | * @tv: pointer to the timeval to be set |
diff --git a/kernel/trace/trace_entries.h b/kernel/trace/trace_entries.h index e3dfecaf13e6..6cf223764be8 100644 --- a/kernel/trace/trace_entries.h +++ b/kernel/trace/trace_entries.h | |||
@@ -53,7 +53,7 @@ | |||
53 | */ | 53 | */ |
54 | 54 | ||
55 | /* | 55 | /* |
56 | * Function trace entry - function address and parent function addres: | 56 | * Function trace entry - function address and parent function address: |
57 | */ | 57 | */ |
58 | FTRACE_ENTRY(function, ftrace_entry, | 58 | FTRACE_ENTRY(function, ftrace_entry, |
59 | 59 | ||
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c index 25915832291a..9da289c34f22 100644 --- a/kernel/user_namespace.c +++ b/kernel/user_namespace.c | |||
@@ -12,6 +12,8 @@ | |||
12 | #include <linux/highuid.h> | 12 | #include <linux/highuid.h> |
13 | #include <linux/cred.h> | 13 | #include <linux/cred.h> |
14 | 14 | ||
15 | static struct kmem_cache *user_ns_cachep __read_mostly; | ||
16 | |||
15 | /* | 17 | /* |
16 | * Create a new user namespace, deriving the creator from the user in the | 18 | * Create a new user namespace, deriving the creator from the user in the |
17 | * passed credentials, and replacing that user with the new root user for the | 19 | * passed credentials, and replacing that user with the new root user for the |
@@ -26,7 +28,7 @@ int create_user_ns(struct cred *new) | |||
26 | struct user_struct *root_user; | 28 | struct user_struct *root_user; |
27 | int n; | 29 | int n; |
28 | 30 | ||
29 | ns = kmalloc(sizeof(struct user_namespace), GFP_KERNEL); | 31 | ns = kmem_cache_alloc(user_ns_cachep, GFP_KERNEL); |
30 | if (!ns) | 32 | if (!ns) |
31 | return -ENOMEM; | 33 | return -ENOMEM; |
32 | 34 | ||
@@ -38,7 +40,7 @@ int create_user_ns(struct cred *new) | |||
38 | /* Alloc new root user. */ | 40 | /* Alloc new root user. */ |
39 | root_user = alloc_uid(ns, 0); | 41 | root_user = alloc_uid(ns, 0); |
40 | if (!root_user) { | 42 | if (!root_user) { |
41 | kfree(ns); | 43 | kmem_cache_free(user_ns_cachep, ns); |
42 | return -ENOMEM; | 44 | return -ENOMEM; |
43 | } | 45 | } |
44 | 46 | ||
@@ -71,7 +73,7 @@ static void free_user_ns_work(struct work_struct *work) | |||
71 | struct user_namespace *ns = | 73 | struct user_namespace *ns = |
72 | container_of(work, struct user_namespace, destroyer); | 74 | container_of(work, struct user_namespace, destroyer); |
73 | free_uid(ns->creator); | 75 | free_uid(ns->creator); |
74 | kfree(ns); | 76 | kmem_cache_free(user_ns_cachep, ns); |
75 | } | 77 | } |
76 | 78 | ||
77 | void free_user_ns(struct kref *kref) | 79 | void free_user_ns(struct kref *kref) |
@@ -126,3 +128,10 @@ gid_t user_ns_map_gid(struct user_namespace *to, const struct cred *cred, gid_t | |||
126 | /* No useful relationship so no mapping */ | 128 | /* No useful relationship so no mapping */ |
127 | return overflowgid; | 129 | return overflowgid; |
128 | } | 130 | } |
131 | |||
132 | static __init int user_namespaces_init(void) | ||
133 | { | ||
134 | user_ns_cachep = KMEM_CACHE(user_namespace, SLAB_PANIC); | ||
135 | return 0; | ||
136 | } | ||
137 | module_init(user_namespaces_init); | ||