* [PATCH v3 0/3] xen/swiotlb: fix an issue and improve swiotlb-xen
@ 2019-06-14 5:46 Juergen Gross
2019-06-14 5:46 ` [PATCH v3 1/3] xen/swiotlb: fix condition for calling xen_destroy_contiguous_region() Juergen Gross
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Juergen Gross @ 2019-06-14 5:46 UTC (permalink / raw)
To: xen-devel, iommu, linux-kernel
Cc: Juergen Gross, Boris Ostrovsky, Stefano Stabellini, stable,
Konrad Rzeszutek Wilk
While hunting an issue in swiotlb-xen I stumbled over a wrong test
and found some areas for improvement.
Juergen Gross (3):
xen/swiotlb: fix condition for calling xen_destroy_contiguous_region()
xen/swiotlb: simplify range_straddles_page_boundary()
xen/swiotlb: remember having called xen_create_contiguous_region()
drivers/xen/swiotlb-xen.c | 34 ++++++++++------------------------
include/linux/page-flags.h | 4 ++++
2 files changed, 14 insertions(+), 24 deletions(-)
--
2.16.4
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v3 1/3] xen/swiotlb: fix condition for calling xen_destroy_contiguous_region()
2019-06-14 5:46 [PATCH v3 0/3] xen/swiotlb: fix an issue and improve swiotlb-xen Juergen Gross
@ 2019-06-14 5:46 ` Juergen Gross
2019-06-14 5:46 ` [PATCH v3 2/3] xen/swiotlb: simplify range_straddles_page_boundary() Juergen Gross
2019-06-14 5:46 ` [PATCH v3 3/3] xen/swiotlb: remember having called xen_create_contiguous_region() Juergen Gross
2 siblings, 0 replies; 4+ messages in thread
From: Juergen Gross @ 2019-06-14 5:46 UTC (permalink / raw)
To: xen-devel, iommu, linux-kernel
Cc: Juergen Gross, Boris Ostrovsky, Stefano Stabellini, stable,
Konrad Rzeszutek Wilk
The condition in xen_swiotlb_free_coherent() for deciding whether to
call xen_destroy_contiguous_region() is wrong: in case the region to
be freed is not contiguous calling xen_destroy_contiguous_region() is
the wrong thing to do: it would result in inconsistent mappings of
multiple PFNs to the same MFN. This will lead to various strange
crashes or data corruption.
Instead of calling xen_destroy_contiguous_region() in that case a
warning should be issued as that situation should never occur.
Cc: stable@vger.kernel.org
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
---
V2: always issue a warning in case xen_destroy_contiguous_region()
isn't called (Jan Beulich)
---
drivers/xen/swiotlb-xen.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c
index d53f3493a6b9..50fd7de54969 100644
--- a/drivers/xen/swiotlb-xen.c
+++ b/drivers/xen/swiotlb-xen.c
@@ -361,8 +361,8 @@ xen_swiotlb_free_coherent(struct device *hwdev, size_t size, void *vaddr,
/* Convert the size to actually allocated. */
size = 1UL << (order + XEN_PAGE_SHIFT);
- if (((dev_addr + size - 1 <= dma_mask)) ||
- range_straddles_page_boundary(phys, size))
+ if (!WARN_ON((dev_addr + size - 1 > dma_mask) ||
+ range_straddles_page_boundary(phys, size)))
xen_destroy_contiguous_region(phys, order);
xen_free_coherent_pages(hwdev, size, vaddr, (dma_addr_t)phys, attrs);
--
2.16.4
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v3 2/3] xen/swiotlb: simplify range_straddles_page_boundary()
2019-06-14 5:46 [PATCH v3 0/3] xen/swiotlb: fix an issue and improve swiotlb-xen Juergen Gross
2019-06-14 5:46 ` [PATCH v3 1/3] xen/swiotlb: fix condition for calling xen_destroy_contiguous_region() Juergen Gross
@ 2019-06-14 5:46 ` Juergen Gross
2019-06-14 5:46 ` [PATCH v3 3/3] xen/swiotlb: remember having called xen_create_contiguous_region() Juergen Gross
2 siblings, 0 replies; 4+ messages in thread
From: Juergen Gross @ 2019-06-14 5:46 UTC (permalink / raw)
To: xen-devel, iommu, linux-kernel
Cc: Juergen Gross, Boris Ostrovsky, Stefano Stabellini,
Konrad Rzeszutek Wilk
range_straddles_page_boundary() is open coding several macros from
include/xen/page.h. Use those instead. Additionally there is no need
to have check_pages_physically_contiguous() as a separate function as
it is used only once, so merge it into range_straddles_page_boundary().
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
---
drivers/xen/swiotlb-xen.c | 28 ++++++----------------------
1 file changed, 6 insertions(+), 22 deletions(-)
diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c
index 50fd7de54969..37ddcfcfbb21 100644
--- a/drivers/xen/swiotlb-xen.c
+++ b/drivers/xen/swiotlb-xen.c
@@ -83,34 +83,18 @@ static inline dma_addr_t xen_virt_to_bus(void *address)
return xen_phys_to_bus(virt_to_phys(address));
}
-static int check_pages_physically_contiguous(unsigned long xen_pfn,
- unsigned int offset,
- size_t length)
+static inline int range_straddles_page_boundary(phys_addr_t p, size_t size)
{
- unsigned long next_bfn;
- int i;
- int nr_pages;
+ unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p);
+ unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + size);
next_bfn = pfn_to_bfn(xen_pfn);
- nr_pages = (offset + length + XEN_PAGE_SIZE-1) >> XEN_PAGE_SHIFT;
- for (i = 1; i < nr_pages; i++) {
+ for (i = 1; i < nr_pages; i++)
if (pfn_to_bfn(++xen_pfn) != ++next_bfn)
- return 0;
- }
- return 1;
-}
+ return 1;
-static inline int range_straddles_page_boundary(phys_addr_t p, size_t size)
-{
- unsigned long xen_pfn = XEN_PFN_DOWN(p);
- unsigned int offset = p & ~XEN_PAGE_MASK;
-
- if (offset + size <= XEN_PAGE_SIZE)
- return 0;
- if (check_pages_physically_contiguous(xen_pfn, offset, size))
- return 0;
- return 1;
+ return 0;
}
static int is_xen_swiotlb_buffer(dma_addr_t dma_addr)
--
2.16.4
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v3 3/3] xen/swiotlb: remember having called xen_create_contiguous_region()
2019-06-14 5:46 [PATCH v3 0/3] xen/swiotlb: fix an issue and improve swiotlb-xen Juergen Gross
2019-06-14 5:46 ` [PATCH v3 1/3] xen/swiotlb: fix condition for calling xen_destroy_contiguous_region() Juergen Gross
2019-06-14 5:46 ` [PATCH v3 2/3] xen/swiotlb: simplify range_straddles_page_boundary() Juergen Gross
@ 2019-06-14 5:46 ` Juergen Gross
2 siblings, 0 replies; 4+ messages in thread
From: Juergen Gross @ 2019-06-14 5:46 UTC (permalink / raw)
To: xen-devel, iommu, linux-kernel
Cc: Juergen Gross, Boris Ostrovsky, Stefano Stabellini,
Konrad Rzeszutek Wilk
Instead of always calling xen_destroy_contiguous_region() in case the
memory is DMA-able for the used device, do so only in case it has been
made DMA-able via xen_create_contiguous_region() before.
This will avoid a lot of xen_destroy_contiguous_region() calls for
64-bit capable devices.
As the memory in question is owned by swiotlb-xen the PG_owner_priv_1
flag of the first allocated page can be used for remembering.
Signed-off-by: Juergen Gross <jgross@suse.com>
---
V2: add PG_xen_remapped alias for PG_owner_priv_1 (Boris Ostrovsky)
only clear page flag in case of sane conditions (Jan Beulich)
V3: use TestClearPageXenRemapped() (Jan Beulich)
---
drivers/xen/swiotlb-xen.c | 4 +++-
include/linux/page-flags.h | 4 ++++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c
index 37ddcfcfbb21..ceb681cf64bb 100644
--- a/drivers/xen/swiotlb-xen.c
+++ b/drivers/xen/swiotlb-xen.c
@@ -322,6 +322,7 @@ xen_swiotlb_alloc_coherent(struct device *hwdev, size_t size,
xen_free_coherent_pages(hwdev, size, ret, (dma_addr_t)phys, attrs);
return NULL;
}
+ SetPageXenRemapped(virt_to_page(ret));
}
memset(ret, 0, size);
return ret;
@@ -346,7 +347,8 @@ xen_swiotlb_free_coherent(struct device *hwdev, size_t size, void *vaddr,
size = 1UL << (order + XEN_PAGE_SHIFT);
if (!WARN_ON((dev_addr + size - 1 > dma_mask) ||
- range_straddles_page_boundary(phys, size)))
+ range_straddles_page_boundary(phys, size)) &&
+ TestClearPageXenRemapped(virt_to_page(vaddr)))
xen_destroy_contiguous_region(phys, order);
xen_free_coherent_pages(hwdev, size, vaddr, (dma_addr_t)phys, attrs);
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
index 9f8712a4b1a5..fc503a47e7db 100644
--- a/include/linux/page-flags.h
+++ b/include/linux/page-flags.h
@@ -152,6 +152,8 @@ enum pageflags {
PG_savepinned = PG_dirty,
/* Has a grant mapping of another (foreign) domain's page. */
PG_foreign = PG_owner_priv_1,
+ /* Remapped by swiotlb-xen. */
+ PG_xen_remapped = PG_owner_priv_1,
/* SLOB */
PG_slob_free = PG_private,
@@ -329,6 +331,8 @@ PAGEFLAG(Pinned, pinned, PF_NO_COMPOUND)
TESTSCFLAG(Pinned, pinned, PF_NO_COMPOUND)
PAGEFLAG(SavePinned, savepinned, PF_NO_COMPOUND);
PAGEFLAG(Foreign, foreign, PF_NO_COMPOUND);
+PAGEFLAG(XenRemapped, xen_remapped, PF_NO_COMPOUND)
+ TESTCLEARFLAG(XenRemapped, xen_remapped, PF_NO_COMPOUND)
PAGEFLAG(Reserved, reserved, PF_NO_COMPOUND)
__CLEARPAGEFLAG(Reserved, reserved, PF_NO_COMPOUND)
--
2.16.4
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-06-14 5:46 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-14 5:46 [PATCH v3 0/3] xen/swiotlb: fix an issue and improve swiotlb-xen Juergen Gross
2019-06-14 5:46 ` [PATCH v3 1/3] xen/swiotlb: fix condition for calling xen_destroy_contiguous_region() Juergen Gross
2019-06-14 5:46 ` [PATCH v3 2/3] xen/swiotlb: simplify range_straddles_page_boundary() Juergen Gross
2019-06-14 5:46 ` [PATCH v3 3/3] xen/swiotlb: remember having called xen_create_contiguous_region() Juergen Gross
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).