Add a module parameter for shazptr to allow skip the self scan in
synchronize_shaptr(). This can force every synchronize_shaptr() to use
shazptr scan kthread, and help testing the shazptr scan kthread.

Another reason users may want to set this paramter is to reduce the self
scan CPU cost in synchronize_shaptr().

Signed-off-by: Boqun Feng <boqun.f...@gmail.com>
---
 kernel/locking/shazptr.c | 28 +++++++++++++++++++++-------
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/kernel/locking/shazptr.c b/kernel/locking/shazptr.c
index a8559cb559f8..b3f7e8390eb2 100644
--- a/kernel/locking/shazptr.c
+++ b/kernel/locking/shazptr.c
@@ -14,11 +14,17 @@
 #include <linux/completion.h>
 #include <linux/kthread.h>
 #include <linux/list.h>
+#include <linux/moduleparam.h>
 #include <linux/mutex.h>
 #include <linux/shazptr.h>
 #include <linux/slab.h>
 #include <linux/sort.h>
 
+#ifdef MODULE_PARAM_PREFIX
+#undef MODULE_PARAM_PREFIX
+#endif
+#define MODULE_PARAM_PREFIX "shazptr."
+
 DEFINE_PER_CPU_SHARED_ALIGNED(void *, shazptr_slots);
 EXPORT_PER_CPU_SYMBOL_GPL(shazptr_slots);
 
@@ -252,6 +258,10 @@ static void synchronize_shazptr_busywait(void *ptr)
        }
 }
 
+/* Disabled by default. */
+static int skip_synchronize_self_scan;
+module_param(skip_synchronize_self_scan, int, 0644);
+
 static void synchronize_shazptr_normal(void *ptr)
 {
        int cpu;
@@ -259,15 +269,19 @@ static void synchronize_shazptr_normal(void *ptr)
 
        smp_mb(); /* Synchronize with the smp_mb() in shazptr_acquire(). */
 
-       for_each_possible_cpu(cpu) {
-               void **slot = per_cpu_ptr(&shazptr_slots, cpu);
-               void *val;
+       if (unlikely(skip_synchronize_self_scan)) {
+               blocking_grp_mask = ~0UL;
+       } else {
+               for_each_possible_cpu(cpu) {
+                       void **slot = per_cpu_ptr(&shazptr_slots, cpu);
+                       void *val;
 
-               /* Pair with smp_store_release() in shazptr_clear(). */
-               val = smp_load_acquire(slot);
+                       /* Pair with smp_store_release() in shazptr_clear(). */
+                       val = smp_load_acquire(slot);
 
-               if (val == ptr || val == SHAZPTR_WILDCARD)
-                       blocking_grp_mask |= 1UL << (cpu / 
shazptr_scan.cpu_grp_size);
+                       if (val == ptr || val == SHAZPTR_WILDCARD)
+                               blocking_grp_mask |= 1UL << (cpu / 
shazptr_scan.cpu_grp_size);
+               }
        }
 
        /* Found blocking slots, prepare to wait. */
-- 
2.39.5 (Apple Git-154)


Reply via email to