* [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios @ 2024-06-04 5:47 xu.xin16 2024-06-04 7:57 ` David Hildenbrand 2024-06-05 9:06 ` Barry Song 0 siblings, 2 replies; 12+ messages in thread From: xu.xin16 @ 2024-06-04 5:47 UTC (permalink / raw) To: akpm, ziy Cc: v-songbaohua, mhocko, david, linux-mm, linux-kernel, xu.xin16, yang.yang29 From: Ran Xiaokai <ran.xiaokai@zte.com.cn> When I did a large folios split test, a WARNING "[ 5059.122759][ T166] Cannot split file folio to non-0 order" was triggered. But my test cases are only for anonmous folios. while mapping_large_folio_support() is only reasonable for page cache folios. In split_huge_page_to_list_to_order(), the folio passed to mapping_large_folio_support() maybe anonmous folio. The folio_test_anon() check is missing. So the split of the anonmous THP is failed. This is also the same for shmem_mapping(). We'd better add a check for both. But the shmem_mapping() in __split_huge_page() is not involved, as for anonmous folios, the end parameter is set to -1, so (head[i].index >= end) is always false. shmem_mapping() is not called. Using /sys/kernel/debug/split_huge_pages to verify this, with this patch, large anon THP is successfully split and the warning is ceased. Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn> Cc: xu xin <xu.xin16@zte.com.cn> Cc: Yang Yang <yang.yang29@zte.com.cn> --- mm/huge_memory.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 317de2afd371..4c9c7e5ea20c 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list, if (new_order >= folio_order(folio)) return -EINVAL; - /* Cannot split anonymous THP to order-1 */ - if (new_order == 1 && folio_test_anon(folio)) { - VM_WARN_ONCE(1, "Cannot split to order-1 folio"); - return -EINVAL; - } - if (new_order) { /* Only swapping a whole PMD-mapped folio is supported */ if (folio_test_swapcache(folio)) return -EINVAL; - /* Split shmem folio to non-zero order not supported */ - if (shmem_mapping(folio->mapping)) { - VM_WARN_ONCE(1, - "Cannot split shmem folio to non-0 order"); - return -EINVAL; - } - /* No split if the file system does not support large folio */ - if (!mapping_large_folio_support(folio->mapping)) { - VM_WARN_ONCE(1, - "Cannot split file folio to non-0 order"); - return -EINVAL; + + if (folio_test_anon(folio)) { + /* Cannot split anonymous THP to order-1 */ + if (new_order == 1) { + VM_WARN_ONCE(1, "Cannot split to order-1 folio"); + return -EINVAL; + } + } else { + /* Split shmem folio to non-zero order not supported */ + if (shmem_mapping(folio->mapping)) { + VM_WARN_ONCE(1, + "Cannot split shmem folio to non-0 order"); + return -EINVAL; + } + /* No split if the file system does not support large folio */ + if (!mapping_large_folio_support(folio->mapping)) { + VM_WARN_ONCE(1, + "Cannot split file folio to non-0 order"); + return -EINVAL; + } } } - is_hzp = is_huge_zero_folio(folio); if (is_hzp) { pr_warn_ratelimited("Called split_huge_page for huge zero page\n"); -- 2.15.2 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios 2024-06-04 5:47 [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios xu.xin16 @ 2024-06-04 7:57 ` David Hildenbrand 2024-06-04 13:52 ` Zi Yan 2024-06-05 2:20 ` ran xiaokai 2024-06-05 9:06 ` Barry Song 1 sibling, 2 replies; 12+ messages in thread From: David Hildenbrand @ 2024-06-04 7:57 UTC (permalink / raw) To: xu.xin16, akpm, ziy Cc: v-songbaohua, mhocko, linux-mm, linux-kernel, yang.yang29 On 04.06.24 07:47, xu.xin16@zte.com.cn wrote: > From: Ran Xiaokai <ran.xiaokai@zte.com.cn> > > When I did a large folios split test, a WARNING > "[ 5059.122759][ T166] Cannot split file folio to non-0 order" > was triggered. But my test cases are only for anonmous folios. > while mapping_large_folio_support() is only reasonable for page > cache folios. Agreed. I wonder if mapping_large_folio_support() should either a) Complain if used for anon folios, so we can detect the wrong use more easily. (VM_WARN_ON_ONCE()) b) Return "true" for anonymous mappings, although that's more debatable. > > In split_huge_page_to_list_to_order(), the folio passed to > mapping_large_folio_support() maybe anonmous folio. The > folio_test_anon() check is missing. So the split of the anonmous THP > is failed. This is also the same for shmem_mapping(). We'd better add > a check for both. But the shmem_mapping() in __split_huge_page() is > not involved, as for anonmous folios, the end parameter is set to -1, so > (head[i].index >= end) is always false. shmem_mapping() is not called. > > Using /sys/kernel/debug/split_huge_pages to verify this, with this > patch, large anon THP is successfully split and the warning is ceased. > > Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn> > Cc: xu xin <xu.xin16@zte.com.cn> > Cc: Yang Yang <yang.yang29@zte.com.cn> > --- > mm/huge_memory.c | 38 ++++++++++++++++++++------------------ > 1 file changed, 20 insertions(+), 18 deletions(-) > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 317de2afd371..4c9c7e5ea20c 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list, > if (new_order >= folio_order(folio)) > return -EINVAL; > > - /* Cannot split anonymous THP to order-1 */ > - if (new_order == 1 && folio_test_anon(folio)) { > - VM_WARN_ONCE(1, "Cannot split to order-1 folio"); > - return -EINVAL; > - } > - > if (new_order) { > /* Only swapping a whole PMD-mapped folio is supported */ > if (folio_test_swapcache(folio)) > return -EINVAL; > - /* Split shmem folio to non-zero order not supported */ > - if (shmem_mapping(folio->mapping)) { > - VM_WARN_ONCE(1, > - "Cannot split shmem folio to non-0 order"); > - return -EINVAL; > - } > - /* No split if the file system does not support large folio */ > - if (!mapping_large_folio_support(folio->mapping)) { > - VM_WARN_ONCE(1, > - "Cannot split file folio to non-0 order"); > - return -EINVAL; > + > + if (folio_test_anon(folio)) { > + /* Cannot split anonymous THP to order-1 */ > + if (new_order == 1) { > + VM_WARN_ONCE(1, "Cannot split to order-1 folio"); > + return -EINVAL; > + } > + } else { > + /* Split shmem folio to non-zero order not supported */ > + if (shmem_mapping(folio->mapping)) { > + VM_WARN_ONCE(1, > + "Cannot split shmem folio to non-0 order"); > + return -EINVAL; > + } > + /* No split if the file system does not support large folio */ > + if (!mapping_large_folio_support(folio->mapping)) { > + VM_WARN_ONCE(1, > + "Cannot split file folio to non-0 order"); > + return -EINVAL; > + } > } > } What about the following sequence: if (folio_test_anon(folio)) { if (new_order == 1) ... } else if (new_order) { if (shmem_mapping(...)) ... ... } if (folio_test_swapcache(folio) && new_order) return -EINVAL; Should result in less churn and reduce indentation level. -- Cheers, David / dhildenb ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios 2024-06-04 7:57 ` David Hildenbrand @ 2024-06-04 13:52 ` Zi Yan 2024-06-04 13:57 ` Zi Yan 2024-06-05 2:56 ` ran xiaokai 2024-06-05 2:20 ` ran xiaokai 1 sibling, 2 replies; 12+ messages in thread From: Zi Yan @ 2024-06-04 13:52 UTC (permalink / raw) To: David Hildenbrand Cc: xu.xin16, akpm, v-songbaohua, mhocko, linux-mm, linux-kernel, yang.yang29 [-- Attachment #1: Type: text/plain, Size: 3958 bytes --] On 4 Jun 2024, at 0:57, David Hildenbrand wrote: > On 04.06.24 07:47, xu.xin16@zte.com.cn wrote: >> From: Ran Xiaokai <ran.xiaokai@zte.com.cn> >> >> When I did a large folios split test, a WARNING >> "[ 5059.122759][ T166] Cannot split file folio to non-0 order" >> was triggered. But my test cases are only for anonmous folios. >> while mapping_large_folio_support() is only reasonable for page >> cache folios. > > Agreed. > > I wonder if mapping_large_folio_support() should either > > a) Complain if used for anon folios, so we can detect the wrong use more easily. (VM_WARN_ON_ONCE()) This is much better. > > b) Return "true" for anonymous mappings, although that's more debatable. This might fix the warning here, but the function might get wrong uses easily. > >> >> In split_huge_page_to_list_to_order(), the folio passed to >> mapping_large_folio_support() maybe anonmous folio. The >> folio_test_anon() check is missing. So the split of the anonmous THP >> is failed. This is also the same for shmem_mapping(). We'd better add >> a check for both. But the shmem_mapping() in __split_huge_page() is >> not involved, as for anonmous folios, the end parameter is set to -1, so >> (head[i].index >= end) is always false. shmem_mapping() is not called. >> >> Using /sys/kernel/debug/split_huge_pages to verify this, with this >> patch, large anon THP is successfully split and the warning is ceased. >> >> Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn> >> Cc: xu xin <xu.xin16@zte.com.cn> >> Cc: Yang Yang <yang.yang29@zte.com.cn> >> --- >> mm/huge_memory.c | 38 ++++++++++++++++++++------------------ >> 1 file changed, 20 insertions(+), 18 deletions(-) >> >> diff --git a/mm/huge_memory.c b/mm/huge_memory.c >> index 317de2afd371..4c9c7e5ea20c 100644 >> --- a/mm/huge_memory.c >> +++ b/mm/huge_memory.c >> @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list, >> if (new_order >= folio_order(folio)) >> return -EINVAL; >> >> - /* Cannot split anonymous THP to order-1 */ >> - if (new_order == 1 && folio_test_anon(folio)) { >> - VM_WARN_ONCE(1, "Cannot split to order-1 folio"); >> - return -EINVAL; >> - } >> - >> if (new_order) { >> /* Only swapping a whole PMD-mapped folio is supported */ >> if (folio_test_swapcache(folio)) >> return -EINVAL; >> - /* Split shmem folio to non-zero order not supported */ >> - if (shmem_mapping(folio->mapping)) { >> - VM_WARN_ONCE(1, >> - "Cannot split shmem folio to non-0 order"); >> - return -EINVAL; >> - } >> - /* No split if the file system does not support large folio */ >> - if (!mapping_large_folio_support(folio->mapping)) { >> - VM_WARN_ONCE(1, >> - "Cannot split file folio to non-0 order"); >> - return -EINVAL; >> + >> + if (folio_test_anon(folio)) { >> + /* Cannot split anonymous THP to order-1 */ >> + if (new_order == 1) { >> + VM_WARN_ONCE(1, "Cannot split to order-1 folio"); >> + return -EINVAL; >> + } >> + } else { >> + /* Split shmem folio to non-zero order not supported */ >> + if (shmem_mapping(folio->mapping)) { >> + VM_WARN_ONCE(1, >> + "Cannot split shmem folio to non-0 order"); >> + return -EINVAL; >> + } >> + /* No split if the file system does not support large folio */ >> + if (!mapping_large_folio_support(folio->mapping)) { >> + VM_WARN_ONCE(1, >> + "Cannot split file folio to non-0 order"); >> + return -EINVAL; >> + } >> } >> } > > What about the following sequence: > > if (folio_test_anon(folio)) { > if (new_order == 1) > ... > } else if (new_order) { > if (shmem_mapping(...)) > ... > ... > } > > if (folio_test_swapcache(folio) && new_order) > return -EINVAL; > > Should result in less churn and reduce indentation level. Yeah, this looks better to me. Best Regards, Yan, Zi [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 854 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios 2024-06-04 13:52 ` Zi Yan @ 2024-06-04 13:57 ` Zi Yan 2024-06-05 2:56 ` ran xiaokai 1 sibling, 0 replies; 12+ messages in thread From: Zi Yan @ 2024-06-04 13:57 UTC (permalink / raw) To: Luis Chamberlain, Pankaj Raghav (Samsung) Cc: xu.xin16, akpm, v-songbaohua, mhocko, linux-mm, linux-kernel, yang.yang29, David Hildenbrand [-- Attachment #1: Type: text/plain, Size: 4259 bytes --] +Luis and Pankaj, who are working on enable bs > ps in XFS and touch split_huge_page_to_list_to_order(). On 4 Jun 2024, at 6:52, Zi Yan wrote: > On 4 Jun 2024, at 0:57, David Hildenbrand wrote: > >> On 04.06.24 07:47, xu.xin16@zte.com.cn wrote: >>> From: Ran Xiaokai <ran.xiaokai@zte.com.cn> >>> >>> When I did a large folios split test, a WARNING >>> "[ 5059.122759][ T166] Cannot split file folio to non-0 order" >>> was triggered. But my test cases are only for anonmous folios. >>> while mapping_large_folio_support() is only reasonable for page >>> cache folios. >> >> Agreed. >> >> I wonder if mapping_large_folio_support() should either >> >> a) Complain if used for anon folios, so we can detect the wrong use more easily. (VM_WARN_ON_ONCE()) > > This is much better. > >> >> b) Return "true" for anonymous mappings, although that's more debatable. > > This might fix the warning here, but the function might get wrong uses easily. > >> >>> >>> In split_huge_page_to_list_to_order(), the folio passed to >>> mapping_large_folio_support() maybe anonmous folio. The >>> folio_test_anon() check is missing. So the split of the anonmous THP >>> is failed. This is also the same for shmem_mapping(). We'd better add >>> a check for both. But the shmem_mapping() in __split_huge_page() is >>> not involved, as for anonmous folios, the end parameter is set to -1, so >>> (head[i].index >= end) is always false. shmem_mapping() is not called. >>> >>> Using /sys/kernel/debug/split_huge_pages to verify this, with this >>> patch, large anon THP is successfully split and the warning is ceased. >>> >>> Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn> >>> Cc: xu xin <xu.xin16@zte.com.cn> >>> Cc: Yang Yang <yang.yang29@zte.com.cn> >>> --- >>> mm/huge_memory.c | 38 ++++++++++++++++++++------------------ >>> 1 file changed, 20 insertions(+), 18 deletions(-) >>> >>> diff --git a/mm/huge_memory.c b/mm/huge_memory.c >>> index 317de2afd371..4c9c7e5ea20c 100644 >>> --- a/mm/huge_memory.c >>> +++ b/mm/huge_memory.c >>> @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list, >>> if (new_order >= folio_order(folio)) >>> return -EINVAL; >>> >>> - /* Cannot split anonymous THP to order-1 */ >>> - if (new_order == 1 && folio_test_anon(folio)) { >>> - VM_WARN_ONCE(1, "Cannot split to order-1 folio"); >>> - return -EINVAL; >>> - } >>> - >>> if (new_order) { >>> /* Only swapping a whole PMD-mapped folio is supported */ >>> if (folio_test_swapcache(folio)) >>> return -EINVAL; >>> - /* Split shmem folio to non-zero order not supported */ >>> - if (shmem_mapping(folio->mapping)) { >>> - VM_WARN_ONCE(1, >>> - "Cannot split shmem folio to non-0 order"); >>> - return -EINVAL; >>> - } >>> - /* No split if the file system does not support large folio */ >>> - if (!mapping_large_folio_support(folio->mapping)) { >>> - VM_WARN_ONCE(1, >>> - "Cannot split file folio to non-0 order"); >>> - return -EINVAL; >>> + >>> + if (folio_test_anon(folio)) { >>> + /* Cannot split anonymous THP to order-1 */ >>> + if (new_order == 1) { >>> + VM_WARN_ONCE(1, "Cannot split to order-1 folio"); >>> + return -EINVAL; >>> + } >>> + } else { >>> + /* Split shmem folio to non-zero order not supported */ >>> + if (shmem_mapping(folio->mapping)) { >>> + VM_WARN_ONCE(1, >>> + "Cannot split shmem folio to non-0 order"); >>> + return -EINVAL; >>> + } >>> + /* No split if the file system does not support large folio */ >>> + if (!mapping_large_folio_support(folio->mapping)) { >>> + VM_WARN_ONCE(1, >>> + "Cannot split file folio to non-0 order"); >>> + return -EINVAL; >>> + } >>> } >>> } >> >> What about the following sequence: >> >> if (folio_test_anon(folio)) { >> if (new_order == 1) >> ... >> } else if (new_order) { >> if (shmem_mapping(...)) >> ... >> ... >> } >> >> if (folio_test_swapcache(folio) && new_order) >> return -EINVAL; >> >> Should result in less churn and reduce indentation level. > > Yeah, this looks better to me. > > Best Regards, > Yan, Zi Best Regards, Yan, Zi [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 854 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios 2024-06-04 13:52 ` Zi Yan 2024-06-04 13:57 ` Zi Yan @ 2024-06-05 2:56 ` ran xiaokai 1 sibling, 0 replies; 12+ messages in thread From: ran xiaokai @ 2024-06-05 2:56 UTC (permalink / raw) To: ziy Cc: akpm, david, linux-kernel, linux-mm, mhocko, ran.xiaokai, v-songbaohua, xu.xin16, yang.yang29 > On 4 Jun 2024, at 0:57, David Hildenbrand wrote: > > > On 04.06.24 07:47, xu.xin16@zte.com.cn wrote: > >> From: Ran Xiaokai <ran.xiaokai@zte.com.cn> > >> > >> When I did a large folios split test, a WARNING > >> "[ 5059.122759][ T166] Cannot split file folio to non-0 order" > >> was triggered. But my test cases are only for anonmous folios. > >> while mapping_large_folio_support() is only reasonable for page > >> cache folios. > > > > Agreed. > > > > I wonder if mapping_large_folio_support() should either > > > > a) Complain if used for anon folios, so we can detect the wrong use more easily. (VM_WARN_ON_ONCE()) > > This is much better. > > > > > b) Return "true" for anonymous mappings, although that's more debatable. > > This might fix the warning here, but the function might get wrong uses easily. yes, maybe we should rename mapping_large_folio_support() if we choose b). > > > >> > >> In split_huge_page_to_list_to_order(), the folio passed to > >> mapping_large_folio_support() maybe anonmous folio. The > >> folio_test_anon() check is missing. So the split of the anonmous THP > >> is failed. This is also the same for shmem_mapping(). We'd better add > >> a check for both. But the shmem_mapping() in __split_huge_page() is > >> not involved, as for anonmous folios, the end parameter is set to -1, so > >> (head[i].index >= end) is always false. shmem_mapping() is not called. > >> > >> Using /sys/kernel/debug/split_huge_pages to verify this, with this > >> patch, large anon THP is successfully split and the warning is ceased. > >> > >> Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn> > >> Cc: xu xin <xu.xin16@zte.com.cn> > >> Cc: Yang Yang <yang.yang29@zte.com.cn> > >> --- > >> mm/huge_memory.c | 38 ++++++++++++++++++++------------------ > >> 1 file changed, 20 insertions(+), 18 deletions(-) > >> > >> diff --git a/mm/huge_memory.c b/mm/huge_memory.c > >> index 317de2afd371..4c9c7e5ea20c 100644 > >> --- a/mm/huge_memory.c > >> +++ b/mm/huge_memory.c > >> @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list, > >> if (new_order >= folio_order(folio)) > >> return -EINVAL; > >> > >> - /* Cannot split anonymous THP to order-1 */ > >> - if (new_order == 1 && folio_test_anon(folio)) { > >> - VM_WARN_ONCE(1, "Cannot split to order-1 folio"); > >> - return -EINVAL; > >> - } > >> - > >> if (new_order) { > >> /* Only swapping a whole PMD-mapped folio is supported */ > >> if (folio_test_swapcache(folio)) > >> return -EINVAL; > >> - /* Split shmem folio to non-zero order not supported */ > >> - if (shmem_mapping(folio->mapping)) { > >> - VM_WARN_ONCE(1, > >> - "Cannot split shmem folio to non-0 order"); > >> - return -EINVAL; > >> - } > >> - /* No split if the file system does not support large folio */ > >> - if (!mapping_large_folio_support(folio->mapping)) { > >> - VM_WARN_ONCE(1, > >> - "Cannot split file folio to non-0 order"); > >> - return -EINVAL; > >> + > >> + if (folio_test_anon(folio)) { > >> + /* Cannot split anonymous THP to order-1 */ > >> + if (new_order == 1) { > >> + VM_WARN_ONCE(1, "Cannot split to order-1 folio"); > >> + return -EINVAL; > >> + } > >> + } else { > >> + /* Split shmem folio to non-zero order not supported */ > >> + if (shmem_mapping(folio->mapping)) { > >> + VM_WARN_ONCE(1, > >> + "Cannot split shmem folio to non-0 order"); > >> + return -EINVAL; > >> + } > >> + /* No split if the file system does not support large folio */ > >> + if (!mapping_large_folio_support(folio->mapping)) { > >> + VM_WARN_ONCE(1, > >> + "Cannot split file folio to non-0 order"); > >> + return -EINVAL; > >> + } > >> } > >> } > > > > What about the following sequence: > > > > if (folio_test_anon(folio)) { > > if (new_order == 1) > > ... > > } else if (new_order) { > > if (shmem_mapping(...)) > > ... > > ... > > } > > > > if (folio_test_swapcache(folio) && new_order) > > return -EINVAL; > > > > Should result in less churn and reduce indentation level. > > Yeah, this looks better to me. > > Best Regards, > Yan, Zi ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios 2024-06-04 7:57 ` David Hildenbrand 2024-06-04 13:52 ` Zi Yan @ 2024-06-05 2:20 ` ran xiaokai 2024-06-05 7:25 ` David Hildenbrand 1 sibling, 1 reply; 12+ messages in thread From: ran xiaokai @ 2024-06-05 2:20 UTC (permalink / raw) To: david Cc: akpm, linux-kernel, linux-mm, mhocko, v-songbaohua, ran.xiaokai, xu.xin16, yang.yang29, ziy > On 04.06.24 07:47, xu.xin16@zte.com.cn wrote: > > From: Ran Xiaokai <ran.xiaokai@zte.com.cn> > > > > When I did a large folios split test, a WARNING > > "[ 5059.122759][ T166] Cannot split file folio to non-0 order" > > was triggered. But my test cases are only for anonmous folios. > > while mapping_large_folio_support() is only reasonable for page > > cache folios. > > Agreed. > > I wonder if mapping_large_folio_support() should either > > a) Complain if used for anon folios, so we can detect the wrong use more > easily. (VM_WARN_ON_ONCE()) > b) Return "true" for anonymous mappings, although that's more debatable. > Hi, David, Thanks for the review. I think a) is better. But we have to add a new parameter "folio" to mapping_large_folio_support(), right ? something like mapping_large_folio_support(struct address_space *mapping, struct folio *folio) ? But in the __filemap_get_folio() path, __filemap_get_folio() no_page: .... if (!mapping_large_folio_support(mapping)) the folio is not allocated yet, yes ? Or do you mean there is some other way to do this ? > > > > In split_huge_page_to_list_to_order(), the folio passed to > > mapping_large_folio_support() maybe anonmous folio. The > > folio_test_anon() check is missing. So the split of the anonmous THP > > is failed. This is also the same for shmem_mapping(). We'd better add > > a check for both. But the shmem_mapping() in __split_huge_page() is > > not involved, as for anonmous folios, the end parameter is set to -1, so > > (head[i].index >= end) is always false. shmem_mapping() is not called. > > > > Using /sys/kernel/debug/split_huge_pages to verify this, with this > > patch, large anon THP is successfully split and the warning is ceased. > > > > Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn> > > Cc: xu xin <xu.xin16@zte.com.cn> > > Cc: Yang Yang <yang.yang29@zte.com.cn> > > --- > > mm/huge_memory.c | 38 ++++++++++++++++++++------------------ > > 1 file changed, 20 insertions(+), 18 deletions(-) > > > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > > index 317de2afd371..4c9c7e5ea20c 100644 > > --- a/mm/huge_memory.c > > +++ b/mm/huge_memory.c > > @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list, > > if (new_order >= folio_order(folio)) > > return -EINVAL; > > > > - /* Cannot split anonymous THP to order-1 */ > > - if (new_order == 1 && folio_test_anon(folio)) { > > - VM_WARN_ONCE(1, "Cannot split to order-1 folio"); > > - return -EINVAL; > > - } > > - > > if (new_order) { > > /* Only swapping a whole PMD-mapped folio is supported */ > > if (folio_test_swapcache(folio)) > > return -EINVAL; > > - /* Split shmem folio to non-zero order not supported */ > > - if (shmem_mapping(folio->mapping)) { > > - VM_WARN_ONCE(1, > > - "Cannot split shmem folio to non-0 order"); > > - return -EINVAL; > > - } > > - /* No split if the file system does not support large folio */ > > - if (!mapping_large_folio_support(folio->mapping)) { > > - VM_WARN_ONCE(1, > > - "Cannot split file folio to non-0 order"); > > - return -EINVAL; > > + > > + if (folio_test_anon(folio)) { > > + /* Cannot split anonymous THP to order-1 */ > > + if (new_order == 1) { > > + VM_WARN_ONCE(1, "Cannot split to order-1 folio"); > > + return -EINVAL; > > + } > > + } else { > > + /* Split shmem folio to non-zero order not supported */ > > + if (shmem_mapping(folio->mapping)) { > > + VM_WARN_ONCE(1, > > + "Cannot split shmem folio to non-0 order"); > > + return -EINVAL; > > + } > > + /* No split if the file system does not support large folio */ > > + if (!mapping_large_folio_support(folio->mapping)) { > > + VM_WARN_ONCE(1, > > + "Cannot split file folio to non-0 order"); > > + return -EINVAL; > > + } > > } > > } > > What about the following sequence: > > if (folio_test_anon(folio)) { > if (new_order == 1) > ... > } else if (new_order) { > if (shmem_mapping(...)) > ... > ... > } > > if (folio_test_swapcache(folio) && new_order) > return -EINVAL; > > Should result in less churn and reduce indentation level. > Thanks. The code is cleaner in this way. > -- > Cheers, > > David / dhildenb ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios 2024-06-05 2:20 ` ran xiaokai @ 2024-06-05 7:25 ` David Hildenbrand 2024-06-05 8:30 ` ran xiaokai 0 siblings, 1 reply; 12+ messages in thread From: David Hildenbrand @ 2024-06-05 7:25 UTC (permalink / raw) To: ran xiaokai Cc: akpm, linux-kernel, linux-mm, mhocko, v-songbaohua, ran.xiaokai, xu.xin16, yang.yang29, ziy On 05.06.24 04:20, ran xiaokai wrote: >> On 04.06.24 07:47, xu.xin16@zte.com.cn wrote: >>> From: Ran Xiaokai <ran.xiaokai@zte.com.cn> >>> >>> When I did a large folios split test, a WARNING >>> "[ 5059.122759][ T166] Cannot split file folio to non-0 order" >>> was triggered. But my test cases are only for anonmous folios. >>> while mapping_large_folio_support() is only reasonable for page >>> cache folios. >> >> Agreed. >> >> I wonder if mapping_large_folio_support() should either >> >> a) Complain if used for anon folios, so we can detect the wrong use more >> easily. (VM_WARN_ON_ONCE()) > >> b) Return "true" for anonymous mappings, although that's more debatable. >> > > Hi, David, > Thanks for the review. > I think a) is better. > But we have to add a new parameter "folio" to mapping_large_folio_support(), right ? > something like mapping_large_folio_support(struct address_space *mapping, struct folio *folio) ? > But in the __filemap_get_folio() path, > > __filemap_get_folio() > no_page: > .... > if (!mapping_large_folio_support(mapping)) > > the folio is not allocated yet, yes ? > Or do you mean there is some other way to do this ? If we really pass unmodified folio->mapping, you can do what folio_test_anon() would and make sure PAGE_MAPPING_ANON is not set. -- Cheers, David / dhildenb ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios 2024-06-05 7:25 ` David Hildenbrand @ 2024-06-05 8:30 ` ran xiaokai 2024-06-05 8:33 ` David Hildenbrand 0 siblings, 1 reply; 12+ messages in thread From: ran xiaokai @ 2024-06-05 8:30 UTC (permalink / raw) To: david Cc: akpm, linux-kernel, linux-mm, mhocko, ran.xiaokai, ranxiaokai627, v-songbaohua, xu.xin16, yang.yang29, ziy > On 05.06.24 04:20, ran xiaokai wrote: > >> On 04.06.24 07:47, xu.xin16@zte.com.cn wrote: > >>> From: Ran Xiaokai <ran.xiaokai@zte.com.cn> > >>> > >>> When I did a large folios split test, a WARNING > >>> "[ 5059.122759][ T166] Cannot split file folio to non-0 order" > >>> was triggered. But my test cases are only for anonmous folios. > >>> while mapping_large_folio_support() is only reasonable for page > >>> cache folios. > >> > >> Agreed. > >> > >> I wonder if mapping_large_folio_support() should either > >> > >> a) Complain if used for anon folios, so we can detect the wrong use more > >> easily. (VM_WARN_ON_ONCE()) > > > >> b) Return "true" for anonymous mappings, although that's more debatable. > >> > > > > Hi, David, > > Thanks for the review. > > I think a) is better. > > But we have to add a new parameter "folio" to mapping_large_folio_support(), right ? > > something like mapping_large_folio_support(struct address_space *mapping, struct folio *folio) ? > > But in the __filemap_get_folio() path, > > > > __filemap_get_folio() > > no_page: > > .... > > if (!mapping_large_folio_support(mapping)) > > > > the folio is not allocated yet, yes ? > > Or do you mean there is some other way to do this ? > > If we really pass unmodified folio->mapping, you can do what > folio_test_anon() would and make sure PAGE_MAPPING_ANON is not set. I think I just misunderstood your suggestion. How about this ? static inline bool mapping_large_folio_support(struct address_space *mapping) { VM_WARN_ONCE((unsigned long)mapping & PAGE_MAPPING_ANON, "Anonymous mapping always supports large folio"); return IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && test_bit(AS_LARGE_FOLIO_SUPPORT, &mapping->flags); } ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios 2024-06-05 8:30 ` ran xiaokai @ 2024-06-05 8:33 ` David Hildenbrand 0 siblings, 0 replies; 12+ messages in thread From: David Hildenbrand @ 2024-06-05 8:33 UTC (permalink / raw) To: ran xiaokai Cc: akpm, linux-kernel, linux-mm, mhocko, ran.xiaokai, v-songbaohua, xu.xin16, yang.yang29, ziy On 05.06.24 10:30, ran xiaokai wrote: >> On 05.06.24 04:20, ran xiaokai wrote: >>>> On 04.06.24 07:47, xu.xin16@zte.com.cn wrote: >>>>> From: Ran Xiaokai <ran.xiaokai@zte.com.cn> >>>>> >>>>> When I did a large folios split test, a WARNING >>>>> "[ 5059.122759][ T166] Cannot split file folio to non-0 order" >>>>> was triggered. But my test cases are only for anonmous folios. >>>>> while mapping_large_folio_support() is only reasonable for page >>>>> cache folios. >>>> >>>> Agreed. >>>> >>>> I wonder if mapping_large_folio_support() should either >>>> >>>> a) Complain if used for anon folios, so we can detect the wrong use more >>>> easily. (VM_WARN_ON_ONCE()) >>> >>>> b) Return "true" for anonymous mappings, although that's more debatable. >>>> >>> >>> Hi, David, >>> Thanks for the review. >>> I think a) is better. >>> But we have to add a new parameter "folio" to mapping_large_folio_support(), right ? >>> something like mapping_large_folio_support(struct address_space *mapping, struct folio *folio) ? >>> But in the __filemap_get_folio() path, >>> >>> __filemap_get_folio() >>> no_page: >>> .... >>> if (!mapping_large_folio_support(mapping)) >>> >>> the folio is not allocated yet, yes ? >>> Or do you mean there is some other way to do this ? >> >> If we really pass unmodified folio->mapping, you can do what >> folio_test_anon() would and make sure PAGE_MAPPING_ANON is not set. > > I think I just misunderstood your suggestion. Likely my use of "folio" was confusing. > How about this ? > > static inline bool mapping_large_folio_support(struct address_space *mapping) > { > VM_WARN_ONCE((unsigned long)mapping & PAGE_MAPPING_ANON, > "Anonymous mapping always supports large folio"); > > return IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && > test_bit(AS_LARGE_FOLIO_SUPPORT, &mapping->flags); > } Yes, and we should likely document that this is not supposed to be used with mappings from anonymous folios. -- Cheers, David / dhildenb ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios 2024-06-04 5:47 [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios xu.xin16 2024-06-04 7:57 ` David Hildenbrand @ 2024-06-05 9:06 ` Barry Song [not found] ` <20240605095406.891512-1-ranxiaokai627@163.com> 1 sibling, 1 reply; 12+ messages in thread From: Barry Song @ 2024-06-05 9:06 UTC (permalink / raw) To: xu.xin16 Cc: akpm, ziy, v-songbaohua, mhocko, david, linux-mm, linux-kernel, yang.yang29 On Tue, Jun 4, 2024 at 5:47 PM <xu.xin16@zte.com.cn> wrote: > > From: Ran Xiaokai <ran.xiaokai@zte.com.cn> > > When I did a large folios split test, a WARNING > "[ 5059.122759][ T166] Cannot split file folio to non-0 order" > was triggered. But my test cases are only for anonmous folios. > while mapping_large_folio_support() is only reasonable for page > cache folios. > > In split_huge_page_to_list_to_order(), the folio passed to > mapping_large_folio_support() maybe anonmous folio. The > folio_test_anon() check is missing. So the split of the anonmous THP > is failed. This is also the same for shmem_mapping(). We'd better add > a check for both. But the shmem_mapping() in __split_huge_page() is > not involved, as for anonmous folios, the end parameter is set to -1, so > (head[i].index >= end) is always false. shmem_mapping() is not called. > > Using /sys/kernel/debug/split_huge_pages to verify this, with this > patch, large anon THP is successfully split and the warning is ceased. > > Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn> > Cc: xu xin <xu.xin16@zte.com.cn> > Cc: Yang Yang <yang.yang29@zte.com.cn> > --- > mm/huge_memory.c | 38 ++++++++++++++++++++------------------ > 1 file changed, 20 insertions(+), 18 deletions(-) > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 317de2afd371..4c9c7e5ea20c 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list, > if (new_order >= folio_order(folio)) > return -EINVAL; > > - /* Cannot split anonymous THP to order-1 */ > - if (new_order == 1 && folio_test_anon(folio)) { > - VM_WARN_ONCE(1, "Cannot split to order-1 folio"); > - return -EINVAL; > - } > - > if (new_order) { > /* Only swapping a whole PMD-mapped folio is supported */ > if (folio_test_swapcache(folio)) > return -EINVAL; > - /* Split shmem folio to non-zero order not supported */ > - if (shmem_mapping(folio->mapping)) { > - VM_WARN_ONCE(1, > - "Cannot split shmem folio to non-0 order"); > - return -EINVAL; > - } > - /* No split if the file system does not support large folio */ > - if (!mapping_large_folio_support(folio->mapping)) { > - VM_WARN_ONCE(1, > - "Cannot split file folio to non-0 order"); > - return -EINVAL; > + > + if (folio_test_anon(folio)) { > + /* Cannot split anonymous THP to order-1 */ > + if (new_order == 1) { > + VM_WARN_ONCE(1, "Cannot split to order-1 folio"); > + return -EINVAL; > + } > + } else { > + /* Split shmem folio to non-zero order not supported */ > + if (shmem_mapping(folio->mapping)) { > + VM_WARN_ONCE(1, > + "Cannot split shmem folio to non-0 order"); > + return -EINVAL; > + } > + /* No split if the file system does not support large folio */ > + if (!mapping_large_folio_support(folio->mapping)) { > + VM_WARN_ONCE(1, > + "Cannot split file folio to non-0 order"); > + return -EINVAL; > + } Am I missing something? if file system doesn't support large folio, how could the large folio start to exist from the first place while its mapping points to a file which doesn't support large folio? > } > } > > - > is_hzp = is_huge_zero_folio(folio); > if (is_hzp) { > pr_warn_ratelimited("Called split_huge_page for huge zero page\n"); > -- > 2.15.2 > Thanks Barry ^ permalink raw reply [flat|nested] 12+ messages in thread
[parent not found: <20240605095406.891512-1-ranxiaokai627@163.com>]
* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios [not found] ` <20240605095406.891512-1-ranxiaokai627@163.com> @ 2024-06-05 14:08 ` Zi Yan [not found] ` <c110eb46-3c9d-40c3-ab16-5bd9f75b6501@redhat.com> 0 siblings, 1 reply; 12+ messages in thread From: Zi Yan @ 2024-06-05 14:08 UTC (permalink / raw) To: ran xiaokai Cc: 21cnbao, akpm, david, linux-kernel, linux-mm, mhocko, v-songbaohua, xu.xin16, yang.yang29 [-- Attachment #1: Type: text/plain, Size: 4458 bytes --] On 5 Jun 2024, at 2:54, ran xiaokai wrote: >> On Tue, Jun 4, 2024 at 5:47?PM <xu.xin16@zte.com.cn> wrote: >>> >>> From: Ran Xiaokai <ran.xiaokai@zte.com.cn> >>> >>> When I did a large folios split test, a WARNING >>> "[ 5059.122759][ T166] Cannot split file folio to non-0 order" >>> was triggered. But my test cases are only for anonmous folios. >>> while mapping_large_folio_support() is only reasonable for page >>> cache folios. >>> >>> In split_huge_page_to_list_to_order(), the folio passed to >>> mapping_large_folio_support() maybe anonmous folio. The >>> folio_test_anon() check is missing. So the split of the anonmous THP >>> is failed. This is also the same for shmem_mapping(). We'd better add >>> a check for both. But the shmem_mapping() in __split_huge_page() is >>> not involved, as for anonmous folios, the end parameter is set to -1, so >>> (head[i].index >= end) is always false. shmem_mapping() is not called. >>> >>> Using /sys/kernel/debug/split_huge_pages to verify this, with this >>> patch, large anon THP is successfully split and the warning is ceased. >>> >>> Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn> >>> Cc: xu xin <xu.xin16@zte.com.cn> >>> Cc: Yang Yang <yang.yang29@zte.com.cn> >>> --- >>> mm/huge_memory.c | 38 ++++++++++++++++++++------------------ >>> 1 file changed, 20 insertions(+), 18 deletions(-) >>> >>> diff --git a/mm/huge_memory.c b/mm/huge_memory.c >>> index 317de2afd371..4c9c7e5ea20c 100644 >>> --- a/mm/huge_memory.c >>> +++ b/mm/huge_memory.c >>> @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list, >>> if (new_order >= folio_order(folio)) >>> return -EINVAL; >>> >>> - /* Cannot split anonymous THP to order-1 */ >>> - if (new_order == 1 && folio_test_anon(folio)) { >>> - VM_WARN_ONCE(1, "Cannot split to order-1 folio"); >>> - return -EINVAL; >>> - } >>> - >>> if (new_order) { >>> /* Only swapping a whole PMD-mapped folio is supported */ >>> if (folio_test_swapcache(folio)) >>> return -EINVAL; >>> - /* Split shmem folio to non-zero order not supported */ >>> - if (shmem_mapping(folio->mapping)) { >>> - VM_WARN_ONCE(1, >>> - "Cannot split shmem folio to non-0 order"); >>> - return -EINVAL; >>> - } >>> - /* No split if the file system does not support large folio */ >>> - if (!mapping_large_folio_support(folio->mapping)) { >>> - VM_WARN_ONCE(1, >>> - "Cannot split file folio to non-0 order"); >>> - return -EINVAL; >>> + >>> + if (folio_test_anon(folio)) { >>> + /* Cannot split anonymous THP to order-1 */ >>> + if (new_order == 1) { >>> + VM_WARN_ONCE(1, "Cannot split to order-1 folio"); >>> + return -EINVAL; >>> + } >>> + } else { >>> + /* Split shmem folio to non-zero order not supported */ >>> + if (shmem_mapping(folio->mapping)) { >>> + VM_WARN_ONCE(1, >>> + "Cannot split shmem folio to non-0 order"); >>> + return -EINVAL; >>> + } >>> + /* No split if the file system does not support large folio */ >>> + if (!mapping_large_folio_support(folio->mapping)) { >>> + VM_WARN_ONCE(1, >>> + "Cannot split file folio to non-0 order"); >>> + return -EINVAL; >>> + } >> >> Am I missing something? if file system doesn't support large folio, >> how could the large folio start to exist from the first place while its >> mapping points to a file which doesn't support large folio? > > I think it is the CONFIG_READ_ONLY_THP_FOR_FS case. > khugepaged will try to collapse read-only file-backed pages to 2M THP. Can you add this information to the commit log in your next version? Best Regards, Yan, Zi [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 854 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
[parent not found: <c110eb46-3c9d-40c3-ab16-5bd9f75b6501@redhat.com>]
* Re: [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios [not found] ` <c110eb46-3c9d-40c3-ab16-5bd9f75b6501@redhat.com> @ 2024-06-06 1:34 ` Barry Song 0 siblings, 0 replies; 12+ messages in thread From: Barry Song @ 2024-06-06 1:34 UTC (permalink / raw) To: David Hildenbrand Cc: Zi Yan, ran xiaokai, akpm, linux-kernel, linux-mm, mhocko, v-songbaohua, xu.xin16, yang.yang29 On Thu, Jun 6, 2024 at 2:42 AM David Hildenbrand <david@redhat.com> wrote: > > On 05.06.24 16:08, Zi Yan wrote: > > On 5 Jun 2024, at 2:54, ran xiaokai wrote: > > > >>> On Tue, Jun 4, 2024 at 5:47?PM <xu.xin16@zte.com.cn> wrote: > >>>> > >>>> From: Ran Xiaokai <ran.xiaokai@zte.com.cn> > >>>> > >>>> When I did a large folios split test, a WARNING > >>>> "[ 5059.122759][ T166] Cannot split file folio to non-0 order" > >>>> was triggered. But my test cases are only for anonmous folios. > >>>> while mapping_large_folio_support() is only reasonable for page > >>>> cache folios. > >>>> > >>>> In split_huge_page_to_list_to_order(), the folio passed to > >>>> mapping_large_folio_support() maybe anonmous folio. The > >>>> folio_test_anon() check is missing. So the split of the anonmous THP > >>>> is failed. This is also the same for shmem_mapping(). We'd better add > >>>> a check for both. But the shmem_mapping() in __split_huge_page() is > >>>> not involved, as for anonmous folios, the end parameter is set to -1, so > >>>> (head[i].index >= end) is always false. shmem_mapping() is not called. > >>>> > >>>> Using /sys/kernel/debug/split_huge_pages to verify this, with this > >>>> patch, large anon THP is successfully split and the warning is ceased. > >>>> > >>>> Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn> > >>>> Cc: xu xin <xu.xin16@zte.com.cn> > >>>> Cc: Yang Yang <yang.yang29@zte.com.cn> > >>>> --- > >>>> mm/huge_memory.c | 38 ++++++++++++++++++++------------------ > >>>> 1 file changed, 20 insertions(+), 18 deletions(-) > >>>> > >>>> diff --git a/mm/huge_memory.c b/mm/huge_memory.c > >>>> index 317de2afd371..4c9c7e5ea20c 100644 > >>>> --- a/mm/huge_memory.c > >>>> +++ b/mm/huge_memory.c > >>>> @@ -3009,31 +3009,33 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list, > >>>> if (new_order >= folio_order(folio)) > >>>> return -EINVAL; > >>>> > >>>> - /* Cannot split anonymous THP to order-1 */ > >>>> - if (new_order == 1 && folio_test_anon(folio)) { > >>>> - VM_WARN_ONCE(1, "Cannot split to order-1 folio"); > >>>> - return -EINVAL; > >>>> - } > >>>> - > >>>> if (new_order) { > >>>> /* Only swapping a whole PMD-mapped folio is supported */ > >>>> if (folio_test_swapcache(folio)) > >>>> return -EINVAL; > >>>> - /* Split shmem folio to non-zero order not supported */ > >>>> - if (shmem_mapping(folio->mapping)) { > >>>> - VM_WARN_ONCE(1, > >>>> - "Cannot split shmem folio to non-0 order"); > >>>> - return -EINVAL; > >>>> - } > >>>> - /* No split if the file system does not support large folio */ > >>>> - if (!mapping_large_folio_support(folio->mapping)) { > >>>> - VM_WARN_ONCE(1, > >>>> - "Cannot split file folio to non-0 order"); > >>>> - return -EINVAL; > >>>> + > >>>> + if (folio_test_anon(folio)) { > >>>> + /* Cannot split anonymous THP to order-1 */ > >>>> + if (new_order == 1) { > >>>> + VM_WARN_ONCE(1, "Cannot split to order-1 folio"); > >>>> + return -EINVAL; > >>>> + } > >>>> + } else { > >>>> + /* Split shmem folio to non-zero order not supported */ > >>>> + if (shmem_mapping(folio->mapping)) { > >>>> + VM_WARN_ONCE(1, > >>>> + "Cannot split shmem folio to non-0 order"); > >>>> + return -EINVAL; > >>>> + } > >>>> + /* No split if the file system does not support large folio */ > >>>> + if (!mapping_large_folio_support(folio->mapping)) { > >>>> + VM_WARN_ONCE(1, > >>>> + "Cannot split file folio to non-0 order"); > >>>> + return -EINVAL; > >>>> + } > >>> > >>> Am I missing something? if file system doesn't support large folio, > >>> how could the large folio start to exist from the first place while its > >>> mapping points to a file which doesn't support large folio? > >> > >> I think it is the CONFIG_READ_ONLY_THP_FOR_FS case. > >> khugepaged will try to collapse read-only file-backed pages to 2M THP. > > > > Can you add this information to the commit log in your next version? > > Can we also add that as a comment to that function, like "Note that we > might still > have THPs in such mappings due to CONFIG_READ_ONLY_THP_FOR_FS. But in > that case, > the mapping does not actually support large folios properly. > "Or sth. like that. +1. Otherwise, the code appears quite confusing. Would using "#ifdef" help to further clarify it? #ifdef CONFIG_READ_ONLY_THP_FOR_FS if (!mapping_large_folio_support(folio->mapping)) { .... } #endif > > -- > Cheers, > > David / dhildenb > Thanks Barry ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2024-06-06 1:34 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-04 5:47 [PATCH linux-next] mm: huge_memory: fix misused mapping_large_folio_support() for anon folios xu.xin16
2024-06-04 7:57 ` David Hildenbrand
2024-06-04 13:52 ` Zi Yan
2024-06-04 13:57 ` Zi Yan
2024-06-05 2:56 ` ran xiaokai
2024-06-05 2:20 ` ran xiaokai
2024-06-05 7:25 ` David Hildenbrand
2024-06-05 8:30 ` ran xiaokai
2024-06-05 8:33 ` David Hildenbrand
2024-06-05 9:06 ` Barry Song
[not found] ` <20240605095406.891512-1-ranxiaokai627@163.com>
2024-06-05 14:08 ` Zi Yan
[not found] ` <c110eb46-3c9d-40c3-ab16-5bd9f75b6501@redhat.com>
2024-06-06 1:34 ` Barry Song
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox