Isaku Yamahata
2007-Jun-11 07:35 UTC
[Xen-devel] [PATCH][Linux] gnttab: make dma address conversion logic of gnttab dma arch specific.
This patch is cleaned up of the patch which was sent as http://lists.xensource.com/archives/html/xen-devel/2007-06/msg00324.html # HG changeset patch # User yamahata@valinux.co.jp # Date 1181545986 -32400 # Node ID 69e2dd4e06c405a92717c5f1818f5096e1dc0bcd # Parent d5e0eb7dd069c0ffc1854da81aa143ccfb0ad66e make dma address conversion logic of gnttab dma arch specific. gnttab_dma_map_page() and gnttab_dma_unmap_page() uses machine address with dma address interchangebly. However it doesn''t work with auto translated mode enabled (i.e. on ia64) because - bus address space(dma_addr_t) is different from machine address space(maddr_t). With the terminology in xen/include/public/mm.h, dma_addr_t is maddr and maddr_t is gmaddr. So they should be handled differently with auto translated physmap mode enabled. - dma address conversion depends on dma api implementation and its paravirtualization. "pfn_valid(mfn_to_local_pfn(maddr >> PAGE_SHIFT)" check in gnttab_dma_map_page() doesn''t make sense with auto translate physmap mode enabled. To address those issues, split those logic from gnttab_dma_map_page() and gnttab_dma_unmap_page(), and put it into arch specific files. This patch doesn''t change the already existing x86 logic. PATCHNAME: make_dma_address_conversion_logic_of_gnttab_dma_arch_specific diff -r d5e0eb7dd069 -r 69e2dd4e06c4 arch/i386/kernel/pci-dma-xen.c --- a/arch/i386/kernel/pci-dma-xen.c Sun Jun 10 19:50:32 2007 +0100 +++ b/arch/i386/kernel/pci-dma-xen.c Mon Jun 11 16:13:06 2007 +0900 @@ -19,6 +19,7 @@ #include <asm/swiotlb.h> #include <asm/tlbflush.h> #include <asm-i386/mach-xen/asm/swiotlb.h> +#include <asm-i386/mach-xen/asm/gnttab_dma.h> #include <asm/bug.h> #ifdef __x86_64__ @@ -58,6 +59,12 @@ static int __init pci_iommu_init(void) /* Must execute after PCI subsystem */ fs_initcall(pci_iommu_init); #endif + +/* this should be in somewhere appropriate */ +int gnttab_dma_local_pfn(struct page *page) +{ + return pfn_valid(mfn_to_local_pfn(pfn_to_mfn(page_to_pfn(page)))); +} struct dma_coherent_mem { void *virt_base; diff -r d5e0eb7dd069 -r 69e2dd4e06c4 arch/i386/kernel/swiotlb.c --- a/arch/i386/kernel/swiotlb.c Sun Jun 10 19:50:32 2007 +0100 +++ b/arch/i386/kernel/swiotlb.c Mon Jun 11 16:13:06 2007 +0900 @@ -27,6 +27,7 @@ #include <asm/uaccess.h> #include <xen/gnttab.h> #include <xen/interface/memory.h> +#include <asm-i386/mach-xen/asm/gnttab_dma.h> int swiotlb; EXPORT_SYMBOL(swiotlb); diff -r d5e0eb7dd069 -r 69e2dd4e06c4 drivers/xen/core/gnttab.c --- a/drivers/xen/core/gnttab.c Sun Jun 10 19:50:32 2007 +0100 +++ b/drivers/xen/core/gnttab.c Mon Jun 11 16:13:06 2007 +0900 @@ -593,20 +593,18 @@ EXPORT_SYMBOL(gnttab_copy_grant_page); * * All other pages are simply returned as is. */ -maddr_t gnttab_dma_map_page(struct page *page) -{ - maddr_t maddr = page_to_bus(page); +void __gnttab_dma_map_page(struct page *page, + int (*local_pfn)(struct page *page)) +{ unsigned int seq; - if (!PageForeign(page)) - return maddr; + if (!is_running_on_xen() || !PageForeign(page)) + return; do { seq = read_seqbegin(&gnttab_dma_lock); - maddr = page_to_bus(page); - - /* Has it become a local MFN? */ - if (pfn_valid(mfn_to_local_pfn(maddr >> PAGE_SHIFT))) + + if (local_pfn && (*local_pfn)(page)) break; atomic_set(&page->_mapcount, 0); @@ -614,8 +612,6 @@ maddr_t gnttab_dma_map_page(struct page /* Make _mapcount visible before read_seqretry. */ smp_mb(); } while (unlikely(read_seqretry(&gnttab_dma_lock, seq))); - - return maddr; } int gnttab_resume(void) diff -r d5e0eb7dd069 -r 69e2dd4e06c4 include/asm-i386/mach-xen/asm/gnttab_dma.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-i386/mach-xen/asm/gnttab_dma.h Mon Jun 11 16:13:06 2007 +0900 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> + * Copyright (c) 2007 Isaku Yamahata <yamahata at valinux co jp> + * VA Linux Systems Japan K.K. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _ASM_I386_GNTTAB_DMA_H +#define _ASM_I386_GNTTAB_DMA_H + +int gnttab_dma_local_pfn(struct page *page); + +static inline maddr_t gnttab_dma_map_page(struct page *page) +{ + __gnttab_dma_map_page(page, &gnttab_dma_local_pfn); + return page_to_bus(page); +} + +static inline void gnttab_dma_unmap_page(maddr_t maddr) +{ + __gnttab_dma_unmap_page(virt_to_page(bus_to_virt(maddr))); +} + +#endif /* _ASM_I386_GNTTAB_DMA_H */ diff -r d5e0eb7dd069 -r 69e2dd4e06c4 include/asm-ia64/gnttab_dma.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-ia64/gnttab_dma.h Mon Jun 11 16:13:06 2007 +0900 @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> + * Copyright (c) 2007 Isaku Yamahata <yamahata at valinux co jp> + * VA Linux Systems Japan K.K. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _ASM_IA64_GNTTAB_DMA_H +#define _ASM_IA64_GNTTAB_DMA_H + +/* caller must get dma address after calling this function */ +static inline void gnttab_dma_use_page(struct page *page) +{ + __gnttab_dma_map_page(page, NULL); +} + +static inline dma_addr_t gnttab_dma_map_page(struct page *page) +{ + gnttab_dma_use_page(page); + return page_to_bus(page); +} + +static inline dma_addr_t gnttab_dma_map_virt(void *ptr) +{ + return gnttab_dma_map_page(virt_to_page(ptr)) + offset_in_page(ptr); +} + +static inline void gnttab_dma_unmap_page(dma_addr_t dma_address) +{ + __gnttab_dma_unmap_page(virt_to_page(bus_to_virt(dma_address))); +} + +#endif /* _ASM_IA64_GNTTAB_DMA_H */ diff -r d5e0eb7dd069 -r 69e2dd4e06c4 include/xen/gnttab.h --- a/include/xen/gnttab.h Sun Jun 10 19:50:32 2007 +0100 +++ b/include/xen/gnttab.h Mon Jun 11 16:13:06 2007 +0900 @@ -103,9 +103,9 @@ void gnttab_grant_foreign_transfer_ref(g unsigned long pfn); int gnttab_copy_grant_page(grant_ref_t ref, struct page **pagep); -maddr_t gnttab_dma_map_page(struct page *page); - -static inline void gnttab_dma_unmap_page(maddr_t mfn) +void __gnttab_dma_map_page(struct page *page, + int (*local_pfn)(struct page *page)); +static inline void __gnttab_dma_unmap_page(struct page *page) { } -- yamahata _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Keir Fraser
2007-Jun-11 08:17 UTC
Re: [Xen-devel] [PATCH][Linux] gnttab: make dma address conversion logic of gnttab dma arch specific.
I don''t spot a sign-off on this specific patch. Apart from that, I''ll check it in when Herbert acks it. -- Keir On 11/6/07 08:35, "Isaku Yamahata" <yamahata@valinux.co.jp> wrote:> This patch is cleaned up of the patch which was sent as > http://lists.xensource.com/archives/html/xen-devel/2007-06/msg00324.html > > # HG changeset patch > # User yamahata@valinux.co.jp > # Date 1181545986 -32400 > # Node ID 69e2dd4e06c405a92717c5f1818f5096e1dc0bcd > # Parent d5e0eb7dd069c0ffc1854da81aa143ccfb0ad66e > make dma address conversion logic of gnttab dma arch specific. > gnttab_dma_map_page() and gnttab_dma_unmap_page() uses machine address > with dma address interchangebly. > However it doesn''t work with auto translated mode enabled (i.e. on ia64) > because > > - bus address space(dma_addr_t) is different from machine address > space(maddr_t). > With the terminology in xen/include/public/mm.h, > dma_addr_t is maddr and maddr_t is gmaddr. > So they should be handled differently with auto translated physmap mode > enabled. > > - dma address conversion depends on dma api implementation and > its paravirtualization. > "pfn_valid(mfn_to_local_pfn(maddr >> PAGE_SHIFT)" check in > gnttab_dma_map_page() doesn''t make sense with auto translate physmap > mode enabled. > > To address those issues, split those logic from gnttab_dma_map_page() and > gnttab_dma_unmap_page(), and put it into arch specific files. > This patch doesn''t change the already existing x86 logic. > > PATCHNAME: make_dma_address_conversion_logic_of_gnttab_dma_arch_specific > > diff -r d5e0eb7dd069 -r 69e2dd4e06c4 arch/i386/kernel/pci-dma-xen.c > --- a/arch/i386/kernel/pci-dma-xen.c Sun Jun 10 19:50:32 2007 +0100 > +++ b/arch/i386/kernel/pci-dma-xen.c Mon Jun 11 16:13:06 2007 +0900 > @@ -19,6 +19,7 @@ > #include <asm/swiotlb.h> > #include <asm/tlbflush.h> > #include <asm-i386/mach-xen/asm/swiotlb.h> > +#include <asm-i386/mach-xen/asm/gnttab_dma.h> > #include <asm/bug.h> > > #ifdef __x86_64__ > @@ -58,6 +59,12 @@ static int __init pci_iommu_init(void) > /* Must execute after PCI subsystem */ > fs_initcall(pci_iommu_init); > #endif > + > +/* this should be in somewhere appropriate */ > +int gnttab_dma_local_pfn(struct page *page) > +{ > + return pfn_valid(mfn_to_local_pfn(pfn_to_mfn(page_to_pfn(page)))); > +} > > struct dma_coherent_mem { > void *virt_base; > diff -r d5e0eb7dd069 -r 69e2dd4e06c4 arch/i386/kernel/swiotlb.c > --- a/arch/i386/kernel/swiotlb.c Sun Jun 10 19:50:32 2007 +0100 > +++ b/arch/i386/kernel/swiotlb.c Mon Jun 11 16:13:06 2007 +0900 > @@ -27,6 +27,7 @@ > #include <asm/uaccess.h> > #include <xen/gnttab.h> > #include <xen/interface/memory.h> > +#include <asm-i386/mach-xen/asm/gnttab_dma.h> > > int swiotlb; > EXPORT_SYMBOL(swiotlb); > diff -r d5e0eb7dd069 -r 69e2dd4e06c4 drivers/xen/core/gnttab.c > --- a/drivers/xen/core/gnttab.c Sun Jun 10 19:50:32 2007 +0100 > +++ b/drivers/xen/core/gnttab.c Mon Jun 11 16:13:06 2007 +0900 > @@ -593,20 +593,18 @@ EXPORT_SYMBOL(gnttab_copy_grant_page); > * > * All other pages are simply returned as is. > */ > -maddr_t gnttab_dma_map_page(struct page *page) > -{ > - maddr_t maddr = page_to_bus(page); > +void __gnttab_dma_map_page(struct page *page, > + int (*local_pfn)(struct page *page)) > +{ > unsigned int seq; > > - if (!PageForeign(page)) > - return maddr; > + if (!is_running_on_xen() || !PageForeign(page)) > + return; > > do { > seq = read_seqbegin(&gnttab_dma_lock); > - maddr = page_to_bus(page); > - > - /* Has it become a local MFN? */ > - if (pfn_valid(mfn_to_local_pfn(maddr >> PAGE_SHIFT))) > + > + if (local_pfn && (*local_pfn)(page)) > break; > > atomic_set(&page->_mapcount, 0); > @@ -614,8 +612,6 @@ maddr_t gnttab_dma_map_page(struct page > /* Make _mapcount visible before read_seqretry. */ > smp_mb(); > } while (unlikely(read_seqretry(&gnttab_dma_lock, seq))); > - > - return maddr; > } > > int gnttab_resume(void) > diff -r d5e0eb7dd069 -r 69e2dd4e06c4 > include/asm-i386/mach-xen/asm/gnttab_dma.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-i386/mach-xen/asm/gnttab_dma.h Mon Jun 11 16:13:06 2007 > +0900 > @@ -0,0 +1,37 @@ > +/* > + * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> > + * Copyright (c) 2007 Isaku Yamahata <yamahata at valinux co jp> > + * VA Linux Systems Japan K.K. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > + */ > + > +#ifndef _ASM_I386_GNTTAB_DMA_H > +#define _ASM_I386_GNTTAB_DMA_H > + > +int gnttab_dma_local_pfn(struct page *page); > + > +static inline maddr_t gnttab_dma_map_page(struct page *page) > +{ > + __gnttab_dma_map_page(page, &gnttab_dma_local_pfn); > + return page_to_bus(page); > +} > + > +static inline void gnttab_dma_unmap_page(maddr_t maddr) > +{ > + __gnttab_dma_unmap_page(virt_to_page(bus_to_virt(maddr))); > +} > + > +#endif /* _ASM_I386_GNTTAB_DMA_H */ > diff -r d5e0eb7dd069 -r 69e2dd4e06c4 include/asm-ia64/gnttab_dma.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-ia64/gnttab_dma.h Mon Jun 11 16:13:06 2007 +0900 > @@ -0,0 +1,46 @@ > +/* > + * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> > + * Copyright (c) 2007 Isaku Yamahata <yamahata at valinux co jp> > + * VA Linux Systems Japan K.K. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > + */ > + > +#ifndef _ASM_IA64_GNTTAB_DMA_H > +#define _ASM_IA64_GNTTAB_DMA_H > + > +/* caller must get dma address after calling this function */ > +static inline void gnttab_dma_use_page(struct page *page) > +{ > + __gnttab_dma_map_page(page, NULL); > +} > + > +static inline dma_addr_t gnttab_dma_map_page(struct page *page) > +{ > + gnttab_dma_use_page(page); > + return page_to_bus(page); > +} > + > +static inline dma_addr_t gnttab_dma_map_virt(void *ptr) > +{ > + return gnttab_dma_map_page(virt_to_page(ptr)) + offset_in_page(ptr); > +} > + > +static inline void gnttab_dma_unmap_page(dma_addr_t dma_address) > +{ > + __gnttab_dma_unmap_page(virt_to_page(bus_to_virt(dma_address))); > +} > + > +#endif /* _ASM_IA64_GNTTAB_DMA_H */ > diff -r d5e0eb7dd069 -r 69e2dd4e06c4 include/xen/gnttab.h > --- a/include/xen/gnttab.h Sun Jun 10 19:50:32 2007 +0100 > +++ b/include/xen/gnttab.h Mon Jun 11 16:13:06 2007 +0900 > @@ -103,9 +103,9 @@ void gnttab_grant_foreign_transfer_ref(g > unsigned long pfn); > > int gnttab_copy_grant_page(grant_ref_t ref, struct page **pagep); > -maddr_t gnttab_dma_map_page(struct page *page); > - > -static inline void gnttab_dma_unmap_page(maddr_t mfn) > +void __gnttab_dma_map_page(struct page *page, > + int (*local_pfn)(struct page *page)); > +static inline void __gnttab_dma_unmap_page(struct page *page) > { > } > >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Isaku Yamahata
2007-Jun-11 08:18 UTC
Re: [Xen-devel] [PATCH][Linux] gnttab: make dma address conversion logic of gnttab dma arch specific.
On Mon, Jun 11, 2007 at 09:17:11AM +0100, Keir Fraser wrote:> I don''t spot a sign-off on this specific patch. Apart from that, I''ll check > it in when Herbert acks it.Sorry. Here is my signed-off. Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>> > -- Keir > > On 11/6/07 08:35, "Isaku Yamahata" <yamahata@valinux.co.jp> wrote: > > > This patch is cleaned up of the patch which was sent as > > http://lists.xensource.com/archives/html/xen-devel/2007-06/msg00324.html > > > > # HG changeset patch > > # User yamahata@valinux.co.jp > > # Date 1181545986 -32400 > > # Node ID 69e2dd4e06c405a92717c5f1818f5096e1dc0bcd > > # Parent d5e0eb7dd069c0ffc1854da81aa143ccfb0ad66e > > make dma address conversion logic of gnttab dma arch specific. > > gnttab_dma_map_page() and gnttab_dma_unmap_page() uses machine address > > with dma address interchangebly. > > However it doesn''t work with auto translated mode enabled (i.e. on ia64) > > because > > > > - bus address space(dma_addr_t) is different from machine address > > space(maddr_t). > > With the terminology in xen/include/public/mm.h, > > dma_addr_t is maddr and maddr_t is gmaddr. > > So they should be handled differently with auto translated physmap mode > > enabled. > > > > - dma address conversion depends on dma api implementation and > > its paravirtualization. > > "pfn_valid(mfn_to_local_pfn(maddr >> PAGE_SHIFT)" check in > > gnttab_dma_map_page() doesn''t make sense with auto translate physmap > > mode enabled. > > > > To address those issues, split those logic from gnttab_dma_map_page() and > > gnttab_dma_unmap_page(), and put it into arch specific files. > > This patch doesn''t change the already existing x86 logic. > > > > PATCHNAME: make_dma_address_conversion_logic_of_gnttab_dma_arch_specific > > > > diff -r d5e0eb7dd069 -r 69e2dd4e06c4 arch/i386/kernel/pci-dma-xen.c > > --- a/arch/i386/kernel/pci-dma-xen.c Sun Jun 10 19:50:32 2007 +0100 > > +++ b/arch/i386/kernel/pci-dma-xen.c Mon Jun 11 16:13:06 2007 +0900 > > @@ -19,6 +19,7 @@ > > #include <asm/swiotlb.h> > > #include <asm/tlbflush.h> > > #include <asm-i386/mach-xen/asm/swiotlb.h> > > +#include <asm-i386/mach-xen/asm/gnttab_dma.h> > > #include <asm/bug.h> > > > > #ifdef __x86_64__ > > @@ -58,6 +59,12 @@ static int __init pci_iommu_init(void) > > /* Must execute after PCI subsystem */ > > fs_initcall(pci_iommu_init); > > #endif > > + > > +/* this should be in somewhere appropriate */ > > +int gnttab_dma_local_pfn(struct page *page) > > +{ > > + return pfn_valid(mfn_to_local_pfn(pfn_to_mfn(page_to_pfn(page)))); > > +} > > > > struct dma_coherent_mem { > > void *virt_base; > > diff -r d5e0eb7dd069 -r 69e2dd4e06c4 arch/i386/kernel/swiotlb.c > > --- a/arch/i386/kernel/swiotlb.c Sun Jun 10 19:50:32 2007 +0100 > > +++ b/arch/i386/kernel/swiotlb.c Mon Jun 11 16:13:06 2007 +0900 > > @@ -27,6 +27,7 @@ > > #include <asm/uaccess.h> > > #include <xen/gnttab.h> > > #include <xen/interface/memory.h> > > +#include <asm-i386/mach-xen/asm/gnttab_dma.h> > > > > int swiotlb; > > EXPORT_SYMBOL(swiotlb); > > diff -r d5e0eb7dd069 -r 69e2dd4e06c4 drivers/xen/core/gnttab.c > > --- a/drivers/xen/core/gnttab.c Sun Jun 10 19:50:32 2007 +0100 > > +++ b/drivers/xen/core/gnttab.c Mon Jun 11 16:13:06 2007 +0900 > > @@ -593,20 +593,18 @@ EXPORT_SYMBOL(gnttab_copy_grant_page); > > * > > * All other pages are simply returned as is. > > */ > > -maddr_t gnttab_dma_map_page(struct page *page) > > -{ > > - maddr_t maddr = page_to_bus(page); > > +void __gnttab_dma_map_page(struct page *page, > > + int (*local_pfn)(struct page *page)) > > +{ > > unsigned int seq; > > > > - if (!PageForeign(page)) > > - return maddr; > > + if (!is_running_on_xen() || !PageForeign(page)) > > + return; > > > > do { > > seq = read_seqbegin(&gnttab_dma_lock); > > - maddr = page_to_bus(page); > > - > > - /* Has it become a local MFN? */ > > - if (pfn_valid(mfn_to_local_pfn(maddr >> PAGE_SHIFT))) > > + > > + if (local_pfn && (*local_pfn)(page)) > > break; > > > > atomic_set(&page->_mapcount, 0); > > @@ -614,8 +612,6 @@ maddr_t gnttab_dma_map_page(struct page > > /* Make _mapcount visible before read_seqretry. */ > > smp_mb(); > > } while (unlikely(read_seqretry(&gnttab_dma_lock, seq))); > > - > > - return maddr; > > } > > > > int gnttab_resume(void) > > diff -r d5e0eb7dd069 -r 69e2dd4e06c4 > > include/asm-i386/mach-xen/asm/gnttab_dma.h > > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > > +++ b/include/asm-i386/mach-xen/asm/gnttab_dma.h Mon Jun 11 16:13:06 2007 > > +0900 > > @@ -0,0 +1,37 @@ > > +/* > > + * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> > > + * Copyright (c) 2007 Isaku Yamahata <yamahata at valinux co jp> > > + * VA Linux Systems Japan K.K. > > + * > > + * This program is free software; you can redistribute it and/or modify > > + * it under the terms of the GNU General Public License as published by > > + * the Free Software Foundation; either version 2 of the License, or > > + * (at your option) any later version. > > + * > > + * This program is distributed in the hope that it will be useful, > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > + * GNU General Public License for more details. > > + * > > + * You should have received a copy of the GNU General Public License > > + * along with this program; if not, write to the Free Software > > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > > + */ > > + > > +#ifndef _ASM_I386_GNTTAB_DMA_H > > +#define _ASM_I386_GNTTAB_DMA_H > > + > > +int gnttab_dma_local_pfn(struct page *page); > > + > > +static inline maddr_t gnttab_dma_map_page(struct page *page) > > +{ > > + __gnttab_dma_map_page(page, &gnttab_dma_local_pfn); > > + return page_to_bus(page); > > +} > > + > > +static inline void gnttab_dma_unmap_page(maddr_t maddr) > > +{ > > + __gnttab_dma_unmap_page(virt_to_page(bus_to_virt(maddr))); > > +} > > + > > +#endif /* _ASM_I386_GNTTAB_DMA_H */ > > diff -r d5e0eb7dd069 -r 69e2dd4e06c4 include/asm-ia64/gnttab_dma.h > > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > > +++ b/include/asm-ia64/gnttab_dma.h Mon Jun 11 16:13:06 2007 +0900 > > @@ -0,0 +1,46 @@ > > +/* > > + * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> > > + * Copyright (c) 2007 Isaku Yamahata <yamahata at valinux co jp> > > + * VA Linux Systems Japan K.K. > > + * > > + * This program is free software; you can redistribute it and/or modify > > + * it under the terms of the GNU General Public License as published by > > + * the Free Software Foundation; either version 2 of the License, or > > + * (at your option) any later version. > > + * > > + * This program is distributed in the hope that it will be useful, > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > + * GNU General Public License for more details. > > + * > > + * You should have received a copy of the GNU General Public License > > + * along with this program; if not, write to the Free Software > > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > > + */ > > + > > +#ifndef _ASM_IA64_GNTTAB_DMA_H > > +#define _ASM_IA64_GNTTAB_DMA_H > > + > > +/* caller must get dma address after calling this function */ > > +static inline void gnttab_dma_use_page(struct page *page) > > +{ > > + __gnttab_dma_map_page(page, NULL); > > +} > > + > > +static inline dma_addr_t gnttab_dma_map_page(struct page *page) > > +{ > > + gnttab_dma_use_page(page); > > + return page_to_bus(page); > > +} > > + > > +static inline dma_addr_t gnttab_dma_map_virt(void *ptr) > > +{ > > + return gnttab_dma_map_page(virt_to_page(ptr)) + offset_in_page(ptr); > > +} > > + > > +static inline void gnttab_dma_unmap_page(dma_addr_t dma_address) > > +{ > > + __gnttab_dma_unmap_page(virt_to_page(bus_to_virt(dma_address))); > > +} > > + > > +#endif /* _ASM_IA64_GNTTAB_DMA_H */ > > diff -r d5e0eb7dd069 -r 69e2dd4e06c4 include/xen/gnttab.h > > --- a/include/xen/gnttab.h Sun Jun 10 19:50:32 2007 +0100 > > +++ b/include/xen/gnttab.h Mon Jun 11 16:13:06 2007 +0900 > > @@ -103,9 +103,9 @@ void gnttab_grant_foreign_transfer_ref(g > > unsigned long pfn); > > > > int gnttab_copy_grant_page(grant_ref_t ref, struct page **pagep); > > -maddr_t gnttab_dma_map_page(struct page *page); > > - > > -static inline void gnttab_dma_unmap_page(maddr_t mfn) > > +void __gnttab_dma_map_page(struct page *page, > > + int (*local_pfn)(struct page *page)); > > +static inline void __gnttab_dma_unmap_page(struct page *page) > > { > > } > > > > > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel >-- yamahata _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Herbert Xu
2007-Jun-11 08:23 UTC
[Xen-devel] Re: [PATCH][Linux] gnttab: make dma address conversion logic of gnttab dma arch specific.
On Mon, Jun 11, 2007 at 04:35:27PM +0900, Isaku Yamahata wrote:> This patch is cleaned up of the patch which was sent as > http://lists.xensource.com/archives/html/xen-devel/2007-06/msg00324.htmlThanks for the patch! I completely agree with your idea of making this architecture-specific but I have question about the implementaiton.> diff -r d5e0eb7dd069 -r 69e2dd4e06c4 drivers/xen/core/gnttab.c > --- a/drivers/xen/core/gnttab.c Sun Jun 10 19:50:32 2007 +0100 > +++ b/drivers/xen/core/gnttab.c Mon Jun 11 16:13:06 2007 +0900 > @@ -593,20 +593,18 @@ EXPORT_SYMBOL(gnttab_copy_grant_page); > * > * All other pages are simply returned as is. > */ > -maddr_t gnttab_dma_map_page(struct page *page) > -{ > - maddr_t maddr = page_to_bus(page); > +void __gnttab_dma_map_page(struct page *page, > + int (*local_pfn)(struct page *page))Do we really need a callback here? In other words when would a single architecture need to have two different values for local_pfn here? Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Isaku Yamahata
2007-Jun-11 09:03 UTC
Re: [Xen-devel] Re: [PATCH][Linux] gnttab: make dma address conversion logic of gnttab dma arch specific.
On Mon, Jun 11, 2007 at 06:23:20PM +1000, Herbert Xu wrote:> On Mon, Jun 11, 2007 at 04:35:27PM +0900, Isaku Yamahata wrote: > > This patch is cleaned up of the patch which was sent as > > http://lists.xensource.com/archives/html/xen-devel/2007-06/msg00324.html > > Thanks for the patch! I completely agree with your idea of making > this architecture-specific but I have question about the implementaiton. > > > diff -r d5e0eb7dd069 -r 69e2dd4e06c4 drivers/xen/core/gnttab.c > > --- a/drivers/xen/core/gnttab.c Sun Jun 10 19:50:32 2007 +0100 > > +++ b/drivers/xen/core/gnttab.c Mon Jun 11 16:13:06 2007 +0900 > > @@ -593,20 +593,18 @@ EXPORT_SYMBOL(gnttab_copy_grant_page); > > * > > * All other pages are simply returned as is. > > */ > > -maddr_t gnttab_dma_map_page(struct page *page) > > -{ > > - maddr_t maddr = page_to_bus(page); > > +void __gnttab_dma_map_page(struct page *page, > > + int (*local_pfn)(struct page *page)) > > Do we really need a callback here? In other words when would a > single architecture need to have two different values for local_pfn > here?No at this moment. So I removed the callback. Is this what you want? thanks, # HG changeset patch # User yamahata@valinux.co.jp # Date 1181552280 -32400 # Node ID 237ea82bc95bb8d9985e07cf319436e89a832591 # Parent d5e0eb7dd069c0ffc1854da81aa143ccfb0ad66e make dma address conversion logic of gnttab dma arch specific. gnttab_dma_map_page() and gnttab_dma_unmap_page() uses machine address with dma address interchangebly. However it doesn''t work with auto translated mode enabled (i.e. on ia64) because - bus address space(dma_addr_t) is different from machine address space(maddr_t). With the terminology in xen/include/public/mm.h, dma_addr_t is maddr and maddr_t is gmaddr. So they should be handled differently with auto translated physmap mode enabled. - dma address conversion depends on dma api implementation and its paravirtualization. "pfn_valid(mfn_to_local_pfn(maddr >> PAGE_SHIFT)" check in gnttab_dma_map_page() doesn''t make sense with auto translate physmap mode enabled. To address those issues, split those logic from gnttab_dma_map_page() and gnttab_dma_unmap_page(), and put it into arch specific files. This patch doesn''t change the already existing x86 logic. PATCHNAME: make_dma_address_conversion_logic_of_gnttab_dma_arch_specific Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp> diff -r d5e0eb7dd069 -r 237ea82bc95b arch/i386/kernel/pci-dma-xen.c --- a/arch/i386/kernel/pci-dma-xen.c Sun Jun 10 19:50:32 2007 +0100 +++ b/arch/i386/kernel/pci-dma-xen.c Mon Jun 11 17:58:00 2007 +0900 @@ -19,6 +19,7 @@ #include <asm/swiotlb.h> #include <asm/tlbflush.h> #include <asm-i386/mach-xen/asm/swiotlb.h> +#include <asm-i386/mach-xen/asm/gnttab_dma.h> #include <asm/bug.h> #ifdef __x86_64__ diff -r d5e0eb7dd069 -r 237ea82bc95b arch/i386/kernel/swiotlb.c --- a/arch/i386/kernel/swiotlb.c Sun Jun 10 19:50:32 2007 +0100 +++ b/arch/i386/kernel/swiotlb.c Mon Jun 11 17:58:00 2007 +0900 @@ -27,6 +27,7 @@ #include <asm/uaccess.h> #include <xen/gnttab.h> #include <xen/interface/memory.h> +#include <asm-i386/mach-xen/asm/gnttab_dma.h> int swiotlb; EXPORT_SYMBOL(swiotlb); diff -r d5e0eb7dd069 -r 237ea82bc95b drivers/xen/core/gnttab.c --- a/drivers/xen/core/gnttab.c Sun Jun 10 19:50:32 2007 +0100 +++ b/drivers/xen/core/gnttab.c Mon Jun 11 17:58:00 2007 +0900 @@ -43,6 +43,7 @@ #include <asm/io.h> #include <xen/interface/memory.h> #include <xen/driver_util.h> +#include <asm/gnttab_dma.h> #ifdef HAVE_XEN_PLATFORM_COMPAT_H #include <xen/platform-compat.h> @@ -593,20 +594,17 @@ EXPORT_SYMBOL(gnttab_copy_grant_page); * * All other pages are simply returned as is. */ -maddr_t gnttab_dma_map_page(struct page *page) -{ - maddr_t maddr = page_to_bus(page); +void __gnttab_dma_map_page(struct page *page) +{ unsigned int seq; - if (!PageForeign(page)) - return maddr; + if (!is_running_on_xen() || !PageForeign(page)) + return; do { seq = read_seqbegin(&gnttab_dma_lock); - maddr = page_to_bus(page); - - /* Has it become a local MFN? */ - if (pfn_valid(mfn_to_local_pfn(maddr >> PAGE_SHIFT))) + + if (gnttab_dma_local_pfn(page)) break; atomic_set(&page->_mapcount, 0); @@ -614,8 +612,6 @@ maddr_t gnttab_dma_map_page(struct page /* Make _mapcount visible before read_seqretry. */ smp_mb(); } while (unlikely(read_seqretry(&gnttab_dma_lock, seq))); - - return maddr; } int gnttab_resume(void) diff -r d5e0eb7dd069 -r 237ea82bc95b include/asm-i386/mach-xen/asm/gnttab_dma.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-i386/mach-xen/asm/gnttab_dma.h Mon Jun 11 17:58:00 2007 +0900 @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> + * Copyright (c) 2007 Isaku Yamahata <yamahata at valinux co jp> + * VA Linux Systems Japan K.K. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _ASM_I386_GNTTAB_DMA_H +#define _ASM_I386_GNTTAB_DMA_H + +static inline int gnttab_dma_local_pfn(struct page *page) +{ + /* Has it become a local MFN? */ + return pfn_valid(mfn_to_local_pfn(pfn_to_mfn(page_to_pfn(page)))); +} + +static inline maddr_t gnttab_dma_map_page(struct page *page) +{ + __gnttab_dma_map_page(page); + return page_to_bus(page); +} + +static inline void gnttab_dma_unmap_page(maddr_t maddr) +{ + __gnttab_dma_unmap_page(virt_to_page(bus_to_virt(maddr))); +} + +#endif /* _ASM_I386_GNTTAB_DMA_H */ diff -r d5e0eb7dd069 -r 237ea82bc95b include/asm-ia64/gnttab_dma.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-ia64/gnttab_dma.h Mon Jun 11 17:58:00 2007 +0900 @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> + * Copyright (c) 2007 Isaku Yamahata <yamahata at valinux co jp> + * VA Linux Systems Japan K.K. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _ASM_IA64_GNTTAB_DMA_H +#define _ASM_IA64_GNTTAB_DMA_H + +static inline int gnttab_dma_local_pfn(struct page *page) +{ + return 0; +} + +/* caller must get dma address after calling this function */ +static inline void gnttab_dma_use_page(struct page *page) +{ + __gnttab_dma_map_page(page); +} + +static inline dma_addr_t gnttab_dma_map_page(struct page *page) +{ + gnttab_dma_use_page(page); + return page_to_bus(page); +} + +static inline dma_addr_t gnttab_dma_map_virt(void *ptr) +{ + return gnttab_dma_map_page(virt_to_page(ptr)) + offset_in_page(ptr); +} + +static inline void gnttab_dma_unmap_page(dma_addr_t dma_address) +{ + __gnttab_dma_unmap_page(virt_to_page(bus_to_virt(dma_address))); +} + +#endif /* _ASM_IA64_GNTTAB_DMA_H */ diff -r d5e0eb7dd069 -r 237ea82bc95b include/asm-x86_64/mach-xen/asm/gnttab_dma.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-x86_64/mach-xen/asm/gnttab_dma.h Mon Jun 11 17:58:00 2007 +0900 @@ -0,0 +1,1 @@ +#include <asm-i386/mach-xen/asm/gnttab_dma.h> diff -r d5e0eb7dd069 -r 237ea82bc95b include/xen/gnttab.h --- a/include/xen/gnttab.h Sun Jun 10 19:50:32 2007 +0100 +++ b/include/xen/gnttab.h Mon Jun 11 17:58:00 2007 +0900 @@ -103,9 +103,8 @@ void gnttab_grant_foreign_transfer_ref(g unsigned long pfn); int gnttab_copy_grant_page(grant_ref_t ref, struct page **pagep); -maddr_t gnttab_dma_map_page(struct page *page); - -static inline void gnttab_dma_unmap_page(maddr_t mfn) +void __gnttab_dma_map_page(struct page *page); +static inline void __gnttab_dma_unmap_page(struct page *page) { } -- yamahata _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Herbert Xu
2007-Jun-11 10:30 UTC
Re: [Xen-devel] Re: [PATCH][Linux] gnttab: make dma address conversion logic of gnttab dma arch specific.
On Mon, Jun 11, 2007 at 06:03:31PM +0900, Isaku Yamahata wrote:> > No at this moment. So I removed the callback. > Is this what you want?Perfect, that''s exactly what I meant. Thanks! -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Possibly Parallel Threads
- Dom0 physical networking/swiotlb/something issue in 3.7-rc1
- [PATCH] linux/x86: utilize lookup_address() for virt_to_ptep()
- [PATCH] minios: support COW for a zero page
- RFC: [0/2] Remove netloop by lazy copying in netback
- xenpaging fixes for kernel and hypervisor