Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp5885275imu; Wed, 30 Jan 2019 05:21:04 -0800 (PST) X-Google-Smtp-Source: ALg8bN73mMjmzKtEsXHqEHVe8lpmWgsolLzSDgrbIb1qCkek+F481ja9N2uDxP756VlyUB9sh7vg X-Received: by 2002:a63:6ac5:: with SMTP id f188mr27813560pgc.165.1548854464252; Wed, 30 Jan 2019 05:21:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548854464; cv=none; d=google.com; s=arc-20160816; b=QhYmGrGN0g30zmnY3yD7w6xZhK0KmEz5QJQsFaZ+Y66jfs+XDQAFnAeN2Re75GeMax Qj4w+JDT2Ijx368p5XmGFzxy2Ou8j2igAfR50EQMTmhmNReI1z39u2z+EQAt/8D5VV0j okL7A6HIBt3BuIP0fOhbGJewaEUMbeH/Kp8OB9Gw9/Q0PRWeqFPRFiPfEiiDsQxsRpPc pyTlzq0cKUYwF4c1A3h9y3eGtcqrgCjNd7zSza5o9XQDGC3bgQqhENQL5EKCc6s3PHLi w1xgnuTuWwk7goqEYBeRaTpQSvWFK1N+Hgm5h+pJlyNnMM5iZxzPdafLkxQtQFqN5rcv x9ow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=ANeoDmbUb0/8sfBPLXSO9VTANf6KaL0CAlPTKb85IhY=; b=ks8ChefjqrMQXH3TQ+Z0BFWtXdybrPnHBOllNYA8cQM1l3snN9yHErI1mZVPhb1eRk bKpjFbqESOyyfGnAiciV1a3YZ6ZAih0jz7vCkNhYKDIAPpD6UMzrhX+8hcFlL82gevmZ eqavc2rqDXaFDomLH6Y0yG78fiWRLkyvbc/rg6PubgGwTaS+2BCXpwIZASzCCtrsm63A WjbMu1/U1ZrY6wwso8z7D8LDUOauVCHyr+11rVktEQRDesToP/eh4Lpqjy2GFAWKT56V Gd62Y/pYk83mHzTJRDt90DhA2skNdRiiW+f2oIlyTJvuZUfv5Lf3lsCH/1iY1OSOvCPB l6Og== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=O+1VduTU; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e11si1468140pfh.147.2019.01.30.05.20.48; Wed, 30 Jan 2019 05:21:04 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=O+1VduTU; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731074AbfA3NTC (ORCPT + 99 others); Wed, 30 Jan 2019 08:19:02 -0500 Received: from mail-it1-f195.google.com ([209.85.166.195]:37122 "EHLO mail-it1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730905AbfA3NTB (ORCPT ); Wed, 30 Jan 2019 08:19:01 -0500 Received: by mail-it1-f195.google.com with SMTP id b5so10411394iti.2 for ; Wed, 30 Jan 2019 05:19:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=ANeoDmbUb0/8sfBPLXSO9VTANf6KaL0CAlPTKb85IhY=; b=O+1VduTU8SIV7R/owFlkvbSyLNgk4wSG1UWLtjayt3FHHoiS0yDasSfXaW5Zi09NcF I64aRLi22tdK7lmm5OdRLkFlyjZLM7BuC4OWPYo9pS1JhObF3ebmSIw8hw1jnir/sXov K/eyBOlOIpjz+6lPeDxiAegTHCTpQFAyNgYTc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=ANeoDmbUb0/8sfBPLXSO9VTANf6KaL0CAlPTKb85IhY=; b=h6FmyuF/VGoUcmInTR95D9MlpsTfR4/nhXRnMzw+PQlVtXo8jSb9/mkUezzqQ1P6m+ exR0pmnCP2YFQjeBq6EptvuVGeH3cERvTj4csjcfKZTujYQELrAp+sGEHlkUId4uYkSG tovTFtfJKv6BM02x66fkcl0uVFqbdo4gz9sJtzqdyyI8xLuj2+K/P/2VuEtBbYFGskqU ueLZvOQxYoo00fCVIBi519Wd9ys5k3OnYyOgpy1+XMcqEZPx1LzV4h4j+WutUcUWNIE0 Q4fFSdpykj88bULvQPWL0S0gHKx8szuogkcTk2yIqo946tnsuqyYYZBq9VtET92wQouf KONA== X-Gm-Message-State: AJcUukfXmrhqOQa3yuyc8Fogms43uZdDOcVjMEFNS9YyuUn3VYD1JfhJ VIlN5gA7TwAbs2uCwB+ucgTdAizq3tU58dHnxhSM8w== X-Received: by 2002:a02:6019:: with SMTP id i25mr19758965jac.137.1548854340418; Wed, 30 Jan 2019 05:19:00 -0800 (PST) MIME-Version: 1.0 References: <1548846984-2044-1-git-send-email-vincent.guittot@linaro.org> In-Reply-To: From: Vincent Guittot Date: Wed, 30 Jan 2019 14:18:49 +0100 Message-ID: Subject: Re: [PATCH v2 ] PM-runtime: fix deadlock with ktime To: "Rafael J. Wysocki" Cc: Linux PM , Linux Kernel Mailing List , Linux ARM , Linux OMAP Mailing List , "Rafael J. Wysocki" , Ulf Hansson , Biju Das , Geert Uytterhoeven , Linux-Renesas , Ladislav Michl Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 30 Jan 2019 at 14:06, Rafael J. Wysocki wrote: > > On Wed, Jan 30, 2019 at 12:16 PM Vincent Guittot > wrote: > > > > A deadlock has been seen when swicthing clocksources which use PM runtime. > > The call path is: > > change_clocksource > > ... > > write_seqcount_begin > > ... > > timekeeping_update > > ... > > sh_cmt_clocksource_enable > > ... > > rpm_resume > > pm_runtime_mark_last_busy > > ktime_get > > do > > read_seqcount_begin > > while read_seqcount_retry > > .... > > write_seqcount_end > > > > Although we should be safe because we haven't yet changed the clocksource > > at that time, we can't because of seqcount protection. > > > > Use ktime_get_mono_fast_ns() instead which is lock safe for such case > > > > With ktime_get_mono_fast_ns, the timestamp is not guaranteed to be > > monotonic across an update and as a result can goes backward. According to > > update_fast_timekeeper() description: "In the worst case, this can > > result is a slightly wrong timestamp (a few nanoseconds)". For > > PM runtime autosuspend, this means only that the suspend decision can > > be slightly sub optimal. > > > > Fixes: 8234f6734c5d ("PM-runtime: Switch autosuspend over to using hrtimers") > > Reported-by: Biju Das > > Signed-off-by: Vincent Guittot > > I've queued this one up as a fix for 5.0, but unfortunately it clashes > with the patch from Ladislav Michl at > https://patchwork.kernel.org/patch/10755477/ which has been dropped > now. Thanks for adding Ladislav in this thread. I'm sorry I forgot to add him in the loop. > > Can you or Ladislav please rebase that patch on top of this one and repost? Ladislav, Let me know if you prefer to rebase and repost your patch of if you want me to do. Regards, Vincent > > > --- > > > > - v2: Updated commit message to explain the impact of using > > ktime_get_mono_fast_ns() > > > > drivers/base/power/runtime.c | 10 +++++----- > > include/linux/pm_runtime.h | 2 +- > > 2 files changed, 6 insertions(+), 6 deletions(-) > > > > diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c > > index 457be03..708a13f 100644 > > --- a/drivers/base/power/runtime.c > > +++ b/drivers/base/power/runtime.c > > @@ -130,7 +130,7 @@ u64 pm_runtime_autosuspend_expiration(struct device *dev) > > { > > int autosuspend_delay; > > u64 last_busy, expires = 0; > > - u64 now = ktime_to_ns(ktime_get()); > > + u64 now = ktime_get_mono_fast_ns(); > > > > if (!dev->power.use_autosuspend) > > goto out; > > @@ -909,7 +909,7 @@ static enum hrtimer_restart pm_suspend_timer_fn(struct hrtimer *timer) > > * If 'expires' is after the current time, we've been called > > * too early. > > */ > > - if (expires > 0 && expires < ktime_to_ns(ktime_get())) { > > + if (expires > 0 && expires < ktime_get_mono_fast_ns()) { > > dev->power.timer_expires = 0; > > rpm_suspend(dev, dev->power.timer_autosuspends ? > > (RPM_ASYNC | RPM_AUTO) : RPM_ASYNC); > > @@ -928,7 +928,7 @@ static enum hrtimer_restart pm_suspend_timer_fn(struct hrtimer *timer) > > int pm_schedule_suspend(struct device *dev, unsigned int delay) > > { > > unsigned long flags; > > - ktime_t expires; > > + u64 expires; > > int retval; > > > > spin_lock_irqsave(&dev->power.lock, flags); > > @@ -945,8 +945,8 @@ int pm_schedule_suspend(struct device *dev, unsigned int delay) > > /* Other scheduled or pending requests need to be canceled. */ > > pm_runtime_cancel_pending(dev); > > > > - expires = ktime_add(ktime_get(), ms_to_ktime(delay)); > > - dev->power.timer_expires = ktime_to_ns(expires); > > + expires = ktime_get_mono_fast_ns() + (u64)delay * NSEC_PER_MSEC); > > + dev->power.timer_expires = expires; > > dev->power.timer_autosuspends = 0; > > hrtimer_start(&dev->power.suspend_timer, expires, HRTIMER_MODE_ABS); > > > > diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h > > index 54af4ee..fed5be7 100644 > > --- a/include/linux/pm_runtime.h > > +++ b/include/linux/pm_runtime.h > > @@ -105,7 +105,7 @@ static inline bool pm_runtime_callbacks_present(struct device *dev) > > > > static inline void pm_runtime_mark_last_busy(struct device *dev) > > { > > - WRITE_ONCE(dev->power.last_busy, ktime_to_ns(ktime_get())); > > + WRITE_ONCE(dev->power.last_busy, ktime_get_mono_fast_ns()); > > } > > > > static inline bool pm_runtime_is_irq_safe(struct device *dev) > > -- > > 2.7.4 > >