projects
/
yaffs2.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
3797c6e
)
gc part of the block at a time to reduce latency
author
charles
<charles>
Thu, 27 Nov 2008 02:46:45 +0000
(
02:46
+0000)
committer
charles
<charles>
Thu, 27 Nov 2008 02:46:45 +0000
(
02:46
+0000)
yaffs_guts.c
patch
|
blob
|
history
yaffs_guts.h
patch
|
blob
|
history
diff --git
a/yaffs_guts.c
b/yaffs_guts.c
index 5c1cfdc6cf240c99c59092c3698faa42bd38245a..34e94a0a93942b2b931026beef9fa8e31624bc53 100644
(file)
--- a/
yaffs_guts.c
+++ b/
yaffs_guts.c
@@
-12,7
+12,7
@@
*/
const char *yaffs_guts_c_version =
*/
const char *yaffs_guts_c_version =
- "$Id: yaffs_guts.c,v 1.6
6 2008-11-26 20:46:47
charles Exp $";
+ "$Id: yaffs_guts.c,v 1.6
7 2008-11-27 02:46:45
charles Exp $";
#include "yportenv.h"
#include "yportenv.h"
@@
-2993,17
+2993,17
@@
static int yaffs_GetErasedChunks(yaffs_Device * dev)
}
}
-static int yaffs_GarbageCollectBlock(yaffs_Device * dev, int block)
+static int yaffs_GarbageCollectBlock(yaffs_Device * dev, int block
, int wholeBlock
)
{
int oldChunk;
int newChunk;
{
int oldChunk;
int newChunk;
- int chunkInBlock;
int markNAND;
int retVal = YAFFS_OK;
int cleanups = 0;
int i;
int isCheckpointBlock;
int matchingChunk;
int markNAND;
int retVal = YAFFS_OK;
int cleanups = 0;
int i;
int isCheckpointBlock;
int matchingChunk;
+ int maxCopies;
int chunksBefore = yaffs_GetErasedChunks(dev);
int chunksAfter;
int chunksBefore = yaffs_GetErasedChunks(dev);
int chunksAfter;
@@
-3019,8
+3019,11
@@
static int yaffs_GarbageCollectBlock(yaffs_Device * dev, int block)
bi->blockState = YAFFS_BLOCK_STATE_COLLECTING;
T(YAFFS_TRACE_TRACING,
bi->blockState = YAFFS_BLOCK_STATE_COLLECTING;
T(YAFFS_TRACE_TRACING,
- (TSTR("Collecting block %d, in use %d, shrink %d, " TENDSTR), block,
- bi->pagesInUse, bi->hasShrinkHeader));
+ (TSTR("Collecting block %d, in use %d, shrink %d, wholeBlock %d" TENDSTR),
+ block,
+ bi->pagesInUse,
+ bi->hasShrinkHeader,
+ wholeBlock));
/*yaffs_VerifyFreeChunks(dev); */
/*yaffs_VerifyFreeChunks(dev); */
@@
-3046,14
+3049,20
@@
static int yaffs_GarbageCollectBlock(yaffs_Device * dev, int block)
yaffs_VerifyBlock(dev,bi,block);
yaffs_VerifyBlock(dev,bi,block);
- for (chunkInBlock = 0, oldChunk = block * dev->nChunksPerBlock;
+ maxCopies = (wholeBlock) ? dev->nChunksPerBlock : 10;
+ oldChunk = block * dev->nChunksPerBlock + dev->gcChunk;
+
+ for ( /* init already done */;
retVal == YAFFS_OK &&
retVal == YAFFS_OK &&
- chunkInBlock < dev->nChunksPerBlock
- && yaffs_StillSomeChunkBits(dev, block);
- chunkInBlock++, oldChunk++) {
- if (yaffs_CheckChunkBit(dev, block, chunkInBlock)) {
+ dev->gcChunk < dev->nChunksPerBlock &&
+ (bi->blockState == YAFFS_BLOCK_STATE_COLLECTING)&&
+ maxCopies > 0;
+ dev->gcChunk++, oldChunk++) {
+ if (yaffs_CheckChunkBit(dev, block, dev->gcChunk)) {
/* This page is in use and might need to be copied off */
/* This page is in use and might need to be copied off */
+
+ maxCopies--;
markNAND = 1;
markNAND = 1;
@@
-3068,8
+3077,8
@@
static int yaffs_GarbageCollectBlock(yaffs_Device * dev, int block)
T(YAFFS_TRACE_GC_DETAIL,
(TSTR
T(YAFFS_TRACE_GC_DETAIL,
(TSTR
- ("Collecting
page
%d, %d %d %d " TENDSTR),
-
chunkInBloc
k, tags.objectId, tags.chunkId,
+ ("Collecting
chunk in block
%d, %d %d %d " TENDSTR),
+
dev->gcChun
k, tags.objectId, tags.chunkId,
tags.byteCount));
if(object && !yaffs_SkipVerification(dev)){
tags.byteCount));
if(object && !yaffs_SkipVerification(dev)){
@@
-3184,6
+3193,7
@@
static int yaffs_GarbageCollectBlock(yaffs_Device * dev, int block)
}
yaffs_ReleaseTempBuffer(dev, buffer, __LINE__);
}
yaffs_ReleaseTempBuffer(dev, buffer, __LINE__);
+
/* Do any required cleanups */
/* Do any required cleanups */
@@
-3218,6
+3228,12
@@
static int yaffs_GarbageCollectBlock(yaffs_Device * dev, int block)
TENDSTR), chunksBefore, chunksAfter));
}
TENDSTR), chunksBefore, chunksAfter));
}
+ /* If the gc completed then clear the current gcBlock so that we find another. */
+ if(bi->blockState != YAFFS_BLOCK_STATE_COLLECTING){
+ dev->gcBlock = -1;
+ dev->gcChunk = 0;
+ }
+
dev->isDoingGC = 0;
return retVal;
dev->isDoingGC = 0;
return retVal;
@@
-3265,7
+3281,12
@@
static int yaffs_CheckGarbageCollection(yaffs_Device * dev)
aggressive = 0;
}
aggressive = 0;
}
- block = yaffs_FindBlockForGarbageCollection(dev, aggressive);
+ if(dev->gcBlock <= 0){
+ dev->gcBlock = yaffs_FindBlockForGarbageCollection(dev, aggressive);
+ dev->gcChunk = 0;
+ }
+
+ block = dev->gcBlock;
if (block > 0) {
dev->garbageCollections++;
if (block > 0) {
dev->garbageCollections++;
@@
-3278,7
+3299,7
@@
static int yaffs_CheckGarbageCollection(yaffs_Device * dev)
("yaffs: GC erasedBlocks %d aggressive %d" TENDSTR),
dev->nErasedBlocks, aggressive));
("yaffs: GC erasedBlocks %d aggressive %d" TENDSTR),
dev->nErasedBlocks, aggressive));
- gcOk = yaffs_GarbageCollectBlock(dev,
block
);
+ gcOk = yaffs_GarbageCollectBlock(dev,
block,aggressive
);
}
if (dev->nErasedBlocks < (dev->nReservedBlocks) && block > 0) {
}
if (dev->nErasedBlocks < (dev->nReservedBlocks) && block > 0) {
@@
-3287,8
+3308,9
@@
static int yaffs_CheckGarbageCollection(yaffs_Device * dev)
("yaffs: GC !!!no reclaim!!! erasedBlocks %d after try %d block %d"
TENDSTR), dev->nErasedBlocks, maxTries, block));
}
("yaffs: GC !!!no reclaim!!! erasedBlocks %d after try %d block %d"
TENDSTR), dev->nErasedBlocks, maxTries, block));
}
- } while ((dev->nErasedBlocks < dev->nReservedBlocks) && (block > 0)
- && (maxTries < 2));
+ } while ((dev->nErasedBlocks < dev->nReservedBlocks) &&
+ (block > 0) &&
+ (maxTries < 2));
return aggressive ? gcOk : YAFFS_OK;
}
return aggressive ? gcOk : YAFFS_OK;
}
@@
-7221,6
+7243,8
@@
int yaffs_GutsInitialise(yaffs_Device * dev)
dev->blockOffset = 0;
dev->chunkOffset = 0;
dev->nFreeChunks = 0;
dev->blockOffset = 0;
dev->chunkOffset = 0;
dev->nFreeChunks = 0;
+
+ dev->gcBlock = -1;
if (dev->startBlock == 0) {
dev->internalStartBlock = dev->startBlock + 1;
if (dev->startBlock == 0) {
dev->internalStartBlock = dev->startBlock + 1;
diff --git
a/yaffs_guts.h
b/yaffs_guts.h
index 3c7358316aba87ffa7140402f8cbba8c4baa5848..849d9511cb9eaafcc26d035889a56bd5d539daf0 100644
(file)
--- a/
yaffs_guts.h
+++ b/
yaffs_guts.h
@@
-691,6
+691,8
@@
struct yaffs_DeviceStruct {
yaffs_TnodeList *allocatedTnodeList;
int isDoingGC;
yaffs_TnodeList *allocatedTnodeList;
int isDoingGC;
+ int gcBlock;
+ int gcChunk;
int nObjectsCreated;
yaffs_Object *freeObjects;
int nObjectsCreated;
yaffs_Object *freeObjects;