Message ID | 20221027031648.2452-1-huangqibo.tech@gmail.com (mailing list archive) |
---|---|
State | Changes Requested, archived |
Headers | show |
Series | thermal/core: cooling device duplicate creation check | expand |
On Thu, Oct 27, 2022 at 5:17 AM Qibo Huang <huangqibo.tech@gmail.com> wrote: > > Because creating a cooling device may have duplicate names. Why is this a problem? > When creating, first check thermal_cdev_list whether > there is a device with the same name. If it has the same name, > it returns a reference to the cooling device. Why is this a correct and the best possible solution? > Signed-off-by: Qibo Huang <huangqibo.tech@gmail.com> > --- > drivers/thermal/thermal_core.c | 34 ++++++++++++++++++++++++++++++++++ > 1 file changed, 34 insertions(+) > > diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c > index 7e669b60a065..f38f9464e9f4 100644 > --- a/drivers/thermal/thermal_core.c > +++ b/drivers/thermal/thermal_core.c > @@ -844,6 +844,34 @@ static void bind_cdev(struct thermal_cooling_device *cdev) > mutex_unlock(&thermal_list_lock); > } > > +struct thermal_cooling_device *thermal_cdev_get_zone_by_name(const char *name) > +{ > + struct thermal_cooling_device *pos = NULL, *ref = ERR_PTR(-EINVAL); > + unsigned int found = 0; > + > + if (!name) > + goto exit; > + > + mutex_lock(&thermal_list_lock); > + list_for_each_entry(pos, &thermal_cdev_list, node) > + if (!strncasecmp(name, pos->type, THERMAL_NAME_LENGTH)) { > + found++; > + ref = pos; > + } > + mutex_unlock(&thermal_list_lock); > + > + /* nothing has been found, thus an error code for it */ > + if (found == 0) > + ref = ERR_PTR(-ENODEV); > + else if (found > 1) > + /* Success only when an unique zone is found */ > + ref = ERR_PTR(-EEXIST); > + > +exit: > + return ref; > +} > +EXPORT_SYMBOL_GPL(thermal_cdev_get_zone_by_name); > + > /** > * __thermal_cooling_device_register() - register a new thermal cooling device > * @np: a pointer to a device tree node. > @@ -873,6 +901,12 @@ __thermal_cooling_device_register(struct device_node *np, > !ops->set_cur_state) > return ERR_PTR(-EINVAL); > > + if (type) { > + cdev = thermal_cdev_get_zone_by_name(type); > + if (!IS_ERR(cdev)) > + return cdev; > + } > + > cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); > if (!cdev) > return ERR_PTR(-ENOMEM); > -- > 2.37.1 >
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c index 7e669b60a065..f38f9464e9f4 100644 --- a/drivers/thermal/thermal_core.c +++ b/drivers/thermal/thermal_core.c @@ -844,6 +844,34 @@ static void bind_cdev(struct thermal_cooling_device *cdev) mutex_unlock(&thermal_list_lock); } +struct thermal_cooling_device *thermal_cdev_get_zone_by_name(const char *name) +{ + struct thermal_cooling_device *pos = NULL, *ref = ERR_PTR(-EINVAL); + unsigned int found = 0; + + if (!name) + goto exit; + + mutex_lock(&thermal_list_lock); + list_for_each_entry(pos, &thermal_cdev_list, node) + if (!strncasecmp(name, pos->type, THERMAL_NAME_LENGTH)) { + found++; + ref = pos; + } + mutex_unlock(&thermal_list_lock); + + /* nothing has been found, thus an error code for it */ + if (found == 0) + ref = ERR_PTR(-ENODEV); + else if (found > 1) + /* Success only when an unique zone is found */ + ref = ERR_PTR(-EEXIST); + +exit: + return ref; +} +EXPORT_SYMBOL_GPL(thermal_cdev_get_zone_by_name); + /** * __thermal_cooling_device_register() - register a new thermal cooling device * @np: a pointer to a device tree node. @@ -873,6 +901,12 @@ __thermal_cooling_device_register(struct device_node *np, !ops->set_cur_state) return ERR_PTR(-EINVAL); + if (type) { + cdev = thermal_cdev_get_zone_by_name(type); + if (!IS_ERR(cdev)) + return cdev; + } + cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); if (!cdev) return ERR_PTR(-ENOMEM);
Because creating a cooling device may have duplicate names. When creating, first check thermal_cdev_list whether there is a device with the same name. If it has the same name, it returns a reference to the cooling device. Signed-off-by: Qibo Huang <huangqibo.tech@gmail.com> --- drivers/thermal/thermal_core.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)