On 19/04/2024 08:43, Ryan Roberts wrote: > Hi All, > > This series adds uffd write-protect and soft-dirty tracking support for arm64. I > consider the soft-dirty support (patches 3 and 4) as RFC - see rationale below. > > Previous attempts to add these features have failed because of a perceived lack > of available PTE SW bits. However it actually turns out that there are 2 > available but they are hidden. PTE_PROT_NONE was previously occupying a SW bit, > but it only applies when PTE_VALID is clear, so this is moved to overlay PTE_UXN > in patch 1, freeing up the SW bit. Bit 63 is marked as "IGNORED" in the Arm ARM, > but it does not currently indicate "reserved for SW use" like it does for the > other SW bits. I've confirmed with the spec owner that this is an oversight; the > bit is intended to be reserved for SW use and the spec will clarify this in a > future update. > > So we have our two bits; patch 2 enables uffd-wp, patch 3 enables soft-dirty and > patches 4 and 5 sort out the selftests so that the soft-dirty tests are compiled > for, and run on arm64. > > That said, these are the last 2 SW bits and we may want to keep 1 bit in reserve > for future use. soft-dirty is only used for CRIU to my knowledge, and it is > thought that their use case could be solved with the more generic uffd-wp. So > unless somebody makes a clear case for the inclusion of soft-dirty support, we > are probably better off dropping patches 3 and 4 and keeping bit 63 for future > use. Although note that the most recent attempt to add soft-dirty for arm64 was > last month [1] so I'd like to give Shivansh Vij the opportunity to make the > case. Ugh, forgot to mention that this applies on top of v6.9-rc3, and all the uffd-wp and soft-dirty tests in the mm selftests suite run and pass. And no regressions are observed in any of the other selftests. > > ---8<--- > As an appendix, I've also experimented with adding an "extended SW bits" region > linked by the `struct ptdesc` (which you can always find from the `pte_t *`). If > demonstrated to work, this would act as an insurance policy in case we ever need > more SW bits in future, giving us confidence to merge soft-dirty now. > Unfortunately this approach suffers from 2 problems; 1) its slow; my fork() > microbenchmark takes 40% longer in the worst case. 2) it is not possible to read > the HW pte and the extended SW bits atomically so it is impossible to implement > ptep_get_lockess() in its current form. So I've abandoned this experiment. (I > can provide more details if there is interest). > ---8<--- > > [1] https://lore.kernel.org/linux-arm-kernel/MW4PR12MB687563EFB56373E8D55DDEABB92B2@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/ > > Thanks, > Ryan > > > Ryan Roberts (5): > arm64/mm: Move PTE_PROT_NONE and PMD_PRESENT_INVALID > arm64/mm: Add uffd write-protect support > arm64/mm: Add soft-dirty page tracking support > selftests/mm: Enable soft-dirty tests on arm64 > selftests/mm: soft-dirty should fail if a testcase fails > > arch/arm64/Kconfig | 2 + > arch/arm64/include/asm/pgtable-prot.h | 20 +++- > arch/arm64/include/asm/pgtable.h | 118 +++++++++++++++++++-- > arch/arm64/mm/contpte.c | 6 +- > arch/arm64/mm/fault.c | 3 +- > arch/arm64/mm/hugetlbpage.c | 6 +- > tools/testing/selftests/mm/Makefile | 5 +- > tools/testing/selftests/mm/madv_populate.c | 26 +---- > tools/testing/selftests/mm/run_vmtests.sh | 5 +- > tools/testing/selftests/mm/soft-dirty.c | 2 +- > 10 files changed, 141 insertions(+), 52 deletions(-) > > -- > 2.25.1 >