mbox series

[V1,0/5] memfd-pin huge page fixes

Message ID 1725373521-451395-1-git-send-email-steven.sistare@oracle.com (mailing list archive)
Headers show
Series memfd-pin huge page fixes | expand

Message

Steven Sistare Sept. 3, 2024, 2:25 p.m. UTC
Fix multiple bugs that occur when using memfd_pin_folios with hugetlb pages
and THP.  The hugetlb bugs only bite when the page is not yet faulted in
when memfd_pin_folios is called.  The THP bug bites when the starting offset
passed to memfd_pin_folios is not huge page aligned.  See the commit messages
for details.

Steve Sistare (5):
  mm/filemap: fix filemap_get_folios_contig THP panic
  mm/hugetlb: fix memfd_pin_folios free_huge_pages leak
  mm/hugetlb: fix memfd_pin_folios resv_huge_pages leak
  mm/gup: fix memfd_pin_folios hugetlb page allocation
  mm/gup: fix memfd_pin_folios alloc race panic

 include/linux/hugetlb.h | 10 ++++++++++
 mm/filemap.c            |  4 ++++
 mm/gup.c                |  5 ++++-
 mm/hugetlb.c            | 17 +++++++++++++++++
 mm/memfd.c              | 15 +++++++++------
 5 files changed, 44 insertions(+), 7 deletions(-)

Comments

Vivek Kasireddy Sept. 4, 2024, 1:12 a.m. UTC | #1
Hi Steve,

> Subject: [PATCH V1 0/5] memfd-pin huge page fixes
> 
> Fix multiple bugs that occur when using memfd_pin_folios with hugetlb
> pages
> and THP.  The hugetlb bugs only bite when the page is not yet faulted in
> when memfd_pin_folios is called.  The THP bug bites when the starting offset
> passed to memfd_pin_folios is not huge page aligned.  See the commit
> messages
> for details.
Thank you for fixing these bugs. I have Acked all patches except for patch #1,
as my understanding of xarrays is limited at this point.

Also, could you please briefly describe how you have exercised memfd_alloc_folio()
code path or what tests you have run to uncover these bugs? I'd like to
figure out ways to augment the list of udmabuf tests to validate scenarios
where hugetlb pages are not faulted in and memfd_pin_folios() is called.

Thanks,
Vivek

> 
> Steve Sistare (5):
>   mm/filemap: fix filemap_get_folios_contig THP panic
>   mm/hugetlb: fix memfd_pin_folios free_huge_pages leak
>   mm/hugetlb: fix memfd_pin_folios resv_huge_pages leak
>   mm/gup: fix memfd_pin_folios hugetlb page allocation
>   mm/gup: fix memfd_pin_folios alloc race panic
> 
>  include/linux/hugetlb.h | 10 ++++++++++
>  mm/filemap.c            |  4 ++++
>  mm/gup.c                |  5 ++++-
>  mm/hugetlb.c            | 17 +++++++++++++++++
>  mm/memfd.c              | 15 +++++++++------
>  5 files changed, 44 insertions(+), 7 deletions(-)
> 
> --
> 1.8.3.1
Steven Sistare Sept. 4, 2024, 2:51 p.m. UTC | #2
On 9/3/2024 9:12 PM, Kasireddy, Vivek wrote:
> Hi Steve,
> 
>> Subject: [PATCH V1 0/5] memfd-pin huge page fixes
>>
>> Fix multiple bugs that occur when using memfd_pin_folios with hugetlb
>> pages
>> and THP.  The hugetlb bugs only bite when the page is not yet faulted in
>> when memfd_pin_folios is called.  The THP bug bites when the starting offset
>> passed to memfd_pin_folios is not huge page aligned.  See the commit
>> messages
>> for details.
> Thank you for fixing these bugs. I have Acked all patches except for patch #1,
> as my understanding of xarrays is limited at this point.
> 
> Also, could you please briefly describe how you have exercised memfd_alloc_folio()
> code path or what tests you have run to uncover these bugs? I'd like to
> figure out ways to augment the list of udmabuf tests to validate scenarios
> where hugetlb pages are not faulted in and memfd_pin_folios() is called.

