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 <sur...@google.com> > --- > 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. -- Michal Hocko SUSE Labs