]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE14-large-cache-fix-20050815
authorChas Williams <chas@cmf.nrl.navy.mil>
Thu, 13 Oct 2005 19:42:27 +0000 (19:42 +0000)
committerDerrick Brashear <shadow@dementia.org>
Thu, 13 Oct 2005 19:42:27 +0000 (19:42 +0000)
roll up change for 1.4.1

(cherry picked from commit bbe78805681ec8303ab198288693586e8bfdb7f3)

src/afs/SOLARIS/osi_vnodeops.c
src/afs/VNOPS/afs_vnop_write.c
src/afs/afs.h
src/afs/afs_dcache.c
src/afsd/afsd.c

index dcbc4c0a53535c619365c047e962f9b64a4faf34..bb70b64fdc6143f4fbebeb96b280313a6acbae62 100644 (file)
@@ -770,9 +770,9 @@ afs_nfsrdwr(avc, auio, arw, ioflag, acred)
      */
     afs_MaybeWakeupTruncateDaemon();
     while ((arw == UIO_WRITE)
-          && (afs_blocksUsed > (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100)) {
+          && (afs_blocksUsed > PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks))) {
        if (afs_blocksUsed - afs_blocksDiscarded >
-           (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100) {
+           PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
            afs_WaitForCacheDrain = 1;
            afs_osi_Sleep(&afs_WaitForCacheDrain);
        }
index d9ae58a7c07bbc2c3a9c7251a4c28b97710fa724..ffcec3389a0b34090895eb2d2321b900f9b34fdc 100644 (file)
@@ -206,7 +206,7 @@ afs_MemWrite(register struct vcache *avc, struct uio *auio, int aio,
            if (tdc)
                ObtainWriteLock(&tdc->lock, 653);
        } else if (afs_blocksUsed >
-                  (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100) {
+                  PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
            tdc = afs_FindDCache(avc, filePos);
            if (tdc) {
                ObtainWriteLock(&tdc->lock, 654);
@@ -220,10 +220,10 @@ afs_MemWrite(register struct vcache *avc, struct uio *auio, int aio,
            if (!tdc) {
                afs_MaybeWakeupTruncateDaemon();
                while (afs_blocksUsed >
-                      (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100) {
+                      PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
                    ReleaseWriteLock(&avc->lock);
                    if (afs_blocksUsed - afs_blocksDiscarded >
-                       (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100) {
+                       PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
                        afs_WaitForCacheDrain = 1;
                        afs_osi_Sleep(&afs_WaitForCacheDrain);
                    }
@@ -468,7 +468,7 @@ afs_UFSWrite(register struct vcache *avc, struct uio *auio, int aio,
            if (tdc)
                ObtainWriteLock(&tdc->lock, 657);
        } else if (afs_blocksUsed >
-                  (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100) {
+                  PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
            tdc = afs_FindDCache(avc, filePos);
            if (tdc) {
                ObtainWriteLock(&tdc->lock, 658);
@@ -482,10 +482,10 @@ afs_UFSWrite(register struct vcache *avc, struct uio *auio, int aio,
            if (!tdc) {
                afs_MaybeWakeupTruncateDaemon();
                while (afs_blocksUsed >
-                      (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100) {
+                      PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
                    ReleaseWriteLock(&avc->lock);
                    if (afs_blocksUsed - afs_blocksDiscarded >
-                       (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100) {
+                       PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
                        afs_WaitForCacheDrain = 1;
                        afs_osi_Sleep(&afs_WaitForCacheDrain);
                    }
index 04d8287c7118f3cab267161fb8e54037b129bb75..f994e78f9a3d285d23d5fc382c163247c84713d2 100644 (file)
@@ -1134,11 +1134,15 @@ extern struct brequest afs_brs[NBRS];   /* request structures */
 #define CM_CACHESIZEDRAINEDPCT 95      /* wakeup processes when down to here. */
 #define CM_WAITFORDRAINPCT     98      /* sleep if cache is this full. */
 
+/* when afs_cacheBlocks is large, settle for slightly decreased precision */
+#define PERCENT(p, v) \
+    ((afs_cacheBlocks & 0xffe00000) ? ((v) / 100 * (p)) : ((p) * (v) / 100))
+
 #define afs_CacheIsTooFull() \
     (afs_blocksUsed - afs_blocksDiscarded > \
-       (CM_DCACHECOUNTFREEPCT*afs_cacheBlocks)/100 || \
+       PERCENT(CM_DCACHECOUNTFREEPCT, afs_cacheBlocks) || \
      afs_freeDCCount - afs_discardDCCount < \
-       ((100-CM_DCACHECOUNTFREEPCT)*afs_cacheFiles)/100)
+       PERCENT(100 - CM_DCACHECOUNTFREEPCT, afs_cacheFiles))
 
 /* Handy max length of a numeric string. */
 #define        CVBS    12              /* max afs_int32 is 2^32 ~ 4*10^9, +1 for NULL, +luck */
index ab95f04d45c42f044543f218d2d0f79b9f720801..67770fb55385243c1877c7f4be19af7bf2fda0f6 100644 (file)
@@ -223,16 +223,14 @@ afs_CacheTruncateDaemon(void)
     u_int counter;
     u_int cb_lowat;
     u_int dc_hiwat =
-       (100 - CM_DCACHECOUNTFREEPCT +
-        CM_DCACHEEXTRAPCT) * afs_cacheFiles / 100;
+       PERCENT((100 - CM_DCACHECOUNTFREEPCT + CM_DCACHEEXTRAPCT), afs_cacheFiles);
     afs_min_cache =
        (((10 * AFS_CHUNKSIZE(0)) + afs_fsfragsize) & ~afs_fsfragsize) >> 10;
 
     osi_GetuTime(&CTD_stats.CTD_afterSleep);
     afs_TruncateDaemonRunning = 1;
     while (1) {
-       cb_lowat = ((CM_DCACHESPACEFREEPCT - CM_DCACHEEXTRAPCT)
-                   * afs_cacheBlocks) / 100;
+       cb_lowat = PERCENT((CM_DCACHESPACEFREEPCT - CM_DCACHEEXTRAPCT), afs_cacheBlocks);
        MObtainWriteLock(&afs_xdcache, 266);
        if (afs_CacheTooFull) {
            int space_needed, slots_needed;
@@ -777,7 +775,7 @@ afs_FlushDCache(register struct dcache *adc)
 
     if (afs_WaitForCacheDrain) {
        if (afs_blocksUsed <=
-           (CM_CACHESIZEDRAINEDPCT * afs_cacheBlocks) / 100) {
+           PERCENT(CM_CACHESIZEDRAINEDPCT, afs_cacheBlocks)) {
            afs_WaitForCacheDrain = 0;
            afs_osi_Wakeup(&afs_WaitForCacheDrain);
        }
@@ -810,7 +808,7 @@ afs_FreeDCache(register struct dcache *adc)
 
     if (afs_WaitForCacheDrain) {
        if ((afs_blocksUsed - afs_blocksDiscarded) <=
-           (CM_CACHESIZEDRAINEDPCT * afs_cacheBlocks) / 100) {
+           PERCENT(CM_CACHESIZEDRAINEDPCT, afs_cacheBlocks)) {
            afs_WaitForCacheDrain = 0;
            afs_osi_Wakeup(&afs_WaitForCacheDrain);
        }
@@ -860,7 +858,7 @@ afs_DiscardDCache(register struct dcache *adc)
 
     if (afs_WaitForCacheDrain) {
        if ((afs_blocksUsed - afs_blocksDiscarded) <=
-           (CM_CACHESIZEDRAINEDPCT * afs_cacheBlocks) / 100) {
+           PERCENT(CM_CACHESIZEDRAINEDPCT, afs_cacheBlocks)) {
            afs_WaitForCacheDrain = 0;
            afs_osi_Wakeup(&afs_WaitForCacheDrain);
        }
@@ -943,7 +941,7 @@ afs_MaybeFreeDiscardedDCache(void)
 
     while (afs_blocksDiscarded
           && (afs_blocksUsed >
-              (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100)) {
+              PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks))) {
        afs_FreeDiscardedDCache();
     }
     return 0;
@@ -1967,7 +1965,7 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
        /* Sleep here when cache needs to be drained. */
        if (setLocks && !slowPass
            && (afs_blocksUsed >
-               (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100)) {
+               PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks))) {
            /* Make sure truncate daemon is running */
            afs_MaybeWakeupTruncateDaemon();
            ObtainWriteLock(&tdc->tlock, 614);
@@ -1976,7 +1974,7 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
            ReleaseWriteLock(&tdc->lock);
            ReleaseReadLock(&avc->lock);
            while ((afs_blocksUsed - afs_blocksDiscarded) >
-                  (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100) {
+                  PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
                afs_WaitForCacheDrain = 1;
                afs_osi_Sleep(&afs_WaitForCacheDrain);
            }
index aa17d84775ae84a106b815872299540cedee32db..35b546975ad8ec734e6fb10060ca0bfb941fd0e9 100644 (file)
@@ -461,7 +461,7 @@ int PartSizeOverflow(char *path, int cs)
        totalblks /= (1024 / bsize);
     }
 
-    mint = totalblks - ((totalblks * 5) / 100);
+    mint = totalblks / 100 * 95;
     if (cs > mint) {
        printf
            ("Cache size (%d) must be less than 95%% of partition size (which is %d). Lower cache size\n",