diff options
author | David S. Miller <davem@davemloft.net> | 2019-08-27 17:23:31 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-08-27 17:23:31 -0400 |
commit | 68aaf4459556b1f9370c259fd486aecad2257552 (patch) | |
tree | 99d92536a3263634969be6b70a96facea85a0df1 /kernel | |
parent | d00ee466a07eb9182ad3caf6140c7ebb527b4c64 (diff) | |
parent | 9e8312f5e160ade069e131d54ab8652cf0e86e1a (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Minor conflict in r8169, bug fix had two versions in net
and net-next, take the net-next hunks.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/bpf/syscall.c | 30 | ||||
-rw-r--r-- | kernel/bpf/verifier.c | 9 | ||||
-rw-r--r-- | kernel/dma/contiguous.c | 8 | ||||
-rw-r--r-- | kernel/dma/direct.c | 10 | ||||
-rw-r--r-- | kernel/irq/irqdesc.c | 15 | ||||
-rw-r--r-- | kernel/kprobes.c | 8 | ||||
-rw-r--r-- | kernel/module.c | 4 | ||||
-rw-r--r-- | kernel/sched/core.c | 5 | ||||
-rw-r--r-- | kernel/sched/psi.c | 8 | ||||
-rw-r--r-- | kernel/signal.c | 5 | ||||
-rw-r--r-- | kernel/time/timekeeping.c | 5 | ||||
-rw-r--r-- | kernel/time/vsyscall.c | 22 |
12 files changed, 89 insertions, 40 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 5d141f16f6fa..272071e9112f 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c | |||
@@ -1707,20 +1707,26 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr) | |||
1707 | if (err) | 1707 | if (err) |
1708 | goto free_used_maps; | 1708 | goto free_used_maps; |
1709 | 1709 | ||
1710 | err = bpf_prog_new_fd(prog); | 1710 | /* Upon success of bpf_prog_alloc_id(), the BPF prog is |
1711 | if (err < 0) { | 1711 | * effectively publicly exposed. However, retrieving via |
1712 | /* failed to allocate fd. | 1712 | * bpf_prog_get_fd_by_id() will take another reference, |
1713 | * bpf_prog_put() is needed because the above | 1713 | * therefore it cannot be gone underneath us. |
1714 | * bpf_prog_alloc_id() has published the prog | 1714 | * |
1715 | * to the userspace and the userspace may | 1715 | * Only for the time /after/ successful bpf_prog_new_fd() |
1716 | * have refcnt-ed it through BPF_PROG_GET_FD_BY_ID. | 1716 | * and before returning to userspace, we might just hold |
1717 | */ | 1717 | * one reference and any parallel close on that fd could |
1718 | bpf_prog_put(prog); | 1718 | * rip everything out. Hence, below notifications must |
1719 | return err; | 1719 | * happen before bpf_prog_new_fd(). |
1720 | } | 1720 | * |
1721 | 1721 | * Also, any failure handling from this point onwards must | |
1722 | * be using bpf_prog_put() given the program is exposed. | ||
1723 | */ | ||
1722 | bpf_prog_kallsyms_add(prog); | 1724 | bpf_prog_kallsyms_add(prog); |
1723 | perf_event_bpf_event(prog, PERF_BPF_EVENT_PROG_LOAD, 0); | 1725 | perf_event_bpf_event(prog, PERF_BPF_EVENT_PROG_LOAD, 0); |
1726 | |||
1727 | err = bpf_prog_new_fd(prog); | ||
1728 | if (err < 0) | ||
1729 | bpf_prog_put(prog); | ||
1724 | return err; | 1730 | return err; |
1725 | 1731 | ||
1726 | free_used_maps: | 1732 | free_used_maps: |
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 10c0ff93f52b..16d66bd7af09 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c | |||
@@ -985,9 +985,6 @@ static void __mark_reg_unbounded(struct bpf_reg_state *reg) | |||
985 | reg->smax_value = S64_MAX; | 985 | reg->smax_value = S64_MAX; |
986 | reg->umin_value = 0; | 986 | reg->umin_value = 0; |
987 | reg->umax_value = U64_MAX; | 987 | reg->umax_value = U64_MAX; |
988 | |||
989 | /* constant backtracking is enabled for root only for now */ | ||
990 | reg->precise = capable(CAP_SYS_ADMIN) ? false : true; | ||
991 | } | 988 | } |
992 | 989 | ||
993 | /* Mark a register as having a completely unknown (scalar) value. */ | 990 | /* Mark a register as having a completely unknown (scalar) value. */ |
@@ -1014,7 +1011,11 @@ static void mark_reg_unknown(struct bpf_verifier_env *env, | |||
1014 | __mark_reg_not_init(regs + regno); | 1011 | __mark_reg_not_init(regs + regno); |
1015 | return; | 1012 | return; |
1016 | } | 1013 | } |
1017 | __mark_reg_unknown(regs + regno); | 1014 | regs += regno; |
1015 | __mark_reg_unknown(regs); | ||
1016 | /* constant backtracking is enabled for root without bpf2bpf calls */ | ||
1017 | regs->precise = env->subprog_cnt > 1 || !env->allow_ptr_leaks ? | ||
1018 | true : false; | ||
1018 | } | 1019 | } |
1019 | 1020 | ||
1020 | static void __mark_reg_not_init(struct bpf_reg_state *reg) | 1021 | static void __mark_reg_not_init(struct bpf_reg_state *reg) |
diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c index 2bd410f934b3..69cfb4345388 100644 --- a/kernel/dma/contiguous.c +++ b/kernel/dma/contiguous.c | |||
@@ -230,9 +230,7 @@ bool dma_release_from_contiguous(struct device *dev, struct page *pages, | |||
230 | */ | 230 | */ |
231 | struct page *dma_alloc_contiguous(struct device *dev, size_t size, gfp_t gfp) | 231 | struct page *dma_alloc_contiguous(struct device *dev, size_t size, gfp_t gfp) |
232 | { | 232 | { |
233 | int node = dev ? dev_to_node(dev) : NUMA_NO_NODE; | 233 | size_t count = size >> PAGE_SHIFT; |
234 | size_t count = PAGE_ALIGN(size) >> PAGE_SHIFT; | ||
235 | size_t align = get_order(PAGE_ALIGN(size)); | ||
236 | struct page *page = NULL; | 234 | struct page *page = NULL; |
237 | struct cma *cma = NULL; | 235 | struct cma *cma = NULL; |
238 | 236 | ||
@@ -243,14 +241,12 @@ struct page *dma_alloc_contiguous(struct device *dev, size_t size, gfp_t gfp) | |||
243 | 241 | ||
244 | /* CMA can be used only in the context which permits sleeping */ | 242 | /* CMA can be used only in the context which permits sleeping */ |
245 | if (cma && gfpflags_allow_blocking(gfp)) { | 243 | if (cma && gfpflags_allow_blocking(gfp)) { |
244 | size_t align = get_order(size); | ||
246 | size_t cma_align = min_t(size_t, align, CONFIG_CMA_ALIGNMENT); | 245 | size_t cma_align = min_t(size_t, align, CONFIG_CMA_ALIGNMENT); |
247 | 246 | ||
248 | page = cma_alloc(cma, count, cma_align, gfp & __GFP_NOWARN); | 247 | page = cma_alloc(cma, count, cma_align, gfp & __GFP_NOWARN); |
249 | } | 248 | } |
250 | 249 | ||
251 | /* Fallback allocation of normal pages */ | ||
252 | if (!page) | ||
253 | page = alloc_pages_node(node, gfp, align); | ||
254 | return page; | 250 | return page; |
255 | } | 251 | } |
256 | 252 | ||
diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c index 795c9b095d75..706113c6bebc 100644 --- a/kernel/dma/direct.c +++ b/kernel/dma/direct.c | |||
@@ -85,6 +85,8 @@ static bool dma_coherent_ok(struct device *dev, phys_addr_t phys, size_t size) | |||
85 | struct page *__dma_direct_alloc_pages(struct device *dev, size_t size, | 85 | struct page *__dma_direct_alloc_pages(struct device *dev, size_t size, |
86 | dma_addr_t *dma_handle, gfp_t gfp, unsigned long attrs) | 86 | dma_addr_t *dma_handle, gfp_t gfp, unsigned long attrs) |
87 | { | 87 | { |
88 | size_t alloc_size = PAGE_ALIGN(size); | ||
89 | int node = dev_to_node(dev); | ||
88 | struct page *page = NULL; | 90 | struct page *page = NULL; |
89 | u64 phys_mask; | 91 | u64 phys_mask; |
90 | 92 | ||
@@ -95,8 +97,14 @@ struct page *__dma_direct_alloc_pages(struct device *dev, size_t size, | |||
95 | gfp &= ~__GFP_ZERO; | 97 | gfp &= ~__GFP_ZERO; |
96 | gfp |= __dma_direct_optimal_gfp_mask(dev, dev->coherent_dma_mask, | 98 | gfp |= __dma_direct_optimal_gfp_mask(dev, dev->coherent_dma_mask, |
97 | &phys_mask); | 99 | &phys_mask); |
100 | page = dma_alloc_contiguous(dev, alloc_size, gfp); | ||
101 | if (page && !dma_coherent_ok(dev, page_to_phys(page), size)) { | ||
102 | dma_free_contiguous(dev, page, alloc_size); | ||
103 | page = NULL; | ||
104 | } | ||
98 | again: | 105 | again: |
99 | page = dma_alloc_contiguous(dev, size, gfp); | 106 | if (!page) |
107 | page = alloc_pages_node(node, gfp, get_order(alloc_size)); | ||
100 | if (page && !dma_coherent_ok(dev, page_to_phys(page), size)) { | 108 | if (page && !dma_coherent_ok(dev, page_to_phys(page), size)) { |
101 | dma_free_contiguous(dev, page, size); | 109 | dma_free_contiguous(dev, page, size); |
102 | page = NULL; | 110 | page = NULL; |
diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index 9484e88dabc2..9be995fc3c5a 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c | |||
@@ -295,6 +295,18 @@ static void irq_sysfs_add(int irq, struct irq_desc *desc) | |||
295 | } | 295 | } |
296 | } | 296 | } |
297 | 297 | ||
298 | static void irq_sysfs_del(struct irq_desc *desc) | ||
299 | { | ||
300 | /* | ||
301 | * If irq_sysfs_init() has not yet been invoked (early boot), then | ||
302 | * irq_kobj_base is NULL and the descriptor was never added. | ||
303 | * kobject_del() complains about a object with no parent, so make | ||
304 | * it conditional. | ||
305 | */ | ||
306 | if (irq_kobj_base) | ||
307 | kobject_del(&desc->kobj); | ||
308 | } | ||
309 | |||
298 | static int __init irq_sysfs_init(void) | 310 | static int __init irq_sysfs_init(void) |
299 | { | 311 | { |
300 | struct irq_desc *desc; | 312 | struct irq_desc *desc; |
@@ -325,6 +337,7 @@ static struct kobj_type irq_kobj_type = { | |||
325 | }; | 337 | }; |
326 | 338 | ||
327 | static void irq_sysfs_add(int irq, struct irq_desc *desc) {} | 339 | static void irq_sysfs_add(int irq, struct irq_desc *desc) {} |
340 | static void irq_sysfs_del(struct irq_desc *desc) {} | ||
328 | 341 | ||
329 | #endif /* CONFIG_SYSFS */ | 342 | #endif /* CONFIG_SYSFS */ |
330 | 343 | ||
@@ -438,7 +451,7 @@ static void free_desc(unsigned int irq) | |||
438 | * The sysfs entry must be serialized against a concurrent | 451 | * The sysfs entry must be serialized against a concurrent |
439 | * irq_sysfs_init() as well. | 452 | * irq_sysfs_init() as well. |
440 | */ | 453 | */ |
441 | kobject_del(&desc->kobj); | 454 | irq_sysfs_del(desc); |
442 | delete_irq_desc(irq); | 455 | delete_irq_desc(irq); |
443 | 456 | ||
444 | /* | 457 | /* |
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 9873fc627d61..d9770a5393c8 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -470,6 +470,7 @@ static DECLARE_DELAYED_WORK(optimizing_work, kprobe_optimizer); | |||
470 | */ | 470 | */ |
471 | static void do_optimize_kprobes(void) | 471 | static void do_optimize_kprobes(void) |
472 | { | 472 | { |
473 | lockdep_assert_held(&text_mutex); | ||
473 | /* | 474 | /* |
474 | * The optimization/unoptimization refers online_cpus via | 475 | * The optimization/unoptimization refers online_cpus via |
475 | * stop_machine() and cpu-hotplug modifies online_cpus. | 476 | * stop_machine() and cpu-hotplug modifies online_cpus. |
@@ -487,9 +488,7 @@ static void do_optimize_kprobes(void) | |||
487 | list_empty(&optimizing_list)) | 488 | list_empty(&optimizing_list)) |
488 | return; | 489 | return; |
489 | 490 | ||
490 | mutex_lock(&text_mutex); | ||
491 | arch_optimize_kprobes(&optimizing_list); | 491 | arch_optimize_kprobes(&optimizing_list); |
492 | mutex_unlock(&text_mutex); | ||
493 | } | 492 | } |
494 | 493 | ||
495 | /* | 494 | /* |
@@ -500,6 +499,7 @@ static void do_unoptimize_kprobes(void) | |||
500 | { | 499 | { |
501 | struct optimized_kprobe *op, *tmp; | 500 | struct optimized_kprobe *op, *tmp; |
502 | 501 | ||
502 | lockdep_assert_held(&text_mutex); | ||
503 | /* See comment in do_optimize_kprobes() */ | 503 | /* See comment in do_optimize_kprobes() */ |
504 | lockdep_assert_cpus_held(); | 504 | lockdep_assert_cpus_held(); |
505 | 505 | ||
@@ -507,7 +507,6 @@ static void do_unoptimize_kprobes(void) | |||
507 | if (list_empty(&unoptimizing_list)) | 507 | if (list_empty(&unoptimizing_list)) |
508 | return; | 508 | return; |
509 | 509 | ||
510 | mutex_lock(&text_mutex); | ||
511 | arch_unoptimize_kprobes(&unoptimizing_list, &freeing_list); | 510 | arch_unoptimize_kprobes(&unoptimizing_list, &freeing_list); |
512 | /* Loop free_list for disarming */ | 511 | /* Loop free_list for disarming */ |
513 | list_for_each_entry_safe(op, tmp, &freeing_list, list) { | 512 | list_for_each_entry_safe(op, tmp, &freeing_list, list) { |
@@ -524,7 +523,6 @@ static void do_unoptimize_kprobes(void) | |||
524 | } else | 523 | } else |
525 | list_del_init(&op->list); | 524 | list_del_init(&op->list); |
526 | } | 525 | } |
527 | mutex_unlock(&text_mutex); | ||
528 | } | 526 | } |
529 | 527 | ||
530 | /* Reclaim all kprobes on the free_list */ | 528 | /* Reclaim all kprobes on the free_list */ |
@@ -556,6 +554,7 @@ static void kprobe_optimizer(struct work_struct *work) | |||
556 | { | 554 | { |
557 | mutex_lock(&kprobe_mutex); | 555 | mutex_lock(&kprobe_mutex); |
558 | cpus_read_lock(); | 556 | cpus_read_lock(); |
557 | mutex_lock(&text_mutex); | ||
559 | /* Lock modules while optimizing kprobes */ | 558 | /* Lock modules while optimizing kprobes */ |
560 | mutex_lock(&module_mutex); | 559 | mutex_lock(&module_mutex); |
561 | 560 | ||
@@ -583,6 +582,7 @@ static void kprobe_optimizer(struct work_struct *work) | |||
583 | do_free_cleaned_kprobes(); | 582 | do_free_cleaned_kprobes(); |
584 | 583 | ||
585 | mutex_unlock(&module_mutex); | 584 | mutex_unlock(&module_mutex); |
585 | mutex_unlock(&text_mutex); | ||
586 | cpus_read_unlock(); | 586 | cpus_read_unlock(); |
587 | mutex_unlock(&kprobe_mutex); | 587 | mutex_unlock(&kprobe_mutex); |
588 | 588 | ||
diff --git a/kernel/module.c b/kernel/module.c index 5933395af9a0..9ee93421269c 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -65,9 +65,9 @@ | |||
65 | /* | 65 | /* |
66 | * Modules' sections will be aligned on page boundaries | 66 | * Modules' sections will be aligned on page boundaries |
67 | * to ensure complete separation of code and data, but | 67 | * to ensure complete separation of code and data, but |
68 | * only when CONFIG_STRICT_MODULE_RWX=y | 68 | * only when CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y |
69 | */ | 69 | */ |
70 | #ifdef CONFIG_STRICT_MODULE_RWX | 70 | #ifdef CONFIG_ARCH_HAS_STRICT_MODULE_RWX |
71 | # define debug_align(X) ALIGN(X, PAGE_SIZE) | 71 | # define debug_align(X) ALIGN(X, PAGE_SIZE) |
72 | #else | 72 | #else |
73 | # define debug_align(X) (X) | 73 | # define debug_align(X) (X) |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 2b037f195473..010d578118d6 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -3904,7 +3904,7 @@ void __noreturn do_task_dead(void) | |||
3904 | 3904 | ||
3905 | static inline void sched_submit_work(struct task_struct *tsk) | 3905 | static inline void sched_submit_work(struct task_struct *tsk) |
3906 | { | 3906 | { |
3907 | if (!tsk->state || tsk_is_pi_blocked(tsk)) | 3907 | if (!tsk->state) |
3908 | return; | 3908 | return; |
3909 | 3909 | ||
3910 | /* | 3910 | /* |
@@ -3920,6 +3920,9 @@ static inline void sched_submit_work(struct task_struct *tsk) | |||
3920 | preempt_enable_no_resched(); | 3920 | preempt_enable_no_resched(); |
3921 | } | 3921 | } |
3922 | 3922 | ||
3923 | if (tsk_is_pi_blocked(tsk)) | ||
3924 | return; | ||
3925 | |||
3923 | /* | 3926 | /* |
3924 | * If we are going to sleep and we have plugged IO queued, | 3927 | * If we are going to sleep and we have plugged IO queued, |
3925 | * make sure to submit it to avoid deadlocks. | 3928 | * make sure to submit it to avoid deadlocks. |
diff --git a/kernel/sched/psi.c b/kernel/sched/psi.c index 23fbbcc414d5..6e52b67b420e 100644 --- a/kernel/sched/psi.c +++ b/kernel/sched/psi.c | |||
@@ -1131,7 +1131,15 @@ static void psi_trigger_destroy(struct kref *ref) | |||
1131 | * deadlock while waiting for psi_poll_work to acquire trigger_lock | 1131 | * deadlock while waiting for psi_poll_work to acquire trigger_lock |
1132 | */ | 1132 | */ |
1133 | if (kworker_to_destroy) { | 1133 | if (kworker_to_destroy) { |
1134 | /* | ||
1135 | * After the RCU grace period has expired, the worker | ||
1136 | * can no longer be found through group->poll_kworker. | ||
1137 | * But it might have been already scheduled before | ||
1138 | * that - deschedule it cleanly before destroying it. | ||
1139 | */ | ||
1134 | kthread_cancel_delayed_work_sync(&group->poll_work); | 1140 | kthread_cancel_delayed_work_sync(&group->poll_work); |
1141 | atomic_set(&group->poll_scheduled, 0); | ||
1142 | |||
1135 | kthread_destroy_worker(kworker_to_destroy); | 1143 | kthread_destroy_worker(kworker_to_destroy); |
1136 | } | 1144 | } |
1137 | kfree(t); | 1145 | kfree(t); |
diff --git a/kernel/signal.c b/kernel/signal.c index e667be6907d7..534fec266a33 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -90,6 +90,11 @@ static bool sig_task_ignored(struct task_struct *t, int sig, bool force) | |||
90 | handler == SIG_DFL && !(force && sig_kernel_only(sig))) | 90 | handler == SIG_DFL && !(force && sig_kernel_only(sig))) |
91 | return true; | 91 | return true; |
92 | 92 | ||
93 | /* Only allow kernel generated signals to this kthread */ | ||
94 | if (unlikely((t->flags & PF_KTHREAD) && | ||
95 | (handler == SIG_KTHREAD_KERNEL) && !force)) | ||
96 | return true; | ||
97 | |||
93 | return sig_handler_ignored(handler, sig); | 98 | return sig_handler_ignored(handler, sig); |
94 | } | 99 | } |
95 | 100 | ||
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index d911c8470149..ca69290bee2a 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
@@ -146,6 +146,11 @@ static void tk_set_wall_to_mono(struct timekeeper *tk, struct timespec64 wtm) | |||
146 | static inline void tk_update_sleep_time(struct timekeeper *tk, ktime_t delta) | 146 | static inline void tk_update_sleep_time(struct timekeeper *tk, ktime_t delta) |
147 | { | 147 | { |
148 | tk->offs_boot = ktime_add(tk->offs_boot, delta); | 148 | tk->offs_boot = ktime_add(tk->offs_boot, delta); |
149 | /* | ||
150 | * Timespec representation for VDSO update to avoid 64bit division | ||
151 | * on every update. | ||
152 | */ | ||
153 | tk->monotonic_to_boot = ktime_to_timespec64(tk->offs_boot); | ||
149 | } | 154 | } |
150 | 155 | ||
151 | /* | 156 | /* |
diff --git a/kernel/time/vsyscall.c b/kernel/time/vsyscall.c index 8cf3596a4ce6..4bc37ac3bb05 100644 --- a/kernel/time/vsyscall.c +++ b/kernel/time/vsyscall.c | |||
@@ -17,7 +17,7 @@ static inline void update_vdso_data(struct vdso_data *vdata, | |||
17 | struct timekeeper *tk) | 17 | struct timekeeper *tk) |
18 | { | 18 | { |
19 | struct vdso_timestamp *vdso_ts; | 19 | struct vdso_timestamp *vdso_ts; |
20 | u64 nsec; | 20 | u64 nsec, sec; |
21 | 21 | ||
22 | vdata[CS_HRES_COARSE].cycle_last = tk->tkr_mono.cycle_last; | 22 | vdata[CS_HRES_COARSE].cycle_last = tk->tkr_mono.cycle_last; |
23 | vdata[CS_HRES_COARSE].mask = tk->tkr_mono.mask; | 23 | vdata[CS_HRES_COARSE].mask = tk->tkr_mono.mask; |
@@ -45,23 +45,27 @@ static inline void update_vdso_data(struct vdso_data *vdata, | |||
45 | } | 45 | } |
46 | vdso_ts->nsec = nsec; | 46 | vdso_ts->nsec = nsec; |
47 | 47 | ||
48 | /* CLOCK_MONOTONIC_RAW */ | 48 | /* Copy MONOTONIC time for BOOTTIME */ |
49 | vdso_ts = &vdata[CS_RAW].basetime[CLOCK_MONOTONIC_RAW]; | 49 | sec = vdso_ts->sec; |
50 | vdso_ts->sec = tk->raw_sec; | 50 | /* Add the boot offset */ |
51 | vdso_ts->nsec = tk->tkr_raw.xtime_nsec; | 51 | sec += tk->monotonic_to_boot.tv_sec; |
52 | nsec += (u64)tk->monotonic_to_boot.tv_nsec << tk->tkr_mono.shift; | ||
52 | 53 | ||
53 | /* CLOCK_BOOTTIME */ | 54 | /* CLOCK_BOOTTIME */ |
54 | vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_BOOTTIME]; | 55 | vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_BOOTTIME]; |
55 | vdso_ts->sec = tk->xtime_sec + tk->wall_to_monotonic.tv_sec; | 56 | vdso_ts->sec = sec; |
56 | nsec = tk->tkr_mono.xtime_nsec; | 57 | |
57 | nsec += ((u64)(tk->wall_to_monotonic.tv_nsec + | ||
58 | ktime_to_ns(tk->offs_boot)) << tk->tkr_mono.shift); | ||
59 | while (nsec >= (((u64)NSEC_PER_SEC) << tk->tkr_mono.shift)) { | 58 | while (nsec >= (((u64)NSEC_PER_SEC) << tk->tkr_mono.shift)) { |
60 | nsec -= (((u64)NSEC_PER_SEC) << tk->tkr_mono.shift); | 59 | nsec -= (((u64)NSEC_PER_SEC) << tk->tkr_mono.shift); |
61 | vdso_ts->sec++; | 60 | vdso_ts->sec++; |
62 | } | 61 | } |
63 | vdso_ts->nsec = nsec; | 62 | vdso_ts->nsec = nsec; |
64 | 63 | ||
64 | /* CLOCK_MONOTONIC_RAW */ | ||
65 | vdso_ts = &vdata[CS_RAW].basetime[CLOCK_MONOTONIC_RAW]; | ||
66 | vdso_ts->sec = tk->raw_sec; | ||
67 | vdso_ts->nsec = tk->tkr_raw.xtime_nsec; | ||
68 | |||
65 | /* CLOCK_TAI */ | 69 | /* CLOCK_TAI */ |
66 | vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_TAI]; | 70 | vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_TAI]; |
67 | vdso_ts->sec = tk->xtime_sec + (s64)tk->tai_offset; | 71 | vdso_ts->sec = tk->xtime_sec + (s64)tk->tai_offset; |