Messages in this thread Patch in this message | | | Date | Tue, 9 Aug 2022 10:14:12 -0400 | Subject | Re: [PATCH] mm: re-allow pinning of zero pfns (again) | From | Felix Kuehling <> |
| |
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@redhat.com> >> --- >> 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) >> >> >>
| |