public inbox for linux-acpi@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ACPICA: Use 'jiffies' as the time bassis for acpi_os_get_timer()
@ 2018-10-17 20:24 Bart Van Assche
  2018-10-19 10:21 ` Rafael J. Wysocki
  0 siblings, 1 reply; 2+ messages in thread
From: Bart Van Assche @ 2018-10-17 20:24 UTC (permalink / raw)
  To: Rafael J . Wysocki
  Cc: Bart Van Assche, Thomas Gleixner, Len Brown, Yu Chen,
	Fengguang Wu, linux-acpi, stable

Since acpi_os_get_timer() may be called after the timer subsystem has
been suspended, use the jiffies counter instead of ktime_get(). This
patch avoids that the following warning is reported during hibernation:

WARNING: CPU: 0 PID: 612 at kernel/time/timekeeping.c:751 ktime_get+0x116/0x120
RIP: 0010:ktime_get+0x116/0x120
Call Trace:
 acpi_os_get_timer+0xe/0x30
 acpi_ds_exec_begin_control_op+0x175/0x1de
 acpi_ds_exec_begin_op+0x2c7/0x39a
 acpi_ps_create_op+0x573/0x5e4
 acpi_ps_parse_loop+0x349/0x1220
 acpi_ps_parse_aml+0x25b/0x6da
 acpi_ps_execute_method+0x327/0x41b
 acpi_ns_evaluate+0x4e9/0x6f5
 acpi_ut_evaluate_object+0xd9/0x2f2
 acpi_rs_get_method_data+0x8f/0x114
 acpi_walk_resources+0x122/0x1b6
 acpi_pci_link_get_current.isra.2+0x157/0x280
 acpi_pci_link_set+0x32f/0x4a0
 irqrouter_resume+0x58/0x80
 syscore_resume+0x84/0x380
 hibernation_snapshot+0x20c/0x4f0
 hibernate+0x22d/0x3a6
 state_store+0x99/0xa0
 kobj_attr_store+0x37/0x50
 sysfs_kf_write+0x87/0xa0
 kernfs_fop_write+0x1a5/0x240
 __vfs_write+0xd2/0x410
 vfs_write+0x101/0x250
 ksys_write+0xab/0x120
 __x64_sys_write+0x43/0x50
 do_syscall_64+0x71/0x220
 entry_SYSCALL_64_after_hwframe+0x49/0xbe

Fixes: 164a08cee135 ("ACPICA: Dispatcher: Introduce timeout mechanism for infinite loop detection")
Reported-by: Fengguang Wu <fengguang.wu@intel.com>
References: https://lists.01.org/pipermail/lkp/2018-April/008406.html
Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Len Brown <lenb@kernel.org>
Cc: Yu Chen <yu.c.chen@intel.com>
Cc: Fengguang Wu <fengguang.wu@intel.com>
Cc: linux-acpi@vger.kernel.org
Cc: stable@vger.kernel.org
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/acpi/osl.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index 8df9abfa947b..ed73f6fb0779 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -617,15 +617,18 @@ void acpi_os_stall(u32 us)
 }
 
 /*
- * Support ACPI 3.0 AML Timer operand
- * Returns 64-bit free-running, monotonically increasing timer
- * with 100ns granularity
+ * Support ACPI 3.0 AML Timer operand. Returns a 64-bit free-running,
+ * monotonically increasing timer with 100ns granularity. Do not use
+ * ktime_get() to implement this function because this function may get
+ * called after timekeeping has been suspended. Note: calling this function
+ * after timekeeping has been suspended may lead to unexpected results
+ * because when timekeeping is suspended the jiffies counter is not
+ * incremented. See also timekeeping_suspend().
  */
 u64 acpi_os_get_timer(void)
 {
-	u64 time_ns = ktime_to_ns(ktime_get());
-	do_div(time_ns, 100);
-	return time_ns;
+	return (get_jiffies_64() - INITIAL_JIFFIES) *
+		(ACPI_100NSEC_PER_SEC / HZ);
 }
 
 acpi_status acpi_os_read_port(acpi_io_address port, u32 * value, u32 width)
-- 
2.19.1.568.g152ad8e336-goog

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] ACPICA: Use 'jiffies' as the time bassis for acpi_os_get_timer()
  2018-10-17 20:24 [PATCH] ACPICA: Use 'jiffies' as the time bassis for acpi_os_get_timer() Bart Van Assche
@ 2018-10-19 10:21 ` Rafael J. Wysocki
  0 siblings, 0 replies; 2+ messages in thread
