File tree Expand file tree Collapse file tree 2 files changed +19
-8
lines changed Expand file tree Collapse file tree 2 files changed +19
-8
lines changed Original file line number Diff line number Diff line change @@ -4789,7 +4789,9 @@ static atomic_t recv_msg_inuse_count = ATOMIC_INIT(0);
4789
4789
static void free_smi_msg (struct ipmi_smi_msg * msg )
4790
4790
{
4791
4791
atomic_dec (& smi_msg_inuse_count );
4792
- kfree (msg );
4792
+ /* Try to keep as much stuff out of the panic path as possible. */
4793
+ if (!oops_in_progress )
4794
+ kfree (msg );
4793
4795
}
4794
4796
4795
4797
struct ipmi_smi_msg * ipmi_alloc_smi_msg (void )
@@ -4808,7 +4810,9 @@ EXPORT_SYMBOL(ipmi_alloc_smi_msg);
4808
4810
static void free_recv_msg (struct ipmi_recv_msg * msg )
4809
4811
{
4810
4812
atomic_dec (& recv_msg_inuse_count );
4811
- kfree (msg );
4813
+ /* Try to keep as much stuff out of the panic path as possible. */
4814
+ if (!oops_in_progress )
4815
+ kfree (msg );
4812
4816
}
4813
4817
4814
4818
static struct ipmi_recv_msg * ipmi_alloc_recv_msg (void )
@@ -4826,7 +4830,7 @@ static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void)
4826
4830
4827
4831
void ipmi_free_recv_msg (struct ipmi_recv_msg * msg )
4828
4832
{
4829
- if (msg -> user )
4833
+ if (msg -> user && ! oops_in_progress )
4830
4834
kref_put (& msg -> user -> refcount , free_user );
4831
4835
msg -> done (msg );
4832
4836
}
Original file line number Diff line number Diff line change @@ -342,13 +342,17 @@ static atomic_t msg_tofree = ATOMIC_INIT(0);
342
342
static DECLARE_COMPLETION (msg_wait );
343
343
static void msg_free_smi (struct ipmi_smi_msg * msg )
344
344
{
345
- if (atomic_dec_and_test (& msg_tofree ))
346
- complete (& msg_wait );
345
+ if (atomic_dec_and_test (& msg_tofree )) {
346
+ if (!oops_in_progress )
347
+ complete (& msg_wait );
348
+ }
347
349
}
348
350
static void msg_free_recv (struct ipmi_recv_msg * msg )
349
351
{
350
- if (atomic_dec_and_test (& msg_tofree ))
351
- complete (& msg_wait );
352
+ if (atomic_dec_and_test (& msg_tofree )) {
353
+ if (!oops_in_progress )
354
+ complete (& msg_wait );
355
+ }
352
356
}
353
357
static struct ipmi_smi_msg smi_msg = {
354
358
.done = msg_free_smi
@@ -434,8 +438,10 @@ static int _ipmi_set_timeout(int do_heartbeat)
434
438
rv = __ipmi_set_timeout (& smi_msg ,
435
439
& recv_msg ,
436
440
& send_heartbeat_now );
437
- if (rv )
441
+ if (rv ) {
442
+ atomic_set (& msg_tofree , 0 );
438
443
return rv ;
444
+ }
439
445
440
446
wait_for_completion (& msg_wait );
441
447
@@ -580,6 +586,7 @@ static int __ipmi_heartbeat(void)
580
586
& recv_msg ,
581
587
1 );
582
588
if (rv ) {
589
+ atomic_set (& msg_tofree , 0 );
583
590
pr_warn ("heartbeat send failure: %d\n" , rv );
584
591
return rv ;
585
592
}
You can’t perform that action at this time.
0 commit comments