aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorNavdeep Parhar <np@FreeBSD.org>2013-02-09 00:35:28 +0000
committerNavdeep Parhar <np@FreeBSD.org>2013-02-09 00:35:28 +0000
commitbf3db9ebd8e439a6d809cef564240fd523927748 (patch)
tree530496abe392a2cebd7f5f96f10b6b615ca6d208 /sys/dev
parentc3400997c48452e75387253a9971ec26fa20cc09 (diff)
downloadsrc-bf3db9ebd8e439a6d809cef564240fd523927748.tar.gz
src-bf3db9ebd8e439a6d809cef564240fd523927748.zip
Do not hold locks around hardware context reads.
MFC after: 3 days
Notes
Notes: svn path=/head/; revision=246575
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/cxgbe/t4_main.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c
index c22ec21a020e..96246a60c748 100644
--- a/sys/dev/cxgbe/t4_main.c
+++ b/sys/dev/cxgbe/t4_main.c
@@ -5161,23 +5161,24 @@ get_sge_context(struct adapter *sc, struct t4_sge_context *cntxt)
cntxt->mem_id != CTXT_FLM && cntxt->mem_id != CTXT_CNM)
return (EINVAL);
+ rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4ctxt");
+ if (rc)
+ return (rc);
+
if (sc->flags & FW_OK) {
- rc = begin_synchronized_op(sc, NULL, HOLD_LOCK, "t4ctxt");
- if (rc == 0) {
- rc = -t4_sge_ctxt_rd(sc, sc->mbox, cntxt->cid,
- cntxt->mem_id, &cntxt->data[0]);
- end_synchronized_op(sc, LOCK_HELD);
- if (rc == 0)
- return (0);
- }
+ rc = -t4_sge_ctxt_rd(sc, sc->mbox, cntxt->cid, cntxt->mem_id,
+ &cntxt->data[0]);
+ if (rc == 0)
+ goto done;
}
/*
* Read via firmware failed or wasn't even attempted. Read directly via
* the backdoor.
*/
- rc = -t4_sge_ctxt_rd_bd(sc, cntxt->cid, cntxt->mem_id,
- &cntxt->data[0]);
+ rc = -t4_sge_ctxt_rd_bd(sc, cntxt->cid, cntxt->mem_id, &cntxt->data[0]);
+done:
+ end_synchronized_op(sc, 0);
return (rc);
}