summaryrefslogtreecommitdiff
path: root/sys-kernel/cairn-sources/files/5.9.6/hardened-patches/0097-mm-Fix-extra_latent_entropy.patch
diff options
context:
space:
mode:
authorLiguros - Gitlab CI/CD [master] <gitlab@liguros.net>2021-01-27 18:53:03 +0000
committerLiguros - Gitlab CI/CD [master] <gitlab@liguros.net>2021-01-27 18:53:03 +0000
commit3482ddf943eff7b8848f1fb31350b99ce349e86a (patch)
tree9c9bb6ec6679e9dc44a84d87ba611989409b12ca /sys-kernel/cairn-sources/files/5.9.6/hardened-patches/0097-mm-Fix-extra_latent_entropy.patch
parent8e8120eabdd28020aa69c7a60505cce2edd20adc (diff)
downloadbaldeagleos-repo-21.1.3.tar.gz
baldeagleos-repo-21.1.3.tar.xz
baldeagleos-repo-21.1.3.zip
Updating liguros repov21.1.3
Diffstat (limited to 'sys-kernel/cairn-sources/files/5.9.6/hardened-patches/0097-mm-Fix-extra_latent_entropy.patch')
-rw-r--r--sys-kernel/cairn-sources/files/5.9.6/hardened-patches/0097-mm-Fix-extra_latent_entropy.patch101
1 files changed, 101 insertions, 0 deletions
diff --git a/sys-kernel/cairn-sources/files/5.9.6/hardened-patches/0097-mm-Fix-extra_latent_entropy.patch b/sys-kernel/cairn-sources/files/5.9.6/hardened-patches/0097-mm-Fix-extra_latent_entropy.patch
new file mode 100644
index 000000000000..2025be17f7ed
--- /dev/null
+++ b/sys-kernel/cairn-sources/files/5.9.6/hardened-patches/0097-mm-Fix-extra_latent_entropy.patch
@@ -0,0 +1,101 @@
+From ae9f5fd6e7211192d1151a8ee395ac08deb8fde6 Mon Sep 17 00:00:00 2001
+From: Thibaut Sautereau <thibaut.sautereau@ssi.gouv.fr>
+Date: Tue, 7 May 2019 11:46:21 +0200
+Subject: [PATCH 097/108] mm: Fix extra_latent_entropy
+
+Commit a9cd410a3d29 ("mm/page_alloc.c: memory hotplug: free pages as
+higher order") changed `static void __init __free_pages_boot_core()`
+into `void __free_pages_core()`, causing the following section mismatch
+warning at compile time:
+
+ WARNING: vmlinux.o(.text+0x180fe4): Section mismatch in reference from the function __free_pages_core() to the variable .meminit.data:extra_latent_entropy
+ The function __free_pages_core() references the variable __meminitdata extra_latent_entropy.
+ This is often because __free_pages_core lacks a __meminitdata annotation or the annotation of extra_latent_entropy is wrong.
+
+This commit is an attempt at fixing this issue. I'm not sure it's OK as
+we are accessing pages that are still managed by the bootmem allocator.
+The prefetching part is not an issue as it only affects struct pages.
+
+Signed-off-by: Thibaut Sautereau <thibaut.sautereau@ssi.gouv.fr>
+---
+ mm/page_alloc.c | 34 ++++++++++++++++++++--------------
+ 1 file changed, 20 insertions(+), 14 deletions(-)
+
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index c7edc1cf5d09..5dfcf80fe597 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -1489,21 +1489,9 @@ static void __free_pages_ok(struct page *page, unsigned int order)
+ local_irq_restore(flags);
+ }
+
+-void __free_pages_core(struct page *page, unsigned int order)
++static void __init __gather_extra_latent_entropy(struct page *page,
++ unsigned int nr_pages)
+ {
+- unsigned int nr_pages = 1 << order;
+- struct page *p = page;
+- unsigned int loop;
+-
+- prefetchw(p);
+- for (loop = 0; loop < (nr_pages - 1); loop++, p++) {
+- prefetchw(p + 1);
+- __ClearPageReserved(p);
+- set_page_count(p, 0);
+- }
+- __ClearPageReserved(p);
+- set_page_count(p, 0);
+-
+ if (extra_latent_entropy && !PageHighMem(page) && page_to_pfn(page) < 0x100000) {
+ unsigned long hash = 0;
+ size_t index, end = PAGE_SIZE * nr_pages / sizeof hash;
+@@ -1518,7 +1506,22 @@ void __free_pages_core(struct page *page, unsigned int order)
+ add_device_randomness((const void *)&hash, sizeof(hash));
+ #endif
+ }
++}
+
++void __free_pages_core(struct page *page, unsigned int order)
++{
++ unsigned int nr_pages = 1 << order;
++ struct page *p = page;
++ unsigned int loop;
++
++ prefetchw(p);
++ for (loop = 0; loop < (nr_pages - 1); loop++, p++) {
++ prefetchw(p + 1);
++ __ClearPageReserved(p);
++ set_page_count(p, 0);
++ }
++ __ClearPageReserved(p);
++ set_page_count(p, 0);
+ atomic_long_add(nr_pages, &page_zone(page)->managed_pages);
+ set_page_refcounted(page);
+ __free_pages(page, order);
+@@ -1573,6 +1576,7 @@ void __init memblock_free_pages(struct page *page, unsigned long pfn,
+ {
+ if (early_page_uninitialised(pfn))
+ return;
++ __gather_extra_latent_entropy(page, 1 << order);
+ __free_pages_core(page, order);
+ }
+
+@@ -1664,6 +1668,7 @@ static void __init deferred_free_range(unsigned long pfn,
+ if (nr_pages == pageblock_nr_pages &&
+ (pfn & (pageblock_nr_pages - 1)) == 0) {
+ set_pageblock_migratetype(page, MIGRATE_MOVABLE);
++ __gather_extra_latent_entropy(page, 1 << pageblock_order);
+ __free_pages_core(page, pageblock_order);
+ return;
+ }
+@@ -1671,6 +1676,7 @@ static void __init deferred_free_range(unsigned long pfn,
+ for (i = 0; i < nr_pages; i++, page++, pfn++) {
+ if ((pfn & (pageblock_nr_pages - 1)) == 0)
+ set_pageblock_migratetype(page, MIGRATE_MOVABLE);
++ __gather_extra_latent_entropy(page, 1);
+ __free_pages_core(page, 0);
+ }
+ }
+--
+2.29.2
+