<div dir="ltr">thanks</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Vasant Hegde <<a href="mailto:hegdevasant@linux.vnet.ibm.com">hegdevasant@linux.vnet.ibm.com</a>> 于2021年1月13日周三 下午6:03写道:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">From: lixg <<a href="mailto:lixgemail@gmail.com" target="_blank">lixgemail@gmail.com</a>><br>
<br>
BT IRQ may preempt BT timer if BMC response host when bt msg timeout.<br>
When BT IRQ preempt BT timer, the infight_bt_msg did not protected by bt.lock very well.<br>
<br>
And we will see the following log:<br>
[29006114.163785853,3] BT: seq 0x81 netfn 0x0a cmd 0x23: Timeout sending message<br>
[29006114.288029290,3] BT: seq 0x81 netfn 0x0b cmd 0x23: Timeout sending message<br>
[29006114.288917798,3] IPMI: Incorrect netfn 0x0b in response<br>
<br>
It may cause 'CPU Hardlock UP', 'memory refree', 'kernel crash' or something else...<br>
<br>
Signed-off-by: lixg <<a href="mailto:867314078@qq.com" target="_blank">867314078@qq.com</a>><br>
---<br>
Lixg,<br>
  Your patch was filtered out and didn't hit mailing list. Hence<br>
  resending your patch.<br>
  I have fixed mailing list issue. Now all your patches/responses will<br>
  come to maiilng list.<br>
<br>
-Vasant<br>
<br>
 hw/bt.c | 8 +++++---<br>
 1 file changed, 5 insertions(+), 3 deletions(-)<br>
<br>
diff --git a/hw/bt.c b/hw/bt.c<br>
index cf967f899..5016feab6 100644<br>
--- a/hw/bt.c<br>
+++ b/hw/bt.c<br>
@@ -211,6 +211,11 @@ static void bt_msg_del(struct bt_msg *bt_msg)<br>
 {<br>
        list_del(&bt_msg->link);<br>
        bt.queue_len--;<br>
+<br>
+       /* once inflight_bt_msg out of list, it should be emptyed */<br>
+       if (bt_msg == inflight_bt_msg)<br>
+               inflight_bt_msg = NULL;<br>
+<br>
        unlock(&bt.lock);<br>
        ipmi_cmd_done(bt_msg->ipmi_msg.cmd,<br>
                      IPMI_NETFN_RETURN_CODE(bt_msg->ipmi_msg.netfn),<br>
@@ -393,9 +398,6 @@ static void bt_expire_old_msg(uint64_t tb)<br>
                        BT_Q_ERR(bt_msg, "Timeout sending message");<br>
                        bt_msg_del(bt_msg);<br>
<br>
-                       /* Ready to send next message */<br>
-                       inflight_bt_msg = NULL;<br>
-<br>
                        /*<br>
                         * Timing out a message is inherently racy as the BMC<br>
                         * may start writing just as we decide to kill the<br>
-- <br>
2.26.2<br>
<br>
</blockquote></div>