On Tue, Feb 13, 2024 at 04:48:50PM +0000, Ryan Roberts wrote: > On 13/02/2024 16:43, Mark Rutland wrote: > > On Fri, Feb 02, 2024 at 08:07:52AM +0000, Ryan Roberts wrote: > >> +static inline void __clear_full_ptes(struct mm_struct *mm, unsigned long addr, > >> + pte_t *ptep, unsigned int nr, int full) > >> +{ > >> + for (;;) { > >> + __ptep_get_and_clear(mm, addr, ptep); > >> + if (--nr == 0) > >> + break; > >> + ptep++; > >> + addr += PAGE_SIZE; > >> + } > >> +} > > > > The loop construct is a bit odd; can't this be: > > I found it a little odd at first, but its avoiding the ptep and addr increments > the last time through the loop. Its the preferred pattern for these functions in > core-mm. See default set_ptes(), wrprotect_ptes(), clear_full_ptes() in > include/linux/pgtable.h. > > So I'd prefer to leave it as is so that we match them. What do you think? That's fair enough; it I'm happy with it as-is. Mark.