Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/sys Adapt to use the new atomic_* operations. As discus...



details:   https://anonhg.NetBSD.org/src/rev/6756860bc756
branches:  trunk
changeset: 967251:6756860bc756
user:      pgoyette <pgoyette%NetBSD.org@localhost>
date:      Tue Dec 03 13:48:25 2019 +0000

description:
Adapt to use the new atomic_* operations.  As discussed with
riastradh@ in private Email.

diffstat:

 sys/sys/module_hook.h |  25 +++++++++++++++++--------
 1 files changed, 17 insertions(+), 8 deletions(-)

diffs (71 lines):

diff -r 802043e15a58 -r 6756860bc756 sys/sys/module_hook.h
--- a/sys/sys/module_hook.h     Tue Dec 03 13:42:55 2019 +0000
+++ b/sys/sys/module_hook.h     Tue Dec 03 13:48:25 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: module_hook.h,v 1.3 2019/03/01 11:06:57 pgoyette Exp $     */
+/* $NetBSD: module_hook.h,v 1.4 2019/12/03 13:48:25 pgoyette Exp $     */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -55,6 +55,17 @@
        type                    (*f)args;                       \
 } hook __cacheline_aligned;
 
+/*
+ * We use pserialize_perform() to issue a memory barrier on the current
+ * CPU and on all other CPUs so that all prior memory operations on the
+ * current CPU globally happen before all subsequent memory operations
+ * on the current CPU, as perceived by any other CPU.
+ *
+ * pserialize_perform() might be rather heavy-weight here, but it only
+ * happens during module loading, and it allows MODULE_HOOK_CALL() to
+ * work without any other memory barriers.
+ */
+
 #define MODULE_HOOK_SET(hook, waitchan, func)                  \
 do {                                                           \
                                                                \
@@ -67,10 +78,10 @@
        hook.f = func;                                          \
                                                                \
        /* Make sure it's initialized before anyone uses it */  \
-       membar_producer();                                      \
+       pserialize_perform(hook.psz);                           \
                                                                \
        /* Let them use it */                                   \
-       hook.hooked = true;                                     \
+       atomic_store_relaxed(&hook.hooked, true);               \
 } while /* CONSTCOND */ (0)
 
 #define MODULE_HOOK_UNSET(hook)                                        \
@@ -84,7 +95,7 @@
        mutex_enter(&hook.mtx);                                 \
                                                                \
        /* Prevent new localcount_acquire calls.  */            \
-       hook.hooked = false;                                    \
+       atomic_store_relaxed(&hook.hooked, false);              \
                                                                \
        /*                                                      \
         * Wait for localcount_acquire calls already under way  \
@@ -109,9 +120,8 @@
        int __hook_s;                                           \
                                                                \
        __hook_s = pserialize_read_enter();                     \
-       __hooked = hook.hooked;                                 \
+       __hooked = atomic_load_relaxed(&hook.hooked);           \
        if (__hooked) {                                         \
-               membar_consumer();                              \
                localcount_acquire(&hook.lc);                   \
        }                                                       \
        pserialize_read_exit(__hook_s);                         \
@@ -131,9 +141,8 @@
        int __hook_s;                                           \
                                                                \
        __hook_s = pserialize_read_enter();                     \
-       __hooked = hook.hooked;                                 \
+       __hooked = atomic_load_relaxed(&hook.hooked);           \
        if (__hooked) {                                         \
-               membar_consumer();                              \
                localcount_acquire(&hook.lc);                   \
        }                                                       \
        pserialize_read_exit(__hook_s);                         \



Home | Main Index | Thread Index | Old Index