On Thu, Mar 17, 2022 at 06:16:51PM +0100, Alexander Bluhm wrote: > On Thu, Mar 17, 2022 at 07:25:27AM +0000, Visa Hankala wrote: > > On Thu, Mar 17, 2022 at 12:42:13AM +0100, Alexander Bluhm wrote: > > > I would like to use btrace to debug refernce counting. The idea > > > is to a a tracepoint for every type of refcnt we have. When it > > > changes, print the actual object, the current counter and the change > > > value. > > > > > Do we want that feature? > > > > I am against this in its current form. The code would become more > > complex, and the trace points can affect timing. There is a risk that > > the kernel behaves slightly differently when dt has been compiled in. > > Can we get in this part then? > > - Remove DIAGNOSTIC to keep similar in non DIAGNOSTIC case. > - Rename refcnt to refs. refcnt is the struct, refs contains the > r_refs value. > - Add KASSERT(refs != ~0) in refcnt_finalize(). > - Always use u_int refs so I can insert my btrace diff easily.
I think this is fine. OK visa@ > Index: kern/kern_synch.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/kern/kern_synch.c,v > retrieving revision 1.184 > diff -u -p -r1.184 kern_synch.c > --- kern/kern_synch.c 16 Mar 2022 14:13:01 -0000 1.184 > +++ kern/kern_synch.c 17 Mar 2022 16:12:50 -0000 > @@ -810,25 +810,21 @@ refcnt_init(struct refcnt *r) > void > refcnt_take(struct refcnt *r) > { > -#ifdef DIAGNOSTIC > - u_int refcnt; > + u_int refs; > > - refcnt = atomic_inc_int_nv(&r->r_refs); > - KASSERT(refcnt != 0); > -#else > - atomic_inc_int(&r->r_refs); > -#endif > + refs = atomic_inc_int_nv(&r->r_refs); > + KASSERT(refs != 0); > + (void)refs; > } > > int > refcnt_rele(struct refcnt *r) > { > - u_int refcnt; > + u_int refs; > > - refcnt = atomic_dec_int_nv(&r->r_refs); > - KASSERT(refcnt != ~0); > - > - return (refcnt == 0); > + refs = atomic_dec_int_nv(&r->r_refs); > + KASSERT(refs != ~0); > + return (refs == 0); > } > > void > @@ -842,26 +838,33 @@ void > refcnt_finalize(struct refcnt *r, const char *wmesg) > { > struct sleep_state sls; > - u_int refcnt; > + u_int refs; > > - refcnt = atomic_dec_int_nv(&r->r_refs); > - while (refcnt) { > + refs = atomic_dec_int_nv(&r->r_refs); > + KASSERT(refs != ~0); > + while (refs) { > sleep_setup(&sls, r, PWAIT, wmesg, 0); > - refcnt = atomic_load_int(&r->r_refs); > - sleep_finish(&sls, refcnt); > + refs = atomic_load_int(&r->r_refs); > + sleep_finish(&sls, refs); > } > } > > int > refcnt_shared(struct refcnt *r) > { > - return (atomic_load_int(&r->r_refs) > 1); > + u_int refs; > + > + refs = atomic_load_int(&r->r_refs); > + return (refs > 1); > } > > unsigned int > refcnt_read(struct refcnt *r) > { > - return (atomic_load_int(&r->r_refs)); > + u_int refs; > + > + refs = atomic_load_int(&r->r_refs); > + return (refs); > } > > void >