diff options
author | David Gwynne <dlg@cvs.openbsd.org> | 2014-10-04 11:42:28 +0000 |
---|---|---|
committer | David Gwynne <dlg@cvs.openbsd.org> | 2014-10-04 11:42:28 +0000 |
commit | b68234b57d435f08d5d783b857f7626128499587 (patch) | |
tree | 1ba597cb559cd412ce2aa64c19e20646c84a1c5c | |
parent | 1b5ea667c93ee4172b58318273a773f71253f862 (diff) |
replace mutexes to serialise the operations on the flag that restricts
the number of contexts that are refilling the rx rings with atomic
ops.
this is borrowed from code i wrote for the scsi midlayer but cant
put in yet because i havent got atomic.h up to scrach on all archs
yet. the archs myx runs on do have enough atomic.h to be fine though.
-rw-r--r-- | sys/dev/pci/if_myx.c | 24 |
1 files changed, 7 insertions, 17 deletions
diff --git a/sys/dev/pci/if_myx.c b/sys/dev/pci/if_myx.c index 69cad8f6f52..0e601f76c4b 100644 --- a/sys/dev/pci/if_myx.c +++ b/sys/dev/pci/if_myx.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_myx.c,v 1.69 2014/10/03 13:41:55 dlg Exp $ */ +/* $OpenBSD: if_myx.c,v 1.70 2014/10/04 11:42:27 dlg Exp $ */ /* * Copyright (c) 2007 Reyk Floeter <reyk@openbsd.org> @@ -33,6 +33,7 @@ #include <sys/timeout.h> #include <sys/device.h> #include <sys/queue.h> +#include <sys/atomic.h> #include <machine/bus.h> #include <machine/intr.h> @@ -2049,27 +2050,16 @@ myx_ring_lock_init(struct myx_ring_lock *mrl) int myx_ring_enter(struct myx_ring_lock *mrl) { - int rv = 1; - - mtx_enter(&mrl->mrl_mtx); - if (++mrl->mrl_running > 1) - rv = 0; - mtx_leave(&mrl->mrl_mtx); - - return (rv); + return (atomic_inc_int_nv(&mrl->mrl_running) == 1); } int myx_ring_leave(struct myx_ring_lock *mrl) { - int rv = 1; + if (atomic_cas_uint(&mrl->mrl_running, 1, 0) == 1) + return (1); - mtx_enter(&mrl->mrl_mtx); - if (--mrl->mrl_running > 0) { - mrl->mrl_running = 1; - rv = 0; - } - mtx_leave(&mrl->mrl_mtx); + mrl->mrl_running = 1; - return (rv); + return (0); } |