mirror of
https://git.openafs.org/openafs.git
synced 2025-01-31 21:47:45 +00:00
windows-buf-mx-20080301
LICENSE MIT further reductions in buffer mutex acquisition churn
This commit is contained in:
parent
3b5a1acef0
commit
fb3f10f329
@ -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)
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user