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,