(CCed to xen-devel for completeness. ;)
On Wed, 2006-08-16 at 17:24 +0200, Tristan Gingold wrote:
> I am porting xen-ppc's xencomm to xen/ia64.
> Currently on xen/ia64 copy_from/to_guest uses guest virtual address. This
> works well as long as the virtual addresses are in the TLB. When not in TLB
> (or vTLB) the hypercall can't success without domain help. The possible
> solution is either to touch the memory areas before doing the hypercall
> and/or restarting the hypercall.
> Touching the memory area is an hack and we can't be sure it works.
> Restarting the hypercall is not always possible (some hypercalls are atomic:
> DOM0_SHADOW_CONTROL_OP_CLEAN) or can result in a live-lock.
> The most simple solution is to use guest physical addresses instead of
> For hypercalls directly issued by the kernel, the translation is very easy.
> For hypercalls (indirectly) issued by dom0 though the ioctl, kernel has to do
> the translation. Because it may not be linear in guest physical memory the
> parameter is a pointer to a list of page (xencomm).
> The pros of such approach is simplicity and reliability.
> The main cons is maybe speed. Hopefully the most frequent hypercalls (dom0vp
> and eoi) either don't use in memory parameters (dom0vp) or may be modified so
> that they pass parameters through registers (eoi). IMHO speed won't be
> Access to guest memory is also performed during vcpu_translate (to read vhpt)
> or EFI/PAL/SAL calls. We can either do not change that code (ie both
> mechanisms are not exclusive) or change the code. This point will be
Right, by switching to the xencomm approach for copy_*_guest(), you lose
the ability to copy_*_guest() with arbitrary addresses, because
copy_*_guest() *requires* that the guest kernel has passed in a xencomm
x86 has a copy_*_user() implementation, which is used only in x86 code
and is independent of the copy_*_guest() API. You could create a similar
parallel API if you need to.
> If we agree on using xencomm we will have to work with xen/ppc people in
> not to duplicate the code. Hopefully it is rather small. I have enhanced
> the xencomm code so that the kernel may not use xencomm area but pass the
> guest physical address with a flag to know the space is linear in memory.
> At this time I can boot dom0 with xencomm. I will publish the patch later.
I'll be very interested to see your patch. I guess the "flag" is a
reserved bit in the (physical) address passed from kernel to hypervisor?
Does that really gain much performance?
I guess you will need to do the same thing we need to with privcmd ioctl
handling, i.e. copy and modify the pointers in the dom0_op data
structures passed to the kernel. :(
We need to do one more thing though: we *also* need to change fix up the
size of longs and pointers in our code (since 32-bit userland is passing
structures to a 64-bit kernel). So perhaps these two fixup passes could
be split: we could share the xencomm conversion in common code, and PPC
arch code could contain the size munging.
This is why passing complex data structures as hcall parameters will
always be a bad thing.
IBM Linux Technology Center
Xen-ppc-devel mailing list