On Thu, 2 Aug 2018, Dave Hansen wrote: > > From: Dave Hansen <dave.han...@linux.intel.com> > > The x86 code has several places where it frees parts of kernel image: > > 1. Unused SMP alternative > 2. __init code > 3. The hole between text and rodata > 4. The hole between rodata and data > > We call free_init_pages() to do this. Strangely, we convert the > symbol addresses to kernel direct map addresses in some cases > (#3, #4) but not others (#1, #2). > > The virt_to_page() and the other code in free_reserved_area() now > works fine for for symbol addresses on x86, so don't bother > converting the addresses to direct map addresses before freeing > them. >
Thanks Dave, this series works for me. But in trying to review it, I am feeling very stupid about this 3/7 (and/or the 2/7 before it: though I don't think that it's wrong). I simply do not understand how this change works, and how #1 and #2 work. I thought that virt_to_page() only works on virtual addresses in the direct map: the __va(__pa_symbol()) you remove below was a good conversion from high kernel mapping to direct map. Without it, how does virt_to_page() then find the right page? Is it that there's a guaranteed common alignment between the direct map and the high kernel mapping, and the ffffffff8....... addresses pass through the arithmetic in such a way that virt_to_page() comes up with the right answer; and that is well-known and relied upon by x86 developers? Or are you now adding a dependency on a coincidence? Or does it not work at all, and the pages are actually not freed? Hugh p.s. if there were to be a respin (I hope not), I notice that in both 1/7 and 2/7 commit comments, you've said " no " for " not "; which always makes us pause and wonder if you meant " now ". > Signed-off-by: Dave Hansen <dave.han...@linux.intel.com> > Cc: Kees Cook <keesc...@google.com> > Cc: Thomas Gleixner <t...@linutronix.de> > Cc: Ingo Molnar <mi...@kernel.org> > Cc: Andrea Arcangeli <aarca...@redhat.com> > Cc: Juergen Gross <jgr...@suse.com> > Cc: Josh Poimboeuf <jpoim...@redhat.com> > Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org> > Cc: Peter Zijlstra <pet...@infradead.org> > Cc: Hugh Dickins <hu...@google.com> > Cc: Linus Torvalds <torva...@linux-foundation.org> > Cc: Borislav Petkov <b...@alien8.de> > Cc: Andy Lutomirski <l...@kernel.org> > Cc: Andi Kleen <a...@linux.intel.com> > --- > > b/arch/x86/mm/init_64.c | 8 ++------ > 1 file changed, 2 insertions(+), 6 deletions(-) > > diff -puN arch/x86/mm/init_64.c~x86-init-do-not-convert-symbol-addresses > arch/x86/mm/init_64.c > --- a/arch/x86/mm/init_64.c~x86-init-do-not-convert-symbol-addresses > 2018-08-02 14:14:48.380483277 -0700 > +++ b/arch/x86/mm/init_64.c 2018-08-02 14:14:48.383483277 -0700 > @@ -1283,12 +1283,8 @@ void mark_rodata_ro(void) > set_memory_ro(start, (end-start) >> PAGE_SHIFT); > #endif > > - free_init_pages("unused kernel", > - (unsigned long) __va(__pa_symbol(text_end)), > - (unsigned long) __va(__pa_symbol(rodata_start))); > - free_init_pages("unused kernel", > - (unsigned long) __va(__pa_symbol(rodata_end)), > - (unsigned long) __va(__pa_symbol(_sdata))); > + free_init_pages("unused kernel", text_end, rodata_start); > + free_init_pages("unused kernel", rodata_end, _sdata); > > debug_checkwx(); > > _