• Jeremy Fitzhardinge's avatar
    x86: preallocate and prepopulate separately · d8d5900e
    Jeremy Fitzhardinge authored
    Jan Beulich points out that vmalloc_sync_all() assumes that the
    kernel's pmd is always expected to be present in the pgd.  The current
    pgd construction code will add the pgd to the pgd_list before its pmds
    have been pre-populated, thereby making it visible to
    vmalloc_sync_all().
    
    However, because pgd_prepopulate_pmd also does the allocation, it may
    block and cannot be done under spinlock.
    
    The solution is to preallocate the pmds out of the spinlock, then
    populate them while holding the pgd_list lock.
    
    This patch also pulls the pmd preallocation and mop-up functions out
    to be common, assuming that the compiler will generate no code for
    them when PREALLOCTED_PMDS is 0.  Also, there's no need for pgd_ctor
    to clear the pgd again, since it's allocated as a zeroed page.
    Signed-off-by: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
    Cc: xen-devel <xen-devel@lists.xensource.com>
    Cc: Stephen Tweedie <sct@redhat.com>
    Cc: Eduardo Habkost <ehabkost@redhat.com>
    Cc: Mark McLoughlin <markmc@redhat.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    Cc: Jan Beulich <jbeulich@novell.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    d8d5900e
pgtable.c 7.59 KB