From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] [PATCH 07/11] xen/mmu: Recycle the Xen provided L4, L3, and L2 pages
Date: Fri, 17 Aug 2012 14:05:57 -0400 [thread overview]
Message-ID: <20120817180557.GA18579@phenom.dumpdata.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1208171902320.15568@kaball.uk.xensource.com>
On Fri, Aug 17, 2012 at 07:07:28PM +0100, Stefano Stabellini wrote:
> On Thu, 16 Aug 2012, Konrad Rzeszutek Wilk wrote:
> > As we are not using them. We end up only using the L1 pagetables
> > and grafting those to our page-tables.
> >
> > [v1: Per Stefano's suggestion squashed two commits]
> > [v2: Per Stefano's suggestion simplified loop]
> > [v3: Fix smatch warnings]
> > Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > ---
> > arch/x86/xen/mmu.c | 40 +++++++++++++++++++++++++++++++++-------
> > 1 files changed, 33 insertions(+), 7 deletions(-)
> >
> > diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
> > index a59070b..bd92c82 100644
> > --- a/arch/x86/xen/mmu.c
> > +++ b/arch/x86/xen/mmu.c
> > @@ -1708,7 +1708,20 @@ static void convert_pfn_mfn(void *v)
> > for (i = 0; i < PTRS_PER_PTE; i++)
> > pte[i] = xen_make_pte(pte[i].pte);
> > }
> > -
> > +static void __init check_pt_base(unsigned long *pt_base, unsigned long *pt_end,
> > + unsigned long addr)
> > +{
> > + if (*pt_base == PFN_DOWN(__pa(addr))) {
> > + set_page_prot((void *)addr, PAGE_KERNEL);
> > + clear_page((void *)addr);
> > + (*pt_base)++;
> > + }
> > + if (*pt_end == PFN_DOWN(__pa(addr))) {
> > + set_page_prot((void *)addr, PAGE_KERNEL);
> > + clear_page((void *)addr);
> > + (*pt_end)--;
> > + }
> > +}
> > /*
> > * Set up the initial kernel pagetable.
> > *
> > @@ -1724,6 +1737,9 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn)
> > {
> > pud_t *l3;
> > pmd_t *l2;
> > + unsigned long addr[3];
> > + unsigned long pt_base, pt_end;
> > + unsigned i;
> >
> > /* max_pfn_mapped is the last pfn mapped in the initial memory
> > * mappings. Considering that on Xen after the kernel mappings we
> > @@ -1731,6 +1747,9 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn)
> > * set max_pfn_mapped to the last real pfn mapped. */
> > max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->mfn_list));
> >
> > + pt_base = PFN_DOWN(__pa(xen_start_info->pt_base));
> > + pt_end = PFN_DOWN(__pa(xen_start_info->pt_base + (xen_start_info->nr_pt_frames * PAGE_SIZE)));
>
or just do:
pt_end = pt_base + xen_start_info->nr_pt_frames;
> code style
>
> > /* Zap identity mapping */
> > init_level4_pgt[0] = __pgd(0);
> >
> > @@ -1749,6 +1768,9 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn)
> > l3 = m2v(pgd[pgd_index(__START_KERNEL_map)].pgd);
> > l2 = m2v(l3[pud_index(__START_KERNEL_map)].pud);
> >
> > + addr[0] = (unsigned long)pgd;
> > + addr[1] = (unsigned long)l3;
> > + addr[2] = (unsigned long)l2;
> > /* Graft it onto L4[272][0]. Note that we creating an aliasing problem:
> > * Both L4[272][0] and L4[511][511] have entries that point to the same
> > * L2 (PMD) tables. Meaning that if you modify it in __va space
> > @@ -1782,20 +1804,24 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn)
> > /* Unpin Xen-provided one */
> > pin_pagetable_pfn(MMUEXT_UNPIN_TABLE, PFN_DOWN(__pa(pgd)));
> >
> > - /* Switch over */
> > - pgd = init_level4_pgt;
> > -
> > /*
> > * At this stage there can be no user pgd, and no page
> > * structure to attach it to, so make sure we just set kernel
> > * pgd.
> > */
> > xen_mc_batch();
> > - __xen_write_cr3(true, __pa(pgd));
> > + __xen_write_cr3(true, __pa(init_level4_pgt));
> > xen_mc_issue(PARAVIRT_LAZY_CPU);
> >
> > - memblock_reserve(__pa(xen_start_info->pt_base),
> > - xen_start_info->nr_pt_frames * PAGE_SIZE);
> > + /* We can't that easily rip out L3 and L2, as the Xen pagetables are
> > + * set out this way: [L4], [L1], [L2], [L3], [L1], [L1] ... for
> > + * the initial domain. For guests using the toolstack, they are in:
> > + * [L4], [L3], [L2], [L1], [L1], order .. */
> > + for (i = 0; i < ARRAY_SIZE(addr); i++)
> > + check_pt_base(&pt_base, &pt_end, addr[i]);
>
> It is much clearer now, but if the comment is correct, doesn't it mean
> that we are going to be able to free pgd, l3 and l2 only in the non-dom0
> case?
And in dom0 case only PGD.
> If so it might be worth saying it explicitly.
OK.
>
> Other than that, it is fine by me.
>
>
> > + /* Our (by three pages) smaller Xen pagetable that we are using */
> > + memblock_reserve(PFN_PHYS(pt_base), (pt_end - pt_base) * PAGE_SIZE);
> > }
> > #else /* !CONFIG_X86_64 */
> > static RESERVE_BRK_ARRAY(pmd_t, initial_kernel_pmd, PTRS_PER_PMD);
> > --
> > 1.7.7.6
> >
> >
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@lists.xen.org
> > http://lists.xen.org/xen-devel
> >
next prev parent reply other threads:[~2012-08-17 18:16 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-16 16:03 [PATCH] Boot PV guests with more than 128GB (v3) for v3.7 Konrad Rzeszutek Wilk
2012-08-16 16:03 ` [PATCH 01/11] xen/p2m: Fix the comment describing the P2M tree Konrad Rzeszutek Wilk
2012-08-17 17:29 ` [Xen-devel] " Stefano Stabellini
2012-08-16 16:03 ` [PATCH 02/11] xen/x86: Use memblock_reserve for sensitive areas Konrad Rzeszutek Wilk
2012-08-17 17:35 ` [Xen-devel] " Stefano Stabellini
2012-08-20 14:13 ` Konrad Rzeszutek Wilk
2012-08-21 17:27 ` Q:pt_base in COMPAT mode offset by two pages. Was:Re: " Konrad Rzeszutek Wilk
2012-08-21 19:03 ` Konrad Rzeszutek Wilk
2012-08-22 10:48 ` Stefano Stabellini
2012-08-22 14:00 ` Konrad Rzeszutek Wilk
2012-08-22 14:12 ` Jan Beulich
2012-08-22 14:41 ` Stefano Stabellini
2012-08-22 14:57 ` Konrad Rzeszutek Wilk
2012-08-22 15:59 ` Jan Beulich
2012-08-22 16:21 ` Konrad Rzeszutek Wilk
2012-08-22 18:55 ` [Xen-devel] Q:pt_base in COMPAT mode offset by two pages. Was:Re: " Konrad Rzeszutek Wilk
2012-08-23 6:23 ` Jan Beulich
2012-08-23 6:23 ` Jan Beulich
2012-08-16 16:03 ` [PATCH 03/11] xen/mmu: The xen_setup_kernel_pagetable doesn't need to return anything Konrad Rzeszutek Wilk
2012-08-16 16:03 ` [PATCH 04/11] xen/mmu: Provide comments describing the _ka and _va aliasing issue Konrad Rzeszutek Wilk
2012-08-16 16:03 ` [PATCH 05/11] xen/mmu: use copy_page instead of memcpy Konrad Rzeszutek Wilk
2012-08-16 16:03 ` [PATCH 06/11] xen/mmu: For 64-bit do not call xen_map_identity_early Konrad Rzeszutek Wilk
2012-08-17 17:41 ` [Xen-devel] " Stefano Stabellini
2012-08-17 17:45 ` Konrad Rzeszutek Wilk
2012-08-20 11:45 ` Stefano Stabellini
2012-08-20 11:53 ` Ian Campbell
2012-08-20 11:58 ` Stefano Stabellini
2012-08-20 12:06 ` Konrad Rzeszutek Wilk
2012-08-20 12:19 ` Stefano Stabellini
2012-08-23 15:40 ` Konrad Rzeszutek Wilk
2012-08-23 15:57 ` Stefano Stabellini
2012-08-16 16:03 ` [PATCH 07/11] xen/mmu: Recycle the Xen provided L4, L3, and L2 pages Konrad Rzeszutek Wilk
2012-08-17 18:07 ` [Xen-devel] " Stefano Stabellini
2012-08-17 18:05 ` Konrad Rzeszutek Wilk [this message]
2012-08-16 16:03 ` [PATCH 08/11] xen/p2m: Add logic to revector a P2M tree to use __va leafs Konrad Rzeszutek Wilk
2012-08-16 16:03 ` [PATCH 09/11] xen/mmu: Copy and revector the P2M tree Konrad Rzeszutek Wilk
2012-08-16 16:03 ` [PATCH 10/11] xen/mmu: Remove from __ka space PMD entries for pagetables Konrad Rzeszutek Wilk
2012-08-16 16:03 ` [PATCH 11/11] xen/mmu: Release just the MFN list, not MFN list and part of pagetables Konrad Rzeszutek Wilk
2012-08-21 14:18 ` [Xen-devel] " Stefano Stabellini
2012-08-21 14:57 ` Konrad Rzeszutek Wilk
2012-08-21 15:27 ` Stefano Stabellini
2012-09-17 18:06 ` William Dauchy
2012-09-17 18:18 ` Konrad Rzeszutek Wilk
2012-08-17 17:39 ` [PATCH] Boot PV guests with more than 128GB (v3) for v3.7 Konrad Rzeszutek Wilk
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=20120817180557.GA18579@phenom.dumpdata.com \
--to=konrad.wilk@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=stefano.stabellini@eu.citrix.com \
--cc=xen-devel@lists.xensource.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.