* [PATCH v2 0/2] xen/swiotlb: fix 2 issues in xen-swiotlb @ 2024-09-16 6:47 Juergen Gross 2024-09-16 6:47 ` [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers Juergen Gross 2024-09-16 6:47 ` [PATCH v2 2/2] xen/swiotlb: fix allocated size Juergen Gross 0 siblings, 2 replies; 17+ messages in thread From: Juergen Gross @ 2024-09-16 6:47 UTC (permalink / raw) To: linux-kernel, iommu Cc: Juergen Gross, Stefano Stabellini, Oleksandr Tyshchenko, xen-devel Fix 2 issues in xen-swiotlb: - buffers need to be aligned properly - wrong buffer size if XEN_PAGE_SIZE < PAGE_SIZE Changes in V2: - added patch 2 Juergen Gross (2): xen/swiotlb: add alignment check for dma buffers xen/swiotlb: fix allocated size drivers/xen/swiotlb-xen.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) -- 2.43.0 ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers 2024-09-16 6:47 [PATCH v2 0/2] xen/swiotlb: fix 2 issues in xen-swiotlb Juergen Gross @ 2024-09-16 6:47 ` Juergen Gross 2024-09-16 6:50 ` Jan Beulich 2024-11-29 17:36 ` Thierry Escande 2024-09-16 6:47 ` [PATCH v2 2/2] xen/swiotlb: fix allocated size Juergen Gross 1 sibling, 2 replies; 17+ messages in thread From: Juergen Gross @ 2024-09-16 6:47 UTC (permalink / raw) To: linux-kernel, iommu Cc: Juergen Gross, Stefano Stabellini, Oleksandr Tyshchenko, xen-devel When checking a memory buffer to be consecutive in machine memory, the alignment needs to be checked, too. Failing to do so might result in DMA memory not being aligned according to its requested size, leading to error messages like: 4xxx 0000:2b:00.0: enabling device (0140 -> 0142) 4xxx 0000:2b:00.0: Ring address not aligned 4xxx 0000:2b:00.0: Failed to initialise service qat_crypto 4xxx 0000:2b:00.0: Resetting device qat_dev0 4xxx: probe of 0000:2b:00.0 failed with error -14 Fixes: 9435cce87950 ("xen/swiotlb: Add support for 64KB page granularity") Signed-off-by: Juergen Gross <jgross@suse.com> --- V2: - use 1ULL for creating align mask in order to cover ARM32 LPAE - fix case of XEN_PAGE_SIZE != PAGE_SIZE (Jan Beulich) --- drivers/xen/swiotlb-xen.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c index 35155258a7e2..ddf5b1df632e 100644 --- a/drivers/xen/swiotlb-xen.c +++ b/drivers/xen/swiotlb-xen.c @@ -78,9 +78,15 @@ static inline int range_straddles_page_boundary(phys_addr_t p, size_t size) { unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p); unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + size); + phys_addr_t algn = 1ULL << (get_order(size) + PAGE_SHIFT); next_bfn = pfn_to_bfn(xen_pfn); + /* If buffer is physically aligned, ensure DMA alignment. */ + if (IS_ALIGNED(p, algn) && + !IS_ALIGNED(next_bfn << XEN_PAGE_SHIFT, algn)) + return 1; + for (i = 1; i < nr_pages; i++) if (pfn_to_bfn(++xen_pfn) != ++next_bfn) return 1; -- 2.43.0 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers 2024-09-16 6:47 ` [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers Juergen Gross @ 2024-09-16 6:50 ` Jan Beulich 2024-09-16 6:56 ` Juergen Gross 2024-11-29 17:36 ` Thierry Escande 1 sibling, 1 reply; 17+ messages in thread From: Jan Beulich @ 2024-09-16 6:50 UTC (permalink / raw) To: Juergen Gross Cc: Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, linux-kernel, iommu On 16.09.2024 08:47, Juergen Gross wrote: > --- a/drivers/xen/swiotlb-xen.c > +++ b/drivers/xen/swiotlb-xen.c > @@ -78,9 +78,15 @@ static inline int range_straddles_page_boundary(phys_addr_t p, size_t size) > { > unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p); > unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + size); > + phys_addr_t algn = 1ULL << (get_order(size) + PAGE_SHIFT); > > next_bfn = pfn_to_bfn(xen_pfn); > > + /* If buffer is physically aligned, ensure DMA alignment. */ > + if (IS_ALIGNED(p, algn) && > + !IS_ALIGNED(next_bfn << XEN_PAGE_SHIFT, algn)) And this shift is not at risk of losing bits on Arm LPAE? Jan ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers 2024-09-16 6:50 ` Jan Beulich @ 2024-09-16 6:56 ` Juergen Gross 2024-09-16 6:59 ` Jan Beulich 2024-09-16 6:59 ` Juergen Gross 0 siblings, 2 replies; 17+ messages in thread From: Juergen Gross @ 2024-09-16 6:56 UTC (permalink / raw) To: Jan Beulich Cc: Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, linux-kernel, iommu [-- Attachment #1.1.1: Type: text/plain, Size: 846 bytes --] On 16.09.24 08:50, Jan Beulich wrote: > On 16.09.2024 08:47, Juergen Gross wrote: >> --- a/drivers/xen/swiotlb-xen.c >> +++ b/drivers/xen/swiotlb-xen.c >> @@ -78,9 +78,15 @@ static inline int range_straddles_page_boundary(phys_addr_t p, size_t size) >> { >> unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p); >> unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + size); >> + phys_addr_t algn = 1ULL << (get_order(size) + PAGE_SHIFT); >> >> next_bfn = pfn_to_bfn(xen_pfn); >> >> + /* If buffer is physically aligned, ensure DMA alignment. */ >> + if (IS_ALIGNED(p, algn) && >> + !IS_ALIGNED(next_bfn << XEN_PAGE_SHIFT, algn)) > > And this shift is not at risk of losing bits on Arm LPAE? For alignment check this just doesn't matter (assuming XEN_PAGE_SIZE is smaller than 4G). Juergen [-- Attachment #1.1.2: OpenPGP public key --] [-- Type: application/pgp-keys, Size: 3743 bytes --] [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 495 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers 2024-09-16 6:56 ` Juergen Gross @ 2024-09-16 6:59 ` Jan Beulich 2024-09-16 7:02 ` Jürgen Groß 2024-09-16 6:59 ` Juergen Gross 1 sibling, 1 reply; 17+ messages in thread From: Jan Beulich @ 2024-09-16 6:59 UTC (permalink / raw) To: Juergen Gross Cc: Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, linux-kernel, iommu On 16.09.2024 08:56, Juergen Gross wrote: > On 16.09.24 08:50, Jan Beulich wrote: >> On 16.09.2024 08:47, Juergen Gross wrote: >>> --- a/drivers/xen/swiotlb-xen.c >>> +++ b/drivers/xen/swiotlb-xen.c >>> @@ -78,9 +78,15 @@ static inline int range_straddles_page_boundary(phys_addr_t p, size_t size) >>> { >>> unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p); >>> unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + size); >>> + phys_addr_t algn = 1ULL << (get_order(size) + PAGE_SHIFT); >>> >>> next_bfn = pfn_to_bfn(xen_pfn); >>> >>> + /* If buffer is physically aligned, ensure DMA alignment. */ >>> + if (IS_ALIGNED(p, algn) && >>> + !IS_ALIGNED(next_bfn << XEN_PAGE_SHIFT, algn)) >> >> And this shift is not at risk of losing bits on Arm LPAE? > > For alignment check this just doesn't matter (assuming XEN_PAGE_SIZE is > smaller than 4G). Oh, yes - of course. A (hypothetical?) strict no-overflow checking mode of the kernel may take issue though, so maybe better to right- shift "algn"? Jan ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers 2024-09-16 6:59 ` Jan Beulich @ 2024-09-16 7:02 ` Jürgen Groß 0 siblings, 0 replies; 17+ messages in thread From: Jürgen Groß @ 2024-09-16 7:02 UTC (permalink / raw) To: Jan Beulich Cc: Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, linux-kernel, iommu [-- Attachment #1.1.1: Type: text/plain, Size: 1194 bytes --] On 16.09.24 08:59, Jan Beulich wrote: > On 16.09.2024 08:56, Juergen Gross wrote: >> On 16.09.24 08:50, Jan Beulich wrote: >>> On 16.09.2024 08:47, Juergen Gross wrote: >>>> --- a/drivers/xen/swiotlb-xen.c >>>> +++ b/drivers/xen/swiotlb-xen.c >>>> @@ -78,9 +78,15 @@ static inline int range_straddles_page_boundary(phys_addr_t p, size_t size) >>>> { >>>> unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p); >>>> unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + size); >>>> + phys_addr_t algn = 1ULL << (get_order(size) + PAGE_SHIFT); >>>> >>>> next_bfn = pfn_to_bfn(xen_pfn); >>>> >>>> + /* If buffer is physically aligned, ensure DMA alignment. */ >>>> + if (IS_ALIGNED(p, algn) && >>>> + !IS_ALIGNED(next_bfn << XEN_PAGE_SHIFT, algn)) >>> >>> And this shift is not at risk of losing bits on Arm LPAE? >> >> For alignment check this just doesn't matter (assuming XEN_PAGE_SIZE is >> smaller than 4G). > > Oh, yes - of course. A (hypothetical?) strict no-overflow checking > mode of the kernel may take issue though, so maybe better to right- > shift "algn"? No, this wouldn't work in case algn < XEN_PAGE_SIZE. Juergen [-- Attachment #1.1.2: OpenPGP public key --] [-- Type: application/pgp-keys, Size: 3743 bytes --] [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 495 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers 2024-09-16 6:56 ` Juergen Gross 2024-09-16 6:59 ` Jan Beulich @ 2024-09-16 6:59 ` Juergen Gross 2024-09-16 7:01 ` Jan Beulich 2024-09-16 20:19 ` Stefano Stabellini 1 sibling, 2 replies; 17+ messages in thread From: Juergen Gross @ 2024-09-16 6:59 UTC (permalink / raw) To: Jan Beulich Cc: Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, linux-kernel, iommu [-- Attachment #1.1.1: Type: text/plain, Size: 1071 bytes --] On 16.09.24 08:56, Juergen Gross wrote: > On 16.09.24 08:50, Jan Beulich wrote: >> On 16.09.2024 08:47, Juergen Gross wrote: >>> --- a/drivers/xen/swiotlb-xen.c >>> +++ b/drivers/xen/swiotlb-xen.c >>> @@ -78,9 +78,15 @@ static inline int >>> range_straddles_page_boundary(phys_addr_t p, size_t size) >>> { >>> unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p); >>> unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + size); >>> + phys_addr_t algn = 1ULL << (get_order(size) + PAGE_SHIFT); >>> next_bfn = pfn_to_bfn(xen_pfn); >>> + /* If buffer is physically aligned, ensure DMA alignment. */ >>> + if (IS_ALIGNED(p, algn) && >>> + !IS_ALIGNED(next_bfn << XEN_PAGE_SHIFT, algn)) >> >> And this shift is not at risk of losing bits on Arm LPAE? > > For alignment check this just doesn't matter (assuming XEN_PAGE_SIZE is > smaller than 4G). Wait, that was nonsense. I'll change the check to: !IS_ALIGNED((phys_addr_t)next_bfn << XEN_PAGE_SHIFT, algn) Juergen [-- Attachment #1.1.2: OpenPGP public key --] [-- Type: application/pgp-keys, Size: 3743 bytes --] [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 495 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers 2024-09-16 6:59 ` Juergen Gross @ 2024-09-16 7:01 ` Jan Beulich 2024-09-16 7:03 ` Jürgen Groß 2024-09-16 20:19 ` Stefano Stabellini 1 sibling, 1 reply; 17+ messages in thread From: Jan Beulich @ 2024-09-16 7:01 UTC (permalink / raw) To: Juergen Gross Cc: Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, linux-kernel, iommu On 16.09.2024 08:59, Juergen Gross wrote: > On 16.09.24 08:56, Juergen Gross wrote: >> On 16.09.24 08:50, Jan Beulich wrote: >>> On 16.09.2024 08:47, Juergen Gross wrote: >>>> --- a/drivers/xen/swiotlb-xen.c >>>> +++ b/drivers/xen/swiotlb-xen.c >>>> @@ -78,9 +78,15 @@ static inline int >>>> range_straddles_page_boundary(phys_addr_t p, size_t size) >>>> { >>>> unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p); >>>> unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + size); >>>> + phys_addr_t algn = 1ULL << (get_order(size) + PAGE_SHIFT); >>>> next_bfn = pfn_to_bfn(xen_pfn); >>>> + /* If buffer is physically aligned, ensure DMA alignment. */ >>>> + if (IS_ALIGNED(p, algn) && >>>> + !IS_ALIGNED(next_bfn << XEN_PAGE_SHIFT, algn)) >>> >>> And this shift is not at risk of losing bits on Arm LPAE? >> >> For alignment check this just doesn't matter (assuming XEN_PAGE_SIZE is >> smaller than 4G). > > Wait, that was nonsense. I think it was quite reasonable, as long as also algn (and hence size) isn't absurdly large. Jan ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers 2024-09-16 7:01 ` Jan Beulich @ 2024-09-16 7:03 ` Jürgen Groß 0 siblings, 0 replies; 17+ messages in thread From: Jürgen Groß @ 2024-09-16 7:03 UTC (permalink / raw) To: Jan Beulich Cc: Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, linux-kernel, iommu [-- Attachment #1.1.1: Type: text/plain, Size: 1243 bytes --] On 16.09.24 09:01, Jan Beulich wrote: > On 16.09.2024 08:59, Juergen Gross wrote: >> On 16.09.24 08:56, Juergen Gross wrote: >>> On 16.09.24 08:50, Jan Beulich wrote: >>>> On 16.09.2024 08:47, Juergen Gross wrote: >>>>> --- a/drivers/xen/swiotlb-xen.c >>>>> +++ b/drivers/xen/swiotlb-xen.c >>>>> @@ -78,9 +78,15 @@ static inline int >>>>> range_straddles_page_boundary(phys_addr_t p, size_t size) >>>>> { >>>>> unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p); >>>>> unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + size); >>>>> + phys_addr_t algn = 1ULL << (get_order(size) + PAGE_SHIFT); >>>>> next_bfn = pfn_to_bfn(xen_pfn); >>>>> + /* If buffer is physically aligned, ensure DMA alignment. */ >>>>> + if (IS_ALIGNED(p, algn) && >>>>> + !IS_ALIGNED(next_bfn << XEN_PAGE_SHIFT, algn)) >>>> >>>> And this shift is not at risk of losing bits on Arm LPAE? >>> >>> For alignment check this just doesn't matter (assuming XEN_PAGE_SIZE is >>> smaller than 4G). >> >> Wait, that was nonsense. > > I think it was quite reasonable, as long as also algn (and hence size) > isn't absurdly large. Better safe than sorry. Juergen [-- Attachment #1.1.2: OpenPGP public key --] [-- Type: application/pgp-keys, Size: 3743 bytes --] [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 495 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers 2024-09-16 6:59 ` Juergen Gross 2024-09-16 7:01 ` Jan Beulich @ 2024-09-16 20:19 ` Stefano Stabellini 1 sibling, 0 replies; 17+ messages in thread From: Stefano Stabellini @ 2024-09-16 20:19 UTC (permalink / raw) To: Juergen Gross Cc: Jan Beulich, Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, linux-kernel, iommu [-- Attachment #1: Type: text/plain, Size: 1238 bytes --] On Mon, 16 Sep 2024, Juergen Gross wrote: > On 16.09.24 08:56, Juergen Gross wrote: > > On 16.09.24 08:50, Jan Beulich wrote: > > > On 16.09.2024 08:47, Juergen Gross wrote: > > > > --- a/drivers/xen/swiotlb-xen.c > > > > +++ b/drivers/xen/swiotlb-xen.c > > > > @@ -78,9 +78,15 @@ static inline int > > > > range_straddles_page_boundary(phys_addr_t p, size_t size) > > > > { > > > > unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p); > > > > unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + > > > > size); > > > > + phys_addr_t algn = 1ULL << (get_order(size) + PAGE_SHIFT); > > > > next_bfn = pfn_to_bfn(xen_pfn); > > > > + /* If buffer is physically aligned, ensure DMA alignment. */ > > > > + if (IS_ALIGNED(p, algn) && > > > > + !IS_ALIGNED(next_bfn << XEN_PAGE_SHIFT, algn)) > > > > > > And this shift is not at risk of losing bits on Arm LPAE? > > > > For alignment check this just doesn't matter (assuming XEN_PAGE_SIZE is > > smaller than 4G). > > Wait, that was nonsense. > > I'll change the check to: > > !IS_ALIGNED((phys_addr_t)next_bfn << XEN_PAGE_SHIFT, algn) With this change: Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers 2024-09-16 6:47 ` [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers Juergen Gross 2024-09-16 6:50 ` Jan Beulich @ 2024-11-29 17:36 ` Thierry Escande 2024-12-02 8:27 ` Jürgen Groß 1 sibling, 1 reply; 17+ messages in thread From: Thierry Escande @ 2024-11-29 17:36 UTC (permalink / raw) To: Juergen Gross, linux-kernel, iommu Cc: Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, jbeulich Hi, On 16/09/2024 08:47, Juergen Gross wrote: > diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c > index 35155258a7e2..ddf5b1df632e 100644 > --- a/drivers/xen/swiotlb-xen.c > +++ b/drivers/xen/swiotlb-xen.c > @@ -78,9 +78,15 @@ static inline int range_straddles_page_boundary(phys_addr_t p, size_t size) > { > unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p); > unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + size); > + phys_addr_t algn = 1ULL << (get_order(size) + PAGE_SHIFT); > > next_bfn = pfn_to_bfn(xen_pfn); > > + /* If buffer is physically aligned, ensure DMA alignment. */ > + if (IS_ALIGNED(p, algn) && > + !IS_ALIGNED(next_bfn << XEN_PAGE_SHIFT, algn)) > + return 1; There is a regression in the mpt3sas driver because of this change. When, in a dom0, this driver creates its DMA pool at probe time and calls dma_pool_zalloc() (see [1]), the call to range_straddles_page_boundary() (from xen_swiotlb_alloc_coherent()) returns 1 because of the alignment checks added by this patch. Then the call to xen_create_contiguous_region() in xen_swiotlb_alloc_coherent() fails because the passed size order is too big (> MAX_CONTIG_ORDER). This driver sets the pool allocation block size to 2.3+ MBytes. From previous discussions on the v1 patch, these checks are not necessary from xen_swiotlb_alloc_coherent() that already ensures alignment, right? [1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/scsi/mpt3sas/mpt3sas_base.c?h=v6.12.1#n6227 Regards, Thierry ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers 2024-11-29 17:36 ` Thierry Escande @ 2024-12-02 8:27 ` Jürgen Groß 2024-12-02 17:21 ` Thierry Escande 0 siblings, 1 reply; 17+ messages in thread From: Jürgen Groß @ 2024-12-02 8:27 UTC (permalink / raw) To: Thierry Escande, linux-kernel, iommu Cc: Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, jbeulich [-- Attachment #1.1.1: Type: text/plain, Size: 2403 bytes --] On 29.11.24 18:36, Thierry Escande wrote: > Hi, > > On 16/09/2024 08:47, Juergen Gross wrote: >> diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c >> index 35155258a7e2..ddf5b1df632e 100644 >> --- a/drivers/xen/swiotlb-xen.c >> +++ b/drivers/xen/swiotlb-xen.c >> @@ -78,9 +78,15 @@ static inline int range_straddles_page_boundary(phys_addr_t p, size_t size) >> { >> unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p); >> unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + size); >> + phys_addr_t algn = 1ULL << (get_order(size) + PAGE_SHIFT); >> >> next_bfn = pfn_to_bfn(xen_pfn); >> >> + /* If buffer is physically aligned, ensure DMA alignment. */ >> + if (IS_ALIGNED(p, algn) && >> + !IS_ALIGNED(next_bfn << XEN_PAGE_SHIFT, algn)) >> + return 1; > > There is a regression in the mpt3sas driver because of this change. > When, in a dom0, this driver creates its DMA pool at probe time and > calls dma_pool_zalloc() (see [1]), the call to > range_straddles_page_boundary() (from xen_swiotlb_alloc_coherent()) > returns 1 because of the alignment checks added by this patch. Then the > call to xen_create_contiguous_region() in xen_swiotlb_alloc_coherent() > fails because the passed size order is too big (> MAX_CONTIG_ORDER). > This driver sets the pool allocation block size to 2.3+ MBytes. > > From previous discussions on the v1 patch, these checks are not > necessary from xen_swiotlb_alloc_coherent() that already ensures > alignment, right? It ensures alignment regarding guest physical memory, but it doesn't do so for machine memory. For DMA machine memory proper alignment might be needed, too, so the check is required. As an example, some crypto drivers seem to rely on proper machine memory alignment, which was the reason for those checks to be added. Possible solutions include: - rising the MAX_CONTIG_ORDER limit (to which value?) - adding a way to allocate large DMA buffers with relaxed alignment requirements (this will impact the whole DMA infrastructure plus drivers like mp3sas which would need to use the new interface) - modify the mpt3sas driver to stay within the current limits - only guarantee proper machine memory alignment up to MAX_CONTIG_ORDER (risking to introduce hard to diagnose bugs for the rare use cases of such large buffers) Juergen [-- Attachment #1.1.2: OpenPGP public key --] [-- Type: application/pgp-keys, Size: 3743 bytes --] [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 495 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers 2024-12-02 8:27 ` Jürgen Groß @ 2024-12-02 17:21 ` Thierry Escande 0 siblings, 0 replies; 17+ messages in thread From: Thierry Escande @ 2024-12-02 17:21 UTC (permalink / raw) To: Jürgen Groß, linux-kernel, iommu Cc: Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, jbeulich On 02/12/2024 09:27, Jürgen Groß wrote: > On 29.11.24 18:36, Thierry Escande wrote: >> Hi, >> >> On 16/09/2024 08:47, Juergen Gross wrote: >>> diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c >>> index 35155258a7e2..ddf5b1df632e 100644 >>> --- a/drivers/xen/swiotlb-xen.c >>> +++ b/drivers/xen/swiotlb-xen.c >>> @@ -78,9 +78,15 @@ static inline int >>> range_straddles_page_boundary(phys_addr_t p, size_t size) >>> { >>> unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p); >>> unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + >>> size); >>> + phys_addr_t algn = 1ULL << (get_order(size) + PAGE_SHIFT); >>> next_bfn = pfn_to_bfn(xen_pfn); >>> + /* If buffer is physically aligned, ensure DMA alignment. */ >>> + if (IS_ALIGNED(p, algn) && >>> + !IS_ALIGNED(next_bfn << XEN_PAGE_SHIFT, algn)) >>> + return 1; >> >> There is a regression in the mpt3sas driver because of this change. >> When, in a dom0, this driver creates its DMA pool at probe time and >> calls dma_pool_zalloc() (see [1]), the call to >> range_straddles_page_boundary() (from xen_swiotlb_alloc_coherent()) >> returns 1 because of the alignment checks added by this patch. Then the >> call to xen_create_contiguous_region() in xen_swiotlb_alloc_coherent() >> fails because the passed size order is too big (> MAX_CONTIG_ORDER). >> This driver sets the pool allocation block size to 2.3+ MBytes. >> >> From previous discussions on the v1 patch, these checks are not >> necessary from xen_swiotlb_alloc_coherent() that already ensures >> alignment, right? > > It ensures alignment regarding guest physical memory, but it doesn't do > so for machine memory. > > For DMA machine memory proper alignment might be needed, too, so the > check is required. As an example, some crypto drivers seem to rely on > proper machine memory alignment, which was the reason for those checks > to be added. > > Possible solutions include: > > - rising the MAX_CONTIG_ORDER limit (to which value?) Looks like the quick and easy solution. Bumping MAX_CONTIG_ORDER to 10 would allow 4MB pools, enough for this particular driver. I'll send a patch if that sounds reasonable. Regards, Thierry > - adding a way to allocate large DMA buffers with relaxed alignment > requirements (this will impact the whole DMA infrastructure plus > drivers like mp3sas which would need to use the new interface) > - modify the mpt3sas driver to stay within the current limits > - only guarantee proper machine memory alignment up to MAX_CONTIG_ORDER > (risking to introduce hard to diagnose bugs for the rare use cases of > such large buffers) > > > Juergen ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 2/2] xen/swiotlb: fix allocated size 2024-09-16 6:47 [PATCH v2 0/2] xen/swiotlb: fix 2 issues in xen-swiotlb Juergen Gross 2024-09-16 6:47 ` [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers Juergen Gross @ 2024-09-16 6:47 ` Juergen Gross 2024-09-16 7:59 ` Jan Beulich 1 sibling, 1 reply; 17+ messages in thread From: Juergen Gross @ 2024-09-16 6:47 UTC (permalink / raw) To: linux-kernel, iommu Cc: Juergen Gross, Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, Jan Beulich The allocated size in xen_swiotlb_alloc_coherent() and xen_swiotlb_free_coherent() is calculated wrong for the case of XEN_PAGE_SIZE not matching PAGE_SIZE. Fix that. Fixes: 7250f422da04 ("xen-swiotlb: use actually allocated size on check physical continuous") Reported-by: Jan Beulich <jbeulich@suse.com> Signed-off-by: Juergen Gross <jgross@suse.com> --- V2: - new patch --- 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 ddf5b1df632e..faa2fb7c74ae 100644 --- a/drivers/xen/swiotlb-xen.c +++ b/drivers/xen/swiotlb-xen.c @@ -147,7 +147,7 @@ xen_swiotlb_alloc_coherent(struct device *dev, size_t size, void *ret; /* Align the allocation to the Xen page size */ - size = 1UL << (order + XEN_PAGE_SHIFT); + size = ALIGN(size, XEN_PAGE_SIZE); ret = (void *)__get_free_pages(flags, get_order(size)); if (!ret) @@ -179,7 +179,7 @@ xen_swiotlb_free_coherent(struct device *dev, size_t size, void *vaddr, int order = get_order(size); /* Convert the size to actually allocated. */ - size = 1UL << (order + XEN_PAGE_SHIFT); + size = ALIGN(size, XEN_PAGE_SIZE); if (WARN_ON_ONCE(dma_handle + size - 1 > dev->coherent_dma_mask) || WARN_ON_ONCE(range_straddles_page_boundary(phys, size))) -- 2.43.0 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/2] xen/swiotlb: fix allocated size 2024-09-16 6:47 ` [PATCH v2 2/2] xen/swiotlb: fix allocated size Juergen Gross @ 2024-09-16 7:59 ` Jan Beulich 2024-09-16 8:05 ` Jürgen Groß 2024-09-16 20:11 ` Stefano Stabellini 0 siblings, 2 replies; 17+ messages in thread From: Jan Beulich @ 2024-09-16 7:59 UTC (permalink / raw) To: Juergen Gross Cc: Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, linux-kernel, iommu On 16.09.2024 08:47, Juergen Gross wrote: > The allocated size in xen_swiotlb_alloc_coherent() and > xen_swiotlb_free_coherent() is calculated wrong for the case of > XEN_PAGE_SIZE not matching PAGE_SIZE. Fix that. > > Fixes: 7250f422da04 ("xen-swiotlb: use actually allocated size on check physical continuous") > Reported-by: Jan Beulich <jbeulich@suse.com> > Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> > --- a/drivers/xen/swiotlb-xen.c > +++ b/drivers/xen/swiotlb-xen.c > @@ -147,7 +147,7 @@ xen_swiotlb_alloc_coherent(struct device *dev, size_t size, > void *ret; > > /* Align the allocation to the Xen page size */ > - size = 1UL << (order + XEN_PAGE_SHIFT); > + size = ALIGN(size, XEN_PAGE_SIZE); The way you're doing it has further positive effects, as the size is now also no longer needlessly over-aligned. May want mentioning in the description. Hope of course is that no-one came to rely on the up-to-next-power-of-2 allocation anywhere (which of course would be a bug there, yet might end in a perceived regression). Jan ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/2] xen/swiotlb: fix allocated size 2024-09-16 7:59 ` Jan Beulich @ 2024-09-16 8:05 ` Jürgen Groß 2024-09-16 20:11 ` Stefano Stabellini 1 sibling, 0 replies; 17+ messages in thread From: Jürgen Groß @ 2024-09-16 8:05 UTC (permalink / raw) To: Jan Beulich Cc: Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, linux-kernel, iommu [-- Attachment #1.1.1: Type: text/plain, Size: 1450 bytes --] On 16.09.24 09:59, Jan Beulich wrote: > On 16.09.2024 08:47, Juergen Gross wrote: >> The allocated size in xen_swiotlb_alloc_coherent() and >> xen_swiotlb_free_coherent() is calculated wrong for the case of >> XEN_PAGE_SIZE not matching PAGE_SIZE. Fix that. >> >> Fixes: 7250f422da04 ("xen-swiotlb: use actually allocated size on check physical continuous") >> Reported-by: Jan Beulich <jbeulich@suse.com> >> Signed-off-by: Juergen Gross <jgross@suse.com> > > Reviewed-by: Jan Beulich <jbeulich@suse.com> > >> --- a/drivers/xen/swiotlb-xen.c >> +++ b/drivers/xen/swiotlb-xen.c >> @@ -147,7 +147,7 @@ xen_swiotlb_alloc_coherent(struct device *dev, size_t size, >> void *ret; >> >> /* Align the allocation to the Xen page size */ >> - size = 1UL << (order + XEN_PAGE_SHIFT); >> + size = ALIGN(size, XEN_PAGE_SIZE); > > The way you're doing it has further positive effects, as the size > is now also no longer needlessly over-aligned. May want mentioning > in the description. Hope of course is that no-one came to rely on > the up-to-next-power-of-2 allocation anywhere (which of course > would be a bug there, yet might end in a perceived regression). Quite unlikely IMHO, as this is a Xen-only behavior. I'm not aware of any hardware used with Xen only. So for a regression to happen the driver allocating DMA memory would need to have a Xen-specific handling relying on the higher alignment. Juergen [-- Attachment #1.1.2: OpenPGP public key --] [-- Type: application/pgp-keys, Size: 3743 bytes --] [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 495 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/2] xen/swiotlb: fix allocated size 2024-09-16 7:59 ` Jan Beulich 2024-09-16 8:05 ` Jürgen Groß @ 2024-09-16 20:11 ` Stefano Stabellini 1 sibling, 0 replies; 17+ messages in thread From: Stefano Stabellini @ 2024-09-16 20:11 UTC (permalink / raw) To: Jan Beulich Cc: Juergen Gross, Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, linux-kernel, iommu On Mon, 16 Sep 2024, Jan Beulich wrote: > On 16.09.2024 08:47, Juergen Gross wrote: > > The allocated size in xen_swiotlb_alloc_coherent() and > > xen_swiotlb_free_coherent() is calculated wrong for the case of > > XEN_PAGE_SIZE not matching PAGE_SIZE. Fix that. > > > > Fixes: 7250f422da04 ("xen-swiotlb: use actually allocated size on check physical continuous") > > Reported-by: Jan Beulich <jbeulich@suse.com> > > Signed-off-by: Juergen Gross <jgross@suse.com> > > Reviewed-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2024-12-02 17:21 UTC | newest] Thread overview: 17+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-09-16 6:47 [PATCH v2 0/2] xen/swiotlb: fix 2 issues in xen-swiotlb Juergen Gross 2024-09-16 6:47 ` [PATCH v2 1/2] xen/swiotlb: add alignment check for dma buffers Juergen Gross 2024-09-16 6:50 ` Jan Beulich 2024-09-16 6:56 ` Juergen Gross 2024-09-16 6:59 ` Jan Beulich 2024-09-16 7:02 ` Jürgen Groß 2024-09-16 6:59 ` Juergen Gross 2024-09-16 7:01 ` Jan Beulich 2024-09-16 7:03 ` Jürgen Groß 2024-09-16 20:19 ` Stefano Stabellini 2024-11-29 17:36 ` Thierry Escande 2024-12-02 8:27 ` Jürgen Groß 2024-12-02 17:21 ` Thierry Escande 2024-09-16 6:47 ` [PATCH v2 2/2] xen/swiotlb: fix allocated size Juergen Gross 2024-09-16 7:59 ` Jan Beulich 2024-09-16 8:05 ` Jürgen Groß 2024-09-16 20:11 ` Stefano Stabellini
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox