From: Peter Zijlstra <peterz@infradead.org>
To: Borislav Petkov <bp@alien8.de>
Cc: Rick Edgecombe <rick.p.edgecombe@intel.com>,
Andy Lutomirski <luto@kernel.org>, Ingo Molnar <mingo@redhat.com>,
linux-kernel@vger.kernel.org, x86@kernel.org, hpa@zytor.com,
Thomas Gleixner <tglx@linutronix.de>,
Nadav Amit <nadav.amit@gmail.com>,
Dave Hansen <dave.hansen@linux.intel.com>,
linux_dti@icloud.com, linux-integrity@vger.kernel.org,
linux-security-module@vger.kernel.org, akpm@linux-foundation.org,
kernel-hardening@lists.openwall.com, linux-mm@kvack.org,
will.deacon@arm.com, ard.biesheuvel@linaro.org,
kristen@linux.intel.com, deneen.t.dock@intel.com,
Nadav Amit <namit@vmware.com>, Kees Cook <keescook@chromium.org>,
Dave Hansen <dave.hansen@intel.com>,
Masami Hiramatsu <mhiramat@kernel.org>
Subject: Re: [PATCH v2 06/20] x86/alternative: use temporary mm for text poking
Date: Tue, 5 Feb 2019 12:31:46 +0100 [thread overview]
Message-ID: <20190205113146.GP17528@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <20190205095853.GJ21801@zn.tnic>
On Tue, Feb 05, 2019 at 10:58:53AM +0100, Borislav Petkov wrote:
> > @@ -683,41 +684,102 @@ __ro_after_init unsigned long poking_addr;
> >
> > static void *__text_poke(void *addr, const void *opcode, size_t len)
> > {
> > + bool cross_page_boundary = offset_in_page(addr) + len > PAGE_SIZE;
> > + temporary_mm_state_t prev;
> > + struct page *pages[2] = {NULL};
> > unsigned long flags;
> > - char *vaddr;
> > - struct page *pages[2];
> > - int i;
> > + pte_t pte, *ptep;
> > + spinlock_t *ptl;
> > + pgprot_t prot;
> >
> > /*
> > - * While boot memory allocator is runnig we cannot use struct
> > - * pages as they are not yet initialized.
> > + * While boot memory allocator is running we cannot use struct pages as
> > + * they are not yet initialized.
> > */
> > BUG_ON(!after_bootmem);
> >
> > if (!core_kernel_text((unsigned long)addr)) {
> > pages[0] = vmalloc_to_page(addr);
> > - pages[1] = vmalloc_to_page(addr + PAGE_SIZE);
> > + if (cross_page_boundary)
> > + pages[1] = vmalloc_to_page(addr + PAGE_SIZE);
> > } else {
> > pages[0] = virt_to_page(addr);
> > WARN_ON(!PageReserved(pages[0]));
> > - pages[1] = virt_to_page(addr + PAGE_SIZE);
> > + if (cross_page_boundary)
> > + pages[1] = virt_to_page(addr + PAGE_SIZE);
> > }
> > - BUG_ON(!pages[0]);
> > + BUG_ON(!pages[0] || (cross_page_boundary && !pages[1]));
>
> checkpatch fires a lot for this patchset and I think we should tone down
> the BUG_ON() use.
I've been pushing for BUG_ON() in this patch set; sod checkpatch.
Maybe not this BUG_ON in particular, but a number of them introduced
here are really situations where we can't do anything sane.
This BUG_ON() in particular is the choice between corrupted text or an
instantly dead machine; what would you do?
In general, text_poke() cannot fail:
- suppose changing a single jump label requires poking multiple sites
(not uncommon), we fail halfway through and then have to undo the
first pokes, but those pokes fail again.
- this then leaves us no way forward and no way back, we've got
inconsistent text state -> FAIL.
So even an 'early' fail (like here) doesn't work in the rollback
scenario if you combine them.
So while in general I agree with BUG_ON() being undesirable, I think
liberal sprinking in text_poke() is fine; you really _REALLY_ want this
to work or fail loudly. Text corruption is just painful.
next prev parent reply other threads:[~2019-02-05 11:31 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-29 0:34 [PATCH v2 00/20] Merge text_poke fixes and executable lockdowns Rick Edgecombe
2019-01-29 0:34 ` [PATCH v2 01/20] Fix "x86/alternatives: Lockdep-enforce text_mutex in text_poke*()" Rick Edgecombe
2019-01-29 0:34 ` [PATCH v2 02/20] x86/jump_label: Use text_poke_early() during early init Rick Edgecombe
2019-01-29 0:34 ` [PATCH v2 03/20] x86/mm: temporary mm struct Rick Edgecombe
2019-01-31 11:29 ` Borislav Petkov
2019-01-31 22:19 ` Nadav Amit
2019-02-01 0:08 ` Borislav Petkov
2019-02-01 0:25 ` Nadav Amit
2019-02-04 14:28 ` Borislav Petkov
2019-01-29 0:34 ` [PATCH v2 04/20] fork: provide a function for copying init_mm Rick Edgecombe
2019-02-05 8:53 ` Borislav Petkov
2019-02-05 9:03 ` Nadav Amit
2019-01-29 0:34 ` [PATCH v2 05/20] x86/alternative: initializing temporary mm for patching Rick Edgecombe
2019-02-05 9:18 ` Borislav Petkov
2019-02-11 0:39 ` Nadav Amit
2019-02-11 5:18 ` Andy Lutomirski
2019-02-11 18:04 ` Nadav Amit
2019-02-11 19:07 ` Andy Lutomirski
2019-02-11 19:18 ` Nadav Amit
2019-02-11 22:47 ` Andy Lutomirski
2019-02-12 18:23 ` Nadav Amit
2019-01-29 0:34 ` [PATCH v2 06/20] x86/alternative: use temporary mm for text poking Rick Edgecombe
2019-02-05 9:58 ` Borislav Petkov
2019-02-05 11:31 ` Peter Zijlstra [this message]
2019-02-05 12:35 ` Borislav Petkov
2019-02-05 13:25 ` Peter Zijlstra
2019-02-05 17:54 ` Nadav Amit
2019-02-05 13:29 ` Peter Zijlstra
2019-01-29 0:34 ` [PATCH v2 07/20] x86/kgdb: avoid redundant comparison of patched code Rick Edgecombe
2019-01-29 0:34 ` [PATCH v2 08/20] x86/ftrace: set trampoline pages as executable Rick Edgecombe
2019-01-29 0:34 ` [PATCH v2 09/20] x86/kprobes: instruction pages initialization enhancements Rick Edgecombe
2019-02-11 18:22 ` Borislav Petkov
2019-02-11 19:36 ` Nadav Amit
2019-01-29 0:34 ` [PATCH v2 10/20] x86: avoid W^X being broken during modules loading Rick Edgecombe
2019-02-11 18:29 ` Borislav Petkov
2019-02-11 18:45 ` Nadav Amit
2019-02-11 19:01 ` Borislav Petkov
2019-02-11 19:09 ` Nadav Amit
2019-02-11 19:10 ` Borislav Petkov
2019-02-11 19:27 ` Nadav Amit
2019-02-11 19:42 ` Borislav Petkov
2019-02-11 20:32 ` Nadav Amit
2019-03-07 15:10 ` [PATCH] x86/cpufeature: Remove __pure attribute to _static_cpu_has() Borislav Petkov
2019-03-07 16:43 ` hpa
2019-03-07 17:02 ` Borislav Petkov
2019-03-07 7:29 ` [PATCH v2 10/20] x86: avoid W^X being broken during modules loading Borislav Petkov
2019-03-07 16:53 ` hpa
2019-03-07 17:06 ` Borislav Petkov
2019-03-07 20:02 ` Andy Lutomirski
2019-03-07 20:25 ` Borislav Petkov
2019-01-29 0:34 ` [PATCH v2 11/20] x86/jump-label: remove support for custom poker Rick Edgecombe
2019-02-11 18:37 ` Borislav Petkov
2019-01-29 0:34 ` [PATCH v2 12/20] x86/alternative: Remove the return value of text_poke_*() Rick Edgecombe
2019-01-29 0:34 ` [PATCH v2 13/20] Add set_alias_ function and x86 implementation Rick Edgecombe
2019-02-11 19:09 ` Borislav Petkov
2019-02-11 19:27 ` Edgecombe, Rick P
2019-02-11 22:59 ` Andy Lutomirski
2019-02-12 0:01 ` Edgecombe, Rick P
2019-01-29 0:34 ` [PATCH v2 14/20] mm: Make hibernate handle unmapped pages Rick Edgecombe
2019-02-19 11:04 ` Borislav Petkov
2019-02-19 21:28 ` Edgecombe, Rick P
2019-02-20 16:07 ` Borislav Petkov
2019-01-29 0:34 ` [PATCH v2 15/20] vmalloc: New flags for safe vfree on special perms Rick Edgecombe
2019-02-19 12:48 ` Borislav Petkov
2019-02-19 19:42 ` Edgecombe, Rick P
2019-02-20 16:14 ` Borislav Petkov
2019-01-29 0:34 ` [PATCH v2 16/20] modules: Use vmalloc special flag Rick Edgecombe
2019-01-29 0:34 ` [PATCH v2 17/20] bpf: " Rick Edgecombe
2019-01-29 0:34 ` [PATCH v2 18/20] x86/ftrace: " Rick Edgecombe
2019-01-29 0:34 ` [PATCH v2 19/20] x86/kprobes: " Rick Edgecombe
2019-01-29 0:34 ` [PATCH v2 20/20] x86/alternative: comment about module removal races Rick Edgecombe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190205113146.GP17528@hirez.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=akpm@linux-foundation.org \
--cc=ard.biesheuvel@linaro.org \
--cc=bp@alien8.de \
--cc=dave.hansen@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=deneen.t.dock@intel.com \
--cc=hpa@zytor.com \
--cc=keescook@chromium.org \
--cc=kernel-hardening@lists.openwall.com \
--cc=kristen@linux.intel.com \
--cc=linux-integrity@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-security-module@vger.kernel.org \
--cc=linux_dti@icloud.com \
--cc=luto@kernel.org \
--cc=mhiramat@kernel.org \
--cc=mingo@redhat.com \
--cc=nadav.amit@gmail.com \
--cc=namit@vmware.com \
--cc=rick.p.edgecombe@intel.com \
--cc=tglx@linutronix.de \
--cc=will.deacon@arm.com \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).