On Mon, 19 Jul 2021 11:47:24 +0100, Quentin Perret <qperret@xxxxxxxxxx> wrote: > > The stage-2 map walkers currently return -EAGAIN when re-creating > identical mappings or only changing access permissions. This allows to > optimize mapping pages for concurrent (v)CPUs faulting on the same > page. > > While this works as expected when touching one page-table leaf at a > time, this can lead to difficult situations when mapping larger ranges. > Indeed, a large map operation can fail in the middle if an existing > mapping is found in the range, even if it has compatible attributes, > hence leaving only half of the range mapped. I'm curious of when this can happen. We normally map a single leaf at a time, and we don't have a way to map multiple leaves at once: we either use the VMA base size or try to upgrade it to a THP, but the result is always a single leaf entry. What changed? > To avoid having to deal with such failures in the caller, don't > interrupt the map operation when hitting existing PTEs, but make sure to > still return -EAGAIN so that user_mem_abort() can mark the page dirty > when needed. I don't follow you here: if you return -EAGAIN for a writable mapping, we don't account for the page to be dirty on the assumption that nothing has been mapped. But if there is a way to map more than a single entry and to get -EAGAIN at the same time, then we're bound to lose data on page eviction. Can you shed some light on this? Thanks, M. -- Without deviation from the norm, progress is not possible. _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm