On 26/02/2025 17:41, Catalin Marinas wrote: > On Wed, Feb 26, 2025 at 12:06:52PM +0000, Ryan Roberts wrote: >> arm64 supports multiple huge_pte sizes. Some of the sizes are covered by >> a single pte entry at a particular level (PMD_SIZE, PUD_SIZE), and some >> are covered by multiple ptes at a particular level (CONT_PTE_SIZE, >> CONT_PMD_SIZE). So the function has to figure out the size from the >> huge_pte pointer. This was previously done by walking the pgtable to >> determine the level and by using the PTE_CONT bit to determine the >> number of ptes at the level. >> >> But the PTE_CONT bit is only valid when the pte is present. For >> non-present pte values (e.g. markers, migration entries), the previous >> implementation was therefore erroneously determining the size. There is >> at least one known caller in core-mm, move_huge_pte(), which may call >> huge_ptep_get_and_clear() for a non-present pte. So we must be robust to >> this case. Additionally the "regular" ptep_get_and_clear() is robust to >> being called for non-present ptes so it makes sense to follow the >> behavior. >> >> Fix this by using the new sz parameter which is now provided to the >> function. Additionally when clearing each pte in a contig range, don't >> gather the access and dirty bits if the pte is not present. >> >> An alternative approach that would not require API changes would be to >> store the PTE_CONT bit in a spare bit in the swap entry pte for the >> non-present case. But it felt cleaner to follow other APIs' lead and >> just pass in the size. >> >> As an aside, PTE_CONT is bit 52, which corresponds to bit 40 in the swap >> entry offset field (layout of non-present pte). Since hugetlb is never >> swapped to disk, this field will only be populated for markers, which >> always set this bit to 0 and hwpoison swap entries, which set the offset >> field to a PFN; So it would only ever be 1 for a 52-bit PVA system where >> memory in that high half was poisoned (I think!). So in practice, this >> bit would almost always be zero for non-present ptes and we would only >> clear the first entry if it was actually a contiguous block. That's >> probably a less severe symptom than if it was always interpreted as 1 >> and cleared out potentially-present neighboring PTEs. >> >> Cc: stable@xxxxxxxxxxxxxxx >> Fixes: 66b3923a1a0f ("arm64: hugetlb: add support for PTE contiguous bit") >> Reviewed-by: Catalin Marinas <catalin.marinas@xxxxxxx> >> Signed-off-by: Ryan Roberts <ryan.roberts@xxxxxxx> >> >> tmp >> --- > > Random "tmp" here, otherwise the patch looks fine (can be removed when > applying). Ugh, sorry. That's me squashing in the changes and forgetting to remove git's default catting of the 2 commit logs. I'll assume Will can fix this up. If not shout and I'll repost. Thanks, Ryan