Messages in this thread | | | Date | Mon, 23 Jan 2023 14:11:45 +0100 | From | David Hildenbrand <> | Subject | Re: [PATCH v7 2/8] iov_iter: Add a function to extract a page list from an iterator |
| |
On 23.01.23 12:51, David Howells wrote: > David Hildenbrand <david@redhat.com> 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
| |