summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormelifaro <melifaro@FreeBSD.org>2013-03-25 14:30:34 +0000
committermelifaro <melifaro@FreeBSD.org>2013-03-25 14:30:34 +0000
commit6557c76b6f263066c030decbcf1d33bcdc09f448 (patch)
tree8c3a222accaed37f58931976e1cb5c235eab50c6
parent53f6db9f3ed0df8bc72dd388031e4f480768de81 (diff)
downloadFreeBSD-src-6557c76b6f263066c030decbcf1d33bcdc09f448.zip
FreeBSD-src-6557c76b6f263066c030decbcf1d33bcdc09f448.tar.gz
Unlock IPMI sc while performing requests via KCS and SMIC interfaces.
It is already done in SSIF interface code. This reduces contention/spinning reported by many users. PR: kern/172166 Submitted by: Eric van Gyzen <eric at vangyzen.net> MFC after: 2 weeks
-rw-r--r--sys/dev/ipmi/ipmi_kcs.c2
-rw-r--r--sys/dev/ipmi/ipmi_smic.c2
2 files changed, 4 insertions, 0 deletions
diff --git a/sys/dev/ipmi/ipmi_kcs.c b/sys/dev/ipmi/ipmi_kcs.c
index 1ca3298..76adf8c 100644
--- a/sys/dev/ipmi/ipmi_kcs.c
+++ b/sys/dev/ipmi/ipmi_kcs.c
@@ -456,6 +456,7 @@ kcs_loop(void *arg)
IPMI_LOCK(sc);
while ((req = ipmi_dequeue_request(sc)) != NULL) {
+ IPMI_UNLOCK(sc);
ok = 0;
for (i = 0; i < 3 && !ok; i++)
ok = kcs_polled_request(sc, req);
@@ -463,6 +464,7 @@ kcs_loop(void *arg)
req->ir_error = 0;
else
req->ir_error = EIO;
+ IPMI_LOCK(sc);
ipmi_complete_request(sc, req);
}
IPMI_UNLOCK(sc);
diff --git a/sys/dev/ipmi/ipmi_smic.c b/sys/dev/ipmi/ipmi_smic.c
index f9fe62e..c79c86d 100644
--- a/sys/dev/ipmi/ipmi_smic.c
+++ b/sys/dev/ipmi/ipmi_smic.c
@@ -362,6 +362,7 @@ smic_loop(void *arg)
IPMI_LOCK(sc);
while ((req = ipmi_dequeue_request(sc)) != NULL) {
+ IPMI_UNLOCK(sc);
ok = 0;
for (i = 0; i < 3 && !ok; i++)
ok = smic_polled_request(sc, req);
@@ -369,6 +370,7 @@ smic_loop(void *arg)
req->ir_error = 0;
else
req->ir_error = EIO;
+ IPMI_LOCK(sc);
ipmi_complete_request(sc, req);
}
IPMI_UNLOCK(sc);
OpenPOWER on IntegriCloud