[SCSI] qla2xxx: Limit excessive DPC cycles.
authorAndrew Vasquez <andrew.vasquez@qlogic.com>
Fri, 18 Nov 2011 17:03:10 +0000 (09:03 -0800)
committerJames Bottomley <JBottomley@Parallels.com>
Thu, 15 Dec 2011 06:55:03 +0000 (10:55 +0400)
The 'continue' cases neglected to place the thread in an
interruptible state, causing the DPC routine to wake immediately.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: Chad Dupuis <chad.dupuis@qlogic.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/qla2xxx/qla_os.c

index c9a74521b402f9f1b7b755e80be9ee24cf1cd95b..51c4655420926e3f12b10d821b4cd7e531707789 100644 (file)
@@ -3445,27 +3445,21 @@ qla2x00_do_dpc(void *data)
                schedule();
                __set_current_state(TASK_RUNNING);
 
-               ql_dbg(ql_dbg_dpc, base_vha, 0x4001,
-                   "DPC handler waking up.\n");
-               ql_dbg(ql_dbg_dpc, base_vha, 0x4002,
-                   "dpc_flags=0x%lx.\n", base_vha->dpc_flags);
-
-               /* Initialization not yet finished. Don't do anything yet. */
-               if (!base_vha->flags.init_done)
-                       continue;
+               if (!base_vha->flags.init_done || ha->flags.mbox_busy)
+                       goto end_loop;
 
                if (ha->flags.eeh_busy) {
                        ql_dbg(ql_dbg_dpc, base_vha, 0x4003,
                            "eeh_busy=%d.\n", ha->flags.eeh_busy);
-                       continue;
+                       goto end_loop;
                }
 
                ha->dpc_active = 1;
 
-               if (ha->flags.mbox_busy) {
-                       ha->dpc_active = 0;
-                       continue;
-               }
+               ql_dbg(ql_dbg_dpc, base_vha, 0x4001,
+                   "DPC handler waking up.\n");
+               ql_dbg(ql_dbg_dpc, base_vha, 0x4002,
+                   "dpc_flags=0x%lx.\n", base_vha->dpc_flags);
 
                qla2x00_do_work(base_vha);
 
@@ -3607,6 +3601,7 @@ qla2x00_do_dpc(void *data)
                qla2x00_do_dpc_all_vps(base_vha);
 
                ha->dpc_active = 0;
+end_loop:
                set_current_state(TASK_INTERRUPTIBLE);
        } /* End of while(1) */
        __set_current_state(TASK_RUNNING);