]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
DEVEL15-windows-buf-mx-20080301
authorJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 1 Mar 2008 16:30:02 +0000 (16:30 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 1 Mar 2008 16:30:02 +0000 (16:30 +0000)
LICENSE MIT

further reductions in buffer mutex acquisition churn

(cherry picked from commit fb3f10f3297c08807c0a3f0b345d88cd19742726)

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

index 8aaf6036e3ad659347acb9696c576a8e2ad9c006..e0928feec3d287ccecbd2a8b9747259d5176b8db 100644 (file)
@@ -1215,15 +1215,17 @@ long buf_CleanAsync(cm_buf_t *bp, cm_req_t *reqp)
 }       
 
 /* wait for a buffer's cleaning to finish */
-void buf_CleanWait(cm_scache_t * scp, cm_buf_t *bp)
+void buf_CleanWait(cm_scache_t * scp, cm_buf_t *bp, afs_uint32 locked)
 {
     osi_assertx(bp->magic == CM_BUF_MAGIC, "invalid cm_buf_t magic");
 
-    lock_ObtainMutex(&bp->mx);
+    if (!locked)
+        lock_ObtainMutex(&bp->mx);
     if (bp->flags & CM_BUF_WRITING) {
         buf_WaitIO(scp, bp);
     }
-    lock_ReleaseMutex(&bp->mx);
+    if (!locked)
+        lock_ReleaseMutex(&bp->mx);
 }       
 
 /* set the dirty flag on a buffer, and set associated write-ahead log,
@@ -1329,7 +1331,7 @@ long buf_CleanAndReset(void)
                req.flags |= CM_REQ_NORETRY;
 
                buf_CleanAsync(bp, &req);
-               buf_CleanWait(NULL, bp);
+               buf_CleanWait(NULL, bp, FALSE);
 
                 /* relock and release buffer */
                 lock_ObtainRead(&buf_globalLock);
@@ -1652,17 +1654,15 @@ long buf_CleanVnode(struct cm_scache *scp, cm_user_t *userp, cm_req_t *reqp)
     for (; bp; bp = nbp) {
         /* clean buffer synchronously */
         if (cm_FidCmp(&bp->fid, &scp->fid) == 0) {
+            lock_ObtainMutex(&bp->mx);
             if (userp) {
                 cm_HoldUser(userp);
-                lock_ObtainMutex(&bp->mx);
                 if (bp->userp) 
                     cm_ReleaseUser(bp->userp);
                 bp->userp = userp;
-                lock_ReleaseMutex(&bp->mx);
             }   
-            wasDirty = buf_CleanAsync(bp, reqp);
-           buf_CleanWait(scp, bp);
-            lock_ObtainMutex(&bp->mx);
+            wasDirty = buf_CleanAsyncLocked(bp, reqp);
+           buf_CleanWait(scp, bp, TRUE);
             if (bp->flags & CM_BUF_ERROR) {
                code = bp->error;
                 if (code == 0) 
index 572a8f4b6e61c91b4f024b5947928f88b793baa2..766b61b7e897942e3b5e431e300ae510cf811a2a 100644 (file)
@@ -161,7 +161,7 @@ extern long buf_CleanAsyncLocked(cm_buf_t *, cm_req_t *);
 
 extern long buf_CleanAsync(cm_buf_t *, cm_req_t *);
 
-extern void buf_CleanWait(cm_scache_t *, cm_buf_t *);
+extern void buf_CleanWait(cm_scache_t *, cm_buf_t *, afs_uint32 locked);
 
 extern void buf_SetDirty(cm_buf_t *, afs_uint32 offset, afs_uint32 length);