[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-ia64-devel] [RFC] Xen machine vector



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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.