mbox series

[0/2] Fix parameter passed to page_mapcount_is_type()

Message ID 20250321053148.1434076-1-gshan@redhat.com (mailing list archive)
Headers show
Series Fix parameter passed to page_mapcount_is_type() | expand

Message

Gavin Shan March 21, 2025, 5:31 a.m. UTC
Found by code inspection. There are two places where the parameter
passed to page_mapcount_is_type() is (page->__mapcount), which is
correct since it should be one more than the value, as explained in
the comments to page_mapcount_is_type(): (a) page_has_type() in
page-flags.h (b) __dump_folio() in mm/debug.c

PATCH[1] fixes the parameter for (a)
PATCH[2] fixes the parameter for (b)

Gavin Shan (2):
  mm: Fix parameter passed to page_mapcount_is_type()
  mm/debug: Fix parameter passed to page_mapcount_is_type()

 include/linux/page-flags.h | 2 +-
 mm/debug.c                 | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

Comments

Gavin Shan March 21, 2025, 5:34 a.m. UTC | #1
On 3/21/25 3:31 PM, Gavin Shan wrote:
> Found by code inspection. There are two places where the parameter
> passed to page_mapcount_is_type() is (page->__mapcount), which is
> correct since it should be one more than the value, as explained in
   ^^^^^^^
   s/correct/incorrect

> the comments to page_mapcount_is_type(): (a) page_has_type() in
> page-flags.h (b) __dump_folio() in mm/debug.c
> 
> PATCH[1] fixes the parameter for (a)
> PATCH[2] fixes the parameter for (b)
> 
> Gavin Shan (2):
>    mm: Fix parameter passed to page_mapcount_is_type()
>    mm/debug: Fix parameter passed to page_mapcount_is_type()
> 
>   include/linux/page-flags.h | 2 +-
>   mm/debug.c                 | 4 ++--
>   2 files changed, 3 insertions(+), 3 deletions(-)
>
Vlastimil Babka March 21, 2025, 9:23 a.m. UTC | #2
On 3/21/25 06:31, Gavin Shan wrote:
> Found by code inspection. There are two places where the parameter
> passed to page_mapcount_is_type() is (page->__mapcount), which is
> correct since it should be one more than the value, as explained in
> the comments to page_mapcount_is_type(): (a) page_has_type() in
> page-flags.h (b) __dump_folio() in mm/debug.c

IIUC you are right. Luckily thanks to the the PGTY_mapcount_underflow limit,
this off-by-one error doesn't currently cause visible issues i.e.
misclassifications legitimate mapcount as page type and vice versa, right?
We'd have to have a mapcount underflown severely right to the limit to make
that off-by-one error cross it?

I wonder if a more future-proof solution would be to redefine
page_mapcount_is_type() instead to not subtract. But I'll leave that to willy.

> PATCH[1] fixes the parameter for (a)
> PATCH[2] fixes the parameter for (b)
> 
> Gavin Shan (2):
>   mm: Fix parameter passed to page_mapcount_is_type()
>   mm/debug: Fix parameter passed to page_mapcount_is_type()
> 
>  include/linux/page-flags.h | 2 +-
>  mm/debug.c                 | 4 ++--
>  2 files changed, 3 insertions(+), 3 deletions(-)
>
David Hildenbrand March 21, 2025, 10:11 a.m. UTC | #3
On 21.03.25 10:23, Vlastimil Babka wrote:
> On 3/21/25 06:31, Gavin Shan wrote:
>> Found by code inspection. There are two places where the parameter
>> passed to page_mapcount_is_type() is (page->__mapcount), which is
>> correct since it should be one more than the value, as explained in
>> the comments to page_mapcount_is_type(): (a) page_has_type() in
>> page-flags.h (b) __dump_folio() in mm/debug.c
> 
> IIUC you are right. Luckily thanks to the the PGTY_mapcount_underflow limit,
> this off-by-one error doesn't currently cause visible issues i.e.
> misclassifications legitimate mapcount as page type and vice versa, right?
> We'd have to have a mapcount underflown severely right to the limit to make
> that off-by-one error cross it?

