# HG changeset patch
# User Hollis Blanchard <hollisb@xxxxxxxxxx>
# Date 1171871352 -32400
# Node ID 7e9dc164b5720dbf60929333d33f8d94e981fe5b
# Parent 3ac19fda0bc256bac20a4decf7e13bb086162220
GNTTAB: PowerPC patch for dynamic grant tables.
Grant table expansion is disabled for now, since we currently make assumptions
about grant table MFNs being contiguous.
Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx>
---
xen/arch/powerpc/mm.c | 16 ++++++++++++++--
xen/common/grant_table.c | 2 ++
xen/include/asm-powerpc/config.h | 9 +++++++++
xen/include/asm-powerpc/grant_table.h | 4 ++--
xen/include/xen/grant_table.h | 4 ++++
5 files changed, 31 insertions(+), 4 deletions(-)
diff -r 3ac19fda0bc2 -r 7e9dc164b572 xen/arch/powerpc/mm.c
--- a/xen/arch/powerpc/mm.c Fri Mar 02 12:11:52 2007 +0000
+++ b/xen/arch/powerpc/mm.c Mon Feb 19 16:49:12 2007 +0900
@@ -416,7 +416,13 @@ ulong pfn2mfn(struct domain *d, ulong pf
if (pfn & foreign_map_pfn) {
t = PFN_TYPE_FOREIGN;
mfn = foreign_to_mfn(d, pfn);
- } else if (pfn >= max_page && pfn < (max_page + NR_GRANT_FRAMES)) {
+ } else if (pfn >= max_page && pfn <
+ (max_page + nr_grant_frames(d->grant_table))) {
+ /* XXX access d->grant_table->nr_grant_frames without lock.
+ * Currently on powerpc dynamic expanding grant table is
+ * inhibited by setting max_nr_grant_frames = INITIAL_NR_GRANT_FRAMES
+ * so that this access is safe.
+ */
/* Its a grant table access */
t = PFN_TYPE_GNTTAB;
mfn = gnttab_shared_mfn(d, d->grant_table, (pfn - max_page));
@@ -494,9 +500,15 @@ unsigned long mfn_to_gmfn(struct domain
ulong gnttab_mfn;
ulong rma_mfn;
+ /* XXX access d->grant_table->nr_grant_frames without lock.
+ * Currently on powerpc dynamic expanding grant table is
+ * inhibited by setting max_nr_grant_frames = INITIAL_NR_GRANT_FRAMES
+ * so that this access is safe.
+ */
/* grant? */
gnttab_mfn = gnttab_shared_mfn(d, d->grant_table, 0);
- if (mfn >= gnttab_mfn && mfn < (gnttab_mfn + NR_GRANT_FRAMES))
+ if (mfn >= gnttab_mfn && mfn <
+ (gnttab_mfn + nr_grant_frames(d->grant_table)))
return max_page + (mfn - gnttab_mfn);
/* IO? */
diff -r 3ac19fda0bc2 -r 7e9dc164b572 xen/common/grant_table.c
--- a/xen/common/grant_table.c Fri Mar 02 12:11:52 2007 +0000
+++ b/xen/common/grant_table.c Mon Feb 19 16:49:12 2007 +0900
@@ -35,8 +35,10 @@
#include <xen/domain_page.h>
#include <acm/acm_hooks.h>
+#ifndef max_nr_grant_frames
unsigned int max_nr_grant_frames = DEFAULT_MAX_NR_GRANT_FRAMES;
integer_param("gnttab_max_nr_frames", max_nr_grant_frames);
+#endif
/* The maximum number of grant mappings is defined as a multiplier of the
* maximum number of grant table entries. This defines the multiplier used.
diff -r 3ac19fda0bc2 -r 7e9dc164b572 xen/include/asm-powerpc/config.h
--- a/xen/include/asm-powerpc/config.h Fri Mar 02 12:11:52 2007 +0000
+++ b/xen/include/asm-powerpc/config.h Mon Feb 19 16:49:12 2007 +0900
@@ -73,4 +73,13 @@ extern char __bss_start[];
#include <asm/powerpc64/config.h>
+/*
+ * Disallow grant table growing tempralily because pfn2mfn() and
+ * mfn_to_gmfn() depends on the fact that grant table is machine-address
+ * contiguous. Grant table growing breaks the assumption.
+ */
+#ifndef max_nr_grant_frames
+#define max_nr_grant_frames INITIAL_NR_GRANT_FRAMES
#endif
+
+#endif
diff -r 3ac19fda0bc2 -r 7e9dc164b572 xen/include/asm-powerpc/grant_table.h
--- a/xen/include/asm-powerpc/grant_table.h Fri Mar 02 12:11:52 2007 +0000
+++ b/xen/include/asm-powerpc/grant_table.h Mon Feb 19 16:49:12 2007 +0900
@@ -41,11 +41,11 @@ int destroy_grant_host_mapping(
#define gnttab_create_shared_page(d, t, i) \
do { \
share_xen_page_with_guest( \
- virt_to_page((char *)(t)->shared + ((i) * PAGE_SIZE)), \
+ virt_to_page((t)->shared[(i)]), \
(d), XENSHARE_writable); \
} while ( 0 )
-#define gnttab_shared_mfn(d, t, i) (((ulong)((t)->shared) >> PAGE_SHIFT) + (i))
+#define gnttab_shared_mfn(d, t, i) (virt_to_mfn((t)->shared[(i)]))
#define gnttab_shared_gmfn(d, t, i) \
(mfn_to_gmfn(d, gnttab_shared_mfn(d, t, i)))
diff -r 3ac19fda0bc2 -r 7e9dc164b572 xen/include/xen/grant_table.h
--- a/xen/include/xen/grant_table.h Fri Mar 02 12:11:52 2007 +0000
+++ b/xen/include/xen/grant_table.h Mon Feb 19 16:49:12 2007 +0900
@@ -56,10 +56,14 @@ struct active_grant_entry {
#define INITIAL_NR_GRANT_ENTRIES ((INITIAL_NR_GRANT_FRAMES << PAGE_SHIFT) / \
sizeof(grant_entry_t))
+#ifndef DEFAULT_MAX_NR_GRANT_FRAMES /* to allow arch to override */
/* Default maximum size of a grant table. [POLICY] */
#define DEFAULT_MAX_NR_GRANT_FRAMES 32
+#endif
+#ifndef max_nr_grant_frames /* to allow arch to override */
/* The maximum size of a grant table. */
extern unsigned int max_nr_grant_frames;
+#endif
/*
* Tracks a mapping of another domain's grant reference. Each domain has a
_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel
|