|
@@ -60,15 +60,17 @@
|
|
|
* NCHUNKS_ORDER determines the internal allocation granularity, effectively
|
|
|
* adjusting internal fragmentation. It also determines the number of
|
|
|
* freelists maintained in each pool. NCHUNKS_ORDER of 6 means that the
|
|
|
- * allocation granularity will be in chunks of size PAGE_SIZE/64, and there
|
|
|
- * will be 64 freelists per pool.
|
|
|
+ * allocation granularity will be in chunks of size PAGE_SIZE/64. As one chunk
|
|
|
+ * in allocated page is occupied by zbud header, NCHUNKS will be calculated to
|
|
|
+ * 63 which shows the max number of free chunks in zbud page, also there will be
|
|
|
+ * 63 freelists per pool.
|
|
|
*/
|
|
|
#define NCHUNKS_ORDER 6
|
|
|
|
|
|
#define CHUNK_SHIFT (PAGE_SHIFT - NCHUNKS_ORDER)
|
|
|
#define CHUNK_SIZE (1 << CHUNK_SHIFT)
|
|
|
-#define NCHUNKS (PAGE_SIZE >> CHUNK_SHIFT)
|
|
|
#define ZHDR_SIZE_ALIGNED CHUNK_SIZE
|
|
|
+#define NCHUNKS ((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)
|
|
|
|
|
|
/**
|
|
|
* struct zbud_pool - stores metadata for each zbud pool
|
|
@@ -268,10 +270,9 @@ static int num_free_chunks(struct zbud_header *zhdr)
|
|
|
{
|
|
|
/*
|
|
|
* Rather than branch for different situations, just use the fact that
|
|
|
- * free buddies have a length of zero to simplify everything. -1 at the
|
|
|
- * end for the zbud header.
|
|
|
+ * free buddies have a length of zero to simplify everything.
|
|
|
*/
|
|
|
- return NCHUNKS - zhdr->first_chunks - zhdr->last_chunks - 1;
|
|
|
+ return NCHUNKS - zhdr->first_chunks - zhdr->last_chunks;
|
|
|
}
|
|
|
|
|
|
/*****************
|