From f1e553e2f19bb1bd931a484604c3c55da1b3399a Mon Sep 17 00:00:00 2001 From: mav Date: Tue, 22 Oct 2013 10:40:26 +0000 Subject: Remove global device lock acquisition from dev_relthread(), replacing it with atomics on per-device data. --- sys/kern/kern_conf.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'sys/kern') diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index c04d1da..b1ae7a1 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -193,7 +193,7 @@ dev_refthread(struct cdev *dev, int *ref) if (csw != NULL) { cdp = cdev2priv(dev); if ((cdp->cdp_flags & CDP_SCHED_DTR) == 0) - dev->si_threadcount++; + atomic_add_long(&dev->si_threadcount, 1); else csw = NULL; } @@ -234,7 +234,7 @@ devvn_refthread(struct vnode *vp, struct cdev **devp, int *ref) if ((cdp->cdp_flags & CDP_SCHED_DTR) == 0) { csw = dev->si_devsw; if (csw != NULL) - dev->si_threadcount++; + atomic_add_long(&dev->si_threadcount, 1); } dev_unlock(); if (csw != NULL) { @@ -251,11 +251,9 @@ dev_relthread(struct cdev *dev, int ref) mtx_assert(&devmtx, MA_NOTOWNED); if (!ref) return; - dev_lock(); KASSERT(dev->si_threadcount > 0, ("%s threadcount is wrong", dev->si_name)); - dev->si_threadcount--; - dev_unlock(); + atomic_subtract_rel_long(&dev->si_threadcount, 1); } int -- cgit v1.1