svn commit: r304386 - stable/10/sys/dev/ntb/ntb_hw
Alexander Motin
mav at FreeBSD.org
Thu Aug 18 10:42:50 UTC 2016
Author: mav
Date: Thu Aug 18 10:42:48 2016
New Revision: 304386
URL: https://svnweb.freebsd.org/changeset/base/304386
Log:
MFC r302491: Switch ctx_lock from mutex to rmlock.
It is odd idea to serialize different MSI-X vectors. Use of rmlocks
here allows them to execute in parallel, but still protects ctx.
If upper layers require any additional serialization -- they can
do it by themselves.
Modified:
stable/10/sys/dev/ntb/ntb_hw/ntb_hw.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/dev/ntb/ntb_hw/ntb_hw.c
==============================================================================
--- stable/10/sys/dev/ntb/ntb_hw/ntb_hw.c Thu Aug 18 10:42:12 2016 (r304385)
+++ stable/10/sys/dev/ntb/ntb_hw/ntb_hw.c Thu Aug 18 10:42:48 2016 (r304386)
@@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$");
#include <sys/pciio.h>
#include <sys/queue.h>
#include <sys/rman.h>
+#include <sys/rmlock.h>
#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <vm/vm.h>
@@ -221,10 +222,7 @@ struct ntb_softc {
void *ntb_ctx;
const struct ntb_ctx_ops *ctx_ops;
struct ntb_vec *msix_vec;
-#define CTX_LOCK(sc) mtx_lock(&(sc)->ctx_lock)
-#define CTX_UNLOCK(sc) mtx_unlock(&(sc)->ctx_lock)
-#define CTX_ASSERT(sc,f) mtx_assert(&(sc)->ctx_lock, (f))
- struct mtx ctx_lock;
+ struct rmlock ctx_lock;
uint32_t ppd;
enum ntb_conn_type conn_type;
@@ -670,7 +668,7 @@ ntb_attach(device_t device)
callout_init(&ntb->lr_timer, CALLOUT_MPSAFE);
callout_init(&ntb->peer_msix_work, 1);
mtx_init(&ntb->db_mask_lock, "ntb hw bits", NULL, MTX_SPIN);
- mtx_init(&ntb->ctx_lock, "ntb ctx", NULL, MTX_DEF);
+ rm_init(&ntb->ctx_lock, "ntb ctx");
if (ntb->type == NTB_ATOM)
error = ntb_detect_atom(ntb);
@@ -733,7 +731,7 @@ ntb_detach(device_t device)
ntb_teardown_interrupts(ntb);
mtx_destroy(&ntb->db_mask_lock);
- mtx_destroy(&ntb->ctx_lock);
+ rm_destroy(&ntb->ctx_lock);
ntb_unmap_pci_bar(ntb);
@@ -2028,17 +2026,15 @@ ntb_set_ctx(device_t dev, void *ctx, con
if (ctx == NULL || ops == NULL)
return (EINVAL);
- if (ntb->ctx_ops != NULL)
- return (EINVAL);
- CTX_LOCK(ntb);
+ rm_wlock(&ntb->ctx_lock);
if (ntb->ctx_ops != NULL) {
- CTX_UNLOCK(ntb);
+ rm_wunlock(&ntb->ctx_lock);
return (EINVAL);
}
ntb->ntb_ctx = ctx;
ntb->ctx_ops = ops;
- CTX_UNLOCK(ntb);
+ rm_wunlock(&ntb->ctx_lock);
return (0);
}
@@ -2063,10 +2059,10 @@ ntb_clear_ctx(device_t dev)
{
struct ntb_softc *ntb = device_get_softc(dev);
- CTX_LOCK(ntb);
+ rm_wlock(&ntb->ctx_lock);
ntb->ntb_ctx = NULL;
ntb->ctx_ops = NULL;
- CTX_UNLOCK(ntb);
+ rm_wunlock(&ntb->ctx_lock);
}
/*
@@ -2080,11 +2076,12 @@ static void
ntb_link_event(device_t dev)
{
struct ntb_softc *ntb = device_get_softc(dev);
+ struct rm_priotracker ctx_tracker;
- CTX_LOCK(ntb);
+ rm_rlock(&ntb->ctx_lock, &ctx_tracker);
if (ntb->ctx_ops != NULL && ntb->ctx_ops->link_event != NULL)
ntb->ctx_ops->link_event(ntb->ntb_ctx);
- CTX_UNLOCK(ntb);
+ rm_runlock(&ntb->ctx_lock, &ctx_tracker);
}
/*
@@ -2104,11 +2101,12 @@ static void
ntb_db_event(device_t dev, uint32_t vec)
{
struct ntb_softc *ntb = device_get_softc(dev);
+ struct rm_priotracker ctx_tracker;
- CTX_LOCK(ntb);
+ rm_rlock(&ntb->ctx_lock, &ctx_tracker);
if (ntb->ctx_ops != NULL && ntb->ctx_ops->db_event != NULL)
ntb->ctx_ops->db_event(ntb->ntb_ctx, vec);
- CTX_UNLOCK(ntb);
+ rm_runlock(&ntb->ctx_lock, &ctx_tracker);
}
static int
More information about the svn-src-stable
mailing list