X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=mm%2Fpage_alloc.c;h=721d62c5be69977bc595f9cd8d8d9e5ce618ea26;hb=53fdf99f676bada351aebb9eb098b5d7ac153cd1;hp=ce03c930ffcf169923c111169061280524aead86;hpb=d481e88ed55345bfdaea6d6b8295e0643d5f0932;p=deliverable%2Flinux.git diff --git a/mm/page_alloc.c b/mm/page_alloc.c index ce03c930ffcf..721d62c5be69 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -64,6 +64,7 @@ #include #include #include +#include #include #include @@ -91,6 +92,11 @@ EXPORT_PER_CPU_SYMBOL(_numa_mem_); int _node_numa_mem_[MAX_NUMNODES]; #endif +#ifdef CONFIG_GCC_PLUGIN_LATENT_ENTROPY +volatile u64 latent_entropy __latent_entropy; +EXPORT_SYMBOL(latent_entropy); +#endif + /* * Array of node states. */ @@ -1245,6 +1251,15 @@ static void __free_pages_ok(struct page *page, unsigned int order) local_irq_restore(flags); } +bool __meminitdata ram_latent_entropy; + +static int __init setup_ram_latent_entropy(char *str) +{ + ram_latent_entropy = true; + return 0; +} +early_param("ram_latent_entropy", setup_ram_latent_entropy); + static void __init __free_pages_boot_core(struct page *page, unsigned int order) { unsigned int nr_pages = 1 << order; @@ -1260,6 +1275,17 @@ static void __init __free_pages_boot_core(struct page *page, unsigned int order) __ClearPageReserved(p); set_page_count(p, 0); + if (ram_latent_entropy && !PageHighMem(page) && + page_to_pfn(page) < 0x100000) { + u64 hash = 0; + size_t index, end = PAGE_SIZE * nr_pages / sizeof(hash); + const u64 *data = lowmem_page_address(page); + + for (index = 0; index < end; index++) + hash ^= hash + data[index]; + add_device_randomness((const void *)&hash, sizeof(hash)); + } + page_zone(page)->managed_pages += nr_pages; set_page_refcounted(page); __free_pages(page, order);