From: Jeffrey Altman Date: Fri, 26 May 2006 07:38:05 +0000 (+0000) Subject: STABLE14-windows-dynamic-thread-priority-20060525 X-Git-Tag: openafs-stable-1_4_1c~11 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=f41589fef632b14d758d0bc0fa9cda2a48c722ba;p=packages%2Fo%2Fopenafs.git STABLE14-windows-dynamic-thread-priority-20060525 Dynamically adjust the priority of server threads based upon the age of the cifs request that is being processed. Bump the priority one level for each 15 seconds of age. (cherry picked from commit 7ca1a339cb488fd97015e959e2a17e91e9b56409) --- diff --git a/src/WINNT/afsd/cm_buf.c b/src/WINNT/afsd/cm_buf.c index 7ed08c0bf..42f16d9bd 100644 --- a/src/WINNT/afsd/cm_buf.c +++ b/src/WINNT/afsd/cm_buf.c @@ -462,6 +462,9 @@ void buf_WaitIO(cm_scache_t * scp, cm_buf_t *bp) bp->waitCount = bp->waitRequests = 1; } osi_SleepM((long) bp, &bp->mx); + + smb_UpdateServerPriority(); + lock_ObtainMutex(&bp->mx); osi_Log1(afsd_logp, "buf_WaitIO conflict wait done for 0x%x", bp); bp->waitCount--; diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 87488a5c8..71d94bb5c 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -917,6 +917,9 @@ long cm_SyncOp(cm_scache_t *scp, cm_buf_t *bufp, cm_user_t *up, cm_req_t *reqp, if (bufLocked) lock_ReleaseMutex(&bufp->mx); osi_SleepM((long) &scp->flags, &scp->mx); + + smb_UpdateServerPriority(); + if (bufLocked) lock_ObtainMutex(&bufp->mx); lock_ObtainMutex(&scp->mx); diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index c59fca464..6283e3af8 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -170,6 +170,8 @@ smb_username_t *usernamesp = NULL; smb_waitingLockRequest_t *smb_allWaitingLocks; +DWORD smb_TlsRequestSlot = -1; + /* forward decl */ void smb_DispatchPacket(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp, NCB *ncbp, raw_write_cont_t *rwcp); @@ -204,6 +206,39 @@ int smb_ServerLanManagerLength = sizeof(smb_ServerLanManager); /* Faux server GUID. This is never checked. */ GUID smb_ServerGUID = { 0x40015cb8, 0x058a, 0x44fc, { 0xae, 0x7e, 0xbb, 0x29, 0x52, 0xee, 0x7e, 0xff }}; +void smb_ResetServerPriority() +{ + void * p = TlsGetValue(smb_TlsRequestSlot); + if (p) { + free(p); + TlsSetValue(smb_TlsRequestSlot, NULL); + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); + } +} + +void smb_SetRequestStartTime() +{ + time_t * tp = malloc(sizeof(time_t)); + if (tp) { + *tp = osi_Time(); + + if (!TlsSetValue(smb_TlsRequestSlot, tp)) + free(tp); + } +} + +void smb_UpdateServerPriority() +{ + time_t *tp = TlsGetValue(smb_TlsRequestSlot); + + if (tp) { + time_t now = osi_Time(); + + /* Give one priority boost for each 15 seconds */ + SetThreadPriority(GetCurrentThread(), (now - *tp) / 15); + } +} + char * myCrt_Dispatch(int i) { switch (i) @@ -7575,6 +7610,9 @@ void smb_Server(VOID *parmp) smb_ReleaseVC(vcp); vcp = NULL; } + + smb_ResetServerPriority(); + code = thrd_WaitForMultipleObjects_Event(numNCBs, NCBreturns[myIdx], FALSE, INFINITE); @@ -7907,6 +7945,8 @@ void smb_Server(VOID *parmp) continue; } + smb_SetRequestStartTime(); + vcp->errorCount = 0; bufp = (struct smb_packet *) ncbp->ncb_buffer; #ifdef DJGPP @@ -8538,6 +8578,8 @@ void smb_Init(osi_log_t *logp, char *snamep, int useV3, int LANadapt, EVENT_HANDLE retHandle; char eventName[MAX_PATH]; + smb_TlsRequestSlot = TlsAlloc(); + #ifndef DJGPP smb_MBfunc = aMBfunc; #endif /* DJGPP */ @@ -9061,6 +9103,8 @@ void smb_Shutdown(void) } } lock_ReleaseWrite(&smb_rctLock); + + TlsFree(smb_TlsRequestSlot); } /* Get the UNC \\\ prefix. */ diff --git a/src/WINNT/afsd/smb.h b/src/WINNT/afsd/smb.h index 840ff92cd..b2b52f33b 100644 --- a/src/WINNT/afsd/smb.h +++ b/src/WINNT/afsd/smb.h @@ -696,6 +696,10 @@ extern char *smb_GetSharename(void); extern DWORD smb_ServerExceptionFilter(void); +extern void smb_UpdateServerPriority(void); +extern void smb_SetRequestStartTime(void); +extern void smb_ResetServerPriority(void); + /* include other include files */ #include "smb3.h" #include "smb_ioctl.h"