locking/lock_events: Don't show pvqspinlock events on bare metal
authorWaiman Long <longman@redhat.com>
Thu, 4 Apr 2019 17:43:18 +0000 (13:43 -0400)
committerIngo Molnar <mingo@kernel.org>
Wed, 10 Apr 2019 08:56:05 +0000 (10:56 +0200)
On bare metal, the pvqspinlock event counts will always be 0. So there
is no point in showing their corresponding debugfs files. So they are
skipped in this case.

Signed-off-by: Waiman Long <longman@redhat.com>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: Davidlohr Bueso <dbueso@suse.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Tim Chen <tim.c.chen@linux.intel.com>
Cc: Will Deacon <will.deacon@arm.com>
Link: http://lkml.kernel.org/r/20190404174320.22416-10-longman@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
kernel/locking/lock_events.c

index 71c36d1..fa2c2f9 100644 (file)
@@ -115,6 +115,29 @@ static const struct file_operations fops_lockevent = {
        .llseek = default_llseek,
 };
 
+#ifdef CONFIG_PARAVIRT_SPINLOCKS
+#include <asm/paravirt.h>
+
+static bool __init skip_lockevent(const char *name)
+{
+       static int pv_on __initdata = -1;
+
+       if (pv_on < 0)
+               pv_on = !pv_is_native_spin_unlock();
+       /*
+        * Skip PV qspinlock events on bare metal.
+        */
+       if (!pv_on && !memcmp(name, "pv_", 3))
+               return true;
+       return false;
+}
+#else
+static inline bool skip_lockevent(const char *name)
+{
+       return false;
+}
+#endif
+
 /*
  * Initialize debugfs for the locking event counts.
  */
@@ -133,10 +156,13 @@ static int __init init_lockevent_counts(void)
         * root is allowed to do the read/write to limit impact to system
         * performance.
         */
-       for (i = 0; i < lockevent_num; i++)
+       for (i = 0; i < lockevent_num; i++) {
+               if (skip_lockevent(lockevent_names[i]))
+                       continue;
                if (!debugfs_create_file(lockevent_names[i], 0400, d_counts,
                                         (void *)(long)i, &fops_lockevent))
                        goto fail_undo;
+       }
 
        if (!debugfs_create_file(lockevent_names[LOCKEVENT_reset_cnts], 0200,
                                 d_counts, (void *)(long)LOCKEVENT_reset_cnts,