Attached the updated patches. Please find them
- 13985_4fa9b86d41b8_grow_granttable_acm.patch
acm part. I did only compile test.
- 13986_cca098fd122c_grow_granttable_ia64.patch
ia64 part.
- 13987_f5f232aef7bd_grow_granttable_powerpc.patch
powerpc part. This patch prohibits growing grant table.
I didn't even compile test.
It needs review by xen/powerpc developers and they may
have their own opinions.
Thanks,
On Thu, Feb 15, 2007 at 02:39:37PM +0000, Keir Fraser wrote:
>
> Hi Isaku,
>
> The dynamic grant table patch is now in xen-unstable (c/s
> 13952:4bd0ea9c499). Can you update and resend these patches?
>
> Thanks,
> Keir
>
>
> On 6/1/07 06:48, "Isaku Yamahata" <[EMAIL PROTECTED]> wrote:
>
> > On Fri, Jan 05, 2007 at 01:43:10PM +0000, Keir Fraser wrote:
> >> This one is waiting for final review before being checked in. Some people
> >> want the functionality this enables (>3 VIFs per guest) so I'm posting the
> >> patch in advance of applying it to xen-unstable.
> >
> > I've been working on the same issue so that I have some patches.
> > I attached a part of them. Although they should be adjusted to
> > your patch which is to be commited, I wanted to send these out before
> > checking in.
> > If necessary, I'm willing to update them.
> >
> > - acm code uses NR_GRANT_ENTRIES.
> > The attached patch is only compile-tested.
> >
> > - IA64 code needs a slight domain initialization adjustment.
> >
> > - PPC code depends on the fact that shared grant table is machine
> > continguous.
> > I'm not familiar with PPC code so that I'm not sure how to solve it.
> > If arch specific code can override maximal grant table size,
> > Xen/PPC can prohibit growing grant table.
> > After solving the issue, they can allow to grow grant table.
>
>
> _______________________________________________
> Xen-devel mailing list
> [EMAIL PROTECTED]
> http://lists.xensource.com/xen-devel
>
--
yamahata
# HG changeset patch
# User [EMAIL PROTECTED]
# Date 1171867951 -32400
# Node ID 4fa9b86d41b8faeeb4338dabe62956ecb359b475
# Parent b5fc88aad1b0eb35d12e503982c70fdc27f0544a
acm catch up for expandable grant table.
only compile-test is done.
PATCHNAME: grow_granttable_acm
Signed-off-by: Isaku Yamahata <[EMAIL PROTECTED]>
diff -r b5fc88aad1b0 -r 4fa9b86d41b8 xen/acm/acm_simple_type_enforcement_hooks.c
--- a/xen/acm/acm_simple_type_enforcement_hooks.c Sun Feb 18 15:29:40 2007 +0000
+++ b/xen/acm/acm_simple_type_enforcement_hooks.c Mon Feb 19 15:52:31 2007 +0900
@@ -234,18 +234,16 @@ ste_init_state(struct acm_ste_policy_buf
}
}
/* b) check for grant table conflicts on shared pages */
- if ((*pd)->grant_table->shared == NULL) {
- printkd("%s: Grant ... sharing for domain %x not setup!\n", __func__, (*pd)->domain_id);
- continue;
- }
- for ( i = 0; i < NR_GRANT_ENTRIES; i++ ) {
- sha_copy = (*pd)->grant_table->shared[i];
+ spin_lock(&(*pd)->grant_table->lock);
+ for ( i = 0; i < nr_grant_entries((*pd)->grant_table); i++ ) {
+ sha_copy = shared_entry((*pd)->grant_table, i);
if ( sha_copy.flags ) {
printkd("%s: grant dom (%hu) SHARED (%d) flags:(%hx) dom:(%hu) frame:(%lx)\n",
__func__, (*pd)->domain_id, i, sha_copy.flags, sha_copy.domid,
(unsigned long)sha_copy.frame);
rdomid = sha_copy.domid;
if ((rdom = get_domain_by_id(rdomid)) == NULL) {
+ spin_unlock(&(*pd)->grant_table->lock);
printkd("%s: domain not found ERROR!\n", __func__);
goto out;
};
@@ -253,14 +251,17 @@ ste_init_state(struct acm_ste_policy_buf
ste_rssid = GET_SSIDP(ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY,
(struct acm_ssid_domain *)(rdom->ssid));
ste_rssidref = ste_rssid->ste_ssidref;
- put_domain(rdom);
if (!have_common_type(ste_ssidref, ste_rssidref)) {
+ spin_unlock(&(*pd)->grant_table->lock);
printkd("%s: Policy violation in grant table sharing domain %x -> domain %x.\n",
__func__, (*pd)->domain_id, rdomid);
+ put_domain(rdom);
goto out;
}
+ put_domain(rdom);
}
}
+ spin_unlock(&(*pd)->grant_table->lock);
}
violation = 0;
out:
diff -r b5fc88aad1b0 -r 4fa9b86d41b8 xen/common/grant_table.c
--- a/xen/common/grant_table.c Sun Feb 18 15:29:40 2007 +0000
+++ b/xen/common/grant_table.c Mon Feb 19 15:52:31 2007 +0900
@@ -100,9 +100,6 @@ nr_active_grant_frames(struct grant_tabl
return num_act_frames_from_sha_frames(nr_grant_frames(gt));
}
-#define SHGNT_PER_PAGE (PAGE_SIZE / sizeof(grant_entry_t))
-#define shared_entry(t, e) \
- ((t)->shared[(e)/SHGNT_PER_PAGE][(e)%SHGNT_PER_PAGE])
#define ACGNT_PER_PAGE (PAGE_SIZE / sizeof(struct active_grant_entry))
#define active_entry(t, e) \
((t)->active[(e)/ACGNT_PER_PAGE][(e)%ACGNT_PER_PAGE])
diff -r b5fc88aad1b0 -r 4fa9b86d41b8 xen/include/xen/grant_table.h
--- a/xen/include/xen/grant_table.h Sun Feb 18 15:29:40 2007 +0000
+++ b/xen/include/xen/grant_table.h Mon Feb 19 15:52:31 2007 +0900
@@ -120,4 +120,9 @@ static inline unsigned int nr_grant_entr
return (nr_grant_frames(gt) << PAGE_SHIFT) / sizeof(grant_entry_t);
}
+/* for acm_cimple_type_enforcement_hooks.c */
+#define SHGNT_PER_PAGE (PAGE_SIZE / sizeof(grant_entry_t))
+#define shared_entry(t, e) \
+ ((t)->shared[(e)/SHGNT_PER_PAGE][(e)%SHGNT_PER_PAGE])
+
#endif /* __XEN_GRANT_TABLE_H__ */
# HG changeset patch
# User [EMAIL PROTECTED]
# Date 1171869376 -32400
# Node ID cca098fd122c9568b67e4ffec5d0c992003e37b9
# Parent 4fa9b86d41b8faeeb4338dabe62956ecb359b475
GNTTAB: ia64 part expandable grant table
PATCHNAME: grow_granttable_ia64
Signed-off-by: Isaku Yamahata <[EMAIL PROTECTED]>
diff -r 4fa9b86d41b8 -r cca098fd122c xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c Mon Feb 19 15:52:31 2007 +0900
+++ b/xen/arch/ia64/xen/domain.c Mon Feb 19 16:16:16 2007 +0900
@@ -521,6 +521,16 @@ int arch_domain_create(struct domain *d)
if ((d->arch.mm.pgd = pgd_alloc(&d->arch.mm)) == NULL)
goto fail_nomem;
+ /*
+ * grant_table_create() can't fully initialize grant table for domain
+ * because it is called before arch_domain_create().
+ * Here we complete the initialization which requires p2m table.
+ */
+ spin_lock(&d->grant_table->lock);
+ for (i = 0; i < nr_grant_frames(d->grant_table); i++)
+ ia64_gnttab_create_shared_page(d, d->grant_table, i);
+ spin_unlock(&d->grant_table->lock);
+
d->arch.ioport_caps = rangeset_new(d, "I/O Ports",
RANGESETF_prettyprint_hex);
diff -r 4fa9b86d41b8 -r cca098fd122c xen/include/asm-ia64/grant_table.h
--- a/xen/include/asm-ia64/grant_table.h Mon Feb 19 15:52:31 2007 +0900
+++ b/xen/include/asm-ia64/grant_table.h Mon Feb 19 16:16:16 2007 +0900
@@ -13,15 +13,6 @@ int destroy_grant_host_mapping(unsigned
// for grant transfer
void guest_physmap_add_page(struct domain *d, unsigned long gpfn, unsigned long mfn);
-
-// for grant table shared page
-#define gnttab_create_shared_page(d, t, i) \
- do { \
- share_xen_page_with_guest( \
- virt_to_page((char *)(t)->shared + ((i) << PAGE_SHIFT)), \
- (d), XENSHARE_writable); \
- } while (0)
-
/* XXX
* somewhere appropriate
@@ -39,14 +30,32 @@ void guest_physmap_add_page(struct domai
/* Guest physical address of the grant table. */
#define IA64_GRANT_TABLE_PADDR IA64_XMAPPEDREGS_PADDR(NR_CPUS)
-#define gnttab_shared_maddr(d, t, i) \
- virt_to_maddr((char*)(t)->shared + ((i) << PAGE_SHIFT))
+#define gnttab_shared_maddr(t, i) (virt_to_maddr((t)->shared[(i)]))
+#define gnttab_shared_page(t, i) (virt_to_page((t)->shared[(i)]))
-# define gnttab_shared_gmfn(d, t, i) \
- ({ assign_domain_page((d), \
- IA64_GRANT_TABLE_PADDR + ((i) << PAGE_SHIFT), \
- gnttab_shared_maddr((d), (t), (i))); \
- (IA64_GRANT_TABLE_PADDR >> PAGE_SHIFT) + (i);})
+#define ia64_gnttab_create_shared_page(d, t, i) \
+ do { \
+ BUG_ON((d)->arch.mm.pgd == NULL); \
+ assign_domain_page((d), \
+ IA64_GRANT_TABLE_PADDR + ((i) << PAGE_SHIFT), \
+ gnttab_shared_maddr((t), (i))); \
+ } while (0)
+
+/*
+ * for grant table shared page
+ * grant_table_create() might call this macro before allocating the p2m table.
+ * In such case, arch_domain_create() completes the initialization.
+ */
+#define gnttab_create_shared_page(d, t, i) \
+ do { \
+ share_xen_page_with_guest(gnttab_shared_page((t), (i)), \
+ (d), XENSHARE_writable); \
+ if ((d)->arch.mm.pgd) \
+ ia64_gnttab_create_shared_page((d), (t), (i)); \
+ } while (0)
+
+#define gnttab_shared_gmfn(d, t, i) \
+ ((IA64_GRANT_TABLE_PADDR >> PAGE_SHIFT) + (i))
#define gnttab_mark_dirty(d, f) ((void)f)
# HG changeset patch
# User [EMAIL PROTECTED]
# Date 1171871352 -32400
# Node ID f5f232aef7bdfabd4997f45d88620dc45b50c185
# Parent cca098fd122c9568b67e4ffec5d0c992003e37b9
GNTTAB: powerpc part expandable grant table.
Currently it is inhibited to grow grant table on powerpc.
Patch only. Even compilation isn't tested.
PATCHNAME: grow_granttable_powerpc
Signed-off-by: Isaku Yamahata <[EMAIL PROTECTED]>
diff -r cca098fd122c -r f5f232aef7bd xen/arch/powerpc/mm.c
--- a/xen/arch/powerpc/mm.c Mon Feb 19 16:16:16 2007 +0900
+++ b/xen/arch/powerpc/mm.c Mon Feb 19 16:49:12 2007 +0900
@@ -412,7 +412,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));
@@ -490,9 +496,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 cca098fd122c -r f5f232aef7bd xen/common/grant_table.c
--- a/xen/common/grant_table.c Mon Feb 19 16:16:16 2007 +0900
+++ 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 cca098fd122c -r f5f232aef7bd xen/include/asm-powerpc/config.h
--- a/xen/include/asm-powerpc/config.h Mon Feb 19 16:16:16 2007 +0900
+++ 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 cca098fd122c -r f5f232aef7bd xen/include/asm-powerpc/grant_table.h
--- a/xen/include/asm-powerpc/grant_table.h Mon Feb 19 16:16:16 2007 +0900
+++ 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_frames[(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_frames[(i)]))
#define gnttab_shared_gmfn(d, t, i) \
(mfn_to_gmfn(d, gnttab_shared_mfn(d, t, i)))
diff -r cca098fd122c -r f5f232aef7bd xen/include/xen/grant_table.h
--- a/xen/include/xen/grant_table.h Mon Feb 19 16:16:16 2007 +0900
+++ 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
[email protected]
http://lists.xensource.com/xen-ppc-devel