]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
dtrace: DTrace walltime lock-free implementation
authorTomas Jedlicka <tomas.jedlicka@oracle.com>
Thu, 30 Mar 2017 13:22:47 +0000 (09:22 -0400)
committerKris Van Hees <kris.van.hees@oracle.com>
Sun, 2 Apr 2017 12:28:48 +0000 (08:28 -0400)
DTrace walltimestamp is now based on reading current kernel
timespec without taking locks.

Orabug: 25715256

Signed-off-by: Tomas Jedlicka <tomas.jedlicka@oracle.com>
Reviewed-by: Kris Van Hees <kris.van.hees@oracle.com>
Acked-by: Nick Alcock <nick.alcock@oracle.com>
include/linux/dtrace_os.h
kernel/dtrace/dtrace_os.c

index 90952301a0131bfb14ea04bc982fd3b3937d4816..e3200c2d6c84aa2ed38f88ed1e5464d614e77c16 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2011-2014 Oracle, Inc. */
+/* Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. */
 
 #ifndef _LINUX_DTRACE_OS_H_
 #define _LINUX_DTRACE_OS_H_
@@ -36,6 +36,8 @@ typedef enum dtrace_vtime_state {
 
 extern dtrace_vtime_state_t dtrace_vtime_active;
 
+extern ktime_t dtrace_get_walltime(void);
+
 extern void dtrace_vtime_enable(void);
 extern void dtrace_vtime_disable(void);
 extern void dtrace_vtime_switch(struct task_struct *, struct task_struct *);
index 2a6941772fba5121b07595ac1545254b29e8d0a6..72d0746748c65a00076cbb8a18726cb9ca81fad3 100644 (file)
@@ -2,7 +2,7 @@
  * FILE:       dtrace_os.c
  * DESCRIPTION:        Dynamic Tracing: OS support functions - part of kernel core
  *
- * Copyright (C) 2010-2014 Oracle Corporation
+ * Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved.
  */
 
 #include <linux/binfmts.h>
@@ -19,6 +19,7 @@
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/stacktrace.h>
+#include <linux/timekeeping.h>
 #include <linux/vmalloc.h>
 #include <linux/kallsyms.h>
 #include <linux/workqueue.h>
@@ -335,6 +336,14 @@ void dtrace_psinfo_free(struct task_struct *tsk)
 \*---------------------------------------------------------------------------*/
 dtrace_vtime_state_t   dtrace_vtime_active = 0;
 
+ktime_t dtrace_get_walltime(void)
+{
+       struct timespec t = __current_kernel_time();
+
+       return ns_to_ktime(timespec64_to_ns(&t));
+}
+EXPORT_SYMBOL(dtrace_get_walltime);
+
 void dtrace_vtime_enable(void)
 {
        dtrace_vtime_state_t    old, new;