diff options
author | Mike Christensen <Michael.Christensen@Sun.COM> | 2010-02-17 13:05:11 -0800 |
---|---|---|
committer | Mike Christensen <Michael.Christensen@Sun.COM> | 2010-02-17 13:05:11 -0800 |
commit | bca70f54b47e1896668cd05d64cdf448a9582d74 (patch) | |
tree | 2ae65a6c5f984f629a1970f1a386f6eadc19e37e | |
parent | c6fd73aef3b5f165501d5c8b95eb1d5a6837e4a5 (diff) | |
download | illumos-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.c | 14 |
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) { |