TESTED: With MACH_LOCK_MON set to 1 in configfrag.ac

---
 kern/lock.h     | 22 +++++++++++++---------
 kern/lock_mon.c | 22 +++++++++-------------
 2 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/kern/lock.h b/kern/lock.h
index 74f2e26e..226735f3 100644
--- a/kern/lock.h
+++ b/kern/lock.h
@@ -59,12 +59,25 @@
  */
 
 #include <machine/lock.h>/*XXX*/
+
+/*
+ *     A simple spin lock.
+ */
+
+struct slock {
+       volatile natural_t lock_data;   /* in general 1 bit is sufficient */
+       struct {} is_a_simple_lock;
+};
+
 #if NCPUS > 1
 #if MACH_LOCK_MON == 0
 #define simple_lock_nocheck    _simple_lock
 #define simple_lock_try_nocheck        _simple_lock_try
 #define simple_unlock_nocheck  _simple_unlock
 #else
+extern void simple_lock(struct slock *l);
+extern int simple_lock_try(struct slock *l);
+extern void simple_unlock(struct slock *l);
 #define simple_lock_nocheck    simple_lock
 #define simple_lock_try_nocheck        simple_lock_try
 #define simple_unlock_nocheck  simple_unlock
@@ -73,15 +86,6 @@
 
 #define MACH_SLOCKS    ((NCPUS > 1) || MACH_LDEBUG)
 
-/*
- *     A simple spin lock.
- */
-
-struct slock {
-       volatile natural_t lock_data;   /* in general 1 bit is sufficient */
-       struct {} is_a_simple_lock;
-};
-
 /*
  *     Used by macros to assert that the given argument is a simple
  *     lock.
diff --git a/kern/lock_mon.c b/kern/lock_mon.c
index edc8ae55..e4a933b9 100644
--- a/kern/lock_mon.c
+++ b/kern/lock_mon.c
@@ -60,11 +60,11 @@ typedef unsigned int time_stamp_t;
 /* in milliseconds */
 #define        time_stamp (elapsed_ticks * 1000 / hz)
 
-#define LOCK_INFO_MAX       (1024*32)
-#define LOCK_INFO_HASH_COUNT 1024
-#define LOCK_INFO_PER_BUCKET   (LOCK_INFO_MAX/LOCK_INFO_HASH_COUNT)
-
-#define HASH_LOCK(lock)        ((long)lock>>5 & (LOCK_INFO_HASH_COUNT-1))
+#define LOCK_INFO_HASH_COUNT   1024
+#define LOCK_INFO_BUCKET_BITS  5
+#define LOCK_INFO_PER_BUCKET   (1 << LOCK_INFO_BUCKET_BITS)
+#define LOCK_INFO_MAX          (LOCK_INFO_HASH_COUNT << LOCK_INFO_BUCKET_BITS)
+#define HASH_LOCK(lock)                (((long)lock >> LOCK_INFO_BUCKET_BITS) 
& (LOCK_INFO_HASH_COUNT-1))
 
 struct lock_info {
        unsigned int    success;
@@ -91,8 +91,7 @@ extern spl_t curr_ipl[];
 
 
 struct lock_info *
-locate_lock_info(lock)
-decl_simple_lock_data(, **lock)
+locate_lock_info(struct slock **lock)
 {
        struct lock_info *li =  &(lock_info[HASH_LOCK(*lock)].info[0]);
        int i;
@@ -112,8 +111,7 @@ decl_simple_lock_data(, **lock)
 }
 
 
-void simple_lock(lock)
-decl_simple_lock_data(, *lock)
+void simple_lock(struct slock *lock)
 {
        struct lock_info *li = locate_lock_info(&lock);
        int my_cpu = cpu_number();
@@ -131,8 +129,7 @@ decl_simple_lock_data(, *lock)
        li->time = time_stamp - li->time;
 }
 
-int simple_lock_try(lock)
-decl_simple_lock_data(, *lock)
+int simple_lock_try(struct slock *lock)
 {
        struct lock_info *li = locate_lock_info(&lock);
        int my_cpu = cpu_number();
@@ -151,8 +148,7 @@ decl_simple_lock_data(, *lock)
        }
 }
 
-void simple_unlock(lock)
-decl_simple_lock_data(, *lock)
+void simple_unlock(struct slock *lock)
 {
        time_stamp_t stamp = time_stamp;
        time_stamp_t *time = &locate_lock_info(&lock)->time;
-- 
2.51.0



Reply via email to