From fb3f10f3297c08807c0a3f0b345d88cd19742726 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sat, 1 Mar 2008 16:28:53 +0000 Subject: [PATCH] windows-buf-mx-20080301 LICENSE MIT further reductions in buffer mutex acquisition churn --- src/WINNT/afsd/cm_buf.c | 18 +++++++++--------- src/WINNT/afsd/cm_buf.h | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/WINNT/afsd/cm_buf.c b/src/WINNT/afsd/cm_buf.c index 1b3cc1c937..e914e5f1f6 100644 --- a/src/WINNT/afsd/cm_buf.c +++ b/src/WINNT/afsd/cm_buf.c @@ -1165,15 +1165,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, @@ -1279,7 +1281,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); @@ -1602,17 +1604,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) diff --git a/src/WINNT/afsd/cm_buf.h b/src/WINNT/afsd/cm_buf.h index 3d92b8ca81..c12a25e638 100644 --- a/src/WINNT/afsd/cm_buf.h +++ b/src/WINNT/afsd/cm_buf.h @@ -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);