cm_data.buf_nOrigBuffers = cm_data.buf_nbuffers;
/* lower hash size to a prime number */
- cm_data.buf_hashSize = osi_PrimeLessThan((afs_uint32)(cm_data.buf_nbuffers/7 + 1));
+ cm_data.buf_hashSize = cm_NextHighestPowerOf2((afs_uint32)(cm_data.buf_nbuffers/7));
/* create hash table */
memset((void *)cm_data.buf_scacheHashTablepp, 0, cm_data.buf_hashSize * sizeof(cm_buf_t *));
#define OPENAFS_WINNT_AFSD_BUF_H 1
#include <osi.h>
+#include <opr/jhash.h>
+
#ifdef DISKCACHE95
#include "cm_diskcache.h"
#endif /* DISKCACHE95 */
#define CM_BUF_CACHETYPE_VIRTUAL 2
extern int buf_cacheType;
-/* force it to be signed so that mod comes out positive or 0 */
-#define BUF_HASH(fidp,offsetp) ((((fidp)->hash \
- +(offsetp)->LowPart) / cm_data.buf_blockSize) \
- % cm_data.buf_hashSize)
+#define BUF_HASH(fidp, offsetp) \
+ (opr_jhash((uint32_t *)(offsetp), 2, (fidp)->hash) & (cm_data.buf_hashSize - 1))
-/* another hash fn */
-#define BUF_FILEHASH(fidp) ((fidp)->hash % cm_data.buf_hashSize)
+#define BUF_FILEHASH(fidp) ((fidp)->hash & (cm_data.buf_hashSize - 1))
#define CM_BUF_MAGIC ('B' | 'U' <<8 | 'F'<<16 | 'F'<<24)
tfid.volume = fidp->Volume;
tfid.vnode = fidp->Vnode;
tfid.unique = fidp->Unique;
+ CM_FID_GEN_HASH(&tfid);
hash = CM_SCACHE_HASH(&tfid);
osi_Log3(afsd_logp, "RevokeCallback vol %u vn %u uniq %u",
#define CM_CELL_NAME_HASH(name) (SDBMHash(name) % cm_data.cellHashTableSize)
-#define CM_CELL_ID_HASH(id) ((unsigned long) id % cm_data.cellHashTableSize)
+#define CM_CELL_ID_HASH(id) (opr_jhash_int(id, 0) & (cm_data.cellHashTableSize - 1))
extern void cm_InitCell(int newFile, long maxCells);
ComputeSizeOfCellHT(DWORD maxcells)
{
afs_uint64 size;
- size = osi_PrimeLessThan((afs_uint32)(maxcells/7 + 1)) * sizeof(cm_cell_t *);
+ size = cm_NextHighestPowerOf2((afs_uint32)(maxcells/7)) * sizeof(cm_cell_t *);
return size;
}
ComputeSizeOfVolumeHT(DWORD maxvols)
{
afs_uint64 size;
- size = osi_PrimeLessThan((afs_uint32)(maxvols/7 + 1)) * sizeof(cm_volume_t *);
+ size = cm_NextHighestPowerOf2((afs_uint32)(maxvols/7)) * sizeof(cm_volume_t *);
return size;
}
ComputeSizeOfSCacheHT(DWORD stats)
{
afs_uint64 size;
- size = osi_PrimeLessThan(stats / 2 + 1) * sizeof(cm_scache_t *);;
+ size = cm_NextHighestPowerOf2(stats / 2 ) * sizeof(cm_scache_t *);;
return size;
}
ComputeSizeOfDataHT(afs_uint64 cacheBlocks)
{
afs_uint64 size;
- size = osi_PrimeLessThan((afs_uint32)(cacheBlocks/7 + 1)) * sizeof(cm_buf_t *);
+ size = cm_NextHighestPowerOf2((afs_uint32)(cacheBlocks/7)) * sizeof(cm_buf_t *);
return size;
}
cm_data.chunkSize = chunkSize;
cm_data.blockSize = blockSize;
cm_data.bufferSize = mappingSize;
- cm_data.scacheHashTableSize = osi_PrimeLessThan(stats / 2 + 1);
- cm_data.volumeHashTableSize = osi_PrimeLessThan((afs_uint32)(maxVols/7 + 1));
- cm_data.cellHashTableSize = osi_PrimeLessThan((afs_uint32)(maxCells/7 + 1));
+
+ cm_data.scacheHashTableSize = cm_NextHighestPowerOf2(stats / 2);
+ cm_data.volumeHashTableSize = cm_NextHighestPowerOf2((afs_uint32)(maxVols/7));
+ cm_data.cellHashTableSize = cm_NextHighestPowerOf2((afs_uint32)(maxCells/7));
if (virtualCache) {
cm_data.cacheType = CM_BUF_CACHETYPE_VIRTUAL;
} else {
cm_data.buf_nbuffers = cacheBlocks;
cm_data.buf_nOrigBuffers = 0;
cm_data.buf_blockSize = blockSize;
- cm_data.buf_hashSize = osi_PrimeLessThan((afs_uint32)(cacheBlocks/7 + 1));
+ cm_data.buf_hashSize = cm_NextHighestPowerOf2((afs_uint32)(cacheBlocks/7));
cm_data.mountRootGen = 0;
#ifndef CM_MEMMAP_H
#define CM_MEMMAP_H 1
-#define CM_CONFIG_DATA_VERSION 17
+#define CM_CONFIG_DATA_VERSION 18
#define CM_CONFIG_DATA_MAGIC ('A' | 'F'<<8 | 'S'<<16 | CM_CONFIG_DATA_VERSION<<24)
typedef struct cm_config_data {
fidp->volume = volume;
fidp->vnode = vnode;
fidp->unique = unique;
- fidp->hash = ((cell & 0xF) << 28) | ((volume & 0x3F) << 22) | ((vnode & 0x7FF) << 11) | (unique & 0x7FF);
+ CM_FID_GEN_HASH(fidp);
}
/* like strcmp, only for fids */
#ifndef OPENAFS_WINNT_AFSD_CM_SCACHE_H
#define OPENAFS_WINNT_AFSD_CM_SCACHE_H 1
+#include <opr/jhash.h>
+
#define MOUNTPOINTLEN 1024 /* max path length for symlink; same as AFSPATHMAX */
typedef struct cm_fid {
* doesn't necessarily know the cell in the case of a multihomed server
* contacting us from a mystery address.
*/
-#define CM_SCACHE_HASH(fidp) (((unsigned long) \
- ((fidp)->volume + \
- (fidp)->vnode + \
- (fidp)->unique)) \
- % cm_data.scacheHashTableSize)
+
+#define CM_FID_GEN_HASH(fidp) do { \
+ (fidp)->hash = opr_jhash(&(fidp)->volume, 3, 0); \
+} while(0)
+
+#define CM_SCACHE_HASH(fidp) ((fidp)->hash & (cm_data.scacheHashTableSize - 1))
#include "cm_conn.h"
#include "cm_buf.h"
*unixTimep = mktime(&localTm);
}
+
+afs_uint32
+cm_NextHighestPowerOf2(afs_uint32 n)
+{
+ n--;
+ n |= n >> 1;
+ n |= n >> 2;
+ n |= n >> 4;
+ n |= n >> 8;
+ n |= n >> 16;
+ n++;
+ return n;
+}
#endif
#endif
+extern afs_uint32
+cm_NextHighestPowerOf2(afs_uint32 n);
+
#endif /* OPENAFS_WINNT_AFSD_CM_UTILS_H */
#ifndef OPENAFS_WINNT_AFSD_CM_VOLUME_H
#define OPENAFS_WINNT_AFSD_CM_VOLUME_H 1
+#include <opr/jhash.h>
+
#define VL_MAXNAMELEN 65
#define CM_VOLUME_MAGIC ('V' | 'O' <<8 | 'L'<<16 | 'M'<<24)
* doesn't necessarily know the cell in the case of a multihomed server
* contacting us from a mystery address.
*/
-#define CM_VOLUME_ID_HASH(volid) ((unsigned long) volid \
- % cm_data.volumeHashTableSize)
+
+#define CM_VOLUME_ID_HASH(volid) \
+ (opr_jhash_int((volid), 0) & (cm_data.volumeHashTableSize - 1))
#define CM_VOLUME_NAME_HASH(name) (SDBMHash(name) % cm_data.volumeHashTableSize)