From: Matt Fleming <[email protected]>

When the BMC does not respond to a "Get Device ID" command, the
wait_event() in __get_device_id() blocks forever in TASK_UNINTERRUPTIBLE
while holding bmc->dyn_mutex. Every subsequent sysfs reader then piles
up in D state. Replace with wait_event_timeout() to return -EIO after 1
second.

Signed-off-by: Matt Fleming <[email protected]>
---
 drivers/char/ipmi/ipmi_msghandler.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/char/ipmi/ipmi_msghandler.c 
b/drivers/char/ipmi/ipmi_msghandler.c
index c41f51c82edd..efa9588e8210 100644
--- a/drivers/char/ipmi/ipmi_msghandler.c
+++ b/drivers/char/ipmi/ipmi_msghandler.c
@@ -2599,7 +2599,13 @@ static int __get_device_id(struct ipmi_smi *intf, struct 
bmc_device *bmc)
        if (rv)
                goto out_reset_handler;
 
-       wait_event(intf->waitq, bmc->dyn_id_set != 2);
+       if (!wait_event_timeout(intf->waitq, bmc->dyn_id_set != 2,
+                               msecs_to_jiffies(1000))) {
+               dev_warn(intf->si_dev,
+                        "Timed out waiting for get bmc device id response\n");
+               rv = -EIO;
+               goto out_reset_handler;
+       }
 
        if (!bmc->dyn_id_set) {
                if (bmc->cc != IPMI_CC_NO_ERROR &&
-- 
2.43.0



_______________________________________________
Openipmi-developer mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openipmi-developer

Reply via email to