From 8ffbacb0cd00f5283873fd74f33be681136f692c Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sat, 8 Jul 2023 15:52:31 +0100 Subject: [PATCH] dev: don't lock bus list when enumerating all buses --- dev/bus.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/dev/bus.c b/dev/bus.c index 570e014..1a1e80c 100644 --- a/dev/bus.c +++ b/dev/bus.c @@ -21,7 +21,7 @@ kern_status_t scan_all_buses(void) kern_status_t status = KERN_OK; /* keep interrupts enabled while scanning for devices */ - spin_lock(&all_buses_lock); + //spin_lock(&all_buses_lock); queue_foreach(struct bus_device, bus, &all_buses, b_buslist) { if (bus->b_ops && bus->b_ops->scan) { @@ -33,10 +33,16 @@ kern_status_t scan_all_buses(void) } } - spin_unlock(&all_buses_lock); + //spin_unlock(&all_buses_lock); return status; } +struct bus_device *bus_device_from_generic(struct device *dev) +{ + dev->dev_type = DEV_TYPE_BUS; + return BUS_DEVICE(dev); +} + static kern_status_t bus_device_register(struct device *dev) { struct bus_device *bus = &dev->bus; @@ -49,7 +55,15 @@ static kern_status_t bus_device_register(struct device *dev) char path[OBJECT_PATH_MAX]; snprintf(path, sizeof path, "/dev/bus/%s", dev->dev_name); - return object_namespace_create_link(global_namespace(), path, &dev->dev_base); + kern_status_t status = object_namespace_create_link(global_namespace(), path, &dev->dev_base); + if (status != KERN_OK) { + spin_lock_irqsave(&all_buses_lock, &flags); + queue_delete(&all_buses, &bus->b_buslist); + spin_unlock_irqrestore(&all_buses_lock, flags); + return status; + } + + return status; } struct device_type_ops bus_type_ops = {