login
Login
/
Register
Search
Forums
News
Blogs
Features
Site
Home
»
Mailing list archives
»
linux-kernel
»
2007
»
October
»
1
Re: [PATCH -mm] intel-iommu sg chaining support
view
thread
!MAILaRCHIVE_VOTE_RePLACE
Previous message: [
thread
] [
date
] [
author
]
Next message: [
thread
] [
date
] [
author
]
[view in full thread]
From:
Keshavamurthy, Anil S <anil.s.keshavamurthy@...>
To: FUJITA Tomonori <tomof@...>
Cc: <akpm@...>, Keshavamurthy, Anil S <anil.s.keshavamurthy@...>, <linux-kernel@...>, <jens.axboe@...>, <fujita.tomonori@...>
Subject:
Re: [PATCH -mm] intel-iommu sg chaining support
Date: Monday, October 1, 2007 - 12:12 pm
On Sat, Sep 29, 2007 at 05:16:38AM -0700, FUJITA Tomonori wrote:
quoted text
> > x86_64 defines ARCH_HAS_SG_CHAIN. So if IOMMU implementations don't > support sg chaining, we will get data corruption. > Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Acked-by: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
quoted text
> --- > drivers/pci/intel-iommu.c | 32 ++++++++++++++++---------------- > 1 files changed, 16 insertions(+), 16 deletions(-) > diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c > index dab329f..4668995 100644 > --- a/drivers/pci/intel-iommu.c > +++ b/drivers/pci/intel-iommu.c > @@ -1963,7 +1963,7 @@ static void intel_free_coherent(struct device *hwdev, > size_t size, > } > #define SG_ENT_VIRT_ADDRESS(sg) (page_address((sg)->page) + > (sg)->offset) > -static void intel_unmap_sg(struct device *hwdev, struct scatterlist *sg, > +static void intel_unmap_sg(struct device *hwdev, struct scatterlist > *sglist, > int nelems, int dir) > { > int i; > @@ -1973,16 +1973,17 @@ static void intel_unmap_sg(struct device *hwdev, > struct scatterlist *sg, > struct iova *iova; > size_t size = 0; > void *addr; > + struct scatterlist *sg; > if (pdev->sysdata == DUMMY_DEVICE_DOMAIN_INFO) > return; > domain = find_domain(pdev); > - iova = find_iova(&domain->iovad, IOVA_PFN(sg[0].dma_address)); > + iova = find_iova(&domain->iovad, IOVA_PFN(sglist[0].dma_address)); > if (!iova) > return; > - for (i = 0; i < nelems; i++, sg++) { > + for_each_sg(sglist, sg, nelems, i) { > addr = SG_ENT_VIRT_ADDRESS(sg); > size += aligned_size((u64)addr, sg->length); > } > @@ -2003,20 +2004,20 @@ static void intel_unmap_sg(struct device *hwdev, > struct scatterlist *sg, > } > static int intel_nontranslate_map_sg(struct device *hddev, > - struct scatterlist *sg, int nelems, int dir) > + struct scatterlist *sglist, int nelems, int dir) > { > int i; > + struct scatterlist *sg; > - for (i = 0; i < nelems; i++) { > - struct scatterlist *s = &sg[i]; > - BUG_ON(!s->page); > - s->dma_address = virt_to_bus(SG_ENT_VIRT_ADDRESS(s)); > - s->dma_length = s->length; > + for_each_sg(sglist, sg, nelems, i) { > + BUG_ON(!sg->page); > + sg->dma_address = virt_to_bus(SG_ENT_VIRT_ADDRESS(sg)); > + sg->dma_length = sg->length; > } > return nelems; > } > -static int intel_map_sg(struct device *hwdev, struct scatterlist *sg, > +static int intel_map_sg(struct device *hwdev, struct scatterlist *sglist, > int nelems, int dir) > { > void *addr; > @@ -2028,18 +2029,18 @@ static int intel_map_sg(struct device *hwdev, struct > scatterlist *sg, > size_t offset = 0; > struct iova *iova = NULL; > int ret; > - struct scatterlist *orig_sg = sg; > + struct scatterlist *sg; > unsigned long start_addr; > BUG_ON(dir == DMA_NONE); > if (pdev->sysdata == DUMMY_DEVICE_DOMAIN_INFO) > - return intel_nontranslate_map_sg(hwdev, sg, nelems, dir); > + return intel_nontranslate_map_sg(hwdev, sglist, nelems, > dir); > domain = get_valid_domain_for_dev(pdev); > if (!domain) > return 0; > - for (i = 0; i < nelems; i++, sg++) { > + for_each_sg(sglist, sg, nelems, i) { > addr = SG_ENT_VIRT_ADDRESS(sg); > addr = (void *)virt_to_phys(addr); > size += aligned_size((u64)addr, sg->length); > @@ -2047,7 +2048,7 @@ static int intel_map_sg(struct device *hwdev, struct > scatterlist *sg, > iova = __intel_alloc_iova(hwdev, domain, size); > if (!iova) { > - orig_sg->dma_length = 0; > + sglist->dma_length = 0; > return 0; > } > @@ -2063,8 +2064,7 @@ static int intel_map_sg(struct device *hwdev, struct > scatterlist *sg, > start_addr = iova->pfn_lo << PAGE_SHIFT_4K; > offset = 0; > - sg = orig_sg; > - for (i = 0; i < nelems; i++, sg++) { > + for_each_sg(sglist, sg, nelems, i) { > addr = SG_ENT_VIRT_ADDRESS(sg); > addr = (void *)virt_to_phys(addr); > size = aligned_size((u64)addr, sg->length); > -- > 1.5.2.4
-
unsubscribe notice
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to
majordomo@vger.kernel.org
More majordomo info at
http://vger.kernel.org/majordomo-info.html
Please read the FAQ at
http://www.tux.org/lkml/
Previous message: [
thread
] [
date
] [
author
]
Next message: [
thread
] [
date
] [
author
]
Messages in current thread:
[PATCH -mm] intel-iommu sg chaining support
, FUJITA Tomonori
, (Sat Sep 29, 8:16 am)
Re: [PATCH -mm] intel-iommu sg chaining support
, Keshavamurthy, Anil S
, (Mon Oct 1, 12:12 pm)
Re: [PATCH -mm] intel-iommu sg chaining support
, Andrew Morton
, (Wed Oct 3, 5:12 pm)
Re: [PATCH -mm] intel-iommu sg chaining support
, Keshavamurthy, Anil S
, (Wed Oct 3, 5:14 pm)
Navigation
Create content
Mailing list archives
Recent posts
Popular discussions
linux-kernel
:
Tarkan Erimer
Re: Dual-Licensing Linux Kernel with GPL V2 and GPL V3
Greg KH
[GIT PATCH] driver core patches against 2.6.24
Mike Travis
[RFC 00/15] x86_64: Optimize percpu accesses
Dave Jones
agp / cpufreq.
linux-netdev
:
Willy Tarreau
Re: [PATCH] tcp: splice as many packets as possible at once
Gerrit Renker
[PATCH 14/37] dccp: Tidy up setsockopt calls
David Miller
Re: [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock().
Natalie Protasevich
[BUG] New Kernel Bugs
git
:
openbsd-misc
:
Colocation donated by:
Who's online
There are currently
2 users
and
577 guests
online.
Online users
kalidavison95
holisticdog329
Syndicate