]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
DEVEL15-windows-buffer-mgmt-20070204
authorJeffrey Altman <jaltman@secure-endpoints.com>
Mon, 5 Feb 2007 03:41:41 +0000 (03:41 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Mon, 5 Feb 2007 03:41:41 +0000 (03:41 +0000)
Instead of using a fixed sized hashtable of 1024 entries regardless
of the number of buffers, compute the hashtable to be large enough
for on average 7 buffers per bucket.

Remove the 'size' field from cm_buf_t since it is never used.

Add more info to the output of cm_buf_t objects when using "fs memdump"

(cherry picked from commit cec0b902f6cbeb849984d5ca1ef1847ef1eeac89)

src/WINNT/afsd/cm_buf.c
src/WINNT/afsd/cm_buf.h
src/WINNT/afsd/cm_memmap.c
src/WINNT/afsd/cm_memmap.h

index 4ad5b75897b76d34012c82df50117e27158b2da6..16cf33bae3f174ec3160b0433c8023b07fd10b1d 100644 (file)
@@ -313,7 +313,7 @@ long buf_Init(int newFile, cm_buf_ops_t *opsp, afs_uint64 nbuffers)
             cm_data.buf_nOrigBuffers = cm_data.buf_nbuffers;
  
             /* lower hash size to a prime number */
-            cm_data.buf_hashSize = osi_PrimeLessThan(CM_BUF_HASHSIZE);
+           cm_data.buf_hashSize = osi_PrimeLessThan((afs_uint32)(cm_data.buf_nbuffers/7 + 1));
  
             /* create hash table */
             memset((void *)cm_data.buf_hashTablepp, 0, cm_data.buf_hashSize * sizeof(cm_buf_t *));
@@ -548,7 +548,7 @@ void buf_WaitIO(cm_scache_t * scp, cm_buf_t *bp)
  */
 cm_buf_t *buf_FindLocked(struct cm_scache *scp, osi_hyper_t *offsetp)
 {
-    long i;
+    afs_uint32 i;
     cm_buf_t *bp;
 
     i = BUF_HASH(&scp->fid, offsetp);
@@ -680,8 +680,8 @@ void buf_Recycle(cm_buf_t *bp)
      * have any lock conflicts, so we can grab the buffer lock out of
      * order in the locking hierarchy.
      */
-    osi_Log2( buf_logp, "buf_Recycle recycles 0x%p, off 0x%x",
-              bp, bp->offset.LowPart);
+    osi_Log3( buf_logp, "buf_Recycle recycles 0x%p, off 0x%x:%08x",
+              bp, bp->offset.HighPart, bp->offset.LowPart);
 
     osi_assert(bp->refCount == 0);
     osi_assert(!(bp->flags & (CM_BUF_READING | CM_BUF_WRITING | CM_BUF_DIRTY)));
@@ -964,8 +964,8 @@ long buf_GetNew(struct cm_scache *scp, osi_hyper_t *offsetp, cm_buf_t **bufpp)
      */
     lock_ReleaseMutex(&bp->mx);
     *bufpp = bp;
-    osi_Log3(buf_logp, "buf_GetNew returning bp 0x%p for scp 0x%p, offset 0x%x",
-              bp, scp, offsetp->LowPart);
+    osi_Log4(buf_logp, "buf_GetNew returning bp 0x%p for scp 0x%p, offset 0x%x:%08x",
+              bp, scp, offsetp->HighPart, offsetp->LowPart);
     return 0;
 }
 
@@ -1112,8 +1112,8 @@ long buf_Get(struct cm_scache *scp, osi_hyper_t *offsetp, cm_buf_t **bufpp)
     }
     lock_ReleaseWrite(&buf_globalLock);
 
-    osi_Log3(buf_logp, "buf_Get returning bp 0x%p for scp 0x%p, offset 0x%x",
-              bp, scp, offsetp->LowPart);
+    osi_Log4(buf_logp, "buf_Get returning bp 0x%p for scp 0x%p, offset 0x%x:%08x",
+              bp, scp, offsetp->HighPart, offsetp->LowPart);
 #ifdef TESTING
     buf_ValidateBufQueues();
 #endif /* TESTING */
