On Tue 17-01-23 16:09:03, Michal Hocko wrote: > On Mon 09-01-23 12:53:08, Suren Baghdasaryan wrote: > > To keep vma locking correctness when vm_flags are modified, add modifier > > functions to be used whenever flags are updated. > > > > Signed-off-by: Suren Baghdasaryan <surenb@xxxxxxxxxx> > > --- > > include/linux/mm.h | 38 ++++++++++++++++++++++++++++++++++++++ > > include/linux/mm_types.h | 8 +++++++- > > 2 files changed, 45 insertions(+), 1 deletion(-) > > > > diff --git a/include/linux/mm.h b/include/linux/mm.h > > index ec2c4c227d51..35cf0a6cbcc2 100644 > > --- a/include/linux/mm.h > > +++ b/include/linux/mm.h > > @@ -702,6 +702,44 @@ static inline void vma_init(struct vm_area_struct *vma, struct mm_struct *mm) > > vma_init_lock(vma); > > } > > > > +/* Use when VMA is not part of the VMA tree and needs no locking */ > > +static inline > > +void init_vm_flags(struct vm_area_struct *vma, unsigned long flags) > > +{ > > + WRITE_ONCE(vma->vm_flags, flags); > > +} > > Why do we need WRITE_ONCE here? Isn't vma invisible during its > initialization? > > > + > > +/* Use when VMA is part of the VMA tree and needs appropriate locking */ > > +static inline > > +void reset_vm_flags(struct vm_area_struct *vma, unsigned long flags) > > +{ > > + vma_write_lock(vma); > > + init_vm_flags(vma, flags); > > +} > > + > > +static inline > > +void set_vm_flags(struct vm_area_struct *vma, unsigned long flags) > > +{ > > + vma_write_lock(vma); > > + vma->vm_flags |= flags; > > +} > > + > > +static inline > > +void clear_vm_flags(struct vm_area_struct *vma, unsigned long flags) > > +{ > > + vma_write_lock(vma); > > + vma->vm_flags &= ~flags; > > +} > > + > > +static inline > > +void mod_vm_flags(struct vm_area_struct *vma, > > + unsigned long set, unsigned long clear) > > +{ > > + vma_write_lock(vma); > > + vma->vm_flags |= set; > > + vma->vm_flags &= ~clear; > > +} > > + > > This is rather unusual pattern. There is no note about locking involved > in the naming and also why is the locking part of this interface in the > first place? I can see reason for access functions to actually check for > lock asserts. OK, it took me a while but it is clear to me now. The confusion comes from the naming vma_write_lock is no a lock in its usual terms. It is more of a vma_mark_modified with side effects to read locking which is a real lock. With that it makes more sense to have this done in these helpers rather than requiring all users to keep this subtletly in mind. -- Michal Hocko SUSE Labs