I am extending iommufd to support memfd pinning, so I added a new ioctl which
takes an fd, offset, and length to pin.  I am just getting started, so currently
it does nothing more than call memfd_pin_folios immediately followed by unpin_folios.
Then exit the process.  That is sufficient to trigger all the bugs except the alloc
race panic. I tested with these files:
   /dev/hugepages/file
   /dev/shm/file    with: mount -o remount,huge=always /dev/shm
   memfd_create(MFD_HUGETLB)
   memfd_create(0)  with: echo always > /sys/kernel/mm/transparent_hugepage/shmem_enabled

- Steve

>> Steve Sistare (5):
>>    mm/filemap: fix filemap_get_folios_contig THP panic
>>    mm/hugetlb: fix memfd_pin_folios free_huge_pages leak
>>    mm/hugetlb: fix memfd_pin_folios resv_huge_pages leak
>>    mm/gup: fix memfd_pin_folios hugetlb page allocation
>>    mm/gup: fix memfd_pin_folios alloc race panic
>>
>>   include/linux/hugetlb.h | 10 ++++++++++
>>   mm/filemap.c            |  4 ++++
>>   mm/gup.c                |  5 ++++-
>>   mm/hugetlb.c            | 17 +++++++++++++++++
>>   mm/memfd.c              | 15 +++++++++------
>>   5 files changed, 44 insertions(+), 7 deletions(-)
>>
>> --
>> 1.8.3.1
>
Vivek Kasireddy Sept. 6, 2024, 8:09 a.m. UTC | #3
> Subject: Re: [PATCH V1 0/5] memfd-pin huge page fixes
> 
> On 9/3/2024 9:12 PM, Kasireddy, Vivek wrote:
> > Hi Steve,
> >
> >> Subject: [PATCH V1 0/5] memfd-pin huge page fixes
> >>
> >> Fix multiple bugs that occur when using memfd_pin_folios with hugetlb
> >> pages
> >> and THP.  The hugetlb bugs only bite when the page is not yet faulted in
> >> when memfd_pin_folios is called.  The THP bug bites when the starting
> offset
> >> passed to memfd_pin_folios is not huge page aligned.  See the commit
> >> messages
> >> for details.
> > Thank you for fixing these bugs. I have Acked all patches except for patch
> #1,
> > as my understanding of xarrays is limited at this point.
> >
> > Also, could you please briefly describe how you have exercised
> memfd_alloc_folio()
> > code path or what tests you have run to uncover these bugs? I'd like to
> > figure out ways to augment the list of udmabuf tests to validate scenarios
> > where hugetlb pages are not faulted in and memfd_pin_folios() is called.
> 
> I am extending iommufd to support memfd pinning, so I added a new ioctl
> which
> takes an fd, offset, and length to pin.  I am just getting started, so currently
> it does nothing more than call memfd_pin_folios immediately followed by
> unpin_folios.
> Then exit the process.  That is sufficient to trigger all the bugs except the alloc
> race panic. I tested with these files:
>    /dev/hugepages/file
>    /dev/shm/file    with: mount -o remount,huge=always /dev/shm
>    memfd_create(MFD_HUGETLB)
>    memfd_create(0)  with: echo always >
> /sys/kernel/mm/transparent_hugepage/shmem_enabled
Thank you for explaining your test-case.

Thanks,
Vivek

> 
> - Steve
> 
> >> Steve Sistare (5):
> >>    mm/filemap: fix filemap_get_folios_contig THP panic
> >>    mm/hugetlb: fix memfd_pin_folios free_huge_pages leak
> >>    mm/hugetlb: fix memfd_pin_folios resv_huge_pages leak
> >>    mm/gup: fix memfd_pin_folios hugetlb page allocation
> >>    mm/gup: fix memfd_pin_folios alloc race panic
> >>
> >>   include/linux/hugetlb.h | 10 ++++++++++
> >>   mm/filemap.c            |  4 ++++
> >>   mm/gup.c                |  5 ++++-
> >>   mm/hugetlb.c            | 17 +++++++++++++++++
> >>   mm/memfd.c              | 15 +++++++++------
> >>   5 files changed, 44 insertions(+), 7 deletions(-)
> >>
> >> --
> >> 1.8.3.1
> >