diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 3ce4392..8eb050e 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -1612,6 +1612,11 @@ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd, goto defer; } + if (cmd->ata_deferred_cnt >= 10) + ata_dev_printk(dev, KERN_INFO, "XXX: cmd %02x deferred %d times taking %u msecs\n", + qc->tf.command, cmd->ata_deferred_cnt, + jiffies_to_msecs(jiffies - cmd->ata_first_deferred)); + /* select device, send command to hardware */ ata_qc_issue(qc); @@ -1633,6 +1638,18 @@ err_mem: return 0; defer: + if (!cmd->ata_deferred_cnt++) { + cmd->ata_first_deferred = cmd->ata_last_deferred = jiffies; + } else { + unsigned long now = jiffies; + + if (jiffies_to_msecs(now - cmd->ata_last_deferred) < 3) + ata_dev_printk(dev, KERN_INFO, "XXX: cmd %02x deferred in %d msecs, cnt=%d\n", + qc->tf.command, + jiffies_to_msecs(now - cmd->ata_last_deferred), + cmd->ata_deferred_cnt); + cmd->ata_last_deferred = now; + } ata_qc_free(qc); DPRINTK("EXIT - defer\n"); if (rc == ATA_DEFER_LINK) diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 110e776..aadee36 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -265,6 +265,7 @@ struct scsi_cmnd *scsi_get_command(struct scsi_device *dev, gfp_t gfp_mask) list_add_tail(&cmd->list, &dev->cmd_list); spin_unlock_irqrestore(&dev->list_lock, flags); cmd->jiffies_at_alloc = jiffies; + cmd->ata_deferred_cnt = 0; } else put_device(&dev->sdev_gendev); diff --git a/include/linux/libata.h b/include/linux/libata.h diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h index 3e46dfa..0000971 100644 --- a/include/scsi/scsi_cmnd.h +++ b/include/scsi/scsi_cmnd.h @@ -127,6 +127,10 @@ struct scsi_cmnd { int result; /* Status code from lower level driver */ unsigned char tag; /* SCSI-II queued command tag */ + + int ata_deferred_cnt; + unsigned long ata_first_deferred; + unsigned long ata_last_deferred; }; extern struct scsi_cmnd *scsi_get_command(struct scsi_device *, gfp_t);