* [PATCH libata-dev#upstream 1/2] libata: don't skip EH report if action is pending @ 2007-07-31 7:42 Tejun Heo 2007-07-31 7:51 ` [PATCH libata-dev#upstream 2/2] libata: move EH repeat reporting into ata_eh_report() Tejun Heo 2007-08-01 5:56 ` [PATCH libata-dev#upstream 1/2] libata: don't skip EH report if action is pending Tejun Heo 0 siblings, 2 replies; 6+ messages in thread From: Tejun Heo @ 2007-07-31 7:42 UTC (permalink / raw) To: Jeff Garzik, linux-ide, mikpe Don't skip EH report if action is pending. Signed-off-by: Tejun Heo <htejun@gmail.com> --- drivers/ata/libata-eh.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: work/drivers/ata/libata-eh.c =================================================================== --- work.orig/drivers/ata/libata-eh.c +++ work/drivers/ata/libata-eh.c @@ -1675,7 +1675,7 @@ static void ata_eh_report(struct ata_por nr_failed++; } - if (!nr_failed && !ehc->i.err_mask) + if (!nr_failed && !ehc->i.err_mask && !ehc->i.action) return; frozen = ""; ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH libata-dev#upstream 2/2] libata: move EH repeat reporting into ata_eh_report() 2007-07-31 7:42 [PATCH libata-dev#upstream 1/2] libata: don't skip EH report if action is pending Tejun Heo @ 2007-07-31 7:51 ` Tejun Heo 2007-08-15 8:52 ` Jeff Garzik 2007-08-01 5:56 ` [PATCH libata-dev#upstream 1/2] libata: don't skip EH report if action is pending Tejun Heo 1 sibling, 1 reply; 6+ messages in thread From: Tejun Heo @ 2007-07-31 7:51 UTC (permalink / raw) To: Jeff Garzik, linux-ide, mikpe EH is sometimes repeated without any error or action. For example, this happens when probing IDENTIFY fails because of a phantom device. In these cases, all the repeated EH does is making sure there is no unhandled error or pending action and return. This repeation is necessary to avoid losing any event which occurred while EH was in progress. Unfortunately, this dry run causes annonying "EH pending after completion" message. This patch moves the repeat reporting into ata_eh_report() such that it's more compact and skipped on dry runs. Signed-off-by: Tejun Heo <htejun@gmail.com> Cc: Mikael Pettersson <mikep@it.uu.se> --- Mikael, please verify this removes the annonying message you're seeing. Thanks. drivers/ata/libata-eh.c | 26 ++++++++++++++++---------- include/linux/libata.h | 5 +++-- 2 files changed, 19 insertions(+), 12 deletions(-) Index: work/drivers/ata/libata-eh.c =================================================================== --- work.orig/drivers/ata/libata-eh.c +++ work/drivers/ata/libata-eh.c @@ -290,7 +290,7 @@ enum scsi_eh_timer_return ata_scsi_timed void ata_scsi_error(struct Scsi_Host *host) { struct ata_port *ap = ata_shost_to_port(host); - int i, repeat_cnt = ATA_EH_MAX_REPEAT; + int i; unsigned long flags; DPRINTK("ENTER\n"); @@ -356,6 +356,9 @@ void ata_scsi_error(struct Scsi_Host *ho __ata_port_freeze(ap); spin_unlock_irqrestore(ap->lock, flags); + + /* initialize eh_tries */ + ap->eh_tries = ATA_EH_MAX_TRIES; } else spin_unlock_wait(ap->lock); @@ -396,15 +399,12 @@ void ata_scsi_error(struct Scsi_Host *ho spin_lock_irqsave(ap->lock, flags); if (ap->pflags & ATA_PFLAG_EH_PENDING) { - if (--repeat_cnt) { - ata_port_printk(ap, KERN_INFO, - "EH pending after completion, " - "repeating EH (cnt=%d)\n", repeat_cnt); + if (--ap->eh_tries) { spin_unlock_irqrestore(ap->lock, flags); goto repeat; } ata_port_printk(ap, KERN_ERR, "EH pending after %d " - "tries, giving up\n", ATA_EH_MAX_REPEAT); + "tries, giving up\n", ATA_EH_MAX_TRIES); ap->pflags &= ~ATA_PFLAG_EH_PENDING; } @@ -1658,6 +1658,7 @@ static void ata_eh_report(struct ata_por { struct ata_eh_context *ehc = &ap->eh_context; const char *frozen, *desc; + char tries_buf[6]; int tag, nr_failed = 0; desc = NULL; @@ -1682,18 +1683,23 @@ static void ata_eh_report(struct ata_por if (ap->pflags & ATA_PFLAG_FROZEN) frozen = " frozen"; + memset(tries_buf, 0, sizeof(tries_buf)); + if (ap->eh_tries < ATA_EH_MAX_TRIES) + snprintf(tries_buf, sizeof(tries_buf) - 1, " t%d", + ap->eh_tries); + if (ehc->i.dev) { ata_dev_printk(ehc->i.dev, KERN_ERR, "exception Emask 0x%x " - "SAct 0x%x SErr 0x%x action 0x%x%s\n", + "SAct 0x%x SErr 0x%x action 0x%x%s%s\n", ehc->i.err_mask, ap->sactive, ehc->i.serror, - ehc->i.action, frozen); + ehc->i.action, frozen, tries_buf); if (desc) ata_dev_printk(ehc->i.dev, KERN_ERR, "%s\n", desc); } else { ata_port_printk(ap, KERN_ERR, "exception Emask 0x%x " - "SAct 0x%x SErr 0x%x action 0x%x%s\n", + "SAct 0x%x SErr 0x%x action 0x%x%s%s\n", ehc->i.err_mask, ap->sactive, ehc->i.serror, - ehc->i.action, frozen); + ehc->i.action, frozen, tries_buf); if (desc) ata_port_printk(ap, KERN_ERR, "%s\n", desc); } Index: work/include/linux/libata.h =================================================================== --- work.orig/include/linux/libata.h +++ work/include/linux/libata.h @@ -287,8 +287,8 @@ enum { ATA_EHI_DID_RESET = ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET, ATA_EHI_RESET_MODIFIER_MASK = ATA_EHI_RESUME_LINK, - /* max repeat if error condition is still set after ->error_handler */ - ATA_EH_MAX_REPEAT = 5, + /* max tries if error condition is still set after ->error_handler */ + ATA_EH_MAX_TRIES = 5, /* how hard are we gonna try to probe/recover devices */ ATA_PROBE_MAX_TRIES = 3, @@ -537,6 +537,7 @@ struct ata_port { struct ata_eh_info eh_info; /* EH context owned by EH */ struct ata_eh_context eh_context; + int eh_tries; struct ata_device device[ATA_MAX_DEVICES]; ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH libata-dev#upstream 2/2] libata: move EH repeat reporting into ata_eh_report() 2007-07-31 7:51 ` [PATCH libata-dev#upstream 2/2] libata: move EH repeat reporting into ata_eh_report() Tejun Heo @ 2007-08-15 8:52 ` Jeff Garzik 2007-08-18 4:28 ` [PATCH libata-dev#upstream REGENERATED] " Tejun Heo 0 siblings, 1 reply; 6+ messages in thread From: Jeff Garzik @ 2007-08-15 8:52 UTC (permalink / raw) To: Tejun Heo; +Cc: linux-ide, mikpe Tejun Heo wrote: > EH is sometimes repeated without any error or action. For example, > this happens when probing IDENTIFY fails because of a phantom device. > In these cases, all the repeated EH does is making sure there is no > unhandled error or pending action and return. This repeation is > necessary to avoid losing any event which occurred while EH was in > progress. > > Unfortunately, this dry run causes annonying "EH pending after > completion" message. This patch moves the repeat reporting into > ata_eh_report() such that it's more compact and skipped on dry runs. > > Signed-off-by: Tejun Heo <htejun@gmail.com> > Cc: Mikael Pettersson <mikep@it.uu.se> > --- > Mikael, please verify this removes the annonying message you're > seeing. > > Thanks. > > drivers/ata/libata-eh.c | 26 ++++++++++++++++---------- > include/linux/libata.h | 5 +++-- > 2 files changed, 19 insertions(+), 12 deletions(-) this will want a rediff too, but looks OK to me ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH libata-dev#upstream REGENERATED] libata: move EH repeat reporting into ata_eh_report() 2007-08-15 8:52 ` Jeff Garzik @ 2007-08-18 4:28 ` Tejun Heo 2007-08-31 9:35 ` Jeff Garzik 0 siblings, 1 reply; 6+ messages in thread From: Tejun Heo @ 2007-08-18 4:28 UTC (permalink / raw) To: Jeff Garzik; +Cc: linux-ide, mikpe EH is sometimes repeated without any error or action. For example, this happens when probing IDENTIFY fails because of a phantom device. In these cases, all the repeated EH does is making sure there is no unhandled error or pending action and return. This repeation is necessary to avoid losing any event which occurred while EH was in progress. Unfortunately, this dry run causes annonying "EH pending after completion" message. This patch moves the repeat reporting into ata_eh_report() such that it's more compact and skipped on dry runs. Signed-off-by: Tejun Heo <htejun@gmail.com> Cc: Mikael Pettersson <mikep@it.uu.se> --- Regenerated against #upstream (41b135c7) + implement-and-use-ata_port_desc patch. drivers/ata/libata-eh.c | 30 ++++++++++++++++++------------ include/linux/libata.h | 5 +++-- 2 files changed, 21 insertions(+), 14 deletions(-) Index: work/drivers/ata/libata-eh.c =================================================================== --- work.orig/drivers/ata/libata-eh.c +++ work/drivers/ata/libata-eh.c @@ -358,7 +358,7 @@ enum scsi_eh_timer_return ata_scsi_timed void ata_scsi_error(struct Scsi_Host *host) { struct ata_port *ap = ata_shost_to_port(host); - int i, repeat_cnt = ATA_EH_MAX_REPEAT; + int i; unsigned long flags; DPRINTK("ENTER\n"); @@ -424,6 +424,9 @@ void ata_scsi_error(struct Scsi_Host *ho __ata_port_freeze(ap); spin_unlock_irqrestore(ap->lock, flags); + + /* initialize eh_tries */ + ap->eh_tries = ATA_EH_MAX_TRIES; } else spin_unlock_wait(ap->lock); @@ -468,15 +471,12 @@ void ata_scsi_error(struct Scsi_Host *ho spin_lock_irqsave(ap->lock, flags); if (ap->pflags & ATA_PFLAG_EH_PENDING) { - if (--repeat_cnt) { - ata_port_printk(ap, KERN_INFO, - "EH pending after completion, " - "repeating EH (cnt=%d)\n", repeat_cnt); + if (--ap->eh_tries) { spin_unlock_irqrestore(ap->lock, flags); goto repeat; } ata_port_printk(ap, KERN_ERR, "EH pending after %d " - "tries, giving up\n", ATA_EH_MAX_REPEAT); + "tries, giving up\n", ATA_EH_MAX_TRIES); ap->pflags &= ~ATA_PFLAG_EH_PENDING; } @@ -1778,6 +1778,7 @@ static void ata_eh_link_report(struct at struct ata_port *ap = link->ap; struct ata_eh_context *ehc = &link->eh_context; const char *frozen, *desc; + char tries_buf[6]; int tag, nr_failed = 0; desc = NULL; @@ -1802,18 +1803,23 @@ static void ata_eh_link_report(struct at if (ap->pflags & ATA_PFLAG_FROZEN) frozen = " frozen"; + memset(tries_buf, 0, sizeof(tries_buf)); + if (ap->eh_tries < ATA_EH_MAX_TRIES) + snprintf(tries_buf, sizeof(tries_buf) - 1, " t%d", + ap->eh_tries); + if (ehc->i.dev) { ata_dev_printk(ehc->i.dev, KERN_ERR, "exception Emask 0x%x " - "SAct 0x%x SErr 0x%x action 0x%x%s\n", - ehc->i.err_mask, link->sactive, - ehc->i.serror, ehc->i.action, frozen); + "SAct 0x%x SErr 0x%x action 0x%x%s%s\n", + ehc->i.err_mask, link->sactive, ehc->i.serror, + ehc->i.action, frozen, tries_buf); if (desc) ata_dev_printk(ehc->i.dev, KERN_ERR, "%s\n", desc); } else { ata_link_printk(link, KERN_ERR, "exception Emask 0x%x " - "SAct 0x%x SErr 0x%x action 0x%x%s\n", - ehc->i.err_mask, link->sactive, - ehc->i.serror, ehc->i.action, frozen); + "SAct 0x%x SErr 0x%x action 0x%x%s%s\n", + ehc->i.err_mask, link->sactive, ehc->i.serror, + ehc->i.action, frozen, tries_buf); if (desc) ata_link_printk(link, KERN_ERR, "%s\n", desc); } Index: work/include/linux/libata.h =================================================================== --- work.orig/include/linux/libata.h +++ work/include/linux/libata.h @@ -293,8 +293,8 @@ enum { ATA_EHI_DID_RESET = ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET, ATA_EHI_RESET_MODIFIER_MASK = ATA_EHI_RESUME_LINK, - /* max repeat if error condition is still set after ->error_handler */ - ATA_EH_MAX_REPEAT = 5, + /* max tries if error condition is still set after ->error_handler */ + ATA_EH_MAX_TRIES = 5, /* how hard are we gonna try to probe/recover devices */ ATA_PROBE_MAX_TRIES = 3, @@ -580,6 +580,7 @@ struct ata_port { u32 msg_enable; struct list_head eh_done_q; wait_queue_head_t eh_wait_q; + int eh_tries; pm_message_t pm_mesg; int *pm_result; ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH libata-dev#upstream REGENERATED] libata: move EH repeat reporting into ata_eh_report() 2007-08-18 4:28 ` [PATCH libata-dev#upstream REGENERATED] " Tejun Heo @ 2007-08-31 9:35 ` Jeff Garzik 0 siblings, 0 replies; 6+ messages in thread From: Jeff Garzik @ 2007-08-31 9:35 UTC (permalink / raw) To: Tejun Heo; +Cc: linux-ide, mikpe Tejun Heo wrote: > EH is sometimes repeated without any error or action. For example, > this happens when probing IDENTIFY fails because of a phantom device. > In these cases, all the repeated EH does is making sure there is no > unhandled error or pending action and return. This repeation is > necessary to avoid losing any event which occurred while EH was in > progress. > > Unfortunately, this dry run causes annonying "EH pending after > completion" message. This patch moves the repeat reporting into > ata_eh_report() such that it's more compact and skipped on dry runs. > > Signed-off-by: Tejun Heo <htejun@gmail.com> > Cc: Mikael Pettersson <mikep@it.uu.se> > --- > Regenerated against #upstream (41b135c7) + > implement-and-use-ata_port_desc patch. > > drivers/ata/libata-eh.c | 30 ++++++++++++++++++------------ > include/linux/libata.h | 5 +++-- > 2 files changed, 21 insertions(+), 14 deletions(-) applied ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH libata-dev#upstream 1/2] libata: don't skip EH report if action is pending 2007-07-31 7:42 [PATCH libata-dev#upstream 1/2] libata: don't skip EH report if action is pending Tejun Heo 2007-07-31 7:51 ` [PATCH libata-dev#upstream 2/2] libata: move EH repeat reporting into ata_eh_report() Tejun Heo @ 2007-08-01 5:56 ` Tejun Heo 1 sibling, 0 replies; 6+ messages in thread From: Tejun Heo @ 2007-08-01 5:56 UTC (permalink / raw) To: Tejun Heo; +Cc: Jeff Garzik, linux-ide, mikpe Tejun Heo wrote: > Don't skip EH report if action is pending. > > Signed-off-by: Tejun Heo <htejun@gmail.com> Jeff, this patch needs other changes to avoid exception message during initial probing. Please drop it for now and just apply the second patch. Thanks. -- tejun ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2007-08-31 9:35 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2007-07-31 7:42 [PATCH libata-dev#upstream 1/2] libata: don't skip EH report if action is pending Tejun Heo 2007-07-31 7:51 ` [PATCH libata-dev#upstream 2/2] libata: move EH repeat reporting into ata_eh_report() Tejun Heo 2007-08-15 8:52 ` Jeff Garzik 2007-08-18 4:28 ` [PATCH libata-dev#upstream REGENERATED] " Tejun Heo 2007-08-31 9:35 ` Jeff Garzik 2007-08-01 5:56 ` [PATCH libata-dev#upstream 1/2] libata: don't skip EH report if action is pending Tejun Heo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).