dev: don't lock bus list when enumerating all buses
This commit is contained in:
20
dev/bus.c
20
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 = {
|
||||
|
||||
Reference in New Issue
Block a user