summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Christensen <Michael.Christensen@Sun.COM>2010-02-17 13:05:11 -0800
committerMike Christensen <Michael.Christensen@Sun.COM>2010-02-17 13:05:11 -0800
commitbca70f54b47e1896668cd05d64cdf448a9582d74 (patch)
tree2ae65a6c5f984f629a1970f1a386f6eadc19e37e
parentc6fd73aef3b5f165501d5c8b95eb1d5a6837e4a5 (diff)
downloadillumos-gate-bca70f54b47e1896668cd05d64cdf448a9582d74.tar.gz
6915529 User level Domain service loopback client registration fails in some scenarios
-rw-r--r--usr/src/uts/sun4v/io/ds_common.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/usr/src/uts/sun4v/io/ds_common.c b/usr/src/uts/sun4v/io/ds_common.c
index 4b872638ec..50b87d58e9 100644
--- a/usr/src/uts/sun4v/io/ds_common.c
+++ b/usr/src/uts/sun4v/io/ds_common.c
@@ -20,7 +20,7 @@
*/
/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -3093,7 +3093,17 @@ ds_loopback_set_svc(ds_svc_t *svc, ds_capability_t *cap, ds_svc_hdl_t *lb_hdlp)
DS_EOL, __func__);
return (ENOTSUP);
}
- if (lb_svc->state != DS_SVC_INACTIVE) {
+
+ /*
+ * If a client service is not inactive, clone it. If the service is
+ * not a client service and has a reg req pending (usually from OBP
+ * in boot state not acking/nacking reg req's), it's OK to ignore that,
+ * since there are never multiple service clients. Also reg req pending
+ * only happens for non-client services, so it's OK to skip
+ * this block that does client service cloning.
+ */
+ if (lb_svc->state != DS_SVC_INACTIVE &&
+ lb_svc->state != DS_SVC_REG_PENDING) {
DS_DBG_LOOP(CE_NOTE, "%s: loopback active: hdl: 0x%llx"
DS_EOL, __func__, (u_longlong_t)lb_hdl);
if ((lb_svc->flags & DSSF_ISCLIENT) == 0) {