Agreed. Likely not stable material because it isn't actually fixing 
anything (because of the safety gaps).

> 
> I wonder if a more future-proof solution would be to redefine
> page_mapcount_is_type() instead to not subtract. But I'll leave that to willy.

With upcoming changes around that, likely best to leave that alone. I 
expect page_mapcount_is_type() to completely vanish.
Gavin Shan March 21, 2025, 11:25 a.m. UTC | #4
On 3/21/25 8:11 PM, David Hildenbrand wrote:
> On 21.03.25 10:23, Vlastimil Babka wrote:
>> On 3/21/25 06:31, Gavin Shan wrote:
>>> Found by code inspection. There are two places where the parameter
>>> passed to page_mapcount_is_type() is (page->__mapcount), which is
>>> correct since it should be one more than the value, as explained in
>>> the comments to page_mapcount_is_type(): (a) page_has_type() in
>>> page-flags.h (b) __dump_folio() in mm/debug.c
>>
>> IIUC you are right. Luckily thanks to the the PGTY_mapcount_underflow limit,
>> this off-by-one error doesn't currently cause visible issues i.e.
>> misclassifications legitimate mapcount as page type and vice versa, right?
>> We'd have to have a mapcount underflown severely right to the limit to make
>> that off-by-one error cross it?
> 
> Agreed. Likely not stable material because it isn't actually fixing anything (because of the safety gaps).
> 

Yes, it shouldn't cause any visible impacts so far due to the gap.
I just found the issue by code inspection. Lets drop the fix tags
in v2.

>>
>> I wonder if a more future-proof solution would be to redefine
>> page_mapcount_is_type() instead to not subtract. But I'll leave that to willy.
> 
> With upcoming changes around that, likely best to leave that alone. I expect page_mapcount_is_type() to completely vanish.
> 

+1 to remove page_mapcount_is_type(). After Willy confirms, I can post
an extra series to do it if needed.

Thanks,
Gavin
David Hildenbrand March 21, 2025, 11:27 a.m. UTC | #5
On 21.03.25 12:25, Gavin Shan wrote:
> On 3/21/25 8:11 PM, David Hildenbrand wrote:
>> On 21.03.25 10:23, Vlastimil Babka wrote:
>>> On 3/21/25 06:31, Gavin Shan wrote:
>>>> Found by code inspection. There are two places where the parameter
>>>> passed to page_mapcount_is_type() is (page->__mapcount), which is
>>>> correct since it should be one more than the value, as explained in
>>>> the comments to page_mapcount_is_type(): (a) page_has_type() in
>>>> page-flags.h (b) __dump_folio() in mm/debug.c
>>>
>>> IIUC you are right. Luckily thanks to the the PGTY_mapcount_underflow limit,
>>> this off-by-one error doesn't currently cause visible issues i.e.
>>> misclassifications legitimate mapcount as page type and vice versa, right?
>>> We'd have to have a mapcount underflown severely right to the limit to make
>>> that off-by-one error cross it?
>>
>> Agreed. Likely not stable material because it isn't actually fixing anything (because of the safety gaps).
>>
> 
> Yes, it shouldn't cause any visible impacts so far due to the gap.
> I just found the issue by code inspection. Lets drop the fix tags
> in v2.
> 
>>>
>>> I wonder if a more future-proof solution would be to redefine
>>> page_mapcount_is_type() instead to not subtract. But I'll leave that to willy.
>>
>> With upcoming changes around that, likely best to leave that alone. I expect page_mapcount_is_type() to completely vanish.
>>
> 
> +1 to remove page_mapcount_is_type(). After Willy confirms, I can post
> an extra series to do it if needed.

