Whamcloud - gitweb
b=23179 MDS node unresponsive
authorIsaac Huang <he.h.huang@oracle.com>
Thu, 19 Aug 2010 17:11:46 +0000 (21:11 +0400)
committerMikhail Pershin <tappro@sun.com>
Fri, 20 Aug 2010 11:59:04 +0000 (15:59 +0400)
Better hash distribution, doubled hash size for the lnet cookie hash.

i=zhen.liang
i=andreas.dilger

lnet/include/lnet/lib-types.h
lnet/lnet/api-ni.c

index 8f69c18..57454bc 100644 (file)
@@ -304,7 +304,8 @@ typedef struct {
 #define LNET_COOKIE_TYPE_MD    1
 #define LNET_COOKIE_TYPE_ME    2
 #define LNET_COOKIE_TYPE_EQ    3
-#define LNET_COOKIE_TYPES      4
+#define LNET_COOKIE_TYPE_BITS  2
+#define LNET_COOKIE_TYPES      (1 << LNET_COOKIE_TYPE_BITS)
 /* LNET_COOKIE_TYPES must be a power of 2, so the cookie type can be
  * extracted by masking with (LNET_COOKIE_TYPES - 1) */
 
index 07069db..3b97ea5 100644 (file)
@@ -482,7 +482,7 @@ lnet_setup_handle_hash (void)
         /* Arbitrary choice of hash table size */
 #ifdef __KERNEL__
         the_lnet.ln_lh_hash_size =
-                CFS_PAGE_SIZE / sizeof (cfs_list_t);
+                (2 * CFS_PAGE_SIZE) / sizeof (cfs_list_t);
 #else
         the_lnet.ln_lh_hash_size = (MAX_MES + MAX_MDS + MAX_EQS)/4;
 #endif
@@ -520,7 +520,7 @@ lnet_lookup_cookie (__u64 cookie, int type)
         if ((cookie & (LNET_COOKIE_TYPES - 1)) != type)
                 return (NULL);
 
-        hash = ((unsigned int)cookie) % the_lnet.ln_lh_hash_size;
+        hash = ((unsigned int)(cookie >> LNET_COOKIE_TYPE_BITS)) % the_lnet.ln_lh_hash_size;
         list = &the_lnet.ln_lh_hash_table[hash];
 
         cfs_list_for_each (el, list) {
@@ -544,7 +544,7 @@ lnet_initialise_handle (lnet_libhandle_t *lh, int type)
         lh->lh_cookie = the_lnet.ln_next_object_cookie | type;
         the_lnet.ln_next_object_cookie += LNET_COOKIE_TYPES;
 
-        hash = ((unsigned int)lh->lh_cookie) % the_lnet.ln_lh_hash_size;
+        hash = ((unsigned int)(lh->lh_cookie >> LNET_COOKIE_TYPE_BITS)) % the_lnet.ln_lh_hash_size;
         cfs_list_add (&lh->lh_hash_chain, &the_lnet.ln_lh_hash_table[hash]);
 }