LCOV - code coverage report
Current view: top level - include/linux - time_namespace.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-djwa @ Mon Jul 31 20:08:17 PDT 2023 Lines: 3 4 75.0 %
Date: 2023-07-31 20:08:17 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : #ifndef _LINUX_TIMENS_H
       3             : #define _LINUX_TIMENS_H
       4             : 
       5             : 
       6             : #include <linux/sched.h>
       7             : #include <linux/nsproxy.h>
       8             : #include <linux/ns_common.h>
       9             : #include <linux/err.h>
      10             : 
      11             : struct user_namespace;
      12             : extern struct user_namespace init_user_ns;
      13             : 
      14             : struct timens_offsets {
      15             :         struct timespec64 monotonic;
      16             :         struct timespec64 boottime;
      17             : };
      18             : 
      19             : struct time_namespace {
      20             :         struct user_namespace   *user_ns;
      21             :         struct ucounts          *ucounts;
      22             :         struct ns_common        ns;
      23             :         struct timens_offsets   offsets;
      24             :         struct page             *vvar_page;
      25             :         /* If set prevents changing offsets after any task joined namespace. */
      26             :         bool                    frozen_offsets;
      27             : } __randomize_layout;
      28             : 
      29             : extern struct time_namespace init_time_ns;
      30             : 
      31             : #ifdef CONFIG_TIME_NS
      32             : extern int vdso_join_timens(struct task_struct *task,
      33             :                             struct time_namespace *ns);
      34             : extern void timens_commit(struct task_struct *tsk, struct time_namespace *ns);
      35             : 
      36             : static inline struct time_namespace *get_time_ns(struct time_namespace *ns)
      37             : {
      38             :         refcount_inc(&ns->ns.count);
      39             :         return ns;
      40             : }
      41             : 
      42             : struct time_namespace *copy_time_ns(unsigned long flags,
      43             :                                     struct user_namespace *user_ns,
      44             :                                     struct time_namespace *old_ns);
      45             : void free_time_ns(struct time_namespace *ns);
      46             : void timens_on_fork(struct nsproxy *nsproxy, struct task_struct *tsk);
      47             : struct page *find_timens_vvar_page(struct vm_area_struct *vma);
      48             : 
      49             : static inline void put_time_ns(struct time_namespace *ns)
      50             : {
      51             :         if (refcount_dec_and_test(&ns->ns.count))
      52             :                 free_time_ns(ns);
      53             : }
      54             : 
      55             : void proc_timens_show_offsets(struct task_struct *p, struct seq_file *m);
      56             : 
      57             : struct proc_timens_offset {
      58             :         int                     clockid;
      59             :         struct timespec64       val;
      60             : };
      61             : 
      62             : int proc_timens_set_offset(struct file *file, struct task_struct *p,
      63             :                            struct proc_timens_offset *offsets, int n);
      64             : 
      65             : static inline void timens_add_monotonic(struct timespec64 *ts)
      66             : {
      67             :         struct timens_offsets *ns_offsets = &current->nsproxy->time_ns->offsets;
      68             : 
      69             :         *ts = timespec64_add(*ts, ns_offsets->monotonic);
      70             : }
      71             : 
      72             : static inline void timens_add_boottime(struct timespec64 *ts)
      73             : {
      74             :         struct timens_offsets *ns_offsets = &current->nsproxy->time_ns->offsets;
      75             : 
      76             :         *ts = timespec64_add(*ts, ns_offsets->boottime);
      77             : }
      78             : 
      79             : static inline u64 timens_add_boottime_ns(u64 nsec)
      80             : {
      81             :         struct timens_offsets *ns_offsets = &current->nsproxy->time_ns->offsets;
      82             : 
      83             :         return nsec + timespec64_to_ns(&ns_offsets->boottime);
      84             : }
      85             : 
      86             : static inline void timens_sub_boottime(struct timespec64 *ts)
      87             : {
      88             :         struct timens_offsets *ns_offsets = &current->nsproxy->time_ns->offsets;
      89             : 
      90             :         *ts = timespec64_sub(*ts, ns_offsets->boottime);
      91             : }
      92             : 
      93             : ktime_t do_timens_ktime_to_host(clockid_t clockid, ktime_t tim,
      94             :                                 struct timens_offsets *offsets);
      95             : 
      96      868617 : static inline ktime_t timens_ktime_to_host(clockid_t clockid, ktime_t tim)
      97             : {
      98      868617 :         struct time_namespace *ns = current->nsproxy->time_ns;
      99             : 
     100      868617 :         if (likely(ns == &init_time_ns))
     101             :                 return tim;
     102             : 
     103           0 :         return do_timens_ktime_to_host(clockid, tim, &ns->offsets);
     104             : }
     105             : 
     106             : #else
     107             : static inline int vdso_join_timens(struct task_struct *task,
     108             :                                    struct time_namespace *ns)
     109             : {
     110             :         return 0;
     111             : }
     112             : 
     113             : static inline void timens_commit(struct task_struct *tsk,
     114             :                                  struct time_namespace *ns)
     115             : {
     116             : }
     117             : 
     118             : static inline struct time_namespace *get_time_ns(struct time_namespace *ns)
     119             : {
     120             :         return NULL;
     121             : }
     122             : 
     123             : static inline void put_time_ns(struct time_namespace *ns)
     124             : {
     125             : }
     126             : 
     127             : static inline
     128             : struct time_namespace *copy_time_ns(unsigned long flags,
     129             :                                     struct user_namespace *user_ns,
     130             :                                     struct time_namespace *old_ns)
     131             : {
     132             :         if (flags & CLONE_NEWTIME)
     133             :                 return ERR_PTR(-EINVAL);
     134             : 
     135             :         return old_ns;
     136             : }
     137             : 
     138             : static inline void timens_on_fork(struct nsproxy *nsproxy,
     139             :                                  struct task_struct *tsk)
     140             : {
     141             :         return;
     142             : }
     143             : 
     144             : static inline struct page *find_timens_vvar_page(struct vm_area_struct *vma)
     145             : {
     146             :         return NULL;
     147             : }
     148             : 
     149             : static inline void timens_add_monotonic(struct timespec64 *ts) { }
     150             : static inline void timens_add_boottime(struct timespec64 *ts) { }
     151             : 
     152             : static inline u64 timens_add_boottime_ns(u64 nsec)
     153             : {
     154             :         return nsec;
     155             : }
     156             : 
     157             : static inline void timens_sub_boottime(struct timespec64 *ts) { }
     158             : 
     159             : static inline ktime_t timens_ktime_to_host(clockid_t clockid, ktime_t tim)
     160             : {
     161             :         return tim;
     162             : }
     163             : #endif
     164             : 
     165             : struct vdso_data *arch_get_vdso_data(void *vvar_page);
     166             : 
     167             : #endif /* _LINUX_TIMENS_H */

Generated by: LCOV version 1.14