[Devel] [PATCH rh7] Port diff-ve-timers-convert-ve-monotonic-to-abs-time-when-setting-timerfd-2

Pavel Tikhomirov ptikhomirov at odin.com
Tue Jun 9 00:26:24 PDT 2015


https://jira.sw.ru/browse/PSBM-34017

On 06/08/2015 07:17 PM, Pavel Tikhomirov wrote:
> Need this for docker, as sometimes systemd-tmpfiles-clean.timer inside
> PCS7 ct is spamming dbus with requests to start corresponding service.
> And at the same time docker tries to create cgroup for container and
> attach it to hierarchies like memory and blkio.
>
> That is because systemd timer was triggered with non-virtualized timerfd
> using plain host clock but check that timer is successfull uses
> virtualized clock_gettime and don't pass before proper(in-container)
> timer activation. And timers charges again and again starts service
> got in busy loop.
>
> minor changes: remove const for do_timerfd_settime argumen new, included
> ve.h in timerfd.c
>
> Port the following RH6 commit:
>
>    Author: Vladimir Davydov
>    Email: vdavydov at parallels.com
>    Subject: fs: convert ve monotonic to abs time when setting timerfd
>    Date: Fri, 15 Feb 2013 11:57:09 +0400
>
>    * [timers] corrected TFD_TIMER_ABSTIME timer handling,
>      the issue led to high cpu usage inside a Fedora 18 CT
>      by 'init' process (PSBM-18284)
>
>    Monotonic time inside container, as it can be obtained using various
>    system calls such as clock_gettime, is reported since start of the container,
>    not since start of the whole system. This was made in order to avoid time
>    issues while a container is migrated between different physical hosts, but this
>    also introduced a lot of problems in time- related system calls because
>    absolute monotonic time, which is in fact relative to container, passed to those
>    system calls must be converted to system-wide monotonic time, which is used by
>    kernel hrtimers.
>
>    One of those buggy system calls is timerfd_settime which accepts as an
>    argument absolute time if flag TFD_TIMER_ABSTIME is specified.
>
>    The patch fixes it by converting container monotonic time to system-
>    wide monotonic time using the monotonic_ve_to_abs() function, which was
>    introduced earlier and is now exported for that reason.
>
>    https://jira.sw.ru/browse/PSBM-18284
>
>    Signed-off-by: Vladimir Davydov <vdavydov at parallels.com>
>
> Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
> ---
>   fs/timerfd.c          |  6 +++++-
>   include/linux/ve.h    |  2 ++
>   kernel/posix-timers.c | 12 ++++++------
>   3 files changed, 13 insertions(+), 7 deletions(-)
>
> diff --git a/fs/timerfd.c b/fs/timerfd.c
> index ad10267..73cf8f11 100644
> --- a/fs/timerfd.c
> +++ b/fs/timerfd.c
> @@ -24,6 +24,7 @@
>   #include <linux/syscalls.h>
>   #include <linux/compat.h>
>   #include <linux/rcupdate.h>
> +#include <linux/ve.h>
>
>   struct timerfd_ctx {
>   	struct hrtimer tmr;
> @@ -349,7 +350,7 @@ SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags)
>   }
>
>   static int do_timerfd_settime(int ufd, int flags,
> -		const struct itimerspec *new,
> +		struct itimerspec *new,
>   		struct itimerspec *old)
>   {
>   	struct fd f;
> @@ -395,6 +396,9 @@ static int do_timerfd_settime(int ufd, int flags,
>   	/*
>   	 * Re-program the timer to the new value ...
>   	 */
> +	if ((flags & TFD_TIMER_ABSTIME) &&
> +	    (new->it_value.tv_sec || new->it_value.tv_nsec))
> +		 monotonic_ve_to_abs(ctx->clockid, &new->it_value);
>   	ret = timerfd_setup(ctx, flags, new);
>
>   	spin_unlock_irq(&ctx->wqh.lock);
> diff --git a/include/linux/ve.h b/include/linux/ve.h
> index 0029f57..758ff85 100644
> --- a/include/linux/ve.h
> +++ b/include/linux/ve.h
> @@ -211,6 +211,8 @@ static inline struct ve_struct *cgroup_ve(struct cgroup *cgroup)
>   }
>
>   extern unsigned long long ve_relative_clock(struct timespec * ts);
> +extern void monotonic_abs_to_ve(clockid_t which_clock, struct timespec *tp);
> +extern void monotonic_ve_to_abs(clockid_t which_clock, struct timespec *tp);
>
>   #ifdef CONFIG_VTTYS
>   extern int vtty_open_master(int veid, int idx);
> diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c
> index b9c849f..add70d8 100644
> --- a/kernel/posix-timers.c
> +++ b/kernel/posix-timers.c
> @@ -133,7 +133,7 @@ static struct k_clock posix_clocks[MAX_CLOCKS];
>   	 (which_clock) == CLOCK_MONOTONIC_COARSE)
>
>   #ifdef CONFIG_VE
> -static void monotonic_abs_to_ve(clockid_t which_clock, struct timespec *tp)
> +void monotonic_abs_to_ve(clockid_t which_clock, struct timespec *tp)
>   {
>   	struct ve_struct *ve = get_exec_env();
>
> @@ -143,7 +143,7 @@ static void monotonic_abs_to_ve(clockid_t which_clock, struct timespec *tp)
>   				tp->tv_nsec - ve->start_timespec.tv_nsec);
>   }
>
> -static void monotonic_ve_to_abs(clockid_t which_clock, struct timespec *tp)
> +void monotonic_ve_to_abs(clockid_t which_clock, struct timespec *tp)
>   {
>   	struct ve_struct *ve = get_exec_env();
>
> @@ -153,10 +153,10 @@ static void monotonic_ve_to_abs(clockid_t which_clock, struct timespec *tp)
>   				tp->tv_nsec + ve->start_timespec.tv_nsec);
>   }
>   #else
> -static inline void monotonic_abs_to_ve(clockid_t which_clock,
> -				       struct timespec *tp) { }
> -static inline void monotonic_ve_to_abs(clockid_t which_clock,
> -				       struct timepsec *tp) { }
> +inline void monotonic_abs_to_ve(clockid_t which_clock,
> +				struct timespec *tp) { }
> +inline void monotonic_ve_to_abs(clockid_t which_clock,
> +				struct timepsec *tp) { }
>   #endif
>
>   /*
>

-- 
Best regards, Tikhomirov Pavel
Junior Software Developer, Odin.



More information about the Devel mailing list