Make kqueue use the refcnt API.

OK?

Index: sys/kern/kern_event.c
===================================================================
RCS file: src/sys/kern/kern_event.c,v
retrieving revision 1.183
diff -u -p -r1.183 kern_event.c
--- sys/kern/kern_event.c       22 Feb 2022 01:15:01 -0000      1.183
+++ sys/kern/kern_event.c       15 Mar 2022 13:43:20 -0000
@@ -199,7 +199,7 @@ const struct filterops *const sysfilt_op
 void
 KQREF(struct kqueue *kq)
 {
-       atomic_inc_int(&kq->kq_refs);
+       refcnt_take(&kq->kq_refcnt);
 }
 
 void
@@ -207,7 +207,7 @@ KQRELE(struct kqueue *kq)
 {
        struct filedesc *fdp;
 
-       if (atomic_dec_int_nv(&kq->kq_refs) > 0)
+       if (refcnt_rele(&kq->kq_refcnt) == 0)
                return;
 
        fdp = kq->kq_fdp;
@@ -837,7 +837,7 @@ kqpoll_exit(void)
 
        kqueue_purge(p, p->p_kq);
        kqueue_terminate(p, p->p_kq);
-       KASSERT(p->p_kq->kq_refs == 1);
+       KASSERT(p->p_kq->kq_refcnt.r_refs == 1);
        KQRELE(p->p_kq);
        p->p_kq = NULL;
 }
@@ -848,7 +848,7 @@ kqueue_alloc(struct filedesc *fdp)
        struct kqueue *kq;
 
        kq = pool_get(&kqueue_pool, PR_WAITOK | PR_ZERO);
-       kq->kq_refs = 1;
+       refcnt_init(&kq->kq_refcnt);
        kq->kq_fdp = fdp;
        TAILQ_INIT(&kq->kq_head);
        mtx_init(&kq->kq_lock, IPL_HIGH);
Index: sys/sys/eventvar.h
===================================================================
RCS file: src/sys/sys/eventvar.h,v
retrieving revision 1.13
diff -u -p -r1.13 eventvar.h
--- sys/sys/eventvar.h  8 Feb 2022 08:56:41 -0000       1.13
+++ sys/sys/eventvar.h  15 Mar 2022 13:43:20 -0000
@@ -32,6 +32,7 @@
 #define _SYS_EVENTVAR_H_
 
 #include <sys/mutex.h>
+#include <sys/refcnt.h>
 #include <sys/task.h>
 
 #define KQ_NEVENTS     8               /* minimize copy{in,out} calls */
@@ -47,7 +48,7 @@ struct kqueue {
        struct          mutex kq_lock;          /* lock for queue access */
        TAILQ_HEAD(, knote) kq_head;            /* [q] list of pending event */
        int             kq_count;               /* [q] # of pending events */
-       u_int           kq_refs;                /* [a] # of references */
+       struct          refcnt kq_refcnt;       /* [a] # of references */
        struct          selinfo kq_sel;
        struct          filedesc *kq_fdp;       /* [I] fd table of this kq */
 

Reply via email to