LCOV - code coverage report
Current view: top level - include/linux - time_namespace.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 1 0.0 %
Date: 2023-04-06 08:38:28 Functions: 0 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 vdso_data *arch_get_vdso_data(void *vvar_page);
      48             : struct page *find_timens_vvar_page(struct vm_area_struct *vma);
      49             : 
      50             : static inline void put_time_ns(struct time_namespace *ns)
      51             : {
      52             :         if (refcount_dec_and_test(&ns->ns.count))
      53             :                 free_time_ns(ns);
      54             : }
      55             : 
      56             : void proc_timens_show_offsets(struct task_struct *p, struct seq_file *m);
      57             : 
      58             : struct proc_timens_offset {
      59             :         int                     clockid;
      60             :         struct timespec64       val;
      61             : };
      62             : 
      63             : int proc_timens_set_offset(struct file *file, struct task_struct *p,
      64             :                            struct proc_timens_offset *offsets, int n);
      65             : 
      66             : static inline void timens_add_monotonic(struct timespec64 *ts)
      67             : {
      68             :         struct timens_offsets *ns_offsets = &current->nsproxy->time_ns->offsets;
      69             : 
      70             :         *ts = timespec64_add(*ts, ns_offsets->monotonic);
      71             : }
      72             : 
      73             : static inline void timens_add_boottime(struct timespec64 *ts)
      74             : {
      75             :         struct timens_offsets *ns_offsets = &current->nsproxy->time_ns->offsets;
      76             : 
      77             :         *ts = timespec64_add(*ts, ns_offsets->boottime);
      78             : }
      79             : 
      80             : static inline u64 timens_add_boottime_ns(u64 nsec)
      81             : {
      82             :         struct timens_offsets *ns_offsets = &current->nsproxy->time_ns->offsets;
      83             : 
      84             :         return nsec + timespec64_to_ns(&ns_offsets->boottime);
      85             : }
      86             : 
      87             : static inline void timens_sub_boottime(struct timespec64 *ts)
      88             : {
      89             :         struct timens_offsets *ns_offsets = &current->nsproxy->time_ns->offsets;
      90             : 
      91             :         *ts = timespec64_sub(*ts, ns_offsets->boottime);
      92             : }
      93             : 
      94             : ktime_t do_timens_ktime_to_host(clockid_t clockid, ktime_t tim,
      95             :                                 struct timens_offsets *offsets);
      96             : 
      97             : static inline ktime_t timens_ktime_to_host(clockid_t clockid, ktime_t tim)
      98             : {
      99             :         struct time_namespace *ns = current->nsproxy->time_ns;
     100             : 
     101             :         if (likely(ns == &init_time_ns))
     102             :                 return tim;
     103             : 
     104             :         return do_timens_ktime_to_host(clockid, tim, &ns->offsets);
     105             : }
     106             : 
     107             : #else
     108             : static inline int vdso_join_timens(struct task_struct *task,
     109             :                                    struct time_namespace *ns)
     110             : {
     111             :         return 0;
     112             : }
     113             : 
     114             : static inline void timens_commit(struct task_struct *tsk,
     115             :                                  struct time_namespace *ns)
     116             : {
     117             : }
     118             : 
     119             : static inline struct time_namespace *get_time_ns(struct time_namespace *ns)
     120             : {
     121             :         return NULL;
     122             : }
     123             : 
     124             : static inline void put_time_ns(struct time_namespace *ns)
     125             : {
     126             : }
     127             : 
     128             : static inline
     129             : struct time_namespace *copy_time_ns(unsigned long flags,
     130             :                                     struct user_namespace *user_ns,
     131             :                                     struct time_namespace *old_ns)
     132             : {
     133           0 :         if (flags & CLONE_NEWTIME)
     134             :                 return ERR_PTR(-EINVAL);
     135             : 
     136             :         return old_ns;
     137             : }
     138             : 
     139             : static inline void timens_on_fork(struct nsproxy *nsproxy,
     140             :                                  struct task_struct *tsk)
     141             : {
     142             :         return;
     143             : }
     144             : 
     145             : static inline struct page *find_timens_vvar_page(struct vm_area_struct *vma)
     146             : {
     147             :         return NULL;
     148             : }
     149             : 
     150             : static inline void timens_add_monotonic(struct timespec64 *ts) { }
     151             : static inline void timens_add_boottime(struct timespec64 *ts) { }
     152             : 
     153             : static inline u64 timens_add_boottime_ns(u64 nsec)
     154             : {
     155             :         return nsec;
     156             : }
     157             : 
     158             : static inline void timens_sub_boottime(struct timespec64 *ts) { }
     159             : 
     160             : static inline ktime_t timens_ktime_to_host(clockid_t clockid, ktime_t tim)
     161             : {
     162             :         return tim;
     163             : }
     164             : #endif
     165             : 
     166             : #endif /* _LINUX_TIMENS_H */

Generated by: LCOV version 1.14