On Tue, Aug 09, 2022 at 10:14:12AM -0400, Felix Kuehling wrote: > 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); It's definitely true that the zero page is never device-coherent, nor movable. Moreover, we want to avoid calling page_to_pfn() if we can. So it should be the last condition that we check.