From: Matthew Wilcox Date: Fri, 15 Feb 2019 20:38:03 +0000 (-0500) Subject: arm_scmi: Convert scmi_protocols to XArray X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=3ad0cefab648b2959de7bf2dd1a3b55337ea5ebd;p=users%2Fwilly%2Fxarray.git arm_scmi: Convert scmi_protocols to XArray Signed-off-by: Matthew Wilcox --- diff --git a/drivers/firmware/arm_scmi/bus.c b/drivers/firmware/arm_scmi/bus.c index 92f843eaf1e0..ba175a7dcf52 100644 --- a/drivers/firmware/arm_scmi/bus.c +++ b/drivers/firmware/arm_scmi/bus.c @@ -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);