Module Name: src
Committed By: palle
Date: Mon Apr 5 12:19:22 UTC 2021
Modified Files:
src/sys/arch/sparc64/dev: ldc.c
Log Message:
sun4v: Ignore spurious ldc CTRL/ACK/VERS messages (do not reset the connection
anymore). Fixes occationals stalls when vdsk uses the ldc service. Observed on
both T2000 and T5 host systems
To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/sparc64/dev/ldc.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sparc64/dev/ldc.c
diff -u src/sys/arch/sparc64/dev/ldc.c:1.6 src/sys/arch/sparc64/dev/ldc.c:1.7
--- src/sys/arch/sparc64/dev/ldc.c:1.6 Tue Oct 15 00:13:52 2019
+++ src/sys/arch/sparc64/dev/ldc.c Mon Apr 5 12:19:22 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ldc.c,v 1.6 2019/10/15 00:13:52 chs Exp $ */
+/* $NetBSD: ldc.c,v 1.7 2021/04/05 12:19:22 palle Exp $ */
/* $OpenBSD: ldc.c,v 1.12 2015/03/21 18:02:58 kettenis Exp $ */
/*
* Copyright (c) 2009 Mark Kettenis
@@ -76,24 +76,25 @@ ldc_rx_ctrl_vers(struct ldc_conn *lc, st
{
switch (lp->stype) {
case LDC_INFO:
- DPRINTF(("CTRL/INFO/VERS\n"));
+ DPRINTF(("CTRL/INFO/VERS major %d minor %d\n", lp->major, lp->minor));
if (lp->major == LDC_VERSION_MAJOR &&
lp->minor == LDC_VERSION_MINOR)
ldc_send_ack(lc);
else {
/* XXX do nothing for now. */
+ DPRINTF(("CTRL/INFO/VERS unsupported major/minor\n"));
}
break;
case LDC_ACK:
+ DPRINTF(("CTRL/ACK/VERS\n"));
if (lc->lc_state != LDC_SND_VERS) {
- DPRINTF(("Spurious CTRL/ACK/VERS: state %d\n",
- lc->lc_state));
- ldc_reset(lc);
- return;
+ DPRINTF(("Spurious CTRL/ACK/VERS: state %d major %d minor %d (ignored)\n",
+ lc->lc_state, lp->major, lp->minor));
+ }
+ else {
+ ldc_send_rts(lc);
}
- DPRINTF(("CTRL/ACK/VERS\n"));
- ldc_send_rts(lc);
break;
case LDC_NACK:
@@ -263,6 +264,7 @@ ldc_send_vers(struct ldc_conn *lc)
lp->ctrl = LDC_VERS;
lp->major = 1;
lp->minor = 0;
+ DPRINTF(("ldc_send_vers() major %d minor %d\n", lp->major, lp->minor));
tx_tail += sizeof(*lp);
tx_tail &= ((lc->lc_txq->lq_nentries * sizeof(*lp)) - 1);
@@ -274,6 +276,7 @@ ldc_send_vers(struct ldc_conn *lc)
}
lc->lc_state = LDC_SND_VERS;
+ DPRINTF(("ldc_send_vers() setting lc->lc_state to %d\n", lc->lc_state));
mutex_exit(&lc->lc_txq->lq_mtx);
}
@@ -309,6 +312,7 @@ ldc_send_ack(struct ldc_conn *lc)
}
lc->lc_state = LDC_RCV_VERS;
+ DPRINTF(("ldc_send_ack() setting lc->lc_state to %d\n", lc->lc_state));
mutex_exit(&lc->lc_txq->lq_mtx);
}
@@ -344,6 +348,7 @@ ldc_send_rts(struct ldc_conn *lc)
}
lc->lc_state = LDC_SND_RTS;
+ DPRINTF(("ldc_send_rts() setting lc->lc_state to %d\n", lc->lc_state));
mutex_exit(&lc->lc_txq->lq_mtx);
}
@@ -379,6 +384,7 @@ ldc_send_rtr(struct ldc_conn *lc)
}
lc->lc_state = LDC_SND_RTR;
+ DPRINTF(("ldc_send_rtr() setting lc->lc_state to %d\n", lc->lc_state));
mutex_exit(&lc->lc_txq->lq_mtx);
}
@@ -414,6 +420,7 @@ ldc_send_rdx(struct ldc_conn *lc)
}
lc->lc_state = LDC_SND_RDX;
+ DPRINTF(("ldc_send_rdx() setting lc->lc_state to %d\n", lc->lc_state));
mutex_exit(&lc->lc_txq->lq_mtx);
}