* [PATCH 0/2][RFC v6] Ignore bogus sleep time if pm_trace is enabled @ 2016-11-08 9:00 ` Chen Yu 0 siblings, 0 replies; 11+ messages in thread From: Chen Yu @ 2016-11-08 9:00 UTC (permalink / raw) To: x86-DgEjT+Ai2ygdnm+yROfE0A Cc: Thomas Gleixner, Rafael J. Wysocki, Len Brown, John Stultz, Xunlei Pang, linux-pm-u79uwXL29TY76Z2rM5mHXA, rtc-linux-/JYPxA39Uh5TLH3MbocFFw, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Chen Yu This patch set is based on Thomas's previous solution, to bypass the bogus CMOS-RTC sleep time after resumed, thus to avoid damage to timekeeping system. The bogus sleep time comes from pm_trace, which might use CMOS-RTC for debugging purpose. Meanwhile, a solution to save/restore of CMOS-RTC is also proposed to give better user experience. Chen Yu (2): timekeeping: Ignore the bogus sleep time if pm_trace is enabled PM / sleep: save/restore RTC time after resumed if pm_trace enabled arch/x86/kernel/rtc.c | 9 +++++++++ drivers/base/power/trace.c | 31 +++++++++++++++++++++++++++++++ drivers/rtc/rtc-cmos.c | 7 +++++++ include/linux/mc146818rtc.h | 1 + include/linux/pm-trace.h | 9 ++++++++- 5 files changed, 56 insertions(+), 1 deletion(-) -- 2.7.4 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 0/2][RFC v6] Ignore bogus sleep time if pm_trace is enabled @ 2016-11-08 9:00 ` Chen Yu 0 siblings, 0 replies; 11+ messages in thread From: Chen Yu @ 2016-11-08 9:00 UTC (permalink / raw) To: x86 Cc: Thomas Gleixner, Rafael J. Wysocki, Len Brown, John Stultz, Xunlei Pang, linux-pm, rtc-linux, linux-kernel, Chen Yu This patch set is based on Thomas's previous solution, to bypass the bogus CMOS-RTC sleep time after resumed, thus to avoid damage to timekeeping system. The bogus sleep time comes from pm_trace, which might use CMOS-RTC for debugging purpose. Meanwhile, a solution to save/restore of CMOS-RTC is also proposed to give better user experience. Chen Yu (2): timekeeping: Ignore the bogus sleep time if pm_trace is enabled PM / sleep: save/restore RTC time after resumed if pm_trace enabled arch/x86/kernel/rtc.c | 9 +++++++++ drivers/base/power/trace.c | 31 +++++++++++++++++++++++++++++++ drivers/rtc/rtc-cmos.c | 7 +++++++ include/linux/mc146818rtc.h | 1 + include/linux/pm-trace.h | 9 ++++++++- 5 files changed, 56 insertions(+), 1 deletion(-) -- 2.7.4 ^ permalink raw reply [flat|nested] 11+ messages in thread
* [rtc-linux] [PATCH 0/2][RFC v6] Ignore bogus sleep time if pm_trace is enabled @ 2016-11-08 9:00 ` Chen Yu 0 siblings, 0 replies; 11+ messages in thread From: Chen Yu @ 2016-11-08 9:00 UTC (permalink / raw) To: x86 Cc: Thomas Gleixner, Rafael J. Wysocki, Len Brown, John Stultz, Xunlei Pang, linux-pm, rtc-linux, linux-kernel, Chen Yu This patch set is based on Thomas's previous solution, to bypass the bogus CMOS-RTC sleep time after resumed, thus to avoid damage to timekeeping system. The bogus sleep time comes from pm_trace, which might use CMOS-RTC for debugging purpose. Meanwhile, a solution to save/restore of CMOS-RTC is also proposed to give better user experience. Chen Yu (2): timekeeping: Ignore the bogus sleep time if pm_trace is enabled PM / sleep: save/restore RTC time after resumed if pm_trace enabled arch/x86/kernel/rtc.c | 9 +++++++++ drivers/base/power/trace.c | 31 +++++++++++++++++++++++++++++++ drivers/rtc/rtc-cmos.c | 7 +++++++ include/linux/mc146818rtc.h | 1 + include/linux/pm-trace.h | 9 ++++++++- 5 files changed, 56 insertions(+), 1 deletion(-) -- 2.7.4 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com. For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply [flat|nested] 11+ messages in thread
[parent not found: <cover.1478589736.git.yu.c.chen-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>]
* [PATCH 1/2][RFC v6] timekeeping: Ignore the bogus sleep time if pm_trace is enabled 2016-11-08 9:00 ` [rtc-linux] " Chen Yu (?) @ 2016-11-08 9:01 ` Chen Yu -1 siblings, 0 replies; 11+ messages in thread From: Chen Yu @ 2016-11-08 9:01 UTC (permalink / raw) To: x86-DgEjT+Ai2ygdnm+yROfE0A Cc: Pavel Machek, Ingo Molnar, H. Peter Anvin, linux-pm-u79uwXL29TY76Z2rM5mHXA, rtc-linux-/JYPxA39Uh5TLH3MbocFFw, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Thomas Gleixner, Rafael J. Wysocki, Len Brown, John Stultz, Xunlei Pang, Chen Yu From: Thomas Gleixner <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org> Previously we encountered some memory overflow issues due to the bogus sleep time brought by inconsistent rtc, which is triggered when pm_trace is enabled, and we have fixed it in recent kernel. However it's improper in the first place to call __timekeeping_inject_sleeptime() in case that pm_trace is enabled simply because that "hash" time value will wreckage the timekeeping subsystem. This patch is to bypass the bogus rtc interval when pm_trace is enabled. Cc: Thomas Gleixner <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org> Cc: "Rafael J. Wysocki" <rjw-LthD3rsA81gm4RdzfppkhA@public.gmane.org> Cc: Len Brown <lenb-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> Cc: John Stultz <john.stultz-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> Cc: Xunlei Pang <xlpang-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> Signed-off-by: Chen Yu <yu.c.chen-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> --- arch/x86/kernel/rtc.c | 9 +++++++++ drivers/base/power/trace.c | 2 ++ drivers/rtc/rtc-cmos.c | 7 +++++++ include/linux/mc146818rtc.h | 1 + include/linux/pm-trace.h | 9 ++++++++- 5 files changed, 27 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/rtc.c b/arch/x86/kernel/rtc.c index 79c6311c..898383c 100644 --- a/arch/x86/kernel/rtc.c +++ b/arch/x86/kernel/rtc.c @@ -64,6 +64,15 @@ void mach_get_cmos_time(struct timespec *now) unsigned int status, year, mon, day, hour, min, sec, century = 0; unsigned long flags; + /* + * If pm trace abused the RTC as storage set the timespec to 0 + * which tells the caller that this RTC value is bogus. + */ + if (!pm_trace_rtc_valid()) { + now->tv_sec = now->tv_nsec = 0; + return; + } + spin_lock_irqsave(&rtc_lock, flags); /* diff --git a/drivers/base/power/trace.c b/drivers/base/power/trace.c index efec10b..aa9109a 100644 --- a/drivers/base/power/trace.c +++ b/drivers/base/power/trace.c @@ -74,6 +74,7 @@ #define DEVSEED (7919) +bool pm_trace_rtc_abused __read_mostly; static unsigned int dev_hash_value; static int set_magic_time(unsigned int user, unsigned int file, unsigned int device) @@ -104,6 +105,7 @@ static int set_magic_time(unsigned int user, unsigned int file, unsigned int dev time.tm_min = (n % 20) * 3; n /= 20; mc146818_set_time(&time); + pm_trace_rtc_abused = true; return n ? -1 : 0; } diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index dd3d598..3d9aedc 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c @@ -191,6 +191,13 @@ static inline void cmos_write_bank2(unsigned char val, unsigned char addr) static int cmos_read_time(struct device *dev, struct rtc_time *t) { + /* + * If pmtrace abused the RTC for storage tell the caller that it is + * unusable. + */ + if (!pm_trace_rtc_valid()) + return -EIO; + /* REVISIT: if the clock has a "century" register, use * that instead of the heuristic in mc146818_get_time(). * That'll make Y3K compatility (year > 2070) easy! diff --git a/include/linux/mc146818rtc.h b/include/linux/mc146818rtc.h index a585b4b..0661af1 100644 --- a/include/linux/mc146818rtc.h +++ b/include/linux/mc146818rtc.h @@ -16,6 +16,7 @@ #include <asm/mc146818rtc.h> /* register access macros */ #include <linux/bcd.h> #include <linux/delay.h> +#include <linux/pm-trace.h> #ifdef __KERNEL__ #include <linux/spinlock.h> /* spinlock_t */ diff --git a/include/linux/pm-trace.h b/include/linux/pm-trace.h index ecbde7a..7b78793 100644 --- a/include/linux/pm-trace.h +++ b/include/linux/pm-trace.h @@ -1,11 +1,17 @@ #ifndef PM_TRACE_H #define PM_TRACE_H +#include <linux/types.h> #ifdef CONFIG_PM_TRACE #include <asm/pm-trace.h> -#include <linux/types.h> extern int pm_trace_enabled; +extern bool pm_trace_rtc_abused; + +static inline bool pm_trace_rtc_valid(void) +{ + return !pm_trace_rtc_abused; +} static inline int pm_trace_is_enabled(void) { @@ -24,6 +30,7 @@ extern int show_trace_dev_match(char *buf, size_t size); #else +static inline bool pm_trace_rtc_valid(void) { return true; } static inline int pm_trace_is_enabled(void) { return 0; } #define TRACE_DEVICE(dev) do { } while (0) -- 2.7.4 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 1/2][RFC v6] timekeeping: Ignore the bogus sleep time if pm_trace is enabled @ 2016-11-08 9:01 ` Chen Yu 0 siblings, 0 replies; 11+ messages in thread From: Chen Yu @ 2016-11-08 9:01 UTC (permalink / raw) To: x86 Cc: Pavel Machek, Ingo Molnar, H. Peter Anvin, linux-pm, rtc-linux, linux-kernel, Thomas Gleixner, Rafael J. Wysocki, Len Brown, John Stultz, Xunlei Pang, Chen Yu From: Thomas Gleixner <tglx@linutronix.de> Previously we encountered some memory overflow issues due to the bogus sleep time brought by inconsistent rtc, which is triggered when pm_trace is enabled, and we have fixed it in recent kernel. However it's improper in the first place to call __timekeeping_inject_sleeptime() in case that pm_trace is enabled simply because that "hash" time value will wreckage the timekeeping subsystem. This patch is to bypass the bogus rtc interval when pm_trace is enabled. Cc: Thomas Gleixner <tglx@linutronix.de> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Cc: Len Brown <lenb@kernel.org> Cc: John Stultz <john.stultz@linaro.org> Cc: Xunlei Pang <xlpang@redhat.com> Signed-off-by: Chen Yu <yu.c.chen@intel.com> --- arch/x86/kernel/rtc.c | 9 +++++++++ drivers/base/power/trace.c | 2 ++ drivers/rtc/rtc-cmos.c | 7 +++++++ include/linux/mc146818rtc.h | 1 + include/linux/pm-trace.h | 9 ++++++++- 5 files changed, 27 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/rtc.c b/arch/x86/kernel/rtc.c index 79c6311c..898383c 100644 --- a/arch/x86/kernel/rtc.c +++ b/arch/x86/kernel/rtc.c @@ -64,6 +64,15 @@ void mach_get_cmos_time(struct timespec *now) unsigned int status, year, mon, day, hour, min, sec, century = 0; unsigned long flags; + /* + * If pm trace abused the RTC as storage set the timespec to 0 + * which tells the caller that this RTC value is bogus. + */ + if (!pm_trace_rtc_valid()) { + now->tv_sec = now->tv_nsec = 0; + return; + } + spin_lock_irqsave(&rtc_lock, flags); /* diff --git a/drivers/base/power/trace.c b/drivers/base/power/trace.c index efec10b..aa9109a 100644 --- a/drivers/base/power/trace.c +++ b/drivers/base/power/trace.c @@ -74,6 +74,7 @@ #define DEVSEED (7919) +bool pm_trace_rtc_abused __read_mostly; static unsigned int dev_hash_value; static int set_magic_time(unsigned int user, unsigned int file, unsigned int device) @@ -104,6 +105,7 @@ static int set_magic_time(unsigned int user, unsigned int file, unsigned int dev time.tm_min = (n % 20) * 3; n /= 20; mc146818_set_time(&time); + pm_trace_rtc_abused = true; return n ? -1 : 0; } diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index dd3d598..3d9aedc 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c @@ -191,6 +191,13 @@ static inline void cmos_write_bank2(unsigned char val, unsigned char addr) static int cmos_read_time(struct device *dev, struct rtc_time *t) { + /* + * If pmtrace abused the RTC for storage tell the caller that it is + * unusable. + */ + if (!pm_trace_rtc_valid()) + return -EIO; + /* REVISIT: if the clock has a "century" register, use * that instead of the heuristic in mc146818_get_time(). * That'll make Y3K compatility (year > 2070) easy! diff --git a/include/linux/mc146818rtc.h b/include/linux/mc146818rtc.h index a585b4b..0661af1 100644 --- a/include/linux/mc146818rtc.h +++ b/include/linux/mc146818rtc.h @@ -16,6 +16,7 @@ #include <asm/mc146818rtc.h> /* register access macros */ #include <linux/bcd.h> #include <linux/delay.h> +#include <linux/pm-trace.h> #ifdef __KERNEL__ #include <linux/spinlock.h> /* spinlock_t */ diff --git a/include/linux/pm-trace.h b/include/linux/pm-trace.h index ecbde7a..7b78793 100644 --- a/include/linux/pm-trace.h +++ b/include/linux/pm-trace.h @@ -1,11 +1,17 @@ #ifndef PM_TRACE_H #define PM_TRACE_H +#include <linux/types.h> #ifdef CONFIG_PM_TRACE #include <asm/pm-trace.h> -#include <linux/types.h> extern int pm_trace_enabled; +extern bool pm_trace_rtc_abused; + +static inline bool pm_trace_rtc_valid(void) +{ + return !pm_trace_rtc_abused; +} static inline int pm_trace_is_enabled(void) { @@ -24,6 +30,7 @@ extern int show_trace_dev_match(char *buf, size_t size); #else +static inline bool pm_trace_rtc_valid(void) { return true; } static inline int pm_trace_is_enabled(void) { return 0; } #define TRACE_DEVICE(dev) do { } while (0) -- 2.7.4 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [rtc-linux] [PATCH 1/2][RFC v6] timekeeping: Ignore the bogus sleep time if pm_trace is enabled @ 2016-11-08 9:01 ` Chen Yu 0 siblings, 0 replies; 11+ messages in thread From: Chen Yu @ 2016-11-08 9:01 UTC (permalink / raw) To: x86 Cc: Pavel Machek, Ingo Molnar, H. Peter Anvin, linux-pm, rtc-linux, linux-kernel, Thomas Gleixner, Rafael J. Wysocki, Len Brown, John Stultz, Xunlei Pang, Chen Yu From: Thomas Gleixner <tglx@linutronix.de> Previously we encountered some memory overflow issues due to the bogus sleep time brought by inconsistent rtc, which is triggered when pm_trace is enabled, and we have fixed it in recent kernel. However it's improper in the first place to call __timekeeping_inject_sleeptime() in case that pm_trace is enabled simply because that "hash" time value will wreckage the timekeeping subsystem. This patch is to bypass the bogus rtc interval when pm_trace is enabled. Cc: Thomas Gleixner <tglx@linutronix.de> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Cc: Len Brown <lenb@kernel.org> Cc: John Stultz <john.stultz@linaro.org> Cc: Xunlei Pang <xlpang@redhat.com> Signed-off-by: Chen Yu <yu.c.chen@intel.com> --- arch/x86/kernel/rtc.c | 9 +++++++++ drivers/base/power/trace.c | 2 ++ drivers/rtc/rtc-cmos.c | 7 +++++++ include/linux/mc146818rtc.h | 1 + include/linux/pm-trace.h | 9 ++++++++- 5 files changed, 27 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/rtc.c b/arch/x86/kernel/rtc.c index 79c6311c..898383c 100644 --- a/arch/x86/kernel/rtc.c +++ b/arch/x86/kernel/rtc.c @@ -64,6 +64,15 @@ void mach_get_cmos_time(struct timespec *now) unsigned int status, year, mon, day, hour, min, sec, century = 0; unsigned long flags; + /* + * If pm trace abused the RTC as storage set the timespec to 0 + * which tells the caller that this RTC value is bogus. + */ + if (!pm_trace_rtc_valid()) { + now->tv_sec = now->tv_nsec = 0; + return; + } + spin_lock_irqsave(&rtc_lock, flags); /* diff --git a/drivers/base/power/trace.c b/drivers/base/power/trace.c index efec10b..aa9109a 100644 --- a/drivers/base/power/trace.c +++ b/drivers/base/power/trace.c @@ -74,6 +74,7 @@ #define DEVSEED (7919) +bool pm_trace_rtc_abused __read_mostly; static unsigned int dev_hash_value; static int set_magic_time(unsigned int user, unsigned int file, unsigned int device) @@ -104,6 +105,7 @@ static int set_magic_time(unsigned int user, unsigned int file, unsigned int dev time.tm_min = (n % 20) * 3; n /= 20; mc146818_set_time(&time); + pm_trace_rtc_abused = true; return n ? -1 : 0; } diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index dd3d598..3d9aedc 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c @@ -191,6 +191,13 @@ static inline void cmos_write_bank2(unsigned char val, unsigned char addr) static int cmos_read_time(struct device *dev, struct rtc_time *t) { + /* + * If pmtrace abused the RTC for storage tell the caller that it is + * unusable. + */ + if (!pm_trace_rtc_valid()) + return -EIO; + /* REVISIT: if the clock has a "century" register, use * that instead of the heuristic in mc146818_get_time(). * That'll make Y3K compatility (year > 2070) easy! diff --git a/include/linux/mc146818rtc.h b/include/linux/mc146818rtc.h index a585b4b..0661af1 100644 --- a/include/linux/mc146818rtc.h +++ b/include/linux/mc146818rtc.h @@ -16,6 +16,7 @@ #include <asm/mc146818rtc.h> /* register access macros */ #include <linux/bcd.h> #include <linux/delay.h> +#include <linux/pm-trace.h> #ifdef __KERNEL__ #include <linux/spinlock.h> /* spinlock_t */ diff --git a/include/linux/pm-trace.h b/include/linux/pm-trace.h index ecbde7a..7b78793 100644 --- a/include/linux/pm-trace.h +++ b/include/linux/pm-trace.h @@ -1,11 +1,17 @@ #ifndef PM_TRACE_H #define PM_TRACE_H +#include <linux/types.h> #ifdef CONFIG_PM_TRACE #include <asm/pm-trace.h> -#include <linux/types.h> extern int pm_trace_enabled; +extern bool pm_trace_rtc_abused; + +static inline bool pm_trace_rtc_valid(void) +{ + return !pm_trace_rtc_abused; +} static inline int pm_trace_is_enabled(void) { @@ -24,6 +30,7 @@ extern int show_trace_dev_match(char *buf, size_t size); #else +static inline bool pm_trace_rtc_valid(void) { return true; } static inline int pm_trace_is_enabled(void) { return 0; } #define TRACE_DEVICE(dev) do { } while (0) -- 2.7.4 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com. For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply related [flat|nested] 11+ messages in thread
[parent not found: <e0ed3331627184f3da6243b00cfa69dd78e85514.1478589736.git.yu.c.chen-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH 1/2][RFC v6] timekeeping: Ignore the bogus sleep time if pm_trace is enabled 2016-11-08 9:01 ` [rtc-linux] " Chen Yu (?) @ 2016-11-08 12:50 ` Chen Yu -1 siblings, 0 replies; 11+ messages in thread From: Chen Yu @ 2016-11-08 12:50 UTC (permalink / raw) To: x86-DgEjT+Ai2ygdnm+yROfE0A Cc: Pavel Machek, Ingo Molnar, H. Peter Anvin, linux-pm-u79uwXL29TY76Z2rM5mHXA, rtc-linux-/JYPxA39Uh5TLH3MbocFFw, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Thomas Gleixner, Rafael J. Wysocki, Len Brown, John Stultz, Xunlei Pang On Tue, Nov 08, 2016 at 05:01:35PM +0800, Chen Yu wrote: > From: Thomas Gleixner <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org> > > Previously we encountered some memory overflow issues due to > the bogus sleep time brought by inconsistent rtc, which is > triggered when pm_trace is enabled, and we have fixed it > in recent kernel. However it's improper in the first place > to call __timekeeping_inject_sleeptime() in case that pm_trace > is enabled simply because that "hash" time value will wreckage > the timekeeping subsystem. > > This patch is to bypass the bogus rtc interval when pm_trace is enabled. > > Cc: Thomas Gleixner <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org> > Cc: "Rafael J. Wysocki" <rjw-LthD3rsA81gm4RdzfppkhA@public.gmane.org> > Cc: Len Brown <lenb-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> > Cc: John Stultz <john.stultz-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> > Cc: Xunlei Pang <xlpang-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> > Signed-off-by: Chen Yu <yu.c.chen-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> > --- > [cut] Will resend another version. Thanks. -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2][RFC v6] timekeeping: Ignore the bogus sleep time if pm_trace is enabled @ 2016-11-08 12:50 ` Chen Yu 0 siblings, 0 replies; 11+ messages in thread From: Chen Yu @ 2016-11-08 12:50 UTC (permalink / raw) To: x86 Cc: Pavel Machek, Ingo Molnar, H. Peter Anvin, linux-pm, rtc-linux, linux-kernel, Thomas Gleixner, Rafael J. Wysocki, Len Brown, John Stultz, Xunlei Pang On Tue, Nov 08, 2016 at 05:01:35PM +0800, Chen Yu wrote: > From: Thomas Gleixner <tglx@linutronix.de> > > Previously we encountered some memory overflow issues due to > the bogus sleep time brought by inconsistent rtc, which is > triggered when pm_trace is enabled, and we have fixed it > in recent kernel. However it's improper in the first place > to call __timekeeping_inject_sleeptime() in case that pm_trace > is enabled simply because that "hash" time value will wreckage > the timekeeping subsystem. > > This patch is to bypass the bogus rtc interval when pm_trace is enabled. > > Cc: Thomas Gleixner <tglx@linutronix.de> > Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> > Cc: Len Brown <lenb@kernel.org> > Cc: John Stultz <john.stultz@linaro.org> > Cc: Xunlei Pang <xlpang@redhat.com> > Signed-off-by: Chen Yu <yu.c.chen@intel.com> > --- > [cut] Will resend another version. Thanks. ^ permalink raw reply [flat|nested] 11+ messages in thread
* [rtc-linux] Re: [PATCH 1/2][RFC v6] timekeeping: Ignore the bogus sleep time if pm_trace is enabled @ 2016-11-08 12:50 ` Chen Yu 0 siblings, 0 replies; 11+ messages in thread From: Chen Yu @ 2016-11-08 12:50 UTC (permalink / raw) To: x86 Cc: Pavel Machek, Ingo Molnar, H. Peter Anvin, linux-pm, rtc-linux, linux-kernel, Thomas Gleixner, Rafael J. Wysocki, Len Brown, John Stultz, Xunlei Pang On Tue, Nov 08, 2016 at 05:01:35PM +0800, Chen Yu wrote: > From: Thomas Gleixner <tglx@linutronix.de> > > Previously we encountered some memory overflow issues due to > the bogus sleep time brought by inconsistent rtc, which is > triggered when pm_trace is enabled, and we have fixed it > in recent kernel. However it's improper in the first place > to call __timekeeping_inject_sleeptime() in case that pm_trace > is enabled simply because that "hash" time value will wreckage > the timekeeping subsystem. > > This patch is to bypass the bogus rtc interval when pm_trace is enabled. > > Cc: Thomas Gleixner <tglx@linutronix.de> > Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> > Cc: Len Brown <lenb@kernel.org> > Cc: John Stultz <john.stultz@linaro.org> > Cc: Xunlei Pang <xlpang@redhat.com> > Signed-off-by: Chen Yu <yu.c.chen@intel.com> > --- > [cut] Will resend another version. Thanks. -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com. For more options, visit https://groups.google.com/d/optout. ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 2/2][RFC v6] PM / sleep: save/restore RTC time after resumed if pm_trace enabled 2016-11-08 9:00 ` [rtc-linux] " Chen Yu ` (2 preceding siblings ...) (?) @ 2016-11-08 9:02 ` Chen Yu 2016-11-08 12:43 ` Chen Yu -1 siblings, 1 reply; 11+ messages in thread From: Chen Yu @ 2016-11-08 9:02 UTC (permalink / raw) To: x86 Cc: Pavel Machek, linux-pm, linux-kernel, Chen Yu, Rafael J. Wysocki, Thomas Gleixner, Len Brown, John Stultz, Xunlei Pang Previously the bogus CMOS RTC sleep time has been ignored if pm_trace is enabled, however once the system successfully resumed back, any further read to CMOS RTC would return an error. Actually it is more user-friendly to bring the system back to normal after resumed. This patch has registered an pm notifier to restore the RTC to the value before been overwitten by pm_trace. Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Len Brown <lenb@kernel.org> Cc: John Stultz <john.stultz@linaro.org> Cc: Xunlei Pang <xlpang@redhat.com> Signed-off-by: Chen Yu <yu.c.chen@intel.com> --- drivers/base/power/trace.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/drivers/base/power/trace.c b/drivers/base/power/trace.c index aa9109a..1e6c611 100644 --- a/drivers/base/power/trace.c +++ b/drivers/base/power/trace.c @@ -10,6 +10,7 @@ #include <linux/pm-trace.h> #include <linux/export.h> #include <linux/rtc.h> +#include <linux/suspend.h> #include <linux/mc146818rtc.h> @@ -76,6 +77,11 @@ bool pm_trace_rtc_abused __read_mostly; static unsigned int dev_hash_value; +struct rtc_time_save { + struct rtc_time time; + atomic_t saved; +}; +static struct rtc_time_save rtc_saved; static int set_magic_time(unsigned int user, unsigned int file, unsigned int device) { @@ -104,6 +110,8 @@ static int set_magic_time(unsigned int user, unsigned int file, unsigned int dev n /= 24; time.tm_min = (n % 20) * 3; n /= 20; + if (!atomic_cmpxchg(&rtc_saved.saved, 0, 1)) + mc146818_get_time(&rtc_saved.time); mc146818_set_time(&time); pm_trace_rtc_abused = true; return n ? -1 : 0; @@ -240,10 +248,31 @@ int show_trace_dev_match(char *buf, size_t size) device_pm_unlock(); return ret; } +static int pm_trace_notify(struct notifier_block *nb, + unsigned long mode, void *_unused) +{ + switch (mode) { + case PM_POST_HIBERNATION: + case PM_POST_SUSPEND: + if (atomic_cmpxchg(&rtc_saved.saved, 1, 0)) { + mc146818_set_time(&rtc_saved.time); + pm_trace_rtc_abused = false; + } + break; + default: + break; + } + return 0; +} + +static struct notifier_block pm_trace_nb = { + .notifier_call = pm_trace_notify, +}; static int early_resume_init(void) { hash_value_early_read = read_magic_time(); + register_pm_notifier(&pm_trace_nb); return 0; } -- 2.7.4 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 2/2][RFC v6] PM / sleep: save/restore RTC time after resumed if pm_trace enabled 2016-11-08 9:02 ` [PATCH 2/2][RFC v6] PM / sleep: save/restore RTC time after resumed if pm_trace enabled Chen Yu @ 2016-11-08 12:43 ` Chen Yu 0 siblings, 0 replies; 11+ messages in thread From: Chen Yu @ 2016-11-08 12:43 UTC (permalink / raw) To: x86 Cc: Pavel Machek, linux-pm, linux-kernel, Rafael J. Wysocki, Thomas Gleixner, Len Brown, John Stultz, Xunlei Pang Hi all, On Tue, Nov 08, 2016 at 05:02:14PM +0800, Chen Yu wrote: > Previously the bogus CMOS RTC sleep time has been ignored if pm_trace > is enabled, however once the system successfully resumed back, > any further read to CMOS RTC would return an error. Actually it is > more user-friendly to bring the system back to normal after resumed. > > This patch has registered an pm notifier to restore the RTC to the > value before been overwitten by pm_trace. > > Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> > Cc: Thomas Gleixner <tglx@linutronix.de> > Cc: Len Brown <lenb@kernel.org> > Cc: John Stultz <john.stultz@linaro.org> > Cc: Xunlei Pang <xlpang@redhat.com> > Signed-off-by: Chen Yu <yu.c.chen@intel.com> > --- Please ignore this version for now, the atomic variable below is unnecessary since pm_trace has disabled the async suspend. And in order to allow the users to adjust rtc after resume, we can clear the pm_trace_rtc_abused directly and warn users of the broken rtc. (Without save/restore). > drivers/base/power/trace.c | 29 +++++++++++++++++++++++++++++ > 1 file changed, 29 insertions(+) > > diff --git a/drivers/base/power/trace.c b/drivers/base/power/trace.c > index aa9109a..1e6c611 100644 > --- a/drivers/base/power/trace.c > +++ b/drivers/base/power/trace.c > @@ -10,6 +10,7 @@ > #include <linux/pm-trace.h> > #include <linux/export.h> > #include <linux/rtc.h> > +#include <linux/suspend.h> > > #include <linux/mc146818rtc.h> > > @@ -76,6 +77,11 @@ > > bool pm_trace_rtc_abused __read_mostly; > static unsigned int dev_hash_value; > +struct rtc_time_save { > + struct rtc_time time; > + atomic_t saved; > +}; > ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2016-11-08 12:50 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-11-08 9:00 [PATCH 0/2][RFC v6] Ignore bogus sleep time if pm_trace is enabled Chen Yu
2016-11-08 9:00 ` Chen Yu
2016-11-08 9:00 ` [rtc-linux] " Chen Yu
[not found] ` <cover.1478589736.git.yu.c.chen-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2016-11-08 9:01 ` [PATCH 1/2][RFC v6] timekeeping: Ignore the " Chen Yu
2016-11-08 9:01 ` Chen Yu
2016-11-08 9:01 ` [rtc-linux] " Chen Yu
[not found] ` <e0ed3331627184f3da6243b00cfa69dd78e85514.1478589736.git.yu.c.chen-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2016-11-08 12:50 ` Chen Yu
2016-11-08 12:50 ` Chen Yu
2016-11-08 12:50 ` [rtc-linux] " Chen Yu
2016-11-08 9:02 ` [PATCH 2/2][RFC v6] PM / sleep: save/restore RTC time after resumed if pm_trace enabled Chen Yu
2016-11-08 12:43 ` Chen Yu
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.