Re: [PATCH] mm: re-allow pinning of zero pfns (again)

From: Felix Kuehling
Date: Tue Aug 09 2022 - 10:14:56 EST


Am 2022-08-09 um 08:31 schrieb Matthew Wilcox:
On Mon, Aug 08, 2022 at 10:42:24PM -0600, Alex Williamson wrote:
The below referenced commit makes the same error as 1c563432588d ("mm: fix
is_pinnable_page against a cma page"), re-interpreting the logic to exclude
pinning of the zero page, which breaks device assignment with vfio.
Perhaps we need to admit we're not as good at boolean logic as we think
we are.

if (is_device_coherent_page(page))
return false;
if (is_zone_movable_page(page))
return false;
return is_zero_pfn(page_to_pfn(page));

(or whatever the right logic is ... I just woke up and I'm having
trouble parsing it).

This implies an assumption that zero-page is never device-coherent or moveable, which is probably true, but not part of the original condition. A more formally correct rewrite would be:

if (is_zero_pfn(page_to_pfn(page)))
return true;
if (is_device_coherent_page(page))
return false;
return !is_zone_moveable_page(page);

Regards,
  Felix



Link: https://lore.kernel.org/all/165490039431.944052.12458624139225785964.stgit@omen
Fixes: f25cbb7a95a2 ("mm: add zone device coherent type memory support")
Signed-off-by: Alex Williamson <alex.williamson@xxxxxxxxxx>
---
include/linux/mm.h | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/include/linux/mm.h b/include/linux/mm.h
index 18e01474cf6b..772279ed7010 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1544,9 +1544,8 @@ static inline bool is_longterm_pinnable_page(struct page *page)
if (mt == MIGRATE_CMA || mt == MIGRATE_ISOLATE)
return false;
#endif
- return !(is_device_coherent_page(page) ||
- is_zone_movable_page(page) ||
- is_zero_pfn(page_to_pfn(page)));
+ return !(is_device_coherent_page(page) || is_zone_movable_page(page)) ||
+ is_zero_pfn(page_to_pfn(page));
}
#else
static inline bool is_longterm_pinnable_page(struct page *page)