I think we should only do that one Willy splits struct folio off from, 
struct page, storing the type elsewhere. For now, we should likely just 
leave it as is.
Vlastimil Babka March 21, 2025, 11:33 a.m. UTC | #6
On 3/21/25 12:25, Gavin Shan wrote:
> On 3/21/25 8:11 PM, David Hildenbrand wrote:
>> On 21.03.25 10:23, Vlastimil Babka wrote:
>>> On 3/21/25 06:31, Gavin Shan wrote:
>>>> Found by code inspection. There are two places where the parameter
>>>> passed to page_mapcount_is_type() is (page->__mapcount), which is
>>>> correct since it should be one more than the value, as explained in
>>>> the comments to page_mapcount_is_type(): (a) page_has_type() in
>>>> page-flags.h (b) __dump_folio() in mm/debug.c
>>>
>>> IIUC you are right. Luckily thanks to the the PGTY_mapcount_underflow limit,
>>> this off-by-one error doesn't currently cause visible issues i.e.
>>> misclassifications legitimate mapcount as page type and vice versa, right?
>>> We'd have to have a mapcount underflown severely right to the limit to make
>>> that off-by-one error cross it?
>> 
>> Agreed. Likely not stable material because it isn't actually fixing anything (because of the safety gaps).
>> 
> 
> Yes, it shouldn't cause any visible impacts so far due to the gap.

Thanks for confirming, please state that in the commit log/cover letter too.

> I just found the issue by code inspection. Lets drop the fix tags
> in v2.

Fixes: tag is fine and correct, just Cc: stable is unnecessary.
Thanks.

>>>
>>> I wonder if a more future-proof solution would be to redefine
>>> page_mapcount_is_type() instead to not subtract. But I'll leave that to willy.
>> 
>> With upcoming changes around that, likely best to leave that alone. I expect page_mapcount_is_type() to completely vanish.
>> 
> 
> +1 to remove page_mapcount_is_type(). After Willy confirms, I can post
> an extra series to do it if needed.
> 
> Thanks,
> Gavin
>
Gavin Shan March 21, 2025, 12:07 p.m. UTC | #7
On 3/21/25 9:33 PM, Vlastimil Babka wrote:
> On 3/21/25 12:25, Gavin Shan wrote:
>> On 3/21/25 8:11 PM, David Hildenbrand wrote:
>>> On 21.03.25 10:23, Vlastimil Babka wrote:
>>>> On 3/21/25 06:31, Gavin Shan wrote:
>>>>> Found by code inspection. There are two places where the parameter
>>>>> passed to page_mapcount_is_type() is (page->__mapcount), which is
>>>>> correct since it should be one more than the value, as explained in
>>>>> the comments to page_mapcount_is_type(): (a) page_has_type() in
>>>>> page-flags.h (b) __dump_folio() in mm/debug.c
>>>>
>>>> IIUC you are right. Luckily thanks to the the PGTY_mapcount_underflow limit,
>>>> this off-by-one error doesn't currently cause visible issues i.e.
>>>> misclassifications legitimate mapcount as page type and vice versa, right?
>>>> We'd have to have a mapcount underflown severely right to the limit to make
>>>> that off-by-one error cross it?
>>>
>>> Agreed. Likely not stable material because it isn't actually fixing anything (because of the safety gaps).
>>>
>>
>> Yes, it shouldn't cause any visible impacts so far due to the gap.
> 
> Thanks for confirming, please state that in the commit log/cover letter too.
> 

Yes, the commit log and cover letter has been improved for this in v2.

>> I just found the issue by code inspection. Lets drop the fix tags
>> in v2.
> 
> Fixes: tag is fine and correct, just Cc: stable is unnecessary.
> 

Thanks for the hints. The 'Cc: stable' tag has been dropped, but the
'Fixes:' tag is kept in v2, which was posted.

https://lore.kernel.org/linux-mm/20250321120222.1456770-1-gshan@redhat.com/T/#t

>>>>
>>>> I wonder if a more future-proof solution would be to redefine
>>>> page_mapcount_is_type() instead to not subtract. But I'll leave that to willy.
>>>
>>> With upcoming changes around that, likely best to leave that alone. I expect page_mapcount_is_type() to completely vanish.
>>>
>>
>> +1 to remove page_mapcount_is_type(). After Willy confirms, I can post
>> an extra series to do it if needed.
>>

Thanks,
Gavin