diff options
| author | Chris Horne <Chris.Horne@Sun.COM> | 2008-09-17 20:24:52 -0600 |
|---|---|---|
| committer | Chris Horne <Chris.Horne@Sun.COM> | 2008-09-17 20:24:52 -0600 |
| commit | f9722deaa8da9978617bd4b5c9130f219e127193 (patch) | |
| tree | 6f8a4a59d77626d9388440d18f600236bd4e0093 /usr/src/uts/common/io/devinfo.c | |
| parent | fbdfcf3ebe2e1545891637b37d19b713bb21d08b (diff) | |
| download | illumos-joyent-f9722deaa8da9978617bd4b5c9130f219e127193.tar.gz | |
6743774 TSlvm tests cause kernel deadlocks on md_unit_array_rw and md_devinfo->devi_cv
6744223 SVM root with snv_97 on sparc hangs system with threads in ndi_devi_enter
6746854 mdprop_op can deadlock with md ioctl resolving a devid
Diffstat (limited to 'usr/src/uts/common/io/devinfo.c')
| -rw-r--r-- | usr/src/uts/common/io/devinfo.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/usr/src/uts/common/io/devinfo.c b/usr/src/uts/common/io/devinfo.c index a61d0b1bfa..1672e5311a 100644 --- a/usr/src/uts/common/io/devinfo.c +++ b/usr/src/uts/common/io/devinfo.c @@ -18,13 +18,12 @@ * * CDDL HEADER END */ + /* * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * driver for accessing kernel devinfo tree. */ @@ -364,7 +363,7 @@ static struct dev_ops di_ops = { */ static struct modldrv modldrv = { &mod_driverops, - "DEVINFO Driver %I%", + "DEVINFO Driver", &di_ops }; @@ -2951,8 +2950,22 @@ di_getprop_add(int list, int dyn, struct di_state *st, struct dev_info *dip, pflags = aflags & ~DDI_PROP_TYPE_MASK; pflags |= DDI_PROP_DONTPASS | DDI_PROP_NOTPROM | DDI_PROP_CONSUMER_TYPED; - rv = (*prop_op)(pdevt, (dev_info_t)dip, PROP_LEN_AND_VAL_ALLOC, - pflags, name, &val, &len); + + /* + * Hold and exit across prop_op(9E) to avoid lock order + * issues between + * [ndi_devi_enter() ..prop_op(9E).. driver-lock] + * .vs. + * [..ioctl(9E).. driver-lock ..ddi_remove_minor_node(9F).. + * ndi_devi_enter()] + * ordering. + */ + ndi_hold_devi((dev_info_t *)dip); + ndi_devi_exit((dev_info_t *)dip, dip->devi_circular); + rv = (*prop_op)(pdevt, (dev_info_t *)dip, + PROP_LEN_AND_VAL_ALLOC, pflags, name, &val, &len); + ndi_devi_enter((dev_info_t *)dip, &dip->devi_circular); + ndi_rele_devi((dev_info_t *)dip); if (rv == DDI_PROP_SUCCESS) { need_free = 1; /* dynamic prop obtained */ |
