>>> On 20.11.12 at 16:04, Daniel Kiper <daniel.kiper at oracle.com> wrote: > Some implementations (e.g. Xen PVOPS) could not use part of identity page > table > to construct transition page table. It means that they require separate > PUDs, > PMDs and PTEs for virtual and physical (identity) mapping. To satisfy that > requirement add extra pointer to PGD, PUD, PMD and PTE and align existing > code. As said for v1 already - this is not really a requirement of the interface, or else none of our Xen kernels since 2.6.30 would have worked. I don't think it is desirable to introduce overhead for everyone if it's not even needed for Xen. Jan > Signed-off-by: Daniel Kiper <daniel.kiper at oracle.com> > --- > arch/x86/include/asm/kexec.h | 10 +++++++--- > arch/x86/kernel/machine_kexec_64.c | 12 ++++++------ > 2 files changed, 13 insertions(+), 9 deletions(-) > > diff --git a/arch/x86/include/asm/kexec.h b/arch/x86/include/asm/kexec.h > index 317ff17..3cf5600 100644 > --- a/arch/x86/include/asm/kexec.h > +++ b/arch/x86/include/asm/kexec.h > @@ -157,9 +157,13 @@ struct kimage_arch { > }; > #else > struct kimage_arch { > - pud_t *pud; > - pmd_t *pmd; > - pte_t *pte; > + pgd_t *pgd; > + pud_t *pud0; > + pud_t *pud1; > + pmd_t *pmd0; > + pmd_t *pmd1; > + pte_t *pte0; > + pte_t *pte1; > }; > #endif > > diff --git a/arch/x86/kernel/machine_kexec_64.c > b/arch/x86/kernel/machine_kexec_64.c > index b3ea9db..976e54b 100644 > --- a/arch/x86/kernel/machine_kexec_64.c > +++ b/arch/x86/kernel/machine_kexec_64.c > @@ -137,9 +137,9 @@ out: > > static void free_transition_pgtable(struct kimage *image) > { > - free_page((unsigned long)image->arch.pud); > - free_page((unsigned long)image->arch.pmd); > - free_page((unsigned long)image->arch.pte); > + free_page((unsigned long)image->arch.pud0); > + free_page((unsigned long)image->arch.pmd0); > + free_page((unsigned long)image->arch.pte0); > } > > static int init_transition_pgtable(struct kimage *image, pgd_t *pgd) > @@ -157,7 +157,7 @@ static int init_transition_pgtable(struct kimage *image, > pgd_t *pgd) > pud = (pud_t *)get_zeroed_page(GFP_KERNEL); > if (!pud) > goto err; > - image->arch.pud = pud; > + image->arch.pud0 = pud; > set_pgd(pgd, __pgd(__pa(pud) | _KERNPG_TABLE)); > } > pud = pud_offset(pgd, vaddr); > @@ -165,7 +165,7 @@ static int init_transition_pgtable(struct kimage *image, > pgd_t *pgd) > pmd = (pmd_t *)get_zeroed_page(GFP_KERNEL); > if (!pmd) > goto err; > - image->arch.pmd = pmd; > + image->arch.pmd0 = pmd; > set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE)); > } > pmd = pmd_offset(pud, vaddr); > @@ -173,7 +173,7 @@ static int init_transition_pgtable(struct kimage *image, > pgd_t *pgd) > pte = (pte_t *)get_zeroed_page(GFP_KERNEL); > if (!pte) > goto err; > - image->arch.pte = pte; > + image->arch.pte0 = pte; > set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE)); > } > pte = pte_offset_kernel(pmd, vaddr); > -- > 1.5.6.5