• J
    x86: fix assumed to be contiguous leaf page tables for kmap_atomic region (take 2) · a3c6018e
    Jan Beulich 提交于
    Debugging and original patch from Nick Piggin <npiggin@suse.de>
    
    The early fixmap pmd entry inserted at the very top of the KVA is causing the
    subsequent fixmap mapping code to not provide physically linear pte pages over
    the kmap atomic portion of the fixmap (which relies on said property to
    calculate pte addresses).
    
    This has caused weird boot failures in kmap_atomic much later in the boot
    process (initial userspace faults) on a 32-bit PAE system with a larger number
    of CPUs (smaller CPU counts tend not to run over into the next page so don't
    show up the problem).
    
    Solve this by attempting to clear out the page table, and copy any of its
    entries to the new one. Also, add a bug if a nonlinear condition is encountered
    and can't be resolved, which might save some hours of debugging if this fragile
    scheme ever breaks again...
    
    Once we have such logic, we can also use it to eliminate the early ioremap
    trickery around the page table setup for the fixmap area. This also fixes
    potential issues with FIX_* entries sharing the leaf page table with the early
    ioremap ones getting discarded by early_ioremap_clear() and not restored by
    early_ioremap_reset(). It at once eliminates the temporary (and configuration,
    namely NR_CPUS, dependent) unavailability of early fixed mappings during the
    time the fixmap area page tables get constructed.
    
    Finally, also replace the hard coded calculation of the initial table space
    needed for the fixmap area with a proper one, allowing kernels configured for
    large CPU counts to actually boot.
    
    Based-on: Nick Piggin <npiggin@suse.de>
    Signed-off-by: NJan Beulich <jbeulich@novell.com>
    Signed-off-by: NIngo Molnar <mingo@elte.hu>
    a3c6018e
ioremap.c 18.1 KB