Re: [RFC PATCH] text_poke/ftrace/x86: Allow text_poke() to be called in early boot
From: Steven Rostedt <rostedt@goodmis.org>
Date: 2022-10-25 01:11:38
Also in:
linux-arch, lkml
On Mon, 24 Oct 2022 17:11:13 -0700 Linus Torvalds [off-list ref] wrote:
On Mon, Oct 24, 2022 at 4:03 PM Steven Rostedt [off-list ref] wrote:quoted
This required some updates to fork and the maple_tree code to allow it to be called with enabling interrupts in the time when interrupts must remain disabled.Yeah, moving special cases from one place to another doesn't really help. Particularly to something as core as dup_mm(). All of this comes from "poking_init()" being a steaming pile of bovine excrement, doing random odd things, and having that special "copy_init_mm()" helper that just makes things even worse. Nothing else uses that, and it shouldn't have called "dup_mm()" in the first place. At this point, there is no actual user VM to even copy, so 99% of everything that duip_mm() does is not just pointless, but actively wrong, like the mmap_write_lock_nested() when we're in early boot. I'm not even sure why "poking_mm" exists at all, and why it has created a whole new copy of "init_mm", and why this code isn't just using '&init_mm' like everything else that wants to just walk the kernel page tables.
It's not just walking the page tables, it's creating one that nobody else is using. Since we want to keep all executable code read only, the way text_poke() works is to create a new memory mapping where the pages it has isn't visible by anyone else (which is why it doesn't use init_mm). And then makes a mapping to the executable address as non executable and writable. Makes the update, and then removes the mapping.
Yes, I see that commit 4fc19708b165 ("x86/alternatives: Initialize
temporary mm for patching"), and no, none of that makes any sense to
me. It seems just (mis-)designed to fail.It's all about updating read only pages that are executable with a shadow mm. -- Steve