hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/char/ipmi/ipmi_si_intf.c
....@@ -2089,6 +2089,11 @@
20892089 new_smi->io.io_cleanup = NULL;
20902090 }
20912091
2092
+ if (rv && new_smi->si_sm) {
2093
+ kfree(new_smi->si_sm);
2094
+ new_smi->si_sm = NULL;
2095
+ }
2096
+
20922097 return rv;
20932098 }
20942099
....@@ -2160,6 +2165,20 @@
21602165 }
21612166 module_init(init_ipmi_si);
21622167
2168
+static void wait_msg_processed(struct smi_info *smi_info)
2169
+{
2170
+ unsigned long jiffies_now;
2171
+ long time_diff;
2172
+
2173
+ while (smi_info->curr_msg || (smi_info->si_state != SI_NORMAL)) {
2174
+ jiffies_now = jiffies;
2175
+ time_diff = (((long)jiffies_now - (long)smi_info->last_timeout_jiffies)
2176
+ * SI_USEC_PER_JIFFY);
2177
+ smi_event_handler(smi_info, time_diff);
2178
+ schedule_timeout_uninterruptible(1);
2179
+ }
2180
+}
2181
+
21632182 static void shutdown_smi(void *send_info)
21642183 {
21652184 struct smi_info *smi_info = send_info;
....@@ -2194,16 +2213,13 @@
21942213 * in the BMC. Note that timers and CPU interrupts are off,
21952214 * so no need for locks.
21962215 */
2197
- while (smi_info->curr_msg || (smi_info->si_state != SI_NORMAL)) {
2198
- poll(smi_info);
2199
- schedule_timeout_uninterruptible(1);
2200
- }
2216
+ wait_msg_processed(smi_info);
2217
+
22012218 if (smi_info->handlers)
22022219 disable_si_irq(smi_info);
2203
- while (smi_info->curr_msg || (smi_info->si_state != SI_NORMAL)) {
2204
- poll(smi_info);
2205
- schedule_timeout_uninterruptible(1);
2206
- }
2220
+
2221
+ wait_msg_processed(smi_info);
2222
+
22072223 if (smi_info->handlers)
22082224 smi_info->handlers->cleanup(smi_info->si_sm);
22092225