From: Julien Grall <julien.grall@citrix.com>
To: <xen-devel@lists.xenproject.org>
Cc: <linux-arm-kernel@lists.infradead.org>, <ian.campbell@citrix.com>,
<stefano.stabellini@eu.citrix.com>,
<linux-kernel@vger.kernel.org>,
"Julien Grall" <julien.grall@citrix.com>,
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
Boris Ostrovsky <boris.ostrovsky@oracle.com>,
"David Vrabel" <david.vrabel@citrix.com>,
Wei Liu <wei.liu2@citrix.com>
Subject: [PATCH v5 12/22] xen/balloon: Don't rely on the page granularity is the same for Xen and Linux
Date: Wed, 30 Sep 2015 11:45:27 +0100 [thread overview]
Message-ID: <1443609937-25278-13-git-send-email-julien.grall@citrix.com> (raw)
In-Reply-To: <1443609937-25278-1-git-send-email-julien.grall@citrix.com>
For ARM64 guests, Linux is able to support either 64K or 4K page
granularity. Although, the hypercall interface is always based on 4K
page granularity.
With 64K page granularity, a single page will be spread over multiple
Xen frame.
To avoid splitting the page into 4K frame, take advantage of the
extent_order field to directly allocate/free chunk of the Linux page
size.
Note that PVMMU is only used for PV guest (which is x86) and the page
granularity is always 4KB. Some BUILD_BUG_ON has been added to ensure
that because the code has not been modified.
Signed-off-by: Julien Grall <julien.grall@citrix.com>
Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: David Vrabel <david.vrabel@citrix.com>
Cc: Wei Liu <wei.liu2@citrix.com>
Note that two BUILD_BUG_ON(XEN_PAGE_SIZE != PAGE_SIZE) in code built
for the PV MMU code is kept in order to have at least one even if we
ever decide to drop of code section.
Stefano, I've kept your reviewed-by because the rebase conflict was very
trivial. Let me know if it's not okay.
Changes in v5:
- Add Stefano's reviewed-by
- Fix comment coding style
- Rebase on top of xentip/for-linus-4.4. Got minor conflict
Changes in v4:
- s/xen_page_to_pfn/page_to_xen_pfn/ based on the new naming
- Use the field lru in the page to get a list of pages when
decreasing the memory reservation. It avoids to use a static
array to store the pages (see v3).
- Update comment for EXTENT_ORDER.
Changes in v3:
- Fix errors reported by checkpatch.pl
- s/mfn/gfn/ based on the new naming
- Rather than splitting the page into 4KB chunk, use the
extent_order field to allocate directly a Linux page size. This
is avoid lots of code for no benefits.
Changes in v2:
- Use xen_apply_to_page to split a page in 4K chunk
- It's not necessary to have a smaller frame list. Re-use
PAGE_SIZE
- Convert reserve_additional_memory to use XEN_... macro
---
drivers/xen/balloon.c | 69 ++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 54 insertions(+), 15 deletions(-)
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
index 5fd7ee1..eaab31f 100644
--- a/drivers/xen/balloon.c
+++ b/drivers/xen/balloon.c
@@ -113,6 +113,12 @@ static struct ctl_table xen_root[] = {
#endif
/*
+ * Use one extent per PAGE_SIZE to avoid to break down the page into
+ * multiple frame.
+ */
+#define EXTENT_ORDER (fls(XEN_PFN_PER_PAGE) - 1)
+
+/*
* balloon_process() state:
*
* BP_DONE: done or nothing to do,
@@ -304,6 +310,12 @@ static enum bp_state reserve_additional_memory(void)
nid = memory_add_physaddr_to_nid(resource->start);
#ifdef CONFIG_XEN_HAVE_PVMMU
+ /*
+ * We don't support PV MMU when Linux and Xen is using
+ * different page granularity.
+ */
+ BUILD_BUG_ON(XEN_PAGE_SIZE != PAGE_SIZE);
+
/*
* add_memory() will build page tables for the new memory so
* the p2m must contain invalid entries so the correct
@@ -384,11 +396,11 @@ static bool balloon_is_inflated(void)
static enum bp_state increase_reservation(unsigned long nr_pages)
{
int rc;
- unsigned long pfn, i;
+ unsigned long i;
struct page *page;
struct xen_memory_reservation reservation = {
.address_bits = 0,
- .extent_order = 0,
+ .extent_order = EXTENT_ORDER,
.domid = DOMID_SELF
};
@@ -401,7 +413,11 @@ static enum bp_state increase_reservation(unsigned long nr_pages)
nr_pages = i;
break;
}
- frame_list[i] = page_to_pfn(page);
+
+ /* XENMEM_populate_physmap requires a PFN based on Xen
+ * granularity.
+ */
+ frame_list[i] = page_to_xen_pfn(page);
page = balloon_next_page(page);
}
@@ -415,10 +431,16 @@ static enum bp_state increase_reservation(unsigned long nr_pages)
page = balloon_retrieve(false);
BUG_ON(page == NULL);
- pfn = page_to_pfn(page);
-
#ifdef CONFIG_XEN_HAVE_PVMMU
+ /*
+ * We don't support PV MMU when Linux and Xen is using
+ * different page granularity.
+ */
+ BUILD_BUG_ON(XEN_PAGE_SIZE != PAGE_SIZE);
+
if (!xen_feature(XENFEAT_auto_translated_physmap)) {
+ unsigned long pfn = page_to_pfn(page);
+
set_phys_to_machine(pfn, frame_list[i]);
/* Link back into the page tables if not highmem. */
@@ -445,14 +467,15 @@ static enum bp_state increase_reservation(unsigned long nr_pages)
static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
{
enum bp_state state = BP_DONE;
- unsigned long pfn, i;
- struct page *page;
+ unsigned long i;
+ struct page *page, *tmp;
int ret;
struct xen_memory_reservation reservation = {
.address_bits = 0,
- .extent_order = 0,
+ .extent_order = EXTENT_ORDER,
.domid = DOMID_SELF
};
+ LIST_HEAD(pages);
if (nr_pages > ARRAY_SIZE(frame_list))
nr_pages = ARRAY_SIZE(frame_list);
@@ -465,8 +488,7 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
break;
}
scrub_page(page);
-
- frame_list[i] = page_to_pfn(page);
+ list_add(&page->lru, &pages);
}
/*
@@ -478,14 +500,24 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
*/
kmap_flush_unused();
- /* Update direct mapping, invalidate P2M, and add to balloon. */
- for (i = 0; i < nr_pages; i++) {
- pfn = frame_list[i];
- frame_list[i] = pfn_to_gfn(pfn);
- page = pfn_to_page(pfn);
+ /*
+ * Setup the frame, update direct mapping, invalidate P2M,
+ * and add to balloon.
+ */
+ list_for_each_entry_safe(page, tmp, &pages, lru) {
+ /* XENMEM_decrease_reservation requires a GFN */
+ frame_list[i] = xen_page_to_gfn(page);
#ifdef CONFIG_XEN_HAVE_PVMMU
+ /*
+ * We don't support PV MMU when Linux and Xen is using
+ * different page granularity.
+ */
+ BUILD_BUG_ON(XEN_PAGE_SIZE != PAGE_SIZE);
+
if (!xen_feature(XENFEAT_auto_translated_physmap)) {
+ unsigned long pfn = page_to_pfn(page);
+
if (!PageHighMem(page)) {
ret = HYPERVISOR_update_va_mapping(
(unsigned long)__va(pfn << PAGE_SHIFT),
@@ -495,6 +527,7 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
__set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
}
#endif
+ list_del(&page->lru);
balloon_append(page);
}
@@ -603,6 +636,12 @@ int alloc_xenballooned_pages(int nr_pages, struct page **pages)
if (page) {
pages[pgno++] = page;
#ifdef CONFIG_XEN_HAVE_PVMMU
+ /*
+ * We don't support PV MMU when Linux and Xen is using
+ * different page granularity.
+ */
+ BUILD_BUG_ON(XEN_PAGE_SIZE != PAGE_SIZE);
+
ret = xen_alloc_p2m_entry(page_to_pfn(page));
if (ret < 0)
goto out_undo;
--
2.1.4
next prev parent reply other threads:[~2015-09-30 10:54 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-30 10:45 [PATCH v5 00/22] xen/arm64: Add support for 64KB page in Linux Julien Grall
2015-09-30 10:45 ` [PATCH v5 01/22] net/xen-netback: xenvif_gop_frag_copy: move GSO check out of the loop Julien Grall
2015-09-30 10:45 ` [PATCH v5 02/22] arm/xen: Drop pte_mfn and mfn_pte Julien Grall
2015-09-30 10:45 ` [PATCH v5 03/22] xen: Add Xen specific page definition Julien Grall
2015-09-30 10:45 ` [PATCH v5 04/22] xen/grant: Introduce helpers to split a page into grant Julien Grall
2015-09-30 10:45 ` [PATCH v5 05/22] xen/grant: Add helper gnttab_page_grant_foreign_access_ref_one Julien Grall
2015-09-30 10:50 ` Julien Grall
2015-09-30 10:45 ` [PATCH v5 06/22] block/xen-blkfront: Split blkif_queue_request in 2 Julien Grall
2015-09-30 10:45 ` [PATCH v5 07/22] block/xen-blkfront: Store a page rather a pfn in the grant structure Julien Grall
2015-09-30 10:45 ` [PATCH v5 08/22] block/xen-blkfront: split get_grant in 2 Julien Grall
2015-09-30 10:45 ` [PATCH v5 09/22] xen/biomerge: Don't allow biovec's to be merged when Linux is not using 4KB pages Julien Grall
2015-09-30 10:45 ` [PATCH v5 10/22] xen/xenbus: Use Xen page definition Julien Grall
2015-09-30 10:45 ` [PATCH v5 11/22] tty/hvc: xen: Use xen " Julien Grall
2015-09-30 10:45 ` Julien Grall [this message]
2015-10-02 14:09 ` [PATCH v5 12/22] xen/balloon: Don't rely on the page granularity is the same for Xen and Linux David Vrabel
2015-10-02 14:31 ` Julien Grall
2015-10-02 14:52 ` Julien Grall
2015-10-02 15:18 ` Boris Ostrovsky
2015-10-02 15:19 ` [Xen-devel] " David Vrabel
2015-09-30 10:45 ` [PATCH v5 13/22] xen/events: fifo: Make it running on 64KB granularity Julien Grall
2015-09-30 10:45 ` [PATCH v5 14/22] xen/grant-table: " Julien Grall
2015-09-30 10:45 ` [PATCH v5 15/22] block/xen-blkfront: Make it running on 64KB page granularity Julien Grall
2015-09-30 10:45 ` [PATCH v5 16/22] block/xen-blkback: " Julien Grall
2015-09-30 10:45 ` [PATCH v5 17/22] net/xen-netfront: " Julien Grall
2015-09-30 10:45 ` [PATCH v5 18/22] net/xen-netback: " Julien Grall
2015-09-30 10:45 ` [PATCH v5 19/22] xen/privcmd: Add support for Linux " Julien Grall
2015-09-30 10:45 ` [PATCH v5 20/22] arm/xen: Add support for " Julien Grall
2015-09-30 10:45 ` [PATCH v5 21/22] xen/swiotlb: Pass addresses rather than frame numbers to xen_arch_need_swiotlb Julien Grall
2015-09-30 10:45 ` [PATCH v5 22/22] xen/swiotlb: Add support for 64KB page granularity Julien Grall
2015-09-30 11:32 ` [PATCH v5 00/22] xen/arm64: Add support for 64KB page in Linux Mark Rutland
2015-09-30 11:45 ` Julien Grall
2015-09-30 13:04 ` Mark Rutland
2015-10-01 15:15 ` [Xen-devel] " David Vrabel
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=1443609937-25278-13-git-send-email-julien.grall@citrix.com \
--to=julien.grall@citrix.com \
--cc=boris.ostrovsky@oracle.com \
--cc=david.vrabel@citrix.com \
--cc=ian.campbell@citrix.com \
--cc=konrad.wilk@oracle.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=stefano.stabellini@eu.citrix.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®