Hi Russ,
In case you decide to hold off uploading 1.4.1rc10 (I know I'd prefer to
wait for 1.4.1), here's the percent patch broken out from upstream's
1.4.1-rc1 patch.
diff -urN openafs-1.4.0/src/afs/afs_dcache.c openafs-1.4.1-rc1/src/afs/afs_dcache.c
--- openafs-1.4.0/src/afs/afs_dcache.c 2005-08-04 16:45:14.000000000 -0400
+++ openafs-1.4.1-rc1/src/afs/afs_dcache.c 2005-10-13 14:42:27.000000000 -0400
@@ -223,16 +223,14 @@
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 @@
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 @@
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 @@
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 @@
while (afs_blocksDiscarded
&& (afs_blocksUsed >
- (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100)) {
+ PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks))) {
afs_FreeDiscardedDCache();
}
return 0;
@@ -1967,7 +1965,7 @@
/* 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 @@
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);
}
diff -urN openafs-1.4.0/src/afs/afs.h openafs-1.4.1-rc1/src/afs/afs.h
--- openafs-1.4.0/src/afs/afs.h 2005-07-11 15:29:55.000000000 -0400
+++ openafs-1.4.1-rc1/src/afs/afs.h 2005-10-13 14:23:36.000000000 -0400
@@ -1112,11 +1112,15 @@
#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 */
diff -urN openafs-1.4.0/src/afs/SOLARIS/osi_vnodeops.c openafs-1.4.1-rc1/src/afs/SOLARIS/osi_vnodeops.c
--- openafs-1.4.0/src/afs/SOLARIS/osi_vnodeops.c 2005-10-12 02:06:47.000000000 -0400
+++ openafs-1.4.1-rc1/src/afs/SOLARIS/osi_vnodeops.c 2005-10-13 14:23:41.000000000 -0400
@@ -762,9 +762,9 @@
*/
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);
}
diff -urN openafs-1.4.0/src/afs/VNOPS/afs_vnop_write.c openafs-1.4.1-rc1/src/afs/VNOPS/afs_vnop_write.c
--- openafs-1.4.0/src/afs/VNOPS/afs_vnop_write.c 2005-10-02 22:55:33.000000000 -0400
+++ openafs-1.4.1-rc1/src/afs/VNOPS/afs_vnop_write.c 2005-10-13 14:23:42.000000000 -0400
@@ -198,7 +198,7 @@
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);
@@ -212,10 +212,10 @@
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);
}
@@ -442,7 +442,7 @@
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);
@@ -456,10 +456,10 @@
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);
}