Print this page
9695 Slow crash dumps, significantly slower than live core
Reviewed by: Dan Fields <dan.fields@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Toomas Soome <tsoome@me.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>

@@ -19,11 +19,11 @@
  * CDDL HEADER END
  */
 
 /*
  * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
  * AHCI (Advanced Host Controller Interface) SATA HBA Driver
  *

@@ -1813,19 +1813,23 @@
 
                 pkt_timeout_ticks =
                     drv_usectohz((clock_t)spkt->satapkt_time * 1000000);
 
                 while (spkt->satapkt_reason == SATA_PKT_BUSY) {
-                        mutex_exit(&ahci_portp->ahciport_mutex);
-
                         /* Simulate the interrupt */
+                        mutex_exit(&ahci_portp->ahciport_mutex);
                         ahci_port_intr(ahci_ctlp, ahci_portp, port);
+                        mutex_enter(&ahci_portp->ahciport_mutex);
 
-                        drv_usecwait(AHCI_10MS_USECS);
+                        if (spkt->satapkt_reason != SATA_PKT_BUSY)
+                                break;
 
+                        mutex_exit(&ahci_portp->ahciport_mutex);
+                        drv_usecwait(AHCI_1MS_USECS);
                         mutex_enter(&ahci_portp->ahciport_mutex);
-                        pkt_timeout_ticks -= AHCI_10MS_TICKS;
+
+                        pkt_timeout_ticks -= AHCI_1MS_TICKS;
                         if (pkt_timeout_ticks < 0) {
                                 cmn_err(CE_WARN, "!ahci%d: ahci_do_sync_start "
                                     "port %d satapkt 0x%p timed out\n",
                                     instance, port, (void *)spkt);
                                 timeout_tags = (0x1 << rval);

@@ -1833,10 +1837,11 @@
                                 ahci_timeout_pkts(ahci_ctlp, ahci_portp,
                                     port, timeout_tags);
                                 mutex_enter(&ahci_portp->ahciport_mutex);
                         }
                 }
+
                 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_POLLING;
                 return (AHCI_SUCCESS);
 
         } else {
                 if ((rval = ahci_deliver_satapkt(ahci_ctlp, ahci_portp,