[Devel] [PATCH vz9 03/27] ve: uninline ve_get_monotonic() and ve_get_uptime()

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Wed Oct 6 12:14:56 MSK 2021



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 <ptikhomirov at virtuozzo.com>

> Signed-off-by: Nikita Yushchenko <nikita.yushchenko at 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.


More information about the Devel mailing list