Hi Alex.
Machine vector means that dma api is accessed indirectory.
Potentially it might be possible to replace dma api
implementation dynamically with xen-paravirtualized one
on unmodified (non-xen) Linux kernel of CONFIG_IA64_GENERIC=y.
Then pci front could be used for VTi domain with paravirtualized
device driver module.
Does it sound useful?
On Thu, May 03, 2007 at 09:35:58PM -0600, Alex Williamson wrote:
> Hi,
>
> This is another work in progress patch. The previous swiotlb &
> sba_iommu paravirtualization seems to work pretty well on dom0, but not
> so much for domU. domUs will naturally start up using the DIG machine
> vector, which means they try to allocate an swiotlb buffer. This fails.
> The x86 code we were borrowing handled this via some ugly branches in
> the PCI DMA mapping services. I think we can do this more cleanly on
> ia64 by creating a Xen machine vector. This replaces the DMA mapping
> services with very basic services. The idea is that the Xen machine
> vector is only for domU guests. I need to add some error catching,
> copyrights, and actually get it working reliably (it seem to be getting
> upcalls while unmapping DMA and ending up in bad page faults in dom0),
> but I thought I'd run this idea by the group before doing all the
> polishing.
>
> This patch applies on top of the previous swiotlb/sba_iommu/generic
> patch and you'll need to add the following files to the sparse tree
> before applying:
>
> linux-2.6-xen-sparse/include/asm-ia64/machvec.h
> linux-2.6-xen-sparse/arch/ia64/kernel/acpi.c
>
> Is this the way to go? I think it might add some interesting
> flexibility. The -xenU kernel config should probably switch to a
> CONFIG_IA64_XEN flavor with this. Thanks,
>
> Alex
>
> Signed-off-by: Alex Williamson <alex.williamson@xxxxxx>
> ---
>
> diff -r 6e86c16c2db2 linux-2.6-xen-sparse/arch/ia64/Kconfig
> --- a/linux-2.6-xen-sparse/arch/ia64/Kconfig Thu May 03 15:45:52 2007 -0600
> +++ b/linux-2.6-xen-sparse/arch/ia64/Kconfig Thu May 03 17:32:27 2007 -0600
> @@ -160,6 +160,10 @@ config IA64_SGI_SN2
>
> config IA64_HP_SIM
> bool "Ski-simulator"
> +
> +config IA64_XEN
> + bool "Xen guest"
> + depends on XEN
>
> endchoice
>
> diff -r 6e86c16c2db2 linux-2.6-xen-sparse/arch/ia64/xen/machvec.c
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/linux-2.6-xen-sparse/arch/ia64/xen/machvec.c Thu May 03 16:56:28
> 2007 -0600
> @@ -0,0 +1,4 @@
> +#define MACHVEC_PLATFORM_NAME xen
> +#define MACHVEC_PLATFORM_HEADER <asm/machvec_xen.h>
> +#include <asm/machvec_init.h>
> +
> diff -r 6e86c16c2db2 linux-2.6-xen-sparse/arch/ia64/xen/xen_pci_dma.c
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/linux-2.6-xen-sparse/arch/ia64/xen/xen_pci_dma.c Thu May 03
> 17:47:12 2007 -0600
> @@ -0,0 +1,94 @@
> +#include <linux/dma-mapping.h>
> +#include <linux/mm.h>
> +#include <asm/scatterlist.h>
> +
> +int
> +xen_map_sg(struct device *hwdev, struct scatterlist *sg, int nents,
> + enum dma_data_direction direction)
> +{
> + int i;
> +
> + for (i = 0 ; i < nents ; i++) {
> + sg[i].dma_address = page_to_bus(sg[i].page) + sg[i].offset;
> + sg[i].dma_length = sg[i].length;
> + }
> +
> + return nents;
> +}
> +EXPORT_SYMBOL(xen_map_sg);
> +
> +void
> +xen_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents,
> + enum dma_data_direction direction)
> +{
> +}
> +EXPORT_SYMBOL(xen_unmap_sg);
> +
> +int
> +xen_dma_mapping_error(dma_addr_t dma_addr)
> +{
> + return 0;
> +}
> +EXPORT_SYMBOL(xen_dma_mapping_error);
> +
> +int
> +xen_dma_supported(struct device *dev, u64 mask)
> +{
> + return 1;
> +}
> +EXPORT_SYMBOL(xen_dma_supported);
> +
> +void *
> +xen_alloc_coherent(struct device *dev, size_t size,
> + dma_addr_t *dma_handle, gfp_t gfp)
> +{
> + unsigned long vaddr;
> + unsigned int order = get_order(size);
> +
> + vaddr = __get_free_pages(gfp, order);
> +
> + if (!vaddr)
> + return NULL;
> +
> + if (xen_create_contiguous_region(vaddr, order,
> + dev->coherent_dma_mask)) {
> + free_pages(vaddr, order);
> + return NULL;
> + }
> +
> + memset((void *)vaddr, 0, size);
> + *dma_handle = virt_to_bus((void *)vaddr);
> +
> + return (void *)vaddr;
> +}
> +EXPORT_SYMBOL(xen_alloc_coherent);
> +
> +void
> +xen_free_coherent(struct device *dev, size_t size,
> + void *vaddr, dma_addr_t dma_handle)
> +{
> + unsigned int order = get_order(size);
> +
> + xen_destroy_contiguous_region((unsigned long)vaddr, order);
> + free_pages((unsigned long)vaddr, order);
> +}
> +EXPORT_SYMBOL(xen_free_coherent);
> +
> +dma_addr_t
> +xen_map_single(struct device *dev, void *ptr, size_t size,
> + enum dma_data_direction direction)
> +{
> + return virt_to_bus(ptr);
> +}
> +EXPORT_SYMBOL(xen_map_single);
> +
> +void
> +xen_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
> + enum dma_data_direction direction)
> +{
> +}
> +EXPORT_SYMBOL(xen_unmap_single);
> +
> +
> +
> +
> diff -r 6e86c16c2db2 linux-2.6-xen-sparse/include/asm-ia64/machvec_xen.h
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/linux-2.6-xen-sparse/include/asm-ia64/machvec_xen.h Thu May 03
> 17:33:48 2007 -0600
> @@ -0,0 +1,37 @@
> +#ifndef _ASM_IA64_MACHVEC_XEN_h
> +#define _ASM_IA64_MACHVEC_XEN_h
> +
> +extern ia64_mv_setup_t dig_setup;
> +extern ia64_mv_dma_alloc_coherent xen_alloc_coherent;
> +extern ia64_mv_dma_free_coherent xen_free_coherent;
> +extern ia64_mv_dma_map_single xen_map_single;
> +extern ia64_mv_dma_unmap_single xen_unmap_single;
> +extern ia64_mv_dma_map_sg xen_map_sg;
> +extern ia64_mv_dma_unmap_sg xen_unmap_sg;
> +extern ia64_mv_dma_supported xen_dma_supported;
> +extern ia64_mv_dma_mapping_error xen_dma_mapping_error;
> +
> +/*
> + * This stuff has dual use!
> + *
> + * For a generic kernel, the macros are used to initialize the
> + * platform's machvec structure. When compiling a non-generic kernel,
> + * the macros are used directly.
> + */
> +#define platform_name "xen"
> +#define platform_setup dig_setup
> +#define platform_dma_init machvec_noop
> +#define platform_dma_alloc_coherent xen_alloc_coherent
> +#define platform_dma_free_coherent xen_free_coherent
> +#define platform_dma_map_single xen_map_single
> +#define platform_dma_unmap_single xen_unmap_single
> +#define platform_dma_map_sg xen_map_sg
> +#define platform_dma_unmap_sg xen_unmap_sg
> +#define platform_dma_sync_single_for_cpu machvec_dma_sync_single
> +#define platform_dma_sync_sg_for_cpu machvec_dma_sync_sg
> +#define platform_dma_sync_single_for_device machvec_dma_sync_single
> +#define platform_dma_sync_sg_for_device machvec_dma_sync_sg
> +#define platform_dma_supported xen_dma_supported
> +#define platform_dma_mapping_error xen_dma_mapping_error
> +
> +#endif /* _ASM_IA64_MACHVEC_XEN_h */
> --- a/linux-2.6-xen-sparse/include/asm-ia64/machvec.h 2006-09-19
> 21:42:06.000000000 -0600
> +++ b/linux-2.6-xen-sparse/include/asm-ia64/machvec.h 2007-05-03
> 17:26:02.000000000 -0600
> @@ -108,6 +108,8 @@
> # include <asm/machvec_hpzx1_swiotlb.h>
> # elif defined (CONFIG_IA64_SGI_SN2)
> # include <asm/machvec_sn2.h>
> +# elif defined (CONFIG_IA64_XEN)
> +# include <asm/machvec_xen.h>
> # elif defined (CONFIG_IA64_GENERIC)
>
> # ifdef MACHVEC_PLATFORM_HEADER
> --- a/linux-2.6-xen-sparse/arch/ia64/kernel/acpi.c 2006-09-19
> 21:42:06.000000000 -0600
> +++ b/linux-2.6-xen-sparse/arch/ia64/kernel/acpi.c 2007-05-03
> 17:52:43.000000000 -0600
> @@ -109,6 +109,10 @@
> return "hpzx1";
> } else if (!strcmp(hdr->oem_id, "SGI")) {
> return "sn2";
> +#ifdef CONFIG_XEN
> + } else if (!strcmp(hdr->oem_id, "XEN")) {
> + return "xen";
> +#endif
> }
>
> return "dig";
> @@ -123,6 +127,8 @@
> return "sn2";
> # elif defined (CONFIG_IA64_DIG)
> return "dig";
> +# elif defined (CONFIG_IA64_XEN)
> + return "xen";
> # else
> # error Unknown platform. Fix acpi.c.
> # endif
> --- a/linux-2.6-xen-sparse/arch/ia64/xen/Makefile 2007-05-02
> 22:52:34.000000000 -0600
> +++ b/linux-2.6-xen-sparse/arch/ia64/xen/Makefile 2007-05-03
> 17:35:31.000000000 -0600
> @@ -4,4 +4,6 @@
>
> obj-y := hypercall.o xenivt.o xenentry.o xensetup.o xenpal.o xenhpski.o \
> hypervisor.o util.o xencomm.o xcom_hcall.o xcom_mini.o \
> - xcom_privcmd.o mem.o
> + xcom_privcmd.o mem.o xen_pci_dma.o
> +
> +obj-$(CONFIG_IA64_GENERIC) += machvec.o
>
>
>
> _______________________________________________
> Xen-ia64-devel mailing list
> Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-ia64-devel
>
--
yamahata
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|