Re: [PATCH v7 2/8] iov_iter: Add a function to extract a page list from an iterator

From: David Hildenbrand
Date: Mon Jan 23 2023 - 08:12:54 EST


On 23.01.23 12:51, David Howells wrote:
David Hildenbrand <david@xxxxxxxxxx> wrote:

How does this work align with the goal of no longer using FOLL_GET for
O_DIRECT? We should get rid of any FOLL_GET usage for accessing page content.

Would that run the risk of changes being made by the child being visible to
the a DIO write if the parent changes the buffer first?


PARENT CHILD
====== =====
start-DIO-write
fork() = pid fork() = 0
alter-buffer
CoW happens
page copied original page retained
alter-buffer
<DMA-happens>

FOLL_PIN users are fine in that regard, because we properly detect "maybe pinned" during fork() and copy the page. See tools/testing/selftests/mm/cow.c (still called tools/testing/selftests/vm/cow.c upstream IIRC) for some test cases for that handling.

FOLL_GET does not work as expected in that regard: pages can't be detected as pinned and we won't be copying them during fork(). We'll end up COW-sharing them, which can result in trouble later.

Switching from FOLL_GET to FOLL_PIN was in the works by John H. Not sure what the status is. Interestingly, Documentation/core-api/pin_user_pages.rst already documents that "CASE 1: Direct IO (DIO)" uses FOLL_PIN ... which does, unfortunately, no reflect reality yet.

--
Thanks,

David / dhildenb