diff options
author | melifaro <melifaro@FreeBSD.org> | 2013-03-25 14:30:34 +0000 |
---|---|---|
committer | melifaro <melifaro@FreeBSD.org> | 2013-03-25 14:30:34 +0000 |
commit | 6557c76b6f263066c030decbcf1d33bcdc09f448 (patch) | |
tree | 8c3a222accaed37f58931976e1cb5c235eab50c6 | |
parent | 53f6db9f3ed0df8bc72dd388031e4f480768de81 (diff) | |
download | FreeBSD-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.c | 2 | ||||
-rw-r--r-- | sys/dev/ipmi/ipmi_smic.c | 2 |
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); |