UINTN Size;\r
} POOL_TAIL;\r
\r
-\r
-#define POOL_SHIFT 7\r
-\r
#define POOL_OVERHEAD (SIZE_OF_POOL_HEAD + sizeof(POOL_TAIL))\r
\r
#define HEAD_TO_TAIL(a) \\r
((POOL_TAIL *) (((CHAR8 *) (a)) + (a)->Size - sizeof(POOL_TAIL)));\r
\r
+//\r
+// Each element is the sum of the 2 previous ones: this allows us to migrate\r
+// blocks between bins by splitting them up, while not wasting too much memory\r
+// as we would in a strict power-of-2 sequence\r
+//\r
+STATIC CONST UINT16 mPoolSizeTable[] = {\r
+ 64, 128, 192, 320, 512, 832, 1344, 2176, 3520, 5696, 9216, 14912, 24128\r
+};\r
\r
-#define SIZE_TO_LIST(a) ((a) >> POOL_SHIFT)\r
-#define LIST_TO_SIZE(a) ((a+1) << POOL_SHIFT)\r
+#define SIZE_TO_LIST(a) (GetPoolIndexFromSize (a))\r
+#define LIST_TO_SIZE(a) (mPoolSizeTable [a])\r
\r
-#define MAX_POOL_LIST SIZE_TO_LIST(DEFAULT_PAGE_ALLOCATION)\r
+#define MAX_POOL_LIST (sizeof (mPoolSizeTable) / sizeof (mPoolSizeTable[0]))\r
\r
#define MAX_POOL_SIZE (MAX_ADDRESS - POOL_OVERHEAD)\r
\r
//\r
LIST_ENTRY mPoolHeadList = INITIALIZE_LIST_HEAD_VARIABLE (mPoolHeadList);\r
\r
+STATIC\r
+UINTN\r
+GetPoolIndexFromSize (\r
+ UINTN Size\r
+ )\r
+{\r
+ UINTN Index;\r
+\r
+ for (Index = 0; Index < MAX_POOL_LIST; Index++) {\r
+ if (mPoolSizeTable [Index] >= Size) {\r
+ return Index;\r
+ }\r
+ }\r
+ return MAX_POOL_LIST;\r
+}\r
\r
/**\r
Called to initialize the pool.\r
// If allocation is over max size, just allocate pages for the request\r
// (slow)\r
//\r
- if (Index >= MAX_POOL_LIST) {\r
+ if (Index >= SIZE_TO_LIST (Granularity)) {\r
NoPages = EFI_SIZE_TO_PAGES(Size) + EFI_SIZE_TO_PAGES (Granularity) - 1;\r
NoPages &= ~(UINTN)(EFI_SIZE_TO_PAGES (Granularity) - 1);\r
Head = CoreAllocatePoolPages (PoolType, NoPages, Granularity);\r
//\r
// If it's not on the list, it must be pool pages\r
//\r
- if (Index >= MAX_POOL_LIST) {\r
+ if (Index >= SIZE_TO_LIST (Granularity)) {\r
\r
//\r
// Return the memory pages back to free memory\r