From 8e1d0d2d2c510601929d5fa4b98dec7656061690 Mon Sep 17 00:00:00 2001 From: Mateusz Guzik Date: Sun, 14 Aug 2022 18:19:20 +0000 Subject: [PATCH 5/7] Switch device eventhandlers to the new API device_attach_deprecated is added to accomodate one consumer which can't easily be converted. --- sys/arm/freescale/imx/imx6_hdmi.c | 4 ++-- sys/dev/acpica/acpi.c | 14 +++++++---- sys/dev/pci/pci.c | 15 ++++++------ sys/kern/kern_devctl.c | 37 ++++++++++++++++++---------- sys/kern/subr_bus.c | 40 ++++++++++++++++++------------- sys/sys/bus.h | 24 ++++++++++++++++--- sys/sys/eventhandler.h | 12 +--------- 7 files changed, 88 insertions(+), 58 deletions(-) diff --git a/sys/arm/freescale/imx/imx6_hdmi.c b/sys/arm/freescale/imx/imx6_hdmi.c index 28a62a66fd01..6f9d88545604 100644 --- a/sys/arm/freescale/imx/imx6_hdmi.c +++ b/sys/arm/freescale/imx/imx6_hdmi.c @@ -106,7 +106,7 @@ imx_hdmi_init(void *dev) if (OF_device_from_xref(sc->i2c_xref) != NULL) { if (sc->eh_tag != NULL) { - EVENTHANDLER_DEREGISTER_NOWAIT(device_attach, + EVENTHANDLER_DEREGISTER_NOWAIT(device_attach_deprecated, sc->eh_tag); } dwc_hdmi_init(dev); @@ -117,7 +117,7 @@ imx_hdmi_init(void *dev) device_printf((device_t)dev, "Waiting for DDC i2c device\n"); if (sc->eh_tag == NULL) { - sc->eh_tag = EVENTHANDLER_REGISTER(device_attach, + sc->eh_tag = EVENTHANDLER_REGISTER(device_attach_deprecated, imx_hdmi_init, dev, EVENTHANDLER_PRI_ANY); } } diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c index 941e2bd75aeb..17c1ceb94555 100644 --- a/sys/dev/acpica/acpi.c +++ b/sys/dev/acpica/acpi.c @@ -111,7 +111,7 @@ int acpi_quirks; /* Supported sleep states. */ static BOOLEAN acpi_sleep_states[ACPI_S_STATE_COUNT]; -static void acpi_lookup(void *arg, const char *name, device_t *dev); +static void acpi_lookup(void *arg); static int acpi_modevent(struct module *mod, int event, void *junk); static int acpi_probe(device_t dev); static int acpi_attach(device_t dev); @@ -707,7 +707,7 @@ acpi_attach(device_t dev) acpi_platform_osc(dev); if (!acpi_disabled("bus")) { - EVENTHANDLER_REGISTER(dev_lookup, acpi_lookup, NULL, 1000); + EVENTHANDLER_SLEEPABLE_REGISTER(dev_lookup, acpi_lookup, FIRST); acpi_probe_children(dev); } @@ -4010,11 +4010,15 @@ acpi_disabled(char *subsys) } static void -acpi_lookup(void *arg, const char *name, device_t *dev) +acpi_lookup(void *arg) { + struct dev_lookup_arg *dla; ACPI_HANDLE handle; + const char *name; - if (*dev != NULL) + dla = arg; + name = dla->name; + if (dla->dev != NULL) return; /* @@ -4031,7 +4035,7 @@ acpi_lookup(void *arg, const char *name, device_t *dev) if (ACPI_FAILURE(AcpiGetHandle(ACPI_ROOT_OBJECT, __DECONST(char *, name), &handle))) return; - *dev = acpi_get_device(handle); + dla->dev = acpi_get_device(handle); } /* diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c index ed48e20b153e..cdf785b2b5a0 100644 --- a/sys/dev/pci/pci.c +++ b/sys/dev/pci/pci.c @@ -5967,13 +5967,15 @@ pci_assign_interrupt_method(device_t dev, device_t child) } static void -pci_lookup(void *arg, const char *name, device_t *dev) +pci_lookup(void *arg) { + struct dev_lookup_arg *dla = arg; + const char *name = dla->name; long val; char *end; int domain, bus, slot, func; - if (*dev != NULL) + if (dla->dev != NULL) return; /* @@ -6012,14 +6014,13 @@ pci_lookup(void *arg, const char *name, device_t *dev) func > PCIE_ARI_FUNCMAX || (slot != 0 && func > PCI_FUNCMAX)) return; - *dev = pci_find_dbsf(domain, bus, slot, func); + dla->dev = pci_find_dbsf(domain, bus, slot, func); } static int pci_modevent(module_t mod, int what, void *arg) { static struct cdev *pci_cdev; - static eventhandler_tag tag; switch (what) { case MOD_LOAD: @@ -6028,13 +6029,11 @@ pci_modevent(module_t mod, int what, void *arg) pci_cdev = make_dev(&pcicdev, 0, UID_ROOT, GID_WHEEL, 0644, "pci"); pci_load_vendor_data(); - tag = EVENTHANDLER_REGISTER(dev_lookup, pci_lookup, NULL, - 1000); + EVENTHANDLER_SLEEPABLE_REGISTER(dev_lookup, pci_lookup, FIRST); break; case MOD_UNLOAD: - if (tag != NULL) - EVENTHANDLER_DEREGISTER(dev_lookup, tag); + EVENTHANDLER_SLEEPABLE_DEREGISTER(dev_lookup, pci_lookup); destroy_dev(pci_cdev); break; } diff --git a/sys/kern/kern_devctl.c b/sys/kern/kern_devctl.c index 414a2b74cbc7..3cad6bd49581 100644 --- a/sys/kern/kern_devctl.c +++ b/sys/kern/kern_devctl.c @@ -92,10 +92,9 @@ static int devctl_queue_length = DEVCTL_DEFAULT_QUEUE_LEN; SYSCTL_PROC(_hw_bus, OID_AUTO, devctl_queue, CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, NULL, 0, sysctl_devctl_queue, "I", "devctl queue length"); -static void devctl_attach_handler(void *arg __unused, device_t dev); -static void devctl_detach_handler(void *arg __unused, device_t dev, - enum evhdev_detach state); -static void devctl_nomatch_handler(void *arg __unused, device_t dev); +static void devctl_attach_handler(void *arg); +static void devctl_detach_handler(void *arg); +static void devctl_nomatch_handler(void *arg); static d_open_t devopen; static d_close_t devclose; @@ -163,12 +162,12 @@ devctl_init(void) uma_zone_reserve(z, reserve); uma_prealloc(z, reserve); } - EVENTHANDLER_REGISTER(device_attach, devctl_attach_handler, - NULL, EVENTHANDLER_PRI_LAST); - EVENTHANDLER_REGISTER(device_detach, devctl_detach_handler, - NULL, EVENTHANDLER_PRI_LAST); - EVENTHANDLER_REGISTER(device_nomatch, devctl_nomatch_handler, - NULL, EVENTHANDLER_PRI_LAST); + EVENTHANDLER_SLEEPABLE_REGISTER(device_attach, devctl_attach_handler, + LAST); + EVENTHANDLER_SLEEPABLE_REGISTER(device_detach, devctl_detach_handler, + LAST); + EVENTHANDLER_SLEEPABLE_REGISTER(device_nomatch, devctl_nomatch_handler, + LAST); } SYSINIT(devctl_init, SI_SUB_DRIVERS, SI_ORDER_SECOND, devctl_init, NULL); @@ -180,8 +179,11 @@ SYSINIT(devctl_init, SI_SUB_DRIVERS, SI_ORDER_SECOND, devctl_init, NULL); * we should have a different message for this). */ static void -devctl_attach_handler(void *arg __unused, device_t dev) +devctl_attach_handler(void *arg) { + device_t dev; + + dev = arg; devaddq("+", device_get_nameunit(dev), dev); } @@ -190,8 +192,14 @@ devctl_attach_handler(void *arg __unused, device_t dev) * happens. */ static void -devctl_detach_handler(void *arg __unused, device_t dev, enum evhdev_detach state) +devctl_detach_handler(void *arg) { + struct device_detach_arg *dda = arg; + device_t dev; + enum evhdev_detach state; + + dev = dda->dev; + state = dda->state; if (state == EVHDEV_DETACH_COMPLETE) devaddq("-", device_get_nameunit(dev), dev); } @@ -204,8 +212,11 @@ devctl_detach_handler(void *arg __unused, device_t dev, enum evhdev_detach state * decline to accept this device. Other errors may not be detected. */ static void -devctl_nomatch_handler(void *arg __unused, device_t dev) +devctl_nomatch_handler(void *arg) { + device_t dev; + + dev = arg; devaddq("?", "", dev); } diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c index 041e77259313..8d95999b432a 100644 --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -147,10 +147,10 @@ struct _device { static MALLOC_DEFINE(M_BUS, "bus", "Bus data structures"); static MALLOC_DEFINE(M_BUS_SC, "bus-sc", "Bus data structures, softc"); -EVENTHANDLER_LIST_DEFINE(device_attach); -EVENTHANDLER_LIST_DEFINE(device_detach); -EVENTHANDLER_LIST_DEFINE(device_nomatch); -EVENTHANDLER_LIST_DEFINE(dev_lookup); +EVENTHANDLER_SLEEPABLE_DEFINE(device_attach); +EVENTHANDLER_SLEEPABLE_DEFINE(device_detach); +EVENTHANDLER_SLEEPABLE_DEFINE(device_nomatch); +EVENTHANDLER_SLEEPABLE_DEFINE(dev_lookup); static void devctl2_init(void); static bool device_frozen; @@ -621,7 +621,7 @@ static void device_handle_nomatch(device_t dev) { BUS_PROBE_NOMATCH(dev->parent, dev); - EVENTHANDLER_DIRECT_INVOKE(device_nomatch, dev); + EVENTHANDLER_SLEEPABLE_INVOKE(device_nomatch, dev); dev->flags |= DF_DONENOMATCH; } @@ -2549,7 +2549,8 @@ device_attach(device_t dev) device_sysctl_update(dev); dev->state = DS_ATTACHED; dev->flags &= ~DF_DONENOMATCH; - EVENTHANDLER_DIRECT_INVOKE(device_attach, dev); + EVENTHANDLER_INVOKE(device_attach_deprecated, dev); + EVENTHANDLER_SLEEPABLE_INVOKE(device_attach, dev); return (0); } @@ -2572,6 +2573,7 @@ device_attach(device_t dev) int device_detach(device_t dev) { + struct device_detach_arg dda; int error; bus_topo_assert(); @@ -2586,15 +2588,19 @@ device_detach(device_t dev) if (dev->state != DS_ATTACHED) return (0); - EVENTHANDLER_DIRECT_INVOKE(device_detach, dev, EVHDEV_DETACH_BEGIN); + dda.dev = dev; + dda.state = EVHDEV_DETACH_BEGIN; + EVENTHANDLER_SLEEPABLE_INVOKE(device_detach, &dda); if ((error = DEVICE_DETACH(dev)) != 0) { - EVENTHANDLER_DIRECT_INVOKE(device_detach, dev, - EVHDEV_DETACH_FAILED); + dda.dev = dev; + dda.state = EVHDEV_DETACH_FAILED; + EVENTHANDLER_SLEEPABLE_INVOKE(device_detach, &dda); return (error); - } else { - EVENTHANDLER_DIRECT_INVOKE(device_detach, dev, - EVHDEV_DETACH_COMPLETE); } + + dda.dev = dev; + dda.state = EVHDEV_DETACH_COMPLETE; + EVENTHANDLER_SLEEPABLE_INVOKE(device_detach, &dda); if (!device_is_quiet(dev)) device_printf(dev, "detached\n"); if (dev->parent) @@ -5219,6 +5225,7 @@ device_lookup_by_name(const char *name) static int find_device(struct devreq *req, device_t *devp) { + struct dev_lookup_arg dla; device_t dev; /* @@ -5238,11 +5245,12 @@ find_device(struct devreq *req, device_t *devp) } /* Finally, give device enumerators a chance. */ - dev = NULL; - EVENTHANDLER_DIRECT_INVOKE(dev_lookup, req->dr_name, &dev); - if (dev == NULL) + dla.name = req->dr_name; + dla.dev = NULL; + EVENTHANDLER_SLEEPABLE_INVOKE(dev_lookup, &dla); + if (dla.dev == NULL) return (ENOENT); - *devp = dev; + *devp = dla.dev; return (0); } diff --git a/sys/sys/bus.h b/sys/sys/bus.h index c363d1ec550e..70f1db7087a6 100644 --- a/sys/sys/bus.h +++ b/sys/sys/bus.h @@ -172,9 +172,27 @@ struct devreq { * Device name parsers. Hook to allow device enumerators to map * scheme-specific names to a device. */ -typedef void (*dev_lookup_fn)(void *arg, const char *name, - device_t *result); -EVENTHANDLER_DECLARE(dev_lookup, dev_lookup_fn); +struct dev_lookup_arg { + const char *name; + device_t dev; +}; +EVENTHANDLER_SLEEPABLE_DECLARE(dev_lookup); + +/* newbus device events */ +enum evhdev_detach { + EVHDEV_DETACH_BEGIN, /* Before detach() is called */ + EVHDEV_DETACH_COMPLETE, /* After detach() returns 0 */ + EVHDEV_DETACH_FAILED /* After detach() returns err */ +}; + +struct device_detach_arg { + device_t dev; + enum evhdev_detach state; +}; + +EVENTHANDLER_SLEEPABLE_DECLARE(device_attach); +EVENTHANDLER_SLEEPABLE_DECLARE(device_detach); +EVENTHANDLER_SLEEPABLE_DECLARE(device_nomatch); /** * @brief A device driver. diff --git a/sys/sys/eventhandler.h b/sys/sys/eventhandler.h index e94540b0c632..e78b300bd7f4 100644 --- a/sys/sys/eventhandler.h +++ b/sys/sys/eventhandler.h @@ -267,18 +267,8 @@ typedef void (*swapoff_fn)(void *, struct swdevt *); EVENTHANDLER_DECLARE(swapon, swapon_fn); EVENTHANDLER_DECLARE(swapoff, swapoff_fn); -/* newbus device events */ -enum evhdev_detach { - EVHDEV_DETACH_BEGIN, /* Before detach() is called */ - EVHDEV_DETACH_COMPLETE, /* After detach() returns 0 */ - EVHDEV_DETACH_FAILED /* After detach() returns err */ -}; typedef void (*device_attach_fn)(void *, device_t); -typedef void (*device_detach_fn)(void *, device_t, enum evhdev_detach); -typedef void (*device_nomatch_fn)(void *, device_t); -EVENTHANDLER_DECLARE(device_attach, device_attach_fn); -EVENTHANDLER_DECLARE(device_detach, device_detach_fn); -EVENTHANDLER_DECLARE(device_nomatch, device_nomatch_fn); +EVENTHANDLER_DECLARE(device_attach_deprecated, device_attach_fn); /* * Preemptible and sleepable eventhandler support. -- 2.34.1