diff options
author | Pawel Wojcik <Pawel.Wojcik@Sun.COM> | 2009-12-23 12:50:51 -0800 |
---|---|---|
committer | Pawel Wojcik <Pawel.Wojcik@Sun.COM> | 2009-12-23 12:50:51 -0800 |
commit | d0415811d0d580b4c209fcf2bb15aee966066ea6 (patch) | |
tree | 8b960129d5aefae3ce9cbc692e40eaaa1a806a6c /usr/src | |
parent | b3660a963b4e1d5319365d4d7c34beb66fb5abc7 (diff) | |
download | illumos-joyent-d0415811d0d580b4c209fcf2bb15aee966066ea6.tar.gz |
6911155 kernel dump fails if panic happens in interrupt service routine
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/io/sata/impl/sata.c | 80 |
1 files changed, 26 insertions, 54 deletions
diff --git a/usr/src/uts/common/io/sata/impl/sata.c b/usr/src/uts/common/io/sata/impl/sata.c index 2d296f31ef..e30143f20b 100644 --- a/usr/src/uts/common/io/sata/impl/sata.c +++ b/usr/src/uts/common/io/sata/impl/sata.c @@ -3072,6 +3072,9 @@ sata_scsi_sync_pkt(struct scsi_address *ap, struct scsi_pkt *pkt) * Checks if a device exists and can be access and translates common * scsi_pkt data to sata_pkt data. * + * Flag argument indicates that ATA command may be sent to HBA to execute + * this packet. + * * Returns TRAN_ACCEPT and scsi pkt_reason CMD_CMPLT if device exists and * sata_pkt was set-up. * Returns TRAN_ACCEPT and scsi pkt_reason CMD_DEV_GONE if device does not @@ -3082,7 +3085,7 @@ sata_scsi_sync_pkt(struct scsi_address *ap, struct scsi_pkt *pkt) * This function should be called with port mutex held. */ static int -sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx, int *reason) +sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx, int *reason, int flag) { sata_drive_info_t *sdinfo; sata_device_t sata_device; @@ -3158,11 +3161,13 @@ sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx, int *reason) break; } /* - * If in an interrupt context, reject packet if it is to be - * executed in polling mode + * If pkt is to be executed in polling mode and a command will not be + * emulated in SATA module (requires sending ATA command to HBA + * driver) and we are in the interrupt contex and not in panic dump, + * then reject the packet to avoid a possible interrupt stack overrun. */ - if (servicing_interrupt() && - (spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0) { + if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0 && flag != 0 && + servicing_interrupt() && !ddi_in_panic()) { SATADBG1(SATA_DBG_INTR_CTX, spx->txlt_sata_hba_inst, "sata_scsi_start: rejecting synchronous command because " "of interrupt context\n", NULL); @@ -3423,7 +3428,7 @@ sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *spx) mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) != + if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); @@ -3486,7 +3491,7 @@ sata_txlt_inquiry(sata_pkt_txlate_t *spx) mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) != + if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); @@ -3695,7 +3700,7 @@ sata_txlt_request_sense(sata_pkt_txlate_t *spx) mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) != + if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); @@ -3829,7 +3834,7 @@ sata_txlt_test_unit_ready(sata_pkt_txlate_t *spx) mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) != + if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); @@ -3934,7 +3939,7 @@ sata_txlt_start_stop_unit(sata_pkt_txlate_t *spx) mutex_enter(&SATA_CPORT_MUTEX(shi, cport)); - if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) != + if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); @@ -4263,7 +4268,7 @@ sata_txlt_read_capacity(sata_pkt_txlate_t *spx) mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) != + if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); @@ -4357,7 +4362,7 @@ sata_txlt_mode_sense(sata_pkt_txlate_t *spx) mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) != + if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); kmem_free(buf, 1024); @@ -4639,22 +4644,11 @@ sata_txlt_mode_select(sata_pkt_txlate_t *spx) mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) != + if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); } - /* - * If in interrupt context, reject this packet because it may result - * in issuing a synchronous command to HBA. - */ - if (servicing_interrupt()) { - SATADBG1(SATA_DBG_INTR_CTX, spx->txlt_sata_hba_inst, - "sata_txlt_mode_select: rejecting command because " - "of interrupt context\n", NULL); - mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); - return (TRAN_BUSY); - } rval = TRAN_ACCEPT; @@ -4947,7 +4941,7 @@ sata_txlt_ata_pass_thru(sata_pkt_txlate_t *spx) mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - rval = sata_txlt_generic_pkt_info(spx, &reason); + rval = sata_txlt_generic_pkt_info(spx, &reason, 1); if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); @@ -5190,24 +5184,12 @@ sata_txlt_log_sense(sata_pkt_txlate_t *spx) mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) != + if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE); return (rval); } - /* - * If in interrupt context, reject this packet because it may result - * in issuing a synchronous command to HBA. - */ - if (servicing_interrupt()) { - SATADBG1(SATA_DBG_INTR_CTX, spx->txlt_sata_hba_inst, - "sata_log_sense: rejecting command because " - "of interrupt context\n", NULL); - mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); - kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE); - return (TRAN_BUSY); - } scsipkt->pkt_reason = CMD_CMPLT; scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | @@ -5478,7 +5460,7 @@ sata_txlt_read(sata_pkt_txlate_t *spx) mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) != + if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); @@ -5747,7 +5729,7 @@ sata_txlt_write(sata_pkt_txlate_t *spx) mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) != + if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); @@ -5996,21 +5978,11 @@ sata_txlt_write_buffer(sata_pkt_txlate_t *spx) mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if ((rval = sata_txlt_generic_pkt_info(spx, &reason)) != TRAN_ACCEPT) { + if ((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != + TRAN_ACCEPT) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); } - /* - * If in interrupt context, reject this packet because it would issue - * a synchronous command to HBA. - */ - if (servicing_interrupt()) { - SATADBG1(SATA_DBG_INTR_CTX, spx->txlt_sata_hba_inst, - "sata_txlt_write_buffer: rejecting command because " - "of interrupt context\n", NULL); - mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); - return (TRAN_BUSY); - } /* Use synchronous mode */ spx->txlt_sata_pkt->satapkt_op_mode @@ -6247,7 +6219,7 @@ sata_txlt_synchronize_cache(sata_pkt_txlate_t *spx) mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) != + if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); @@ -8609,7 +8581,7 @@ sata_txlt_atapi(sata_pkt_txlate_t *spx) mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) != + if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); |