Mercurial > illumos > illumos-gate
changeset 3560:7125cbb98149
6505472 RC1 build: guest ldg(s) softhang during repeat boot
6520626 Assertion panic in vdc following primary domain reboot
author | narayan |
---|---|
date | Tue, 06 Feb 2007 12:08:29 -0800 |
parents | 928ac4896872 |
children | 0c87d0473863 |
files | usr/src/uts/sun4v/io/ldc.c usr/src/uts/sun4v/io/vdc.c |
diffstat | 2 files changed, 48 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/sun4v/io/ldc.c Tue Feb 06 11:44:51 2007 -0800 +++ b/usr/src/uts/sun4v/io/ldc.c Tue Feb 06 12:08:29 2007 -0800 @@ -20,7 +20,7 @@ */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -210,7 +210,7 @@ int ldcdbg = 0x0; int64_t ldcdbgchan = DBG_ALL_LDCS; -boolean_t ldc_inject_reset_flag = B_FALSE; +uint64_t ldc_inject_err_flag = 0; static void ldcdebug(int64_t id, const char *fmt, ...) @@ -237,17 +237,20 @@ cmn_err(CE_CONT, "?%s", buf); } +#define LDC_ERR_RESET 0x1 +#define LDC_ERR_PKTLOSS 0x2 + static boolean_t -ldc_inject_reset(ldc_chan_t *ldcp) +ldc_inject_error(ldc_chan_t *ldcp, uint64_t error) { if ((ldcdbgchan != DBG_ALL_LDCS) && (ldcdbgchan != ldcp->id)) return (B_FALSE); - if (!ldc_inject_reset_flag) + if ((ldc_inject_err_flag & error) == 0) return (B_FALSE); /* clear the injection state */ - ldc_inject_reset_flag = 0; + ldc_inject_err_flag &= ~error; return (B_TRUE); } @@ -291,7 +294,8 @@ } \ } -#define LDC_INJECT_RESET(_ldcp) ldc_inject_reset(_ldcp) +#define LDC_INJECT_RESET(_ldcp) ldc_inject_error(_ldcp, LDC_ERR_RESET) +#define LDC_INJECT_PKTLOSS(_ldcp) ldc_inject_error(_ldcp, LDC_ERR_PKTLOSS) #else @@ -305,6 +309,7 @@ #define DUMP_LDC_PKT(c, s, addr) #define LDC_INJECT_RESET(_ldcp) (B_FALSE) +#define LDC_INJECT_PKTLOSS(_ldcp) (B_FALSE) #endif @@ -627,7 +632,7 @@ static void i_ldc_reset(ldc_chan_t *ldcp, boolean_t force_reset) { - D1(ldcp->id, "i_ldc_reset: (0x%llx) channel reset\n", ldcp->id); + DWARN(ldcp->id, "i_ldc_reset: (0x%llx) channel reset\n", ldcp->id); ASSERT(MUTEX_HELD(&ldcp->lock)); ASSERT(MUTEX_HELD(&ldcp->tx_lock)); @@ -890,6 +895,14 @@ return (EIO); } +#ifdef DEBUG + if (LDC_INJECT_PKTLOSS(ldcp)) { + DWARN(ldcp->id, + "i_ldc_check_seqid: (0x%llx) inject pkt loss\n", ldcp->id); + return (EIO); + } +#endif + return (0); } @@ -1008,7 +1021,7 @@ ldcp->version.minor = rcvd_ver->minor; ldcp->hstate |= TS_RCVD_VER; ldcp->tstate |= TS_VER_DONE; - DWARN(DBG_ALL_LDCS, + D1(DBG_ALL_LDCS, "(0x%llx) Sent ACK, " "Agreed on version v%u.%u\n", ldcp->id, rcvd_ver->major, rcvd_ver->minor); @@ -2038,7 +2051,9 @@ mutex_enter(&ldcp->tx_lock); i_ldc_reset(ldcp, B_TRUE); mutex_exit(&ldcp->tx_lock); - rv = ECONNRESET; + + notify_client = B_TRUE; + notify_event = LDC_EVT_RESET; break; } @@ -2078,6 +2093,19 @@ } } + /* process data NACKs */ + if ((msg->type & LDC_DATA) && (msg->stype & LDC_NACK)) { + DWARN(ldcp->id, + "i_ldc_rx_hdlr: (0x%llx) received DATA/NACK", + ldcp->id); + mutex_enter(&ldcp->tx_lock); + i_ldc_reset(ldcp, B_TRUE); + mutex_exit(&ldcp->tx_lock); + notify_client = B_TRUE; + notify_event = LDC_EVT_RESET; + break; + } + /* process data ACKs */ if ((msg->type & LDC_DATA) && (msg->stype & LDC_ACK)) { if (rv = i_ldc_process_data_ACK(ldcp, msg)) { @@ -3471,6 +3499,16 @@ } } + /* process data NACKs */ + if ((msg->type & LDC_DATA) && (msg->stype & LDC_NACK)) { + DWARN(ldcp->id, + "ldc_read: (0x%llx) received DATA/NACK", ldcp->id); + mutex_enter(&ldcp->tx_lock); + i_ldc_reset(ldcp, B_TRUE); + mutex_exit(&ldcp->tx_lock); + return (ECONNRESET); + } + /* process data messages */ if ((msg->type & LDC_DATA) && (msg->stype & LDC_INFO)) {
--- a/usr/src/uts/sun4v/io/vdc.c Tue Feb 06 11:44:51 2007 -0800 +++ b/usr/src/uts/sun4v/io/vdc.c Tue Feb 06 12:08:29 2007 -0800 @@ -1111,8 +1111,6 @@ CB_STRATEGY, buf, (op == VD_OP_BREAD) ? VIO_read_dir : VIO_write_dir); - ASSERT(rv == 0 || rv == EINVAL); - /* * If the request was successfully sent, the strategy call returns and * the ACK handler calls the bioxxx functions when the vDisk server is @@ -2358,10 +2356,7 @@ * * Return Codes: * 0 - * EAGAIN - * EFAULT - * ENXIO - * EIO + * ENXIO */ static int vdc_send_request(vdc_t *vdcp, int operation, caddr_t addr,