diff --git a/patches.kabi/kabi-allow-extra-bugints.patch b/patches.kabi/kabi-allow-extra-bugints.patch index fe19c90..55cd0fb 100644 --- a/patches.kabi/kabi-allow-extra-bugints.patch +++ b/patches.kabi/kabi-allow-extra-bugints.patch @@ -110,7 +110,7 @@ Signed-off-by: Nikolay Borisov + set_bit(bit - ((NCAPINTS+NBUGINTS)*32), \ + (unsigned long *)&(&boot_cpu_data)->x86_ext_capability[NEXTCAPINTS]); \ + } else { \ -+ set_cpu_cap(&boot_cpu_data, bit); \ ++ set_bit(bit, (unsigned long *)((&boot_cpu_data)->x86_capability)); \ + set_bit(bit, (unsigned long *)cpu_caps_set); \ + } \ +} while (0) diff --git a/patches.suse/mm-vmalloc-huge-vmalloc-backing-pages-should-be-split-rather-than-compound.patch b/patches.suse/mm-vmalloc-huge-vmalloc-backing-pages-should-be-split-rather-than-compound.patch new file mode 100644 index 0000000..e3cbe1d --- /dev/null +++ b/patches.suse/mm-vmalloc-huge-vmalloc-backing-pages-should-be-split-rather-than-compound.patch @@ -0,0 +1,112 @@ +From: Nicholas Piggin +Date: Fri, 22 Apr 2022 16:01:05 +1000 +Subject: mm/vmalloc: huge vmalloc backing pages should be split rather than + compound +Git-commit: 3b8000ae185cb068adbda5f966a3835053c85fd4 +Patch-mainline: v5.18-rc4 +References: bsc#1217829 + +Huge vmalloc higher-order backing pages were allocated with __GFP_COMP +in order to allow the sub-pages to be refcounted by callers such as +"remap_vmalloc_page [sic]" (remap_vmalloc_range). + +However a similar problem exists for other struct page fields callers +use, for example fb_deferred_io_fault() takes a vmalloc'ed page and +not only refcounts it but uses ->lru, ->mapping, ->index. + +This is not compatible with compound sub-pages, and can cause bad page +state issues like + + BUG: Bad page state in process swapper/0 pfn:00743 + page:(____ptrval____) refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x743 + flags: 0x7ffff000000000(node=0|zone=0|lastcpupid=0x7ffff) + raw: 007ffff000000000 c00c00000001d0c8 c00c00000001d0c8 0000000000000000 + raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000 + page dumped because: corrupted mapping in tail page + Modules linked in: + CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.18.0-rc3-00082-gfc6fff4a7ce1-dirty #2810 + Call Trace: + dump_stack_lvl+0x74/0xa8 (unreliable) + bad_page+0x12c/0x170 + free_tail_pages_check+0xe8/0x190 + free_pcp_prepare+0x31c/0x4e0 + free_unref_page+0x40/0x1b0 + __vunmap+0x1d8/0x420 + ... + +The correct approach is to use split high-order pages for the huge +vmalloc backing. These allow callers to treat them in exactly the same +way as individually-allocated order-0 pages. + +[ SLE15-SP5 backport: we also need to set page->private to 0 for the tail pages + or the swapfile code might be confused. Upstream ultimately made swapfile not + use huge vmalloc due to 559089e0a93d ("vmalloc: replace VM_NO_HUGE_VMAP with + VM_ALLOW_HUGE_VMAP") but that's a kabi hazard ] + +Link: https://lore.kernel.org/all/14444103-d51b-0fb3-ee63-c3f182f0b546@molgen.mpg.de/ +Signed-off-by: Nicholas Piggin +Cc: Paul Menzel +Cc: Song Liu +Cc: Rick Edgecombe +Signed-off-by: Linus Torvalds +Signed-off-by: Vlastimil Babka +--- + mm/vmalloc.c | 28 +++++++++++++++++++--------- + 1 file changed, 19 insertions(+), 9 deletions(-) + +--- a/mm/vmalloc.c ++++ b/mm/vmalloc.c +@@ -2599,14 +2599,17 @@ static void __vunmap(const void *addr, i + vm_remove_mappings(area, deallocate_pages); + + if (deallocate_pages) { +- unsigned int page_order = vm_area_page_order(area); + int i; + +- for (i = 0; i < area->nr_pages; i += 1U << page_order) { ++ for (i = 0; i < area->nr_pages; i++) { + struct page *page = area->pages[i]; + + BUG_ON(!page); +- __free_pages(page, page_order); ++ /* ++ * High-order allocs for huge vmallocs are split, so ++ * can be freed as an array of order-0 allocations ++ */ ++ __free_pages(page, 0); + cond_resched(); + } + atomic_long_sub(area->nr_pages, &nr_vmalloc_pages); +@@ -2838,12 +2841,7 @@ vm_area_alloc_pages(gfp_t gfp, int nid, + if (nr != nr_pages_request) + break; + } +- } else if (order) +- /* +- * Compound pages required for remap_vmalloc_page if +- * high-order pages. +- */ +- gfp |= __GFP_COMP; ++ } + + /* High-order pages or fallback path if "bulk" fails. */ + +@@ -2854,6 +2852,18 @@ vm_area_alloc_pages(gfp_t gfp, int nid, + page = alloc_pages_node(nid, gfp, order); + if (unlikely(!page)) + break; ++ /* ++ * Higher order allocations must be able to be treated as ++ * indepdenent small pages by callers (as they can with ++ * small-page vmallocs). Some drivers do their own refcounting ++ * on vmalloc_to_page() pages, some use page->mapping, ++ * page->lru, etc. ++ */ ++ if (order) { ++ split_page(page, order); ++ for (i = 1; i < (1U << order); i++) ++ set_page_private(page + i, 0); ++ } + + /* + * Careful, we allocate and map page-order pages, but diff --git a/series.conf b/series.conf index f932d7d..82997b5 100644 --- a/series.conf +++ b/series.conf @@ -24275,6 +24275,7 @@ patches.suse/1573-drm-i915-display-vrr-Reset-VRR-capable-property-on-a.patch patches.suse/drm-i915-display-psr-Unset-enable_psr2_sel_fetch-if-.patch patches.suse/1575-drm-msm-Revert-drm-msm-Stop-using-iommu_present.patch + patches.suse/mm-vmalloc-huge-vmalloc-backing-pages-should-be-split-rather-than-compound.patch patches.suse/sound-oss-dmasound-fix-dmasound_setup-defined-but-no.patch patches.suse/ALSA-hda-hdmi-fix-warning-about-PCM-count-when-used-.patch patches.suse/ALSA-hda-hdmi-add-HDMI-codec-VID-for-Raptorlake-P.patch