UBIFS: document dark_wm and dead_wm better
Just add more commentaries. Also some commentary fixes for lprops flags. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
This commit is contained in:
Родитель
a50412e3f8
Коммит
7078202e55
|
@ -31,6 +31,26 @@
|
||||||
* to be reused. Garbage collection will cause the number of dirty index nodes
|
* to be reused. Garbage collection will cause the number of dirty index nodes
|
||||||
* to grow, however sufficient space is reserved for the index to ensure the
|
* to grow, however sufficient space is reserved for the index to ensure the
|
||||||
* commit will never run out of space.
|
* commit will never run out of space.
|
||||||
|
*
|
||||||
|
* Notes about dead watermark. At current UBIFS implementation we assume that
|
||||||
|
* LEBs which have less than @c->dead_wm bytes of free + dirty space are full
|
||||||
|
* and not worth garbage-collecting. The dead watermark is one min. I/O unit
|
||||||
|
* size, or min. UBIFS node size, depending on what is greater. Indeed, UBIFS
|
||||||
|
* Garbage Collector has to synchronize the GC head's write buffer before
|
||||||
|
* returning, so this is about wasting one min. I/O unit. However, UBIFS GC can
|
||||||
|
* actually reclaim even very small pieces of dirty space by garbage collecting
|
||||||
|
* enough dirty LEBs, but we do not bother doing this at this implementation.
|
||||||
|
*
|
||||||
|
* Notes about dark watermark. The results of GC work depends on how big are
|
||||||
|
* the UBIFS nodes GC deals with. Large nodes make GC waste more space. Indeed,
|
||||||
|
* if GC move data from LEB A to LEB B and nodes in LEB A are large, GC would
|
||||||
|
* have to waste large pieces of free space at the end of LEB B, because nodes
|
||||||
|
* from LEB A would not fit. And the worst situation is when all nodes are of
|
||||||
|
* maximum size. So dark watermark is the amount of free + dirty space in LEB
|
||||||
|
* which are guaranteed to be reclaimable. If LEB has less space, the GC migh
|
||||||
|
* be unable to reclaim it. So, LEBs with free + dirty greater than dark
|
||||||
|
* watermark are "good" LEBs from GC's point of few. The other LEBs are not so
|
||||||
|
* good, and GC takes extra care when moving them.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/pagemap.h>
|
#include <linux/pagemap.h>
|
||||||
|
|
|
@ -573,15 +573,8 @@ static int init_constants_early(struct ubifs_info *c)
|
||||||
c->ranges[UBIFS_IDX_NODE].max_len = INT_MAX;
|
c->ranges[UBIFS_IDX_NODE].max_len = INT_MAX;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize dead and dark LEB space watermarks.
|
* Initialize dead and dark LEB space watermarks. See gc.c for comments
|
||||||
*
|
* about these values.
|
||||||
* Dead space is the space which cannot be used. Its watermark is
|
|
||||||
* equivalent to min. I/O unit or minimum node size if it is greater
|
|
||||||
* then min. I/O unit.
|
|
||||||
*
|
|
||||||
* Dark space is the space which might be used, or might not, depending
|
|
||||||
* on which node should be written to the LEB. Its watermark is
|
|
||||||
* equivalent to maximum UBIFS node size.
|
|
||||||
*/
|
*/
|
||||||
c->dead_wm = ALIGN(MIN_WRITE_SZ, c->min_io_size);
|
c->dead_wm = ALIGN(MIN_WRITE_SZ, c->min_io_size);
|
||||||
c->dark_wm = ALIGN(UBIFS_MAX_NODE_SZ, c->min_io_size);
|
c->dark_wm = ALIGN(UBIFS_MAX_NODE_SZ, c->min_io_size);
|
||||||
|
|
|
@ -426,9 +426,9 @@ struct ubifs_unclean_leb {
|
||||||
* LEB properties flags.
|
* LEB properties flags.
|
||||||
*
|
*
|
||||||
* LPROPS_UNCAT: not categorized
|
* LPROPS_UNCAT: not categorized
|
||||||
* LPROPS_DIRTY: dirty > 0, not index
|
* LPROPS_DIRTY: dirty > free, dirty >= @c->dead_wm, not index
|
||||||
* LPROPS_DIRTY_IDX: dirty + free > @c->min_idx_node_sze and index
|
* LPROPS_DIRTY_IDX: dirty + free > @c->min_idx_node_sze and index
|
||||||
* LPROPS_FREE: free > 0, not empty, not index
|
* LPROPS_FREE: free > 0, dirty < @c->dead_wm, not empty, not index
|
||||||
* LPROPS_HEAP_CNT: number of heaps used for storing categorized LEBs
|
* LPROPS_HEAP_CNT: number of heaps used for storing categorized LEBs
|
||||||
* LPROPS_EMPTY: LEB is empty, not taken
|
* LPROPS_EMPTY: LEB is empty, not taken
|
||||||
* LPROPS_FREEABLE: free + dirty == leb_size, not index, not taken
|
* LPROPS_FREEABLE: free + dirty == leb_size, not index, not taken
|
||||||
|
|
Загрузка…
Ссылка в новой задаче