The branch main has been updated by nprice:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=ee44a57e34a8812b4641d5c9202255ea7883764d

commit ee44a57e34a8812b4641d5c9202255ea7883764d
Author:     Nick Price <[email protected]>
AuthorDate: 2026-08-31 23:47:12 +0000
Commit:     Nick Price <[email protected]>
CommitDate: 2026-08-31 23:47:24 +0000

    umtx: use a distribution-fair multiplier for the chain hash
    
      umtxq_hash() multiplies the key by 0x9E370001 and keeps the high bits.  
That
      constant is 0x9E37 * 2^16 + 1, so it degenerates for keys whose spacing 
carries
      trailing zero bits: at a 64 KiB stride it puts 128 of 512 parked waiters 
onto a
      single chain mutex, and at 16 KiB and up it uses only a handful of the 512
      chains.  Base-system consumers never hit this because libthr places its 
own wait
      words 128 bytes apart, but a Linux-ABI runtime waiting on addresses it 
allocates
      itself lands squarely on the floor.  Switch to 0x61C88647, which leaves 
at most 3
      waiters per chain at the same stride; Linux made this exact change in 
2016, after
      judging the sparse constants "actively bad for hashing".
    
    Approved by:    adrian (mentor)
    Reviewed by:    kib, adrian, emaste
    Differential Revision:  https://reviews.freebsd.org/D58337
    
    Signed-off-by: Nick Price <[email protected]>
---
 sys/kern/kern_umtx.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c
index 69ea90ce9972..ac2469379690 100644
--- a/sys/kern/kern_umtx.c
+++ b/sys/kern/kern_umtx.c
@@ -113,7 +113,7 @@
                          (td)->td_user_pri <= PRI_MAX_TIMESHARE) ?\
                         PRI_MAX_TIMESHARE : (td)->td_user_pri)
 
-#define        GOLDEN_RATIO_PRIME      2654404609U
+#define        GOLDEN_RATIO_32         1640531527U
 #ifndef        UMTX_CHAINS
 #define        UMTX_CHAINS             512
 #endif
@@ -380,7 +380,7 @@ umtxq_hash(struct umtx_key *key)
        unsigned n;
 
        n = (uintptr_t)key->info.both.a + key->info.both.b;
-       key->hash = ((n * GOLDEN_RATIO_PRIME) >> UMTX_SHIFTS) % UMTX_CHAINS;
+       key->hash = ((n * GOLDEN_RATIO_32) >> UMTX_SHIFTS) % UMTX_CHAINS;
 }
 
 struct umtxq_chain *

Reply via email to