From: Rafael J. Wysocki @ 2018-10-19 10:21 UTC (permalink / raw)
  To: Bart Van Assche
  Cc: Thomas Gleixner, Len Brown, Yu Chen, Fengguang Wu, linux-acpi,
	stable

On Wednesday, October 17, 2018 10:24:56 PM CEST Bart Van Assche wrote:
> Since acpi_os_get_timer() may be called after the timer subsystem has
> been suspended, use the jiffies counter instead of ktime_get(). This
> patch avoids that the following warning is reported during hibernation:
> 
> WARNING: CPU: 0 PID: 612 at kernel/time/timekeeping.c:751 ktime_get+0x116/0x120
> RIP: 0010:ktime_get+0x116/0x120
> Call Trace:
>  acpi_os_get_timer+0xe/0x30
>  acpi_ds_exec_begin_control_op+0x175/0x1de
>  acpi_ds_exec_begin_op+0x2c7/0x39a
>  acpi_ps_create_op+0x573/0x5e4
>  acpi_ps_parse_loop+0x349/0x1220
>  acpi_ps_parse_aml+0x25b/0x6da
>  acpi_ps_execute_method+0x327/0x41b
>  acpi_ns_evaluate+0x4e9/0x6f5
>  acpi_ut_evaluate_object+0xd9/0x2f2
>  acpi_rs_get_method_data+0x8f/0x114
>  acpi_walk_resources+0x122/0x1b6
>  acpi_pci_link_get_current.isra.2+0x157/0x280
>  acpi_pci_link_set+0x32f/0x4a0
>  irqrouter_resume+0x58/0x80
>  syscore_resume+0x84/0x380
>  hibernation_snapshot+0x20c/0x4f0
>  hibernate+0x22d/0x3a6
>  state_store+0x99/0xa0
>  kobj_attr_store+0x37/0x50
>  sysfs_kf_write+0x87/0xa0
>  kernfs_fop_write+0x1a5/0x240
>  __vfs_write+0xd2/0x410
>  vfs_write+0x101/0x250
>  ksys_write+0xab/0x120
>  __x64_sys_write+0x43/0x50
>  do_syscall_64+0x71/0x220
>  entry_SYSCALL_64_after_hwframe+0x49/0xbe
> 
> Fixes: 164a08cee135 ("ACPICA: Dispatcher: Introduce timeout mechanism for infinite loop detection")
> Reported-by: Fengguang Wu <fengguang.wu@intel.com>
> References: https://lists.01.org/pipermail/lkp/2018-April/008406.html
> Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Len Brown <lenb@kernel.org>
> Cc: Yu Chen <yu.c.chen@intel.com>
> Cc: Fengguang Wu <fengguang.wu@intel.com>
> Cc: linux-acpi@vger.kernel.org
> Cc: stable@vger.kernel.org
> Signed-off-by: Bart Van Assche <bvanassche@acm.org>
> ---
>  drivers/acpi/osl.c | 15 +++++++++------
>  1 file changed, 9 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
> index 8df9abfa947b..ed73f6fb0779 100644
> --- a/drivers/acpi/osl.c
> +++ b/drivers/acpi/osl.c
> @@ -617,15 +617,18 @@ void acpi_os_stall(u32 us)
>  }
>  
>  /*
> - * Support ACPI 3.0 AML Timer operand
> - * Returns 64-bit free-running, monotonically increasing timer
> - * with 100ns granularity
> + * Support ACPI 3.0 AML Timer operand. Returns a 64-bit free-running,
> + * monotonically increasing timer with 100ns granularity. Do not use
> + * ktime_get() to implement this function because this function may get
> + * called after timekeeping has been suspended. Note: calling this function
> + * after timekeeping has been suspended may lead to unexpected results
> + * because when timekeeping is suspended the jiffies counter is not
> + * incremented. See also timekeeping_suspend().
>   */
>  u64 acpi_os_get_timer(void)
>  {
> -	u64 time_ns = ktime_to_ns(ktime_get());
> -	do_div(time_ns, 100);
> -	return time_ns;
> +	return (get_jiffies_64() - INITIAL_JIFFIES) *
> +		(ACPI_100NSEC_PER_SEC / HZ);
>  }
>  
>  acpi_status acpi_os_read_port(acpi_io_address port, u32 * value, u32 width)
> 

Applied, thanks!

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2018-10-19 10:21 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-10-17 20:24 [PATCH] ACPICA: Use 'jiffies' as the time bassis for acpi_os_get_timer() Bart Van Assche
2018-10-19 10:21 ` Rafael J. Wysocki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox