diff mbox series

[v2] kdb: use ktime_get_mono_fast_ns() instead of ktime_get_ts()

Message ID 3f15868475cb4b32353885ee03c983209279fa81.1517192387.git.baolin.wang@linaro.org
State New
Headers show
Series [v2] kdb: use ktime_get_mono_fast_ns() instead of ktime_get_ts() | expand

Commit Message

(Exiting) Baolin Wang Jan. 29, 2018, 2:22 a.m. UTC
The kdb code will print the monotonic time by ktime_get_ts(), but
the ktime_get_ts() will be protected by a sequence lock, that will
introduce one deadlock risk if the lock was already held in the
context from which we entered the debugger.

Thus we can use the ktime_get_mono_fast_ns() to get the monotonic
time, which is NMI safe access to clock monotonic. Moreover we can
remove the 'struct timespec', which is not y2038 safe.

Signed-off-by: Baolin Wang <baolin.wang@linaro.org>

---
Changes since v1:
 - Use ktime_get_mono_fast_ns() instead of ktime_get_seconds().
---
 kernel/debug/kdb/kdb_main.c |    6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

-- 
1.7.9.5

Comments

Daniel Thompson Jan. 30, 2018, 9:48 a.m. UTC | #1
On Mon, Jan 29, 2018 at 10:22:51AM +0800, Baolin Wang wrote:
> The kdb code will print the monotonic time by ktime_get_ts(), but

> the ktime_get_ts() will be protected by a sequence lock, that will

> introduce one deadlock risk if the lock was already held in the

> context from which we entered the debugger.

> 

> Thus we can use the ktime_get_mono_fast_ns() to get the monotonic

> time, which is NMI safe access to clock monotonic. Moreover we can

> remove the 'struct timespec', which is not y2038 safe.

> 

> Signed-off-by: Baolin Wang <baolin.wang@linaro.org>


Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org>



> ---

> Changes since v1:

>  - Use ktime_get_mono_fast_ns() instead of ktime_get_seconds().

> ---

>  kernel/debug/kdb/kdb_main.c |    6 +++---

>  1 file changed, 3 insertions(+), 3 deletions(-)

> 

> diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c

> index 69e70f4..bf1d0e0 100644

> --- a/kernel/debug/kdb/kdb_main.c

> +++ b/kernel/debug/kdb/kdb_main.c

> @@ -2486,10 +2486,10 @@ static int kdb_kill(int argc, const char **argv)

>   */

>  static void kdb_sysinfo(struct sysinfo *val)

>  {

> -	struct timespec uptime;

> -	ktime_get_ts(&uptime);

> +	u64 uptime = ktime_get_mono_fast_ns();

> +

>  	memset(val, 0, sizeof(*val));

> -	val->uptime = uptime.tv_sec;

> +	val->uptime = div_u64(uptime, NSEC_PER_SEC);

>  	val->loads[0] = avenrun[0];

>  	val->loads[1] = avenrun[1];

>  	val->loads[2] = avenrun[2];

> -- 

> 1.7.9.5

>
Arnd Bergmann Jan. 30, 2018, 1:35 p.m. UTC | #2
On Mon, Jan 29, 2018 at 3:22 AM, Baolin Wang <baolin.wang@linaro.org> wrote:
> The kdb code will print the monotonic time by ktime_get_ts(), but

> the ktime_get_ts() will be protected by a sequence lock, that will

> introduce one deadlock risk if the lock was already held in the

> context from which we entered the debugger.

>

> Thus we can use the ktime_get_mono_fast_ns() to get the monotonic

> time, which is NMI safe access to clock monotonic. Moreover we can

> remove the 'struct timespec', which is not y2038 safe.

>

> Signed-off-by: Baolin Wang <baolin.wang@linaro.org>


Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Jason Wessel Jan. 30, 2018, 2:02 p.m. UTC | #3
On 01/30/2018 07:35 AM, Arnd Bergmann wrote:
> On Mon, Jan 29, 2018 at 3:22 AM, Baolin Wang <baolin.wang@linaro.org> wrote:

>> The kdb code will print the monotonic time by ktime_get_ts(), but

>> the ktime_get_ts() will be protected by a sequence lock, that will

>> introduce one deadlock risk if the lock was already held in the

>> context from which we entered the debugger.

>>

>> Thus we can use the ktime_get_mono_fast_ns() to get the monotonic

>> time, which is NMI safe access to clock monotonic. Moreover we can

>> remove the 'struct timespec', which is not y2038 safe.

>>

>> Signed-off-by: Baolin Wang <baolin.wang@linaro.org>

> 

> Reviewed-by: Arnd Bergmann <arnd@arndb.de>

> 



I'll add this in today, run some tests and it should be in the merge window.

Thanks,
Jason
diff mbox series

Patch

diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index 69e70f4..bf1d0e0 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -2486,10 +2486,10 @@  static int kdb_kill(int argc, const char **argv)
  */
 static void kdb_sysinfo(struct sysinfo *val)
 {
-	struct timespec uptime;
-	ktime_get_ts(&uptime);
+	u64 uptime = ktime_get_mono_fast_ns();
+
 	memset(val, 0, sizeof(*val));
-	val->uptime = uptime.tv_sec;
+	val->uptime = div_u64(uptime, NSEC_PER_SEC);
 	val->loads[0] = avenrun[0];
 	val->loads[1] = avenrun[1];
 	val->loads[2] = avenrun[2];