.. | .. |
---|
2089 | 2089 | new_smi->io.io_cleanup = NULL; |
---|
2090 | 2090 | } |
---|
2091 | 2091 | |
---|
| 2092 | + if (rv && new_smi->si_sm) { |
---|
| 2093 | + kfree(new_smi->si_sm); |
---|
| 2094 | + new_smi->si_sm = NULL; |
---|
| 2095 | + } |
---|
| 2096 | + |
---|
2092 | 2097 | return rv; |
---|
2093 | 2098 | } |
---|
2094 | 2099 | |
---|
.. | .. |
---|
2160 | 2165 | } |
---|
2161 | 2166 | module_init(init_ipmi_si); |
---|
2162 | 2167 | |
---|
| 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 | + |
---|
2163 | 2182 | static void shutdown_smi(void *send_info) |
---|
2164 | 2183 | { |
---|
2165 | 2184 | struct smi_info *smi_info = send_info; |
---|
.. | .. |
---|
2194 | 2213 | * in the BMC. Note that timers and CPU interrupts are off, |
---|
2195 | 2214 | * so no need for locks. |
---|
2196 | 2215 | */ |
---|
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 | + |
---|
2201 | 2218 | if (smi_info->handlers) |
---|
2202 | 2219 | 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 | + |
---|
2207 | 2223 | if (smi_info->handlers) |
---|
2208 | 2224 | smi_info->handlers->cleanup(smi_info->si_sm); |
---|
2209 | 2225 | |
---|