patch 3/8: Change the state after "PIO data-in" to HSM_ST_IDLE instead of HSM_ST_LAST. This can prevent the irq handler from thinking "HSM is waiting for the last irq" and submitting redundant tasks to the workqueue. Signed-off-by: Albert Lee <albertcc@xxxxxxxxxx> --- This patch is needed if irq driven pio to be delegated to workqueue. diff -Nrup 02_smart_flush/drivers/ata/libata-core.c 03_read_state/drivers/ata/libata-core.c --- 02_smart_flush/drivers/ata/libata-core.c 2007-05-16 10:37:53.000000000 +0800 +++ 03_read_state/drivers/ata/libata-core.c 2007-05-16 10:37:57.000000000 +0800 @@ -4453,7 +4453,7 @@ static void ata_pio_sector(struct ata_qu unsigned char *buf; if (qc->curbytes == qc->nbytes - qc->sect_size) - ap->hsm_task_state = HSM_ST_LAST; + ap->hsm_task_state = do_write ? HSM_ST_LAST : HSM_ST_IDLE; page = sg[qc->cursg].page; offset = sg[qc->cursg].offset + qc->cursg_ofs; @@ -4807,6 +4807,8 @@ int ata_hsm_move(struct ata_port *ap, st */ WARN_ON(in_wq != ata_hsm_ok_in_wq(ap, qc)); + WARN_ON(ap->hsm_task_state == HSM_ST_IDLE); + fsm_start: DPRINTK("ata%u: protocol %d task_state %d (dev_stat 0x%X)\n", ap->print_id, qc->tf.protocol, ap->hsm_task_state, status); @@ -4964,8 +4966,7 @@ fsm_start: ata_pio_sectors(qc); - if (ap->hsm_task_state == HSM_ST_LAST && - (!(qc->tf.flags & ATA_TFLAG_WRITE))) { + if (ap->hsm_task_state == HSM_ST_IDLE) { /* all data read */ status = ata_wait_idle(ap); goto fsm_start; @@ -4976,6 +4977,7 @@ fsm_start: break; case HSM_ST_LAST: + case HSM_ST_IDLE: if (unlikely(!ata_ok(status))) { qc->err_mask |= __ac_err_mask(status); ap->hsm_task_state = HSM_ST_ERR; - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html