]> www.infradead.org Git - users/willy/xarray.git/commitdiff
arm_scmi: Convert scmi_protocols to XArray
authorMatthew Wilcox <willy@infradead.org>
Fri, 15 Feb 2019 20:38:03 +0000 (15:38 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 9 Aug 2019 01:38:16 +0000 (21:38 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
drivers/firmware/arm_scmi/bus.c

index 92f843eaf1e0156cf56d7839cec8d766bff6e86f..ba175a7dcf5257286b4864aaaf36bcb285ab2619 100644 (file)
@@ -16,8 +16,7 @@
 #include "common.h"
 
 static DEFINE_IDA(scmi_bus_id);
-static DEFINE_IDR(scmi_protocols);
-static DEFINE_SPINLOCK(protocol_lock);
+static DEFINE_XARRAY(scmi_protocols);
 
 static const struct scmi_device_id *
 scmi_dev_match_id(struct scmi_device *scmi_dev, struct scmi_driver *scmi_drv)
@@ -49,7 +48,7 @@ static int scmi_dev_match(struct device *dev, struct device_driver *drv)
 
 static int scmi_protocol_init(int protocol_id, struct scmi_handle *handle)
 {
-       scmi_prot_init_fn_t fn = idr_find(&scmi_protocols, protocol_id);
+       scmi_prot_init_fn_t fn = xa_load(&scmi_protocols, protocol_id);
 
        if (unlikely(!fn))
                return -EINVAL;
@@ -175,11 +174,10 @@ int scmi_protocol_register(int protocol_id, scmi_prot_init_fn_t fn)
 {
        int ret;
 
-       spin_lock(&protocol_lock);
-       ret = idr_alloc(&scmi_protocols, fn, protocol_id, protocol_id + 1,
-                       GFP_ATOMIC);
-       spin_unlock(&protocol_lock);
-       if (ret != protocol_id)
+       ret = xa_insert(&scmi_protocols, protocol_id, fn, GFP_ATOMIC);
+       if (ret == 0)
+               ret = protocol_id;
+       else
                pr_err("unable to allocate SCMI idr slot, err %d\n", ret);
 
        return ret;
@@ -188,9 +186,7 @@ EXPORT_SYMBOL_GPL(scmi_protocol_register);
 
 void scmi_protocol_unregister(int protocol_id)
 {
-       spin_lock(&protocol_lock);
-       idr_remove(&scmi_protocols, protocol_id);
-       spin_unlock(&protocol_lock);
+       xa_erase(&scmi_protocols, protocol_id);
 }
 EXPORT_SYMBOL_GPL(scmi_protocol_unregister);