* [PATCH] iommufd: Fix offset handling in folio subroutines
@ 2025-04-02 1:44 Alexey Kardashevskiy
2025-04-07 5:12 ` Tian, Kevin
0 siblings, 1 reply; 3+ messages in thread
From: Alexey Kardashevskiy @ 2025-04-02 1:44 UTC (permalink / raw)
To: iommu
Cc: Jason Gunthorpe, Kevin Tian, Joerg Roedel, Will Deacon,
Robin Murphy, Steve Sistare, Alexey Kardashevskiy
The @offset from memfd_pin_folios() is pgoff_t and is bytes, not
a number of pages as batch_from_folios() treats it.
Convert byte offset to pfn offset and use that.
Fixes: ed9178fbfd4e ("iommufd: Folio subroutines")
Signed-off-by: Alexey Kardashevskiy <aik@amd.com>
---
Found this when tried mapping a bunch of folios (>64) with an offset and
the first folio was used for all the mappings in the batch.
---
drivers/iommu/iommufd/pages.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/iommu/iommufd/pages.c b/drivers/iommu/iommufd/pages.c
index 3427749bc5ce..6075d11691a6 100644
--- a/drivers/iommu/iommufd/pages.c
+++ b/drivers/iommu/iommufd/pages.c
@@ -646,8 +646,9 @@ static int batch_from_folios(struct pfn_batch *batch, struct folio ***folios_p,
while (npages) {
struct folio *folio = *folios;
- unsigned long nr = folio_nr_pages(folio) - offset;
- unsigned long pfn = page_to_pfn(folio_page(folio, offset));
+ unsigned long offset_nr = offset >> PAGE_SHIFT;
+ unsigned long nr = folio_nr_pages(folio) - offset_nr;
+ unsigned long pfn = page_to_pfn(folio_page(folio, offset_nr));
nr = min(nr, npages);
npages -= nr;
--
2.47.1
^ permalink raw reply related [flat|nested] 3+ messages in thread* RE: [PATCH] iommufd: Fix offset handling in folio subroutines 2025-04-02 1:44 [PATCH] iommufd: Fix offset handling in folio subroutines Alexey Kardashevskiy @ 2025-04-07 5:12 ` Tian, Kevin 2025-04-07 6:53 ` Alexey Kardashevskiy 0 siblings, 1 reply; 3+ messages in thread From: Tian, Kevin @ 2025-04-07 5:12 UTC (permalink / raw) To: Alexey Kardashevskiy, iommu@lists.linux.dev Cc: Jason Gunthorpe, Joerg Roedel, Will Deacon, Robin Murphy, Steve Sistare > From: Alexey Kardashevskiy <aik@amd.com> > Sent: Wednesday, April 2, 2025 9:44 AM > > The @offset from memfd_pin_folios() is pgoff_t and is bytes, not > a number of pages as batch_from_folios() treats it. > > Convert byte offset to pfn offset and use that. > > Fixes: ed9178fbfd4e ("iommufd: Folio subroutines") > Signed-off-by: Alexey Kardashevskiy <aik@amd.com> > --- > > Found this when tried mapping a bunch of folios (>64) with an offset and > the first folio was used for all the mappings in the batch. > > --- > drivers/iommu/iommufd/pages.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/drivers/iommu/iommufd/pages.c > b/drivers/iommu/iommufd/pages.c > index 3427749bc5ce..6075d11691a6 100644 > --- a/drivers/iommu/iommufd/pages.c > +++ b/drivers/iommu/iommufd/pages.c > @@ -646,8 +646,9 @@ static int batch_from_folios(struct pfn_batch *batch, > struct folio ***folios_p, > > while (npages) { > struct folio *folio = *folios; > - unsigned long nr = folio_nr_pages(folio) - offset; > - unsigned long pfn = page_to_pfn(folio_page(folio, offset)); > + unsigned long offset_nr = offset >> PAGE_SHIFT; > + unsigned long nr = folio_nr_pages(folio) - offset_nr; > + unsigned long pfn = page_to_pfn(folio_page(folio, offset_nr)); pin_memfd_pages(): nfolios = memfd_pin_folios(user->file, start, end, user->ufolios, nfolios, &offset); offset >>= PAGE_SHIFT; user->ufolios_next = user->ufolios; user->ufolios_offset = offset; pfn_reader_fill_span(): if (!user->file) batch_from_pages(&pfns->batch, user->upages + start_index, npages); else rc = batch_from_folios(&pfns->batch, &user->ufolios_next, &user->ufolios_offset, npages); So the offset is already about a page number as batch_from_folios() expects. > > nr = min(nr, npages); > npages -= nr; > -- > 2.47.1 ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] iommufd: Fix offset handling in folio subroutines 2025-04-07 5:12 ` Tian, Kevin @ 2025-04-07 6:53 ` Alexey Kardashevskiy 0 siblings, 0 replies; 3+ messages in thread From: Alexey Kardashevskiy @ 2025-04-07 6:53 UTC (permalink / raw) To: Tian, Kevin, iommu@lists.linux.dev Cc: Jason Gunthorpe, Joerg Roedel, Will Deacon, Robin Murphy, Steve Sistare On 7/4/25 15:12, Tian, Kevin wrote: >> From: Alexey Kardashevskiy <aik@amd.com> >> Sent: Wednesday, April 2, 2025 9:44 AM >> >> The @offset from memfd_pin_folios() is pgoff_t and is bytes, not >> a number of pages as batch_from_folios() treats it. >> >> Convert byte offset to pfn offset and use that. >> >> Fixes: ed9178fbfd4e ("iommufd: Folio subroutines") >> Signed-off-by: Alexey Kardashevskiy <aik@amd.com> >> --- >> >> Found this when tried mapping a bunch of folios (>64) with an offset and >> the first folio was used for all the mappings in the batch. >> >> --- >> drivers/iommu/iommufd/pages.c | 5 +++-- >> 1 file changed, 3 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/iommu/iommufd/pages.c >> b/drivers/iommu/iommufd/pages.c >> index 3427749bc5ce..6075d11691a6 100644 >> --- a/drivers/iommu/iommufd/pages.c >> +++ b/drivers/iommu/iommufd/pages.c >> @@ -646,8 +646,9 @@ static int batch_from_folios(struct pfn_batch *batch, >> struct folio ***folios_p, >> >> while (npages) { >> struct folio *folio = *folios; >> - unsigned long nr = folio_nr_pages(folio) - offset; >> - unsigned long pfn = page_to_pfn(folio_page(folio, offset)); >> + unsigned long offset_nr = offset >> PAGE_SHIFT; >> + unsigned long nr = folio_nr_pages(folio) - offset_nr; >> + unsigned long pfn = page_to_pfn(folio_page(folio, offset_nr)); > > pin_memfd_pages(): > nfolios = memfd_pin_folios(user->file, start, end, user->ufolios, > nfolios, &offset); > offset >>= PAGE_SHIFT; Aaaaahhh missed that so there is a bug in my variant of memfd_pin_folios() for gmemfd and sorry for the noise. Thanks, > user->ufolios_next = user->ufolios; > user->ufolios_offset = offset; > > pfn_reader_fill_span(): > if (!user->file) > batch_from_pages(&pfns->batch, user->upages + start_index, > npages); > else > rc = batch_from_folios(&pfns->batch, &user->ufolios_next, > &user->ufolios_offset, npages); > > So the offset is already about a page number as batch_from_folios() expects. > >> >> nr = min(nr, npages); >> npages -= nr; >> -- >> 2.47.1 > -- Alexey ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-04-07 6:53 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-04-02 1:44 [PATCH] iommufd: Fix offset handling in folio subroutines Alexey Kardashevskiy 2025-04-07 5:12 ` Tian, Kevin 2025-04-07 6:53 ` Alexey Kardashevskiy
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox