On 06.10.2021 11:57, Nikita Yushchenko wrote:
These functions reference put_time_ns() that is not exported.
This turns into link errors when the functions are used in modules.

Also split out ve_get_time_ns() because it is useful elsewhere.
Keep this one inline for now.


Reviewed-by: Pavel Tikhomirov <ptikhomi...@virtuozzo.com>

Signed-off-by: Nikita Yushchenko <nikita.yushche...@virtuozzo.com>
---
  include/linux/ve.h | 42 ++++++------------------------------------
  kernel/ve/ve.c     | 34 ++++++++++++++++++++++++++++++++++
  2 files changed, 40 insertions(+), 36 deletions(-)

diff --git a/include/linux/ve.h b/include/linux/ve.h
index 959e919633c9..4dde4cb46d52 100644
--- a/include/linux/ve.h
+++ b/include/linux/ve.h
@@ -127,52 +127,22 @@ static inline struct ve_struct *css_to_ve(struct 
cgroup_subsys_state *css)
extern struct cgroup_subsys_state *ve_get_init_css(struct ve_struct *ve, int subsys_id); -static inline u64 ve_get_monotonic(struct ve_struct *ve)
+static inline struct time_namespace *ve_get_time_ns(struct ve_struct *ve)
  {
-       struct timespec64 tp = ns_to_timespec64(0);
-       struct time_namespace *time_ns;
        struct nsproxy *ve_ns;
-
-       rcu_read_lock();
-       ve_ns = rcu_dereference(ve->ve_ns);
-       if (!ve_ns) {
-               rcu_read_unlock();
-               goto out;
-       }
-
-       time_ns = get_time_ns(ve_ns->time_ns);
-       rcu_read_unlock();
-
-       ktime_get_ts64(&tp);
-       tp = timespec64_add(tp, time_ns->offsets.monotonic);
-       put_time_ns(time_ns);
-out:
-       return timespec64_to_ns(&tp);
-}
-
-static u64 ve_get_uptime(struct ve_struct *ve)
-{
-       struct timespec64 tp = ns_to_timespec64(0);
        struct time_namespace *time_ns;
-       struct nsproxy *ve_ns;
rcu_read_lock();
        ve_ns = rcu_dereference(ve->ve_ns);
-       if (!ve_ns) {
-               rcu_read_unlock();
-               goto out;
-       }
-
-       time_ns = get_time_ns(ve_ns->time_ns);
+       time_ns = ve_ns ? get_time_ns(ve_ns->time_ns) : NULL;
        rcu_read_unlock();
- ktime_get_boottime_ts64(&tp);
-       tp = timespec64_add(tp, time_ns->offsets.boottime);
-       put_time_ns(time_ns);
-out:
-       return timespec64_to_ns(&tp);
+       return time_ns;
  }
+extern u64 ve_get_monotonic(struct ve_struct *ve);
+extern u64 ve_get_uptime(struct ve_struct *ve);
+
  static inline void ve_set_task_start_time(struct ve_struct *ve,
                                          struct task_struct *t)
  {
diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
index cd4b982cc0da..bd114bd620eb 100644
--- a/kernel/ve/ve.c
+++ b/kernel/ve/ve.c
@@ -577,6 +577,40 @@ void ve_exit_ns(struct pid_namespace *pid_ns)
        up_write(&ve->op_sem);
  }
+u64 ve_get_monotonic(struct ve_struct *ve)
+{
+       struct time_namespace *time_ns = ve_get_time_ns(ve);
+       struct timespec64 tp;
+
+       if (unlikely(!time_ns)) {
+               /* container not yet started */
+               return 0;
+       }
+
+       ktime_get_ts64(&tp);
+       tp = timespec64_add(tp, time_ns->offsets.monotonic);
+       put_time_ns(time_ns);
+       return timespec64_to_ns(&tp);
+}
+EXPORT_SYMBOL(ve_get_monotonic);
+
+u64 ve_get_uptime(struct ve_struct *ve)
+{
+       struct time_namespace *time_ns = ve_get_time_ns(ve);
+       struct timespec64 tp;
+
+       if (unlikely(!time_ns)) {
+               /* container not yet started */
+               return 0;
+       }
+
+       ktime_get_boottime_ts64(&tp);
+       tp = timespec64_add(tp, time_ns->offsets.boottime);
+       put_time_ns(time_ns);
+       return timespec64_to_ns(&tp);
+}
+EXPORT_SYMBOL(ve_get_uptime);
+
  static int copy_vdso(struct vdso_image **vdso_dst, const struct vdso_image 
*vdso_src)
  {
        struct vdso_image *vdso;


--
Best regards, Tikhomirov Pavel
Software Developer, Virtuozzo.
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to