|
|
@@ -1230,17 +1230,43 @@ const char *arch_vma_name(struct vm_area_struct *vma)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_X86_UV
|
|
|
-unsigned long memory_block_size_bytes(void)
|
|
|
+static unsigned long probe_memory_block_size(void)
|
|
|
{
|
|
|
+ /* start from 2g */
|
|
|
+ unsigned long bz = 1UL<<31;
|
|
|
+
|
|
|
+#ifdef CONFIG_X86_UV
|
|
|
if (is_uv_system()) {
|
|
|
printk(KERN_INFO "UV: memory block size 2GB\n");
|
|
|
return 2UL * 1024 * 1024 * 1024;
|
|
|
}
|
|
|
- return MIN_MEMORY_BLOCK_SIZE;
|
|
|
-}
|
|
|
#endif
|
|
|
|
|
|
+ /* less than 64g installed */
|
|
|
+ if ((max_pfn << PAGE_SHIFT) < (16UL << 32))
|
|
|
+ return MIN_MEMORY_BLOCK_SIZE;
|
|
|
+
|
|
|
+ /* get the tail size */
|
|
|
+ while (bz > MIN_MEMORY_BLOCK_SIZE) {
|
|
|
+ if (!((max_pfn << PAGE_SHIFT) & (bz - 1)))
|
|
|
+ break;
|
|
|
+ bz >>= 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ printk(KERN_DEBUG "memory block size : %ldMB\n", bz >> 20);
|
|
|
+
|
|
|
+ return bz;
|
|
|
+}
|
|
|
+
|
|
|
+static unsigned long memory_block_size_probed;
|
|
|
+unsigned long memory_block_size_bytes(void)
|
|
|
+{
|
|
|
+ if (!memory_block_size_probed)
|
|
|
+ memory_block_size_probed = probe_memory_block_size();
|
|
|
+
|
|
|
+ return memory_block_size_probed;
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
|
|
/*
|
|
|
* Initialise the sparsemem vmemmap using huge-pages at the PMD level.
|