On Mon, Dec 14, 2020 at 10:59:05AM -0300, Martin Pieuchot wrote:
> On 08/12/20(Tue) 14:39, Visa Hankala wrote:
> > On Mon, Dec 07, 2020 at 03:25:00PM -0300, Martin Pieuchot wrote:
> > > Simple diff below to add the rw_lock_held() as well as a read & write
> > > version.
> > > 
> > > This allows us to reduce the difference with NetBSD in UVM by adding the
> > > following checks:
> > > 
> > >   KASSERT(rw_write_held(amap->am_lock));
> > > 
> > > ok?
> > > 
> > > Index: sys/rwlock.h
> > > ===================================================================
> > > RCS file: /cvs/src/sys/sys/rwlock.h,v
> > > retrieving revision 1.26
> > > diff -u -p -r1.26 rwlock.h
> > > --- sys/rwlock.h  16 Jul 2019 01:40:49 -0000      1.26
> > > +++ sys/rwlock.h  7 Dec 2020 18:22:03 -0000
> > > @@ -168,6 +168,11 @@ int  rw_enter(struct rwlock *, int);
> > >  void     rw_exit(struct rwlock *);
> > >  int      rw_status(struct rwlock *);
> > >  
> > > +#define  rw_read_held(rwl)       (rw_status(rwl) == RW_READ)
> > > +#define  rw_write_held(rwl)      (rw_status(rwl) == RW_WRITE)
> > > +#define  rw_lock_held(rwl)       (rw_write_held(rwl) || 
> > > rw_read_held(rwl))
> > 
> > I think rw_lock_held() should invoke rw_status() only once. This would
> > reduce the overhead. It could even be a proper C function.
> 
> As below?

Yes.  OK visa@

> Index: sys/rwlock.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/rwlock.h,v
> retrieving revision 1.26
> diff -u -p -r1.26 rwlock.h
> --- sys/rwlock.h      16 Jul 2019 01:40:49 -0000      1.26
> +++ sys/rwlock.h      14 Dec 2020 13:35:41 -0000
> @@ -168,6 +168,29 @@ int      rw_enter(struct rwlock *, int);
>  void rw_exit(struct rwlock *);
>  int  rw_status(struct rwlock *);
>  
> +static inline int
> +rw_read_held(struct rwlock *rwl)
> +{
> +     return (rw_status(rwl) == RW_READ);
> +}
> +
> +static inline int
> +rw_write_held(struct rwlock *rwl)
> +{
> +     return (rw_status(rwl) == RW_WRITE);
> +}
> +
> +static inline int
> +rw_lock_held(struct rwlock *rwl)
> +{
> +     int status;
> +
> +     status = rw_status(rwl);
> +
> +     return (status == RW_READ || status == RW_WRITE);
> +}
> +
> +
>  void _rrw_init_flags(struct rrwlock *, const char *, int,
>           const struct lock_type *);
>  int  rrw_enter(struct rrwlock *, int);
> 

Reply via email to