From: "Raj, Ashok" <ashok.raj@intel.com>
To: Robin Murphy <robin.murphy@arm.com>
Cc: Harsh Jain <Harsh@chelsio.com>, Casey Leedom <leedom@chelsio.com>,
Herbert Xuy <herbert@gondor.apana.org.au>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"iommu@lists.linux-foundation.org"
<iommu@lists.linux-foundation.org>,
"linux-crypto@vger.kernel.org" <linux-crypto@vger.kernel.org>,
Dan Williams <dan.j.williams@intel.com>,
"dwmw2@infradead.org" <dwmw2@infradead.org>
Subject: Re: DMA error when sg->offset value is greater than PAGE_SIZE in Intel IOMMU
Date: Tue, 26 Sep 2017 07:40:33 -0700 [thread overview]
Message-ID: <20170926144032.GA90930@otc-nc-03> (raw)
In-Reply-To: <20170926143441.GA136940@otc-nc-03>
Oops..minor typo.. VTD_PAGE_SHIFT instead of VTD_PAGE_MASK
On Tue, Sep 26, 2017 at 07:34:41AM -0700, Ashok Raj wrote:
> On Tue, Sep 26, 2017 at 03:22:47PM +0100, Robin Murphy wrote:
> > diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
> > index 6784a05dd6b2..d7f7def81613 100644
> > --- a/drivers/iommu/intel-iommu.c
> > +++ b/drivers/iommu/intel-iommu.c
> > @@ -2254,10 +2254,12 @@ static int __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn,
> > uint64_t tmp;
> >
> > if (!sg_res) {
> > + size_t off = sg->offset & ~PAGE_MASK;
>
> Should this be VTD_PAGE_MASK?
>
> > +
> > sg_res = aligned_nrpages(sg->offset, sg->length);
> > - sg->dma_address = ((dma_addr_t)iov_pfn << VTD_PAGE_SHIFT) + sg->offset;
> > + sg->dma_address = ((dma_addr_t)iov_pfn << VTD_PAGE_SHIFT) + off;
> > sg->dma_length = sg->length;
> > - pteval = page_to_phys(sg_page(sg)) | prot;
> > + pteval = (page_to_phys(sg_page(sg)) + sg->offset - off) | prot;
>
> Something seems wrong here.. sg->offset can be > VTD_PAGE_SIZE, think
> we should add sg->offset and then find the pteval?
>
> attached below another cut at fixing the same problem.. if there is something
> obvious i missed, let me know.
>
> again.. untested :-)
>
> Cheers,
> Ashok
>
> Sometimes offset can be greater than 4K. vt-d needs to account for that.
>
> From: Ashok Raj <ashok.raj@intel.com>
>
> Signed-off-by: Ashok Raj <ashok.raj@intel.com>
> ---
> drivers/iommu/intel-iommu.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
> index 6784a05..d43b566 100644
> --- a/drivers/iommu/intel-iommu.c
> +++ b/drivers/iommu/intel-iommu.c
> @@ -2254,10 +2254,13 @@ static int __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn,
> uint64_t tmp;
>
> if (!sg_res) {
> + size_t off = sg->offset & ~VTD_PAGE_SHIFT;
> sg_res = aligned_nrpages(sg->offset, sg->length);
> - sg->dma_address = ((dma_addr_t)iov_pfn << VTD_PAGE_SHIFT) + sg->offset;
> + sg->dma_address = ((dma_addr_t)
> + (iov_pfn + sg->offset) << VTD_PAGE_SHIFT) + off;
> sg->dma_length = sg->length;
> - pteval = page_to_phys(sg_page(sg)) | prot;
> + pteval = (page_to_phys(sg_page(sg)) +
> + (sg->offset << VTD_PAGE_SHIFT)) | prot;
> phys_pfn = pteval >> VTD_PAGE_SHIFT;
> }
>
Sometimes offset can be greater than 4K. vt-d needs to account for that.
From: Ashok Raj <ashok.raj@intel.com>
Signed-off-by: Ashok Raj <ashok.raj@intel.com>
---
drivers/iommu/intel-iommu.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 6784a05..0333afe 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -2254,10 +2254,13 @@ static int __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn,
uint64_t tmp;
if (!sg_res) {
+ size_t off = sg->offset & ~VTD_PAGE_MASK;
sg_res = aligned_nrpages(sg->offset, sg->length);
- sg->dma_address = ((dma_addr_t)iov_pfn << VTD_PAGE_SHIFT) + sg->offset;
+ sg->dma_address = ((dma_addr_t)
+ (iov_pfn + sg->offset) << VTD_PAGE_SHIFT) + off;
sg->dma_length = sg->length;
- pteval = page_to_phys(sg_page(sg)) | prot;
+ pteval = (page_to_phys(sg_page(sg)) +
+ (sg->offset << VTD_PAGE_SHIFT)) | prot;
phys_pfn = pteval >> VTD_PAGE_SHIFT;
}
next prev parent reply other threads:[~2017-09-26 17:28 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-16 6:11 DMA error when sg->offset value is greater than PAGE_SIZE in Intel IOMMU Harsh Jain
2017-09-20 8:01 ` Herbert Xu
2017-09-20 10:12 ` Robin Murphy
2017-09-20 11:20 ` Harsh Jain
2017-09-25 17:46 ` Casey Leedom
2017-09-25 15:54 ` Raj, Ashok
2017-09-25 18:46 ` Casey Leedom
2017-09-26 3:46 ` Harsh Jain
[not found] ` <afa02763-4556-0e14-7d1b-1c044cdc1ff7-ut6Up61K2wZBDgjK7y7TUQ@public.gmane.org>
2017-09-26 12:21 ` Harsh Jain
2017-09-26 12:21 ` Harsh Jain
2017-09-26 14:22 ` Robin Murphy
2017-09-26 14:34 ` Raj, Ashok
2017-09-26 14:40 ` Raj, Ashok [this message]
2017-09-26 20:50 ` Casey Leedom
2017-09-26 20:50 ` Casey Leedom
2017-09-26 18:15 ` Robin Murphy
[not found] ` <437a9bd8-d4d6-22ca-1a64-1a3e73f1101a-5wv7dgnIgG8@public.gmane.org>
2017-09-26 16:06 ` Casey Leedom
2017-09-26 16:10 ` Dan Williams
2017-09-27 16:31 ` Casey Leedom
[not found] ` <MWHPR12MB160060436AC70CB5BE8C0C6EC8780-Gy0DoCVfaSVsWITs4OkDoAdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2017-09-27 17:13 ` Dan Williams
2017-09-27 17:13 ` Dan Williams
2017-10-01 8:59 ` Christoph Hellwig
2017-09-27 17:18 ` Robin Murphy
2017-09-27 17:18 ` Robin Murphy
[not found] ` <20170927181802.3dcd7efb-h2/QxWiDqNo@public.gmane.org>
2017-09-27 14:48 ` Raj, Ashok
2017-09-27 14:48 ` Raj, Ashok
2017-09-27 21:29 ` Casey Leedom
[not found] ` <MWHPR12MB16005D59D7A33F3D5BE43395C8780-Gy0DoCVfaSVsWITs4OkDoAdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2017-09-27 19:07 ` Raj, Ashok
2017-09-27 19:07 ` Raj, Ashok
2017-09-27 22:13 ` Casey Leedom
2017-09-28 5:01 ` Harsh Jain
[not found] ` <MWHPR12MB16007E5363E79173C52BFA19C8780-Gy0DoCVfaSVsWITs4OkDoAdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2017-09-28 10:33 ` Herbert Xu
2017-09-28 10:33 ` Herbert Xu
[not found] ` <20170928103312.GB8118-lOAM2aK0SrRLBo1qDEOMRrpzq4S04n8Q@public.gmane.org>
2017-09-28 11:11 ` Harsh Jain
2017-09-28 13:38 ` Harsh Jain
2017-09-28 13:38 ` Harsh Jain
2017-09-28 13:05 ` Raj, Ashok
2017-09-29 5:37 ` Harsh Jain
2017-09-27 17:30 ` Casey Leedom
2017-09-26 17:30 ` Casey Leedom
2017-09-26 17:30 ` Casey Leedom
2017-09-25 19:31 ` Dan Williams
[not found] ` <CAPcyv4j3J41eY2eR07nTvo75F0yCbL9bNHM8GmXEFOHDQUuf8Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2017-09-25 20:05 ` Casey Leedom
2017-09-25 20:05 ` Casey Leedom
[not found] ` <MWHPR12MB1600948B2F57696189FC7C22C87A0-Gy0DoCVfaSVsWITs4OkDoAdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2017-09-25 20:11 ` Dan Williams
2017-09-25 20:11 ` Dan Williams
2017-09-25 19:03 ` Raj, Ashok
2017-09-25 23:41 ` Casey Leedom
2017-09-26 13:04 ` Harsh Jain
2017-09-20 11:30 ` Harsh Jain
2017-09-25 18:45 ` David Woodhouse
2017-09-25 20:19 ` Casey Leedom
2017-09-26 11:17 ` Harsh Jain
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170926144032.GA90930@otc-nc-03 \
--to=ashok.raj@intel.com \
--cc=Harsh@chelsio.com \
--cc=dan.j.williams@intel.com \
--cc=dwmw2@infradead.org \
--cc=herbert@gondor.apana.org.au \
--cc=iommu@lists.linux-foundation.org \
--cc=leedom@chelsio.com \
--cc=linux-crypto@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=robin.murphy@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.