| From fc4bf75ea300a5e62a2419f89dd0e22189dd7ab7 Mon Sep 17 00:00:00 2001 |
| From: Raghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com> |
| Date: Mon, 25 Apr 2016 23:31:57 -0700 |
| Subject: aacraid: Fix for aac_command_thread hang |
| |
| From: Raghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com> |
| |
| commit fc4bf75ea300a5e62a2419f89dd0e22189dd7ab7 upstream. |
| |
| Typically under error conditions, it is possible for aac_command_thread() |
| to miss the wakeup from kthread_stop() and go back to sleep, causing it |
| to hang aac_shutdown. |
| |
| In the observed scenario, the adapter is not functioning correctly and so |
| aac_fib_send() never completes (or time-outs depending on how it was |
| called). Shortly after aac_command_thread() starts it performs |
| aac_fib_send(SendHostTime) which hangs. When aac_probe_one |
| /aac_get_adapter_info send time outs, kthread_stop is called which breaks |
| the command thread out of it's hang. |
| |
| The code will still go back to sleep in schedule_timeout() without |
| checking kthread_should_stop() so it causes aac_probe_one to hang until |
| the schedule_timeout() which is 30 minutes. |
| |
| Fixed by: Adding another kthread_should_stop() before schedule_timeout() |
| Signed-off-by: Raghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com> |
| Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/scsi/aacraid/commsup.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/drivers/scsi/aacraid/commsup.c |
| +++ b/drivers/scsi/aacraid/commsup.c |
| @@ -1996,6 +1996,10 @@ int aac_command_thread(void *data) |
| if (difference <= 0) |
| difference = 1; |
| set_current_state(TASK_INTERRUPTIBLE); |
| + |
| + if (kthread_should_stop()) |
| + break; |
| + |
| schedule_timeout(difference); |
| |
| if (kthread_should_stop()) |