All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrei Vagin <avagin@gmail.com>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: Dmitry Safonov <dima@arista.com>,
	linux-kernel@vger.kernel.org, Adrian Reber <adrian@lisas.de>,
	Andrei Vagin <avagin@openvz.org>,
	Andy Lutomirski <luto@kernel.org>, Arnd Bergmann <arnd@arndb.de>,
	Christian Brauner <christian.brauner@ubuntu.com>,
	Cyrill Gorcunov <gorcunov@openvz.org>,
	Dmitry Safonov <0x7f454c46@gmail.com>,
	"Eric W. Biederman" <ebiederm@xmission.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@redhat.com>,
	Jeff Dike <jdike@addtoit.com>, Oleg Nesterov <oleg@redhat.com>,
	Pavel Emelyanov <xemul@virtuozzo.com>,
	Shuah Khan <shuah@kernel.org>,
	Vincenzo Frascino <vincenzo.frascino@arm.com>,
	containers@lists.linux-foundation.org, criu@openvz.org,
	linux-api@vger.kernel.org, x86@kernel.org
Subject: Re: [PATCHv3 05/27] timerfd/timens: Take into account ns clock offsets
Date: Fri, 3 May 2019 00:00:29 -0700	[thread overview]
Message-ID: <20190503070028.GA7984@gmail.com> (raw)
In-Reply-To: <alpine.DEB.2.21.1904252207170.1768@nanos.tec.linutronix.de>

Hi Thomas,

Thank you for the review.  I read your comments. All of them look
reasonable. I'm sorry that you had to comment a lot. Will fix in the
next version.

Thanks,
Andrei

