From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
To: Chen Yu <yu.c.chen@intel.com>
Cc: Thomas Gleixner <tglx@linutronix.de>,
John Stultz <john.stultz@linaro.org>,
Linux PM <linux-pm@vger.kernel.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH][v2] timekeeping: Fix memory overwrite of sleep_time_bin array
Date: Wed, 20 Jul 2016 14:59:55 +0200 [thread overview]
Message-ID: <9248665.2Hdcz4PDBO@vostro.rjw.lan> (raw)
In-Reply-To: <20160720110658.GA5943@sharon>
On Wednesday, July 20, 2016 07:06:58 PM Chen Yu wrote:
> Hi Thomas,
> On Tue, Jul 19, 2016 at 12:40:14PM +0200, Thomas Gleixner wrote:
> > On Tue, 19 Jul 2016, Chen Yu wrote:
> > > On 2016年07月19日 16:36, Thomas Gleixner wrote:
> > > > On Tue, 19 Jul 2016, Chen Yu wrote:
> > > > > Further investigation shows that, the problem is caused by setting
> > > > > /sys/power/pm_trace to 1 before the 1st hibernation, since once
> > > > > pm_trace is enabled, the rtc becomes an unmeaningful value after resumed,
> > > >
> > > > So why is the RTC value useless if pm_trace is enabled? I really have a hard
> > > > time to understand why pm_trace would affect the sleep time readout from
> > > > RTC.
> > >
> > > After pm_trace is enabled, during system suspend/hibernate, the hash name of
> > > each devices will be written to rtc, so the rtc value depends on what we
> > > write in last suspend round, thus pm_trace can be used for diagnose which
> > > device failed to suspend(eg, the suspending on this device hang the system,
> > > we reboot the system , and check rtc hash value).
> > >
> > > In our case, after first hibernate/resume round, we found our current system
> > > time is at 2117, so syscore_resume -> timekeeping_resume :
> > > __timekeeping_inject_sleeptime(tk, &ts_delta) would inject a quite large
> > > delta : 2117 - 2017 year, thus the sleep_time_bin is overflow.
> >
> > While the range check is certainly correct and a good thing to have it's wrong
> > in the first place to call __timekeeping_inject_sleeptime() in case that
> > pm_trace is enabled simply because that "hash" time value will also wreckage
> > timekeeping. Your patch is just curing the symptom in the debug code but not
> > fixing the root cause.
> >
> OK. I've modified the patch.
> In case I break any other stuff :p, could you help check
> if this patch is in the right direction, thanks:
>
> 1. There are two places would invoke __timekeeping_inject_sleeptime(),
> they are timekeeping_resume and rtc_resume, so we need to deal with
> them respctively.
>
> 2. for rtc_resume, if the pm_trace has once been enabled,
> we bypass the injection of sleep time.
>
> 3. for timekeeping_resume,
> Currently we either use nonstop clock source, or use persistent
> clock to get the sleep time. As pm_trace breaks systems who use rtc
> as a persistent clock, x86 is affected. So we add a
> check for x86 that, if the pm_trace has been enabled, we can not
> trust the persistent clock delta read from rtc, thus bypass
> the injection of sleep time in this case.
>
> 4. Why we checked the history of pm_trace: once pm_trace
> has been enabled, the delta of rtc would not be reliable anymore.
> For example, if we only check current pm_trace, we might still get
> memory overwrite:
>
> 4.1 echo 1 > /sys/power/pm_trace
> 4.2 hibernate/resume (rtc is broken, do not add delta from rtc because pm_trace is 1)
> 4.3 echo 0 > /sys/power/pm_trace
> 4.4 hibernate/resume (rtc is still broken, but add delta from rtc because pm_trace is 0)
The initial state of the RTC is invalid, but will the delta be still invalid?
And what if the admin fixes up the RTC before hibernating? You will still discard
the RTC delta until the next reboot, right?
Thanks,
Rafael
next prev parent reply other threads:[~2016-07-20 12:59 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-19 4:51 [PATCH][v2] timekeeping: Fix memory overwrite of sleep_time_bin array Chen Yu
2016-07-19 8:36 ` Thomas Gleixner
2016-07-19 9:07 ` Chen Yu
2016-07-19 10:40 ` Thomas Gleixner
2016-07-20 11:06 ` Chen Yu
2016-07-20 12:59 ` Rafael J. Wysocki [this message]
2016-07-20 16:59 ` Chen, Yu C
2016-07-29 9:50 ` Chen Yu
2016-07-29 12:59 ` Thomas Gleixner
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=9248665.2Hdcz4PDBO@vostro.rjw.lan \
--to=rjw@rjwysocki.net \
--cc=john.stultz@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=tglx@linutronix.de \
--cc=yu.c.chen@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox