[PATCH 3/8] libata: change the state after "PIO data-in" to HSM_ST_IDLE instead of HSM_ST_LAST

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Linux Filesystems]     [Linux SCSI]     [Linux RAID]     [Git]     [Kernel Newbies]     [Linux Newbie]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Samba]     [Device Mapper]

  Powered by Linux