On Thu, Apr 25, 2019 at 11:28:24PM +0200, Thomas Gleixner wrote:
> On Thu, 25 Apr 2019, Dmitry Safonov wrote:
> > From: Andrei Vagin <avagin@gmail.com>
> > 
> > Make timerfd respect timens offsets.
> > Provide a helper timens_ktime_to_host() that is useful to wire up
> > timens to different kernel subsystems.
> 
> Yet another changelog which lacks meat.
> 
> > @@ -179,6 +180,8 @@ static int timerfd_setup(struct timerfd_ctx *ctx, int flags,
> >  	htmode = (flags & TFD_TIMER_ABSTIME) ?
> >  		HRTIMER_MODE_ABS: HRTIMER_MODE_REL;
> >  
> > +	htmode |= HRTIMER_MODE_NS;
> 
> Without looking further this time. My gut reaction is that this is
> wrong. Name space adjustment is only valid for absolute timers not for
> relative timers.
> 
> Aside of that the name sucks. MODE_NS is really not intuitive. It could be
> NanoSeconds or whatever and quite some time(r) functions have a _ns element
> already. Please look for something more inuitive and clearly related to
> namespaces. We are not short of letters.
> 
> >  	texp = timespec64_to_ktime(ktmr->it_value);
> >  	ctx->expired = 0;
> >  	ctx->ticks = 0;
> > @@ -197,9 +200,10 @@ static int timerfd_setup(struct timerfd_ctx *ctx, int flags,
> >  
> >  	if (texp != 0) {
> >  		if (isalarm(ctx)) {
> > -			if (flags & TFD_TIMER_ABSTIME)
> > +			if (flags & TFD_TIMER_ABSTIME) {
> > +				texp = timens_ktime_to_host(clockid, texp);
> 
> You are not serious about that inline function here? It's huge and
> pointless bloat because the only time affected here is boot time, but the
> compiler does not know that.
> 
> >  				alarm_start(&ctx->t.alarm, texp);
> 
> Make that:
> 
>    alarm_start_namespace(.....)
> 
> and that does:
> 
> void alarm_start_namespace(struct alarm *alarm, ktime_t expires)
> {
> 	if (alarm->type == ALARM_BOOTTIME)
> 		expires = timens_sub_boottime(expires);
> 	alarm_start(alarm, expires);
> }
> 
> Hmm?
> 
> > -			else
> > +			} else
> >  				alarm_start_relative(&ctx->t.alarm, texp);
> >  		} else {
> >  			hrtimer_start(&ctx->t.tmr, texp, htmode);
> > diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h
> > index 2e8957eac4d4..4b9c89c797ee 100644
> > --- a/include/linux/hrtimer.h
> > +++ b/include/linux/hrtimer.h
> > @@ -38,6 +38,7 @@ enum hrtimer_mode {
> >  	HRTIMER_MODE_REL	= 0x01,
> >  	HRTIMER_MODE_PINNED	= 0x02,
> >  	HRTIMER_MODE_SOFT	= 0x04,
> > +	HRTIMER_MODE_NS		= 0x08,
> >  
> >  	HRTIMER_MODE_ABS_PINNED = HRTIMER_MODE_ABS | HRTIMER_MODE_PINNED,
> >  	HRTIMER_MODE_REL_PINNED = HRTIMER_MODE_REL | HRTIMER_MODE_PINNED,
> > diff --git a/include/linux/time_namespace.h b/include/linux/time_namespace.h
> > index 5f0da6858b10..988414f7f791 100644
> > --- a/include/linux/time_namespace.h
> > +++ b/include/linux/time_namespace.h
> > @@ -56,6 +56,41 @@ static inline void timens_add_boottime(struct timespec64 *ts)
> >                  *ts = timespec64_add(*ts, ns_offsets->monotonic_boottime_offset);
> >  }
> >  
> > +static inline ktime_t timens_ktime_to_host(clockid_t clockid, ktime_t tim)
> > +{
> > +	struct timens_offsets *ns_offsets = current->nsproxy->time_ns->offsets;
> > +	struct timespec64 *offset;
> > +	ktime_t koff;
> > +
> > +	if (!ns_offsets)
> > +		return tim;
> > +
> > +	switch (clockid) {
> > +		case CLOCK_MONOTONIC:
> > +		case CLOCK_MONOTONIC_RAW:
> > +		case CLOCK_MONOTONIC_COARSE:
> 
> What's the point of COARSE and RAW? Neither of them can be used to arm
> timers.
> 
> > +			offset = &ns_offsets->monotonic_time_offset;
> > +			break;
> > +		case CLOCK_BOOTTIME:
> > +		case CLOCK_BOOTTIME_ALARM:
> > +			offset = &ns_offsets->monotonic_boottime_offset;
> > +			break;
> > +		default:
> > +			return tim;
> > +	}
> > +
> > +	koff = timespec64_to_ktime(*offset);
> 
> What about storing both the timespec and the ktime_t representation?
> 
> > +	if (tim < koff)
> > +		tim = 0;
> > +	else if (KTIME_MAX - tim < -koff)
> > +		tim = KTIME_MAX;
> 
> Blink!?! This is completely nonobvious and you're going to stare at it in
> disbelief half a year from now. Comments exist for a reason.
> 
> > +	else
> > +		tim = ktime_sub(tim, koff);
> > +
> > +	return tim;
> 
> This whole thing is way too large for inlining.
> 
> Please create a function which does the magic substraction, something like
> ktime_sub_namespace_offset() and invoke it from the proper places, i.e. the
> alarmtimer one.
> 
> > @@ -1069,6 +1070,8 @@ static int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
> >  
> >  	if (mode & HRTIMER_MODE_REL)
> >  		tim = ktime_add_safe(tim, base->get_time());
> > +	else if (mode & HRTIMER_MODE_NS)
> > +		tim = timens_ktime_to_host(base->clockid, tim);
> 
> You can do the same as for alarmtime above:
> 
> hrtimer_start_namespace(struct hrtimer *timer, ktime_t tim,
> 			const enum hrtimer_mode mode)
> {
> 	if (mode & HRTIMER_MODE_ABS) {
> 		switch(timer->base->clockid) {
> 		case CLOCK_MONOTONIC:
> 			tim = timens_sub_monotonic(tim);
> 			break;
> 		case CLOCK_BOOTTIME:
> 			tim = timens_sub_boottime(tim);
> 			break;
> 		}
> 	}
> 	hrtimer_start(timer, tim, mode);
> }
> 
> Thanks,
> 
> 	tglx

  reply	other threads:[~2019-05-03  7:00 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-25 16:13 [PATCHv3 00/27] kernel: Introduce Time Namespace Dmitry Safonov
2019-04-25 16:13 ` [PATCHv3 01/27] ns: " Dmitry Safonov
2019-04-25 19:10   ` Jann Horn
2019-04-25 19:10     ` Jann Horn
2019-04-25 16:13 ` [PATCHv3 02/27] timens: Add timens_offsets Dmitry Safonov
2019-04-25 16:13 ` [PATCHv3 03/27] timens: Introduce CLOCK_MONOTONIC offsets Dmitry Safonov
2019-04-25 19:52   ` Thomas Gleixner
2019-04-25 16:13 ` [PATCHv3 04/27] timens: Introduce CLOCK_BOOTTIME offset Dmitry Safonov
2019-04-25 20:08   ` Cyrill Gorcunov
2019-04-25 16:13 ` [PATCHv3 05/27] timerfd/timens: Take into account ns clock offsets Dmitry Safonov
2019-04-25 21:28   ` Thomas Gleixner
2019-05-03  7:00     ` Andrei Vagin [this message]
2019-04-25 16:13 ` [PATCHv3 06/27] posix-timers/timens: Take into account " Dmitry Safonov
2019-04-25 21:45   ` Thomas Gleixner
2019-04-25 16:13 ` [PATCHv3 07/27] timens/kernel: Take into account timens clock offsets in clock_nanosleep Dmitry Safonov
2019-04-25 16:13 ` [PATCHv3 08/27] timens: Shift /proc/uptime Dmitry Safonov
2019-04-25 16:13 ` [PATCHv3 09/27] x86/vdso2c: Correct err messages on file opening Dmitry Safonov
2019-04-25 16:13 ` [PATCHv3 10/27] x86/vdso2c: Convert iterator to unsigned Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 11/27] x86/vdso/Makefile: Add vobjs32 Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 12/27] x86/vdso: Restrict splitting VVAR VMA Dmitry Safonov
2019-04-25 18:41   ` Jann Horn
2019-04-25 18:41     ` Jann Horn
2019-04-25 18:46     ` Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 13/27] x86/vdso: Rename vdso_image {.data=>.text} Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 14/27] x86/vdso: Add offsets page in vvar Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 15/27] x86/vdso: Allocate timens vdso Dmitry Safonov
2019-04-25 18:32   ` Jann Horn
2019-04-25 18:32     ` Jann Horn
2019-04-25 19:05     ` Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 16/27] x86/vdso: Switch image on setns()/unshare()/clone() Dmitry Safonov
2019-04-25 17:53   ` Jann Horn
2019-04-25 17:53     ` Jann Horn
2019-04-25 18:02     ` Dmitry Safonov
2019-04-25 18:02       ` Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 17/27] vdso: introduce timens_static_branch Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 18/27] timens: Add align for timens_offsets Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 19/27] timens/fs/proc: Introduce /proc/pid/timens_offsets Dmitry Safonov
2019-04-25 18:16   ` Jann Horn
2019-04-25 18:16     ` Jann Horn
2019-05-02  6:08     ` Andrei Vagin
2019-05-02  6:08       ` Andrei Vagin
2019-04-25 16:14 ` [PATCHv3 20/27] selftest/timens: Add Time Namespace test for supported clocks Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 21/27] selftest/timens: Add a test for timerfd Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 22/27] selftest/timens: Add a test for clock_nanosleep() Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 23/27] selftest/timens: Add procfs selftest Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 24/27] selftest/timens: Add timer offsets test Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 25/27] x86/vdso: Align VDSO functions by CPU L1 cache line Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 26/27] selftests: Add a simple perf test for clock_gettime() Dmitry Safonov
2019-04-25 16:14 ` [PATCHv3 27/27] selftest/timens: Check that a right vdso is mapped after fork and exec Dmitry Safonov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190503070028.GA7984@gmail.com \
    --to=avagin@gmail.com \
    --cc=0x7f454c46@gmail.com \
    --cc=adrian@lisas.de \
    --cc=arnd@arndb.de \
    --cc=avagin@openvz.org \
    --cc=christian.brauner@ubuntu.com \
    --cc=containers@lists.linux-foundation.org \
    --cc=criu@openvz.org \
    --cc=dima@arista.com \
    --cc=ebiederm@xmission.com \
    --cc=gorcunov@openvz.org \
    --cc=hpa@zytor.com \
    --cc=jdike@addtoit.com \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=mingo@redhat.com \
    --cc=oleg@redhat.com \
    --cc=shuah@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=vincenzo.frascino@arm.com \
    --cc=x86@kernel.org \
    --cc=xemul@virtuozzo.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.