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