On Wed, Aug 01, 2007 at 02:07:54PM -0500, Hollis Blanchard wrote:
> On Wed, 2007-08-01 at 15:36 +0900, Isaku Yamahata wrote:
> > remove xencomm page size limit.
> > Currently xencomm has page size limit so that a domain with many memory
> > (e.g. 100GB+) can't be created.
> > This patch allows that the address array of struct xencomm_desc to cross
> > page boundary so that the size of struct xencomm_desc can exceed page size.
> > Note that struct xencomm_desc itself can't page boundary. 
> I'm confused about this.
> We noticed a much smaller limit doing save/restore. The p2m mapping
> maxed out at 512MB:
>       * a xencomm_desc must fit into 1 page (1<<12)
>       * it contains approx 1<<9 64-bit entries
>       * each entry points to a page of memory containing 1<<9 entries of
>         the p2m array
>       * total: 1<<18 p2m entries
>       * each p2m entry represents a guest page (1<<12)
>       * 1<<30 total guest memory can be represented with a single
>         xencomm_desc
> But we can issue sequential p2m hcalls with different offsets, so we do.
> So what exactly is the new problem?

The limit is about 64GB for xen/ia64 because xen/ia64 deafult page size
is 16KB.
The issue I'm seeing is the populate physmap hypercall failure
at domain creation. It's essentially same issue you described above.
I want to remove the limitation with the patches.

> Secondly, your patch doesn't make much sense to me, because the Xen side
> is explicitly rejecting xencomm_descs that cross a page boundary. So
> even if Linux sends down a multipage descriptor, Xen will return EINVAL.
> Am I missing something?

The patch description should have been clearer.
It confuses struct xencomm_desc itself (note sizeof(struct xencomm_descs) = 8)
with xencomm_desc->address[] variable sized array.
Please remember
struct xencomm_desc {
    uint32_t magic;
    uint32_t nr_addrs; /* the number of entries in address[] */
    uint64_t address[0];

Yes, struct xencomm_descs itself (8 bytes) can not cross page boundary.
But I want to allow the xencomm_descs->address[] variable sized array
to cross page boundary so that nr_addrs can be greater than
((PAGE_SIZE - sizeof(*desc)) / sizeof(desc->address[0]))
where struct xencomm_desc *desc;

> (As a side question, is it really so difficult for you guys to just use
> the common code? I tried very hard to make it easy for you to just
> implement a couple hooks; I can't imagine it would take more than a day
> to do it.)

Sorry for that. It seems to be good time to resolve it.
I'll work on xencomm consolidation.


Xen-ppc-devel mailing list

Reply via email to