While discussing recent config_detach(9) vs close(2) race I figured out that the 'indirect' flag (`cd_indirect') is never set.
Time to kill this feature? This survived build on x86, armv7, sgi, hppa, luna88k, alpha, landisk, sparc64. Ok? Index: sys/sys/device.h =================================================================== RCS file: /cvs/src/sys/sys/device.h,v retrieving revision 1.55 diff -u -p -r1.55 device.h --- sys/sys/device.h 10 Sep 2018 16:18:34 -0000 1.55 +++ sys/sys/device.h 16 Jan 2020 08:07:23 -0000 @@ -140,7 +140,6 @@ struct cfdriver { void **cd_devs; /* devices found */ char *cd_name; /* device name */ enum devclass cd_class; /* device classification */ - int cd_indirect; /* indirectly configure subdevices */ int cd_ndevs; /* size of cd_devs array */ }; Index: sys/kern/subr_autoconf.c =================================================================== RCS file: /cvs/src/sys/kern/subr_autoconf.c,v retrieving revision 1.94 diff -u -p -r1.94 subr_autoconf.c --- sys/kern/subr_autoconf.c 30 Dec 2019 23:56:26 -0000 1.94 +++ sys/kern/subr_autoconf.c 16 Jan 2020 09:43:17 -0000 @@ -71,7 +71,7 @@ struct matchinfo { cfmatch_t fn; struct device *parent; void *match, *aux; - int indirect, pri; + int pri; }; #ifndef AUTOCONF_VERBOSE @@ -128,10 +128,7 @@ mapply(struct matchinfo *m, struct cfdat int pri; void *match; - if (m->indirect) - match = config_make_softc(m->parent, cf); - else - match = cf; + match = cf; if (autoconf_verbose) { printf(">>> probing for %s", cf->cf_driver->cd_name); @@ -154,15 +151,8 @@ mapply(struct matchinfo *m, struct cfdat pri); if (pri > m->pri) { - if (m->indirect && m->match) { - cf = ((struct device *)m->match)->dv_cfdata; - free(m->match, M_DEVBUF, cf->cf_attach->ca_devsize); - } m->match = match; m->pri = pri; - } else { - if (m->indirect) - free(match, M_DEVBUF, cf->cf_attach->ca_devsize); } } @@ -188,7 +178,6 @@ config_search(cfmatch_t fn, struct devic m.parent = parent; m.match = NULL; m.aux = aux; - m.indirect = parent && parent->dv_cfdata->cf_driver->cd_indirect; m.pri = 0; for (cf = cfdata; cf->cf_driver; cf++) { @@ -209,10 +198,7 @@ config_search(cfmatch_t fn, struct devic if (autoconf_verbose) { if (m.match) { - if (m.indirect) - cf = ((struct device *)m.match)->dv_cfdata; - else - cf = (struct cfdata *)m.match; + cf = (struct cfdata *)m.match; printf(">>> %s probe won\n", cf->cf_driver->cd_name); } else @@ -235,9 +221,6 @@ config_scan(cfscan_t fn, struct device * struct cfdata *cf; short *p; void *match; - int indirect; - - indirect = parent && parent->dv_cfdata->cf_driver->cd_indirect; for (cf = cfdata; cf->cf_driver; cf++) { /* @@ -252,9 +235,7 @@ config_scan(cfscan_t fn, struct device * continue; for (p = cf->cf_parents; *p >= 0; p++) if (parent->dv_cfdata == &cfdata[*p]) { - match = indirect? - config_make_softc(parent, cf) : - (void *)cf; + match = cf; (*fn)(parent, match); } } @@ -275,7 +256,6 @@ config_rootsearch(cfmatch_t fn, char *ro m.parent = ROOT; m.match = NULL; m.aux = aux; - m.indirect = 0; m.pri = 0; /* * Look at root entries for matching name. We do not bother @@ -348,13 +328,8 @@ config_attach(struct device *parent, voi autoconf_attdet++; mtx_leave(&autoconf_attdet_mtx); - if (parent && parent->dv_cfdata->cf_driver->cd_indirect) { - dev = match; - cf = dev->dv_cfdata; - } else { - cf = match; - dev = config_make_softc(parent, cf); - } + cf = match; + dev = config_make_softc(parent, cf); cd = cf->cf_driver; ca = cf->cf_attach; Index: share/man/man9/autoconf.9 =================================================================== RCS file: /cvs/src/share/man/man9/autoconf.9,v retrieving revision 1.17 diff -u -p -r1.17 autoconf.9 --- share/man/man9/autoconf.9 18 Apr 2018 22:33:18 -0000 1.17 +++ share/man/man9/autoconf.9 16 Jan 2020 09:46:06 -0000 @@ -66,12 +66,6 @@ The autoconfiguration framework supports .Em direct configuration where the bus driver can determine the devices present. .Pp -The autoconfiguration framework also supports -.Em indirect configuration -where the drivers must probe the bus looking for the presence of a device. -Direct configuration is preferred since it can find hardware regardless of -the presence of proper drivers. -.Pp The autoconfiguration process occurs at system bootstrap and is driven by a table generated from a .Do @@ -92,64 +86,6 @@ ends with a unit number. The unit number identifies an instance of the driver. Device data structures are allocated dynamically during autoconfiguration, giving a unique address for each instance. -.Ss Indirect Configuration -The -.Fn config_search -function performs indirect configuration of physical devices by iterating -over all potential children, calling the given function -.Fa func -for each one. -.Pp -The -.Fn config_rootsearch -function finds the root device identified by the string -.Fa rootname , -in a manner similar to -.Fn config_search , -except that there is no parent device. -If -.Fa func -is -.Dv NULL , -.Fn config_search -applies each child's match function instead. -The argument -.Fa parent -is the pointer to the parent's device structure. -The given -.Fa aux -argument describes the device that has been found and is simply passed -on through -.Fa func -to the child. -.Fn config_search -returns a pointer to the best-matched child or -.Dv NULL -otherwise. -.Pp -The role of -.Fa func -is to call -the match function for each device and call -.Fn config_attach -for any positive matches. -.Bd -literal -typedef int (*cfmatch_t)(struct device *parent, void *child, void *aux); -.Ed -.Pp -If -.Fa func -is -.Dv NULL , -then the parent should record the return value from -.Fn config_search -and call -.Fn config_attach -itself. -.Pp -Note that this function is designed so that it can be used to apply an -arbitrary function to all potential children. -In this case callers may choose to ignore the return value. .Ss Direct Configuration The .Fn config_found_sm