Integrated a bit differently, thanks!
Damien Zammit, le dim. 04 oct. 2026 03:44:56 +0000, a ecrit:
> 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
>
>
>
--
Samuel
<s> cool, j'ai un rapport a rendre pour le 31 decembre a minuit...
-+- #ens-mim - bonne année ! -+-