@@ -1236,7 +1236,7 @@ void buf_SetDirty(cm_buf_t *bp)
  */
 long buf_CleanAndReset(void)
 {
-    long i;
+    afs_uint32 i;
     cm_buf_t *bp;
     cm_req_t req;
 
@@ -1608,7 +1608,7 @@ int cm_DumpBufHashTable(FILE *outputFile, char *cookie, int lock)
     int zilch;
     cm_buf_t *bp;
     char output[1024];
-    int i;
+    afs_uint32 i;
   
     if (cm_data.buf_hashTablepp == NULL)
         return -1;
@@ -1626,9 +1626,12 @@ int cm_DumpBufHashTable(FILE *outputFile, char *cookie, int lock)
         {
            StringCbPrintfA(output, sizeof(output), 
                            "%s bp=0x%08X, hash=%d, fid (cell=%d, volume=%d, "
-                           "vnode=%d, unique=%d), size=%d flags=0x%x, refCount=%d\r\n", 
+                           "vnode=%d, unique=%d), offset=%x:%08x, dv=%d, "
+                           "flags=0x%x, cmFlags=0x%x, refCount=%d\r\n",
                             cookie, (void *)bp, i, bp->fid.cell, bp->fid.volume, 
-                            bp->fid.vnode, bp->fid.unique, bp->size, bp->flags, bp->refCount);
+                            bp->fid.vnode, bp->fid.unique, bp->offset.HighPart, 
+                            bp->offset.LowPart, bp->dataVersion, bp->flags, 
+                            bp->cmFlags, bp->refCount);
            WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL);
         }
     }
@@ -1641,9 +1644,12 @@ int cm_DumpBufHashTable(FILE *outputFile, char *cookie, int lock)
     for(bp = cm_data.buf_freeListEndp; bp; bp=(cm_buf_t *) osi_QPrev(&bp->q)) {
        StringCbPrintfA(output, sizeof(output), 
                         "%s bp=0x%08X, fid (cell=%d, volume=%d, "
-                        "vnode=%d, unique=%d), size=%d flags=0x%x, refCount=%d\r\n", 
+                        "vnode=%d, unique=%d), offset=%x:%08x, dv=%d, "
+                        "flags=0x%x, cmFlags=0x%x, refCount=%d\r\n",
                         cookie, (void *)bp, bp->fid.cell, bp->fid.volume, 
-                        bp->fid.vnode, bp->fid.unique, bp->size, bp->flags, bp->refCount);
+                        bp->fid.vnode, bp->fid.unique, bp->offset.HighPart, 
+                        bp->offset.LowPart, bp->dataVersion, bp->flags, 
+                        bp->cmFlags, bp->refCount);
        WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL);
     }
     StringCbPrintfA(output, sizeof(output), "%s - Done dumping buf_FreeListEndp.\r\n", cookie);
@@ -1654,9 +1660,12 @@ int cm_DumpBufHashTable(FILE *outputFile, char *cookie, int lock)
     for(bp = cm_data.buf_dirtyListEndp; bp; bp=(cm_buf_t *) osi_QPrev(&bp->q)) {
        StringCbPrintfA(output, sizeof(output), 
                         "%s bp=0x%08X, fid (cell=%d, volume=%d, "
-                        "vnode=%d, unique=%d), size=%d flags=0x%x, refCount=%d\r\n", 
+                        "vnode=%d, unique=%d), offset=%x:%08x, dv=%d, "
+                        "flags=0x%x, cmFlags=0x%x, refCount=%d\r\n",
                         cookie, (void *)bp, bp->fid.cell, bp->fid.volume, 
-                        bp->fid.vnode, bp->fid.unique, bp->size, bp->flags, bp->refCount);
+                        bp->fid.vnode, bp->fid.unique, bp->offset.HighPart, 
+                        bp->offset.LowPart, bp->dataVersion, bp->flags, 
+                        bp->cmFlags, bp->refCount);
        WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL);
     }
     StringCbPrintfA(output, sizeof(output), "%s - Done dumping buf_dirtyListEndp.\r\n", cookie);
index 5ae0065d9e5c58d0dcd9d7a3ef41b806d6dcf243..a122da9d3e868e8a761ef08e8f1d6334b5790c13 100644 (file)
@@ -47,11 +47,6 @@ extern int buf_cacheType;
 /* backup over pointer to the buffer */
 #define BUF_OVERTOBUF(op) ((cm_buf_t *)(((char *)op) - ((long)(&((cm_buf_t *)0)->over))))
 
-#ifdef notdef
-/* pretend we have logs, too */
-typedef char cm_log_t;
-#endif
-
 #define CM_BUF_MAGIC    ('B' | 'U' <<8 | 'F'<<16 | 'F'<<24)
 
 /* represents a single buffer */
@@ -75,10 +70,6 @@ typedef struct cm_buf {
     unsigned long refCount;    /* reference count (buf_globalLock) */
     long idCounter;            /* counter for softrefs; bumped at each recycle */
     long dirtyCounter;         /* bumped at each dirty->clean transition */
-#ifdef notdef
-    cm_log_t *logp;            /* log for this buffer, if any */
-    osi_hyper_t lsn;           /* lsn to force to (last LSN changing this buffer) */
-#endif /* notdef */
     osi_hyper_t offset;                /* offset */
     cm_fid_t fid;              /* file ID */
 #ifdef DEBUG
@@ -86,7 +77,6 @@ typedef struct cm_buf {
                                 /* the fid at the time of fid assignment. */
 #endif
     long flags;                        /* flags we're using */
-    long size;                 /* size in bytes of this buffer */
     char *datap;               /* data in this buffer */
     unsigned long error;       /* last error code, if CM_BUF_ERROR is set */
     cm_user_t *userp;          /* user who wrote to the buffer last */
@@ -159,10 +149,6 @@ extern cm_buf_t *buf_FindLocked(struct cm_scache *, osi_hyper_t *);
 
 extern cm_buf_t *buf_Find(struct cm_scache *, osi_hyper_t *);
 
-#ifndef DJGPP
-extern HANDLE buf_GetFileHandle(long);
-#endif /* !DJGPP */
-
 extern long buf_GetNewLocked(struct cm_scache *, osi_hyper_t *, cm_buf_t **);
 
 extern long buf_Get(struct cm_scache *, osi_hyper_t *, cm_buf_t **);
index 2433216131e1421c0faaf2f36f674df950016bac..606901ddabfe0d0541a08d8c44634db6dcf21411 100644 (file)
@@ -87,10 +87,10 @@ ComputeSizeOfDataBuffers(afs_uint64 cacheBlocks, DWORD blockSize)
 }
 
 afs_uint64 
-ComputeSizeOfDataHT(void)
+ComputeSizeOfDataHT(afs_uint64 cacheBlocks)
 {
     afs_uint64 size;
-    size = osi_PrimeLessThan(CM_BUF_HASHSIZE) * sizeof(cm_buf_t *);
+    size = osi_PrimeLessThan((afs_uint32)(cacheBlocks/7 + 1)) * sizeof(cm_buf_t *);
     return size;
 }
 
@@ -115,7 +115,7 @@ ComputeSizeOfMappingFile(DWORD stats, DWORD maxVols, DWORD maxCells, DWORD chunk
                +  ComputeSizeOfSCacheHT(stats)
                +  ComputeSizeOfDNLCache()
                +  ComputeSizeOfDataBuffers(cacheBlocks, blockSize) 
-               +  2 * ComputeSizeOfDataHT() 
+               +  2 * ComputeSizeOfDataHT(cacheBlocks
                +  ComputeSizeOfDataHeaders(cacheBlocks);
     return size;    
 }
@@ -837,7 +837,7 @@ cm_InitMappedMemory(DWORD virtualCache, char * cachePath, DWORD stats, DWORD chu
         cm_data.buf_nbuffers = cacheBlocks;
         cm_data.buf_nOrigBuffers = 0;
         cm_data.buf_blockSize = CM_BUF_BLOCKSIZE;
-        cm_data.buf_hashSize = CM_BUF_HASHSIZE;
+        cm_data.buf_hashSize = osi_PrimeLessThan((afs_uint32)(cacheBlocks/7 + 1));
 
         cm_data.mountRootGen = time(NULL);
 
@@ -855,9 +855,9 @@ cm_InitMappedMemory(DWORD virtualCache, char * cachePath, DWORD stats, DWORD chu
         cm_data.dnlcBaseAddress = (cm_nc_t *) baseAddress;
         baseAddress += ComputeSizeOfDNLCache();
         cm_data.buf_hashTablepp = (cm_buf_t **) baseAddress;
-        baseAddress += ComputeSizeOfDataHT();
+        baseAddress += ComputeSizeOfDataHT(cacheBlocks);
         cm_data.buf_fileHashTablepp = (cm_buf_t **) baseAddress;
-        baseAddress += ComputeSizeOfDataHT();
+        baseAddress += ComputeSizeOfDataHT(cacheBlocks);
         cm_data.bufHeaderBaseAddress = (cm_buf_t *) baseAddress;
         baseAddress += ComputeSizeOfDataHeaders(cacheBlocks);
         cm_data.bufDataBaseAddress = (char *) baseAddress;
index f2dd2b344bc7c42f457c406bc6d1ab668910cabc..d5442fc08d9311a7d43aa66a139123ffc076b5ab 100644 (file)
@@ -95,7 +95,7 @@ afs_uint64 ComputeSizeOfSCache(DWORD stats);
 afs_uint64 ComputeSizeOfSCacheHT(DWORD stats);
 afs_uint64 ComputeSizeOfDNLCache(void);
 afs_uint64 ComputeSizeOfDataBuffers(afs_uint64 cacheBlocks, DWORD blockSize);
-afs_uint64 ComputeSizeOfDataHT(void);
+afs_uint64 ComputeSizeOfDataHT(afs_uint64 cacheBlocks);
 afs_uint64 ComputeSizeOfDataHeaders(afs_uint64 cacheBlocks);
 afs_uint64 ComputeSizeOfMappingFile(DWORD stats, DWORD maxVols, DWORD maxCells, DWORD chunkSize, afs_uint64 cacheBlocks, DWORD blockSize);
 PSECURITY_ATTRIBUTES CreateCacheFileSA();