Browse Source

fw/diskcache: use a circular multiply for hashing

A circular multiply has better diffusion characteristics than a plain
multiply.
H. Peter Anvin 3 years ago
parent
commit
f9aa3d5f27

BIN
fpga/output_files/max80.jbc


BIN
fpga/output_files/max80.jic


BIN
fpga/output_files/max80.pof


BIN
fpga/output_files/max80.sof


+ 50 - 50
fw/boot.mif

@@ -1238,60 +1238,60 @@ CONTENT BEGIN
 04CF : D2267179;
 04D0 : 34F204B7;
 04D1 : 85D48293;
-04D2 : 02550333;
-04D3 : 89B7CE4E;
-04D4 : D4224088;
-04D5 : 84136799;
-04D6 : D6065209;
-04D7 : C65ECC52;
-04D8 : 7393D04A;
-04D9 : 94931FF3;
-04DA : CA560033;
-04DB : C462C85A;
-04DC : BD878093;
-04DD : 008488B3;
-04DE : 0040A803;
-04DF : 0048A403;
-04E0 : 8BAE8A2A;
-04E1 : 52098993;
-04E2 : 06889E63;
-04E3 : 005A1B13;
-04E4 : 090B7863;
-04E5 : 020B0513;
-04E6 : 02000C13;
-04E7 : 00A87463;
-04E8 : FE080C13;
-04E9 : 0E002903;
-04EA : FF890A93;
-04EB : 3F1D8556;
-04EC : 060B9063;
-04ED : FE892C23;
-04EE : 01492423;
-04EF : 00998633;
-04F0 : 84564254;
-04F1 : FED92E23;
-04F2 : 01562223;
-04F3 : FFC92703;
-04F4 : 01572023;
-04F5 : 00842F03;
-04F6 : 00C42F83;
-04F7 : 0E000293;
-04F8 : 01FF2223;
-04F9 : 0E93441C;
-04FA : A0230084;
-04FB : A30300FF;
-04FC : 24230042;
-04FD : A2230054;
-04FE : 262301D2;
-04FF : 20230064;
-0500 : A00501D3;
+04D2 : 02550733;
+04D3 : CC52D422;
+04D4 : 40888A37;
+04D5 : 6799CA56;
+04D6 : 520A0A93;
+04D7 : CE4ED606;
+04D8 : 3333C65E;
+04D9 : D04A0255;
+04DA : C462C85A;
+04DB : BD878093;
+04DC : 0040A883;
+04DD : 8BAE89AA;
+04DE : 520A0A13;
+04DF : 00E303B3;
+04E0 : 1FF3F413;
+04E1 : 00341493;
+04E2 : A4039AA6;
+04E3 : 1B63004A;
+04E4 : 9B130754;
+04E5 : 75630059;
+04E6 : 0513091B;
+04E7 : 0C13020B;
+04E8 : F4630200;
+04E9 : 8C1300A8;
+04EA : 2903FE08;
+04EB : 04130E00;
+04EC : 8522FF89;
+04ED : 9D633F05;
+04EE : 2423040B;
+04EF : 2C230139;
+04F0 : 0633FF59;
+04F1 : 4254009A;
+04F2 : FED92E23;
+04F3 : 2803C240;
+04F4 : 2023FFC9;
+04F5 : 2F030088;
+04F6 : 2F830084;
+04F7 : 029300C4;
+04F8 : 22230E00;
+04F9 : 441C01FF;
+04FA : 00840E93;
+04FB : 00FFA023;
+04FC : 0042A703;
+04FD : 00542423;
+04FE : 01D2A223;
+04FF : 2023C458;
+0500 : A00501D7;
 0501 : 01042E03;
-0502 : FDCA06E3;
-0503 : BFAD4040;
+0502 : FDC987E3;
+0503 : B7414040;
 0504 : 85DA8662;
 0505 : 00C90513;
 0506 : 941FF0EF;
-0507 : F9850CE3;
+0507 : F9850FE3;
 0508 : 50B24401;
 0509 : 54228522;
 050A : 59025492;

+ 8 - 2
fw/diskcache.c

@@ -54,9 +54,15 @@ static void disk_cache_init(void)
 	dll_init(hp++);
 }
 
-static inline struct dll *hash_slot(block_t block)
+static inline __attribute__((const)) struct dll *hash_slot(block_t block)
 {
-    return &cache_hash[(0x34f1f85d * block) % CACHE_BLOCKS];
+    uint64_t m;
+    uint32_t hash;
+
+    m = UINT64_C(0x34f1f85d) * block;
+    hash = (m >> 32) + m;
+
+    return &cache_hash[hash % CACHE_BLOCKS];
 }
 
 static struct cache_block *disk_cache_find(block_t block)