windows-buf-mx-20080301

LICENSE MIT

further reductions in buffer mutex acquisition churn
This commit is contained in:
Jeffrey Altman 2008-03-01 16:28:53 +00:00
parent 3b5a1acef0
commit fb3f10f329
2 changed files with 10 additions and 10 deletions

View File

@ -1165,15 +1165,17 @@ long buf_CleanAsync(cm_buf_t *bp, cm_req_t *reqp)
} }
/* wait for a buffer's cleaning to finish */ /* 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"); 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) { if (bp->flags & CM_BUF_WRITING) {
buf_WaitIO(scp, bp); 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, /* 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; req.flags |= CM_REQ_NORETRY;
buf_CleanAsync(bp, &req); buf_CleanAsync(bp, &req);
buf_CleanWait(NULL, bp); buf_CleanWait(NULL, bp, FALSE);
/* relock and release buffer */ /* relock and release buffer */
lock_ObtainRead(&buf_globalLock); 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) { for (; bp; bp = nbp) {
/* clean buffer synchronously */ /* clean buffer synchronously */
if (cm_FidCmp(&bp->fid, &scp->fid) == 0) { if (cm_FidCmp(&bp->fid, &scp->fid) == 0) {
lock_ObtainMutex(&bp->mx);
if (userp) { if (userp) {
cm_HoldUser(userp); cm_HoldUser(userp);
lock_ObtainMutex(&bp->mx);
if (bp->userp) if (bp->userp)
cm_ReleaseUser(bp->userp); cm_ReleaseUser(bp->userp);
bp->userp = userp; bp->userp = userp;
lock_ReleaseMutex(&bp->mx);
} }
wasDirty = buf_CleanAsync(bp, reqp); wasDirty = buf_CleanAsyncLocked(bp, reqp);
buf_CleanWait(scp, bp); buf_CleanWait(scp, bp, TRUE);
lock_ObtainMutex(&bp->mx);
if (bp->flags & CM_BUF_ERROR) { if (bp->flags & CM_BUF_ERROR) {
code = bp->error; code = bp->error;
if (code == 0) if (code == 0)

View 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 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); extern void buf_SetDirty(cm_buf_t *, afs_uint32 offset, afs_uint32 length);