* [PATCH v2 0/2] hwmon: Add "label" attribute v2
@ 2022-01-05 15:15 Paul Cercueil
2022-01-05 15:15 ` [PATCH v2 1/2] ABI: hwmon: Document "label" sysfs attribute Paul Cercueil
2022-01-05 15:15 ` [PATCH v2 2/2] hwmon: Add "label" attribute Paul Cercueil
0 siblings, 2 replies; 10+ messages in thread
From: Paul Cercueil @ 2022-01-05 15:15 UTC (permalink / raw)
To: Jean Delvare, Guenter Roeck, Jonathan Corbet
Cc: linux-hwmon, linux-kernel, linux-doc, list, Paul Cercueil
Hi Jean, Guenter,
A V2 of my patchset which allows specifying a hwmon device's label from
Device Tree. When the "label" device property is present, its value is
exported to the userspace via the "label" sysfs attribute.
This is useful for userspace to be able to identify an individual device
when multiple individual chips are present in the system.
Note that this mechanism already exists in IIO.
Patch [1/2] documents the ABI change.
Patch [2/2] adds the change to the core drivers/hwmon/hwmon.c file.
Changes from v1:
- The label is cached into the hwmon_device structure
- hwmon_dev_name_is_visible() renamed to hwmon_dev_attr_is_visible()
- Add missing <linux/property.h> include
- The DT binding documentation of the "label" property has been dropped,
and the "label" property is now supported directly in dtschema.
Cheers,
-Paul
Paul Cercueil (2):
ABI: hwmon: Document "label" sysfs attribute
hwmon: Add "label" attribute
Documentation/ABI/testing/sysfs-class-hwmon | 8 +++++
Documentation/hwmon/sysfs-interface.rst | 4 +++
drivers/hwmon/hwmon.c | 34 +++++++++++++++++++--
3 files changed, 43 insertions(+), 3 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 1/2] ABI: hwmon: Document "label" sysfs attribute
2022-01-05 15:15 [PATCH v2 0/2] hwmon: Add "label" attribute v2 Paul Cercueil
@ 2022-01-05 15:15 ` Paul Cercueil
2022-01-05 15:15 ` [PATCH v2 2/2] hwmon: Add "label" attribute Paul Cercueil
1 sibling, 0 replies; 10+ messages in thread
From: Paul Cercueil @ 2022-01-05 15:15 UTC (permalink / raw)
To: Jean Delvare, Guenter Roeck, Jonathan Corbet
Cc: linux-hwmon, linux-kernel, linux-doc, list, Paul Cercueil
Add the "label" sysfs attribute, which can contain a descriptive label
that allows to uniquely identify a device within the system.
Signed-off-by: Paul Cercueil <paul@crapouillou.net>
---
Notes:
v2: New patch
Documentation/ABI/testing/sysfs-class-hwmon | 8 ++++++++
Documentation/hwmon/sysfs-interface.rst | 4 ++++
2 files changed, 12 insertions(+)
diff --git a/Documentation/ABI/testing/sysfs-class-hwmon b/Documentation/ABI/testing/sysfs-class-hwmon
index 1f20687def44..653d4c75eddb 100644
--- a/Documentation/ABI/testing/sysfs-class-hwmon
+++ b/Documentation/ABI/testing/sysfs-class-hwmon
@@ -9,6 +9,14 @@ Description:
RO
+What: /sys/class/hwmon/hwmonX/label
+Description:
+ A descriptive label that allows to uniquely identify a
+ device within the system.
+ The contents of the label are free-form.
+
+ RO
+
What: /sys/class/hwmon/hwmonX/update_interval
Description:
The interval at which the chip will update readings.
diff --git a/Documentation/hwmon/sysfs-interface.rst b/Documentation/hwmon/sysfs-interface.rst
index 85652a6aaa3e..209626fb2405 100644
--- a/Documentation/hwmon/sysfs-interface.rst
+++ b/Documentation/hwmon/sysfs-interface.rst
@@ -99,6 +99,10 @@ Global attributes
`name`
The chip name.
+`label`
+ A descriptive label that allows to uniquely identify a device
+ within the system.
+
`update_interval`
The interval at which the chip will update readings.
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 2/2] hwmon: Add "label" attribute
2022-01-05 15:15 [PATCH v2 0/2] hwmon: Add "label" attribute v2 Paul Cercueil
2022-01-05 15:15 ` [PATCH v2 1/2] ABI: hwmon: Document "label" sysfs attribute Paul Cercueil
@ 2022-01-05 15:15 ` Paul Cercueil
2022-01-05 22:27 ` kernel test robot
2022-01-10 1:29 ` Guenter Roeck
1 sibling, 2 replies; 10+ messages in thread
From: Paul Cercueil @ 2022-01-05 15:15 UTC (permalink / raw)
To: Jean Delvare, Guenter Roeck, Jonathan Corbet
Cc: linux-hwmon, linux-kernel, linux-doc, list, Paul Cercueil,
Cosmin Tanislav
If a label is defined in the device tree for this device add that
to the device specific attributes. This is useful for userspace to
be able to identify an individual device when multiple identical
chips are present in the system.
Signed-off-by: Paul Cercueil <paul@crapouillou.net>
Tested-by: Cosmin Tanislav <cosmin.tanislav@analog.com>
---
Notes:
v2: - Cache label into hwmon_device
- Rename hwmon_dev_name_is_visible() to hwmon_dev_attr_is_visible()
- Add missing <linux/property.h> include
drivers/hwmon/hwmon.c | 34 +++++++++++++++++++++++++++++++---
1 file changed, 31 insertions(+), 3 deletions(-)
diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c
index 3501a3ead4ba..22e1b47c09fc 100644
--- a/drivers/hwmon/hwmon.c
+++ b/drivers/hwmon/hwmon.c
@@ -18,6 +18,7 @@
#include <linux/list.h>
#include <linux/module.h>
#include <linux/pci.h>
+#include <linux/property.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/thermal.h>
@@ -30,6 +31,7 @@
struct hwmon_device {
const char *name;
+ const char *label;
struct device dev;
const struct hwmon_chip_info *chip;
struct list_head tzdata;
@@ -71,17 +73,29 @@ name_show(struct device *dev, struct device_attribute *attr, char *buf)
}
static DEVICE_ATTR_RO(name);
+static ssize_t
+label_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ return sysfs_emit(buf, "%s\n", to_hwmon_device(dev)->label);
+}
+static DEVICE_ATTR_RO(label);
+
static struct attribute *hwmon_dev_attrs[] = {
&dev_attr_name.attr,
+ &dev_attr_label.attr,
NULL
};
-static umode_t hwmon_dev_name_is_visible(struct kobject *kobj,
+static umode_t hwmon_dev_attr_is_visible(struct kobject *kobj,
struct attribute *attr, int n)
{
struct device *dev = kobj_to_dev(kobj);
+ struct hwmon_device *hdev = to_hwmon_device(dev);
- if (to_hwmon_device(dev)->name == NULL)
+ if (attr == &dev_attr_name.attr && hdev->name == NULL)
+ return 0;
+
+ if (attr == &dev_attr_label.attr && hdev->label == NULL)
return 0;
return attr->mode;
@@ -89,7 +103,7 @@ static umode_t hwmon_dev_name_is_visible(struct kobject *kobj,
static const struct attribute_group hwmon_dev_attr_group = {
.attrs = hwmon_dev_attrs,
- .is_visible = hwmon_dev_name_is_visible,
+ .is_visible = hwmon_dev_attr_is_visible,
};
static const struct attribute_group *hwmon_dev_attr_groups[] = {
@@ -117,6 +131,7 @@ static void hwmon_dev_release(struct device *dev)
if (hwdev->group.attrs)
hwmon_free_attrs(hwdev->group.attrs);
kfree(hwdev->groups);
+ kfree(hwdev->label);
kfree(hwdev);
}
@@ -733,6 +748,7 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
const struct attribute_group **groups)
{
struct hwmon_device *hwdev;
+ const char *label;
struct device *hdev;
int i, err, id;
@@ -752,6 +768,18 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
goto ida_remove;
}
+ if (device_property_present(dev, "label")) {
+ err = device_property_read_string(dev, "label", &label);
+ if (err < 0)
+ goto free_hwmon;
+
+ hwdev->label = kstrdup(label, GFP_KERNEL);
+ if (hwdev->label == NULL) {
+ err = -ENOMEM;
+ goto free_hwmon;
+ }
+ }
+
hdev = &hwdev->dev;
if (chip) {
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/2] hwmon: Add "label" attribute
2022-01-05 15:15 ` [PATCH v2 2/2] hwmon: Add "label" attribute Paul Cercueil
@ 2022-01-05 22:27 ` kernel test robot
2022-01-10 1:29 ` Guenter Roeck
1 sibling, 0 replies; 10+ messages in thread
From: kernel test robot @ 2022-01-05 22:27 UTC (permalink / raw)
To: Paul Cercueil, Jean Delvare, Guenter Roeck, Jonathan Corbet
Cc: llvm, kbuild-all, linux-hwmon, linux-kernel, linux-doc, list,
Paul Cercueil, Cosmin Tanislav
Hi Paul,
I love your patch! Perhaps something to improve:
[auto build test WARNING on groeck-staging/hwmon-next]
[also build test WARNING on v5.16-rc8 next-20220105]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Paul-Cercueil/hwmon-Add-label-attribute-v2/20220105-231930
base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next
config: arm64-randconfig-r026-20220105 (https://download.01.org/0day-ci/archive/20220106/202201060630.vsp02mfB-lkp@intel.com/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project d5b6e30ed3acad794dd0aec400e617daffc6cc3d)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install arm64 cross compiling tool for clang build
# apt-get install binutils-aarch64-linux-gnu
# https://github.com/0day-ci/linux/commit/57dab49995d01d638d9fa9aaddb5fa48e17b3c48
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Paul-Cercueil/hwmon-Add-label-attribute-v2/20220105-231930
git checkout 57dab49995d01d638d9fa9aaddb5fa48e17b3c48
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm64 SHELL=/bin/bash drivers/hwmon/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/hwmon/hwmon.c:777:7: warning: variable 'hdev' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (hwdev->label == NULL) {
^~~~~~~~~~~~~~~~~~~~
drivers/hwmon/hwmon.c:851:20: note: uninitialized use occurs here
hwmon_dev_release(hdev);
^~~~
drivers/hwmon/hwmon.c:777:3: note: remove the 'if' if its condition is always false
if (hwdev->label == NULL) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/hwmon/hwmon.c:773:7: warning: variable 'hdev' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (err < 0)
^~~~~~~
drivers/hwmon/hwmon.c:851:20: note: uninitialized use occurs here
hwmon_dev_release(hdev);
^~~~
drivers/hwmon/hwmon.c:773:3: note: remove the 'if' if its condition is always false
if (err < 0)
^~~~~~~~~~~~
drivers/hwmon/hwmon.c:752:21: note: initialize the variable 'hdev' to silence this warning
struct device *hdev;
^
= NULL
2 warnings generated.
vim +777 drivers/hwmon/hwmon.c
744
745 static struct device *
746 __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
747 const struct hwmon_chip_info *chip,
748 const struct attribute_group **groups)
749 {
750 struct hwmon_device *hwdev;
751 const char *label;
752 struct device *hdev;
753 int i, err, id;
754
755 /* Complain about invalid characters in hwmon name attribute */
756 if (name && (!strlen(name) || strpbrk(name, "-* \t\n")))
757 dev_warn(dev,
758 "hwmon: '%s' is not a valid name attribute, please fix\n",
759 name);
760
761 id = ida_simple_get(&hwmon_ida, 0, 0, GFP_KERNEL);
762 if (id < 0)
763 return ERR_PTR(id);
764
765 hwdev = kzalloc(sizeof(*hwdev), GFP_KERNEL);
766 if (hwdev == NULL) {
767 err = -ENOMEM;
768 goto ida_remove;
769 }
770
771 if (device_property_present(dev, "label")) {
772 err = device_property_read_string(dev, "label", &label);
773 if (err < 0)
774 goto free_hwmon;
775
776 hwdev->label = kstrdup(label, GFP_KERNEL);
> 777 if (hwdev->label == NULL) {
778 err = -ENOMEM;
779 goto free_hwmon;
780 }
781 }
782
783 hdev = &hwdev->dev;
784
785 if (chip) {
786 struct attribute **attrs;
787 int ngroups = 2; /* terminating NULL plus &hwdev->groups */
788
789 if (groups)
790 for (i = 0; groups[i]; i++)
791 ngroups++;
792
793 hwdev->groups = kcalloc(ngroups, sizeof(*groups), GFP_KERNEL);
794 if (!hwdev->groups) {
795 err = -ENOMEM;
796 goto free_hwmon;
797 }
798
799 attrs = __hwmon_create_attrs(drvdata, chip);
800 if (IS_ERR(attrs)) {
801 err = PTR_ERR(attrs);
802 goto free_hwmon;
803 }
804
805 hwdev->group.attrs = attrs;
806 ngroups = 0;
807 hwdev->groups[ngroups++] = &hwdev->group;
808
809 if (groups) {
810 for (i = 0; groups[i]; i++)
811 hwdev->groups[ngroups++] = groups[i];
812 }
813
814 hdev->groups = hwdev->groups;
815 } else {
816 hdev->groups = groups;
817 }
818
819 hwdev->name = name;
820 hdev->class = &hwmon_class;
821 hdev->parent = dev;
822 hdev->of_node = dev ? dev->of_node : NULL;
823 hwdev->chip = chip;
824 dev_set_drvdata(hdev, drvdata);
825 dev_set_name(hdev, HWMON_ID_FORMAT, id);
826 err = device_register(hdev);
827 if (err) {
828 put_device(hdev);
829 goto ida_remove;
830 }
831
832 INIT_LIST_HEAD(&hwdev->tzdata);
833
834 if (dev && dev->of_node && chip && chip->ops->read &&
835 chip->info[0]->type == hwmon_chip &&
836 (chip->info[0]->config[0] & HWMON_C_REGISTER_TZ)) {
837 err = hwmon_thermal_register_sensors(hdev);
838 if (err) {
839 device_unregister(hdev);
840 /*
841 * Don't worry about hwdev; hwmon_dev_release(), called
842 * from device_unregister(), will free it.
843 */
844 goto ida_remove;
845 }
846 }
847
848 return hdev;
849
850 free_hwmon:
851 hwmon_dev_release(hdev);
852 ida_remove:
853 ida_simple_remove(&hwmon_ida, id);
854 return ERR_PTR(err);
855 }
856
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/2] hwmon: Add "label" attribute
@ 2022-01-05 22:27 ` kernel test robot
0 siblings, 0 replies; 10+ messages in thread
From: kernel test robot @ 2022-01-05 22:27 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 6622 bytes --]
Hi Paul,
I love your patch! Perhaps something to improve:
[auto build test WARNING on groeck-staging/hwmon-next]
[also build test WARNING on v5.16-rc8 next-20220105]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Paul-Cercueil/hwmon-Add-label-attribute-v2/20220105-231930
base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next
config: arm64-randconfig-r026-20220105 (https://download.01.org/0day-ci/archive/20220106/202201060630.vsp02mfB-lkp(a)intel.com/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project d5b6e30ed3acad794dd0aec400e617daffc6cc3d)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install arm64 cross compiling tool for clang build
# apt-get install binutils-aarch64-linux-gnu
# https://github.com/0day-ci/linux/commit/57dab49995d01d638d9fa9aaddb5fa48e17b3c48
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Paul-Cercueil/hwmon-Add-label-attribute-v2/20220105-231930
git checkout 57dab49995d01d638d9fa9aaddb5fa48e17b3c48
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm64 SHELL=/bin/bash drivers/hwmon/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/hwmon/hwmon.c:777:7: warning: variable 'hdev' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (hwdev->label == NULL) {
^~~~~~~~~~~~~~~~~~~~
drivers/hwmon/hwmon.c:851:20: note: uninitialized use occurs here
hwmon_dev_release(hdev);
^~~~
drivers/hwmon/hwmon.c:777:3: note: remove the 'if' if its condition is always false
if (hwdev->label == NULL) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/hwmon/hwmon.c:773:7: warning: variable 'hdev' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (err < 0)
^~~~~~~
drivers/hwmon/hwmon.c:851:20: note: uninitialized use occurs here
hwmon_dev_release(hdev);
^~~~
drivers/hwmon/hwmon.c:773:3: note: remove the 'if' if its condition is always false
if (err < 0)
^~~~~~~~~~~~
drivers/hwmon/hwmon.c:752:21: note: initialize the variable 'hdev' to silence this warning
struct device *hdev;
^
= NULL
2 warnings generated.
vim +777 drivers/hwmon/hwmon.c
744
745 static struct device *
746 __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
747 const struct hwmon_chip_info *chip,
748 const struct attribute_group **groups)
749 {
750 struct hwmon_device *hwdev;
751 const char *label;
752 struct device *hdev;
753 int i, err, id;
754
755 /* Complain about invalid characters in hwmon name attribute */
756 if (name && (!strlen(name) || strpbrk(name, "-* \t\n")))
757 dev_warn(dev,
758 "hwmon: '%s' is not a valid name attribute, please fix\n",
759 name);
760
761 id = ida_simple_get(&hwmon_ida, 0, 0, GFP_KERNEL);
762 if (id < 0)
763 return ERR_PTR(id);
764
765 hwdev = kzalloc(sizeof(*hwdev), GFP_KERNEL);
766 if (hwdev == NULL) {
767 err = -ENOMEM;
768 goto ida_remove;
769 }
770
771 if (device_property_present(dev, "label")) {
772 err = device_property_read_string(dev, "label", &label);
773 if (err < 0)
774 goto free_hwmon;
775
776 hwdev->label = kstrdup(label, GFP_KERNEL);
> 777 if (hwdev->label == NULL) {
778 err = -ENOMEM;
779 goto free_hwmon;
780 }
781 }
782
783 hdev = &hwdev->dev;
784
785 if (chip) {
786 struct attribute **attrs;
787 int ngroups = 2; /* terminating NULL plus &hwdev->groups */
788
789 if (groups)
790 for (i = 0; groups[i]; i++)
791 ngroups++;
792
793 hwdev->groups = kcalloc(ngroups, sizeof(*groups), GFP_KERNEL);
794 if (!hwdev->groups) {
795 err = -ENOMEM;
796 goto free_hwmon;
797 }
798
799 attrs = __hwmon_create_attrs(drvdata, chip);
800 if (IS_ERR(attrs)) {
801 err = PTR_ERR(attrs);
802 goto free_hwmon;
803 }
804
805 hwdev->group.attrs = attrs;
806 ngroups = 0;
807 hwdev->groups[ngroups++] = &hwdev->group;
808
809 if (groups) {
810 for (i = 0; groups[i]; i++)
811 hwdev->groups[ngroups++] = groups[i];
812 }
813
814 hdev->groups = hwdev->groups;
815 } else {
816 hdev->groups = groups;
817 }
818
819 hwdev->name = name;
820 hdev->class = &hwmon_class;
821 hdev->parent = dev;
822 hdev->of_node = dev ? dev->of_node : NULL;
823 hwdev->chip = chip;
824 dev_set_drvdata(hdev, drvdata);
825 dev_set_name(hdev, HWMON_ID_FORMAT, id);
826 err = device_register(hdev);
827 if (err) {
828 put_device(hdev);
829 goto ida_remove;
830 }
831
832 INIT_LIST_HEAD(&hwdev->tzdata);
833
834 if (dev && dev->of_node && chip && chip->ops->read &&
835 chip->info[0]->type == hwmon_chip &&
836 (chip->info[0]->config[0] & HWMON_C_REGISTER_TZ)) {
837 err = hwmon_thermal_register_sensors(hdev);
838 if (err) {
839 device_unregister(hdev);
840 /*
841 * Don't worry about hwdev; hwmon_dev_release(), called
842 * from device_unregister(), will free it.
843 */
844 goto ida_remove;
845 }
846 }
847
848 return hdev;
849
850 free_hwmon:
851 hwmon_dev_release(hdev);
852 ida_remove:
853 ida_simple_remove(&hwmon_ida, id);
854 return ERR_PTR(err);
855 }
856
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/2] hwmon: Add "label" attribute
2022-01-05 15:15 ` [PATCH v2 2/2] hwmon: Add "label" attribute Paul Cercueil
2022-01-05 22:27 ` kernel test robot
@ 2022-01-10 6:44 ` Dan Carpenter
1 sibling, 0 replies; 10+ messages in thread
From: kernel test robot @ 2022-01-08 9:11 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 10001 bytes --]
CC: kbuild-all(a)lists.01.org
In-Reply-To: <20220105151551.20285-3-paul@crapouillou.net>
References: <20220105151551.20285-3-paul@crapouillou.net>
TO: Paul Cercueil <paul@crapouillou.net>
TO: Jean Delvare <jdelvare@suse.com>
TO: Guenter Roeck <linux@roeck-us.net>
TO: Jonathan Corbet <corbet@lwn.net>
CC: linux-hwmon(a)vger.kernel.org
CC: linux-kernel(a)vger.kernel.org
CC: linux-doc(a)vger.kernel.org
CC: list(a)opendingux.net
CC: Paul Cercueil <paul@crapouillou.net>
CC: Cosmin Tanislav <cosmin.tanislav@analog.com>
Hi Paul,
I love your patch! Perhaps something to improve:
[auto build test WARNING on groeck-staging/hwmon-next]
[also build test WARNING on v5.16-rc8 next-20220107]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Paul-Cercueil/hwmon-Add-label-attribute-v2/20220105-231930
base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next
:::::: branch date: 3 days ago
:::::: commit date: 3 days ago
config: i386-randconfig-m021-20220105 (https://download.01.org/0day-ci/archive/20220108/202201081730.TlHZabuC-lkp(a)intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
smatch warnings:
drivers/hwmon/hwmon.c:851 __hwmon_device_register() error: uninitialized symbol 'hdev'.
drivers/hwmon/hwmon.c:854 __hwmon_device_register() warn: possible memory leak of 'hwdev'
vim +/hdev +851 drivers/hwmon/hwmon.c
d560168b5d0fb4 Guenter Roeck 2015-08-26 744
d560168b5d0fb4 Guenter Roeck 2015-08-26 745 static struct device *
d560168b5d0fb4 Guenter Roeck 2015-08-26 746 __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
d560168b5d0fb4 Guenter Roeck 2015-08-26 747 const struct hwmon_chip_info *chip,
bab2243ce18978 Guenter Roeck 2013-07-06 748 const struct attribute_group **groups)
1236441f38b6a9 Mark M. Hoffman 2005-07-15 749 {
bab2243ce18978 Guenter Roeck 2013-07-06 750 struct hwmon_device *hwdev;
57dab49995d01d Paul Cercueil 2022-01-05 751 const char *label;
d560168b5d0fb4 Guenter Roeck 2015-08-26 752 struct device *hdev;
44e3ad882bb268 Akinobu Mita 2020-05-04 753 int i, err, id;
ded2b666156130 Mark M. Hoffman 2006-03-05 754
74d3b6419772e4 Guenter Roeck 2017-01-27 755 /* Complain about invalid characters in hwmon name attribute */
648cd48c9e566f Guenter Roeck 2014-02-28 756 if (name && (!strlen(name) || strpbrk(name, "-* \t\n")))
74d3b6419772e4 Guenter Roeck 2017-01-27 757 dev_warn(dev,
74d3b6419772e4 Guenter Roeck 2017-01-27 758 "hwmon: '%s' is not a valid name attribute, please fix\n",
74d3b6419772e4 Guenter Roeck 2017-01-27 759 name);
648cd48c9e566f Guenter Roeck 2014-02-28 760
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 761 id = ida_simple_get(&hwmon_ida, 0, 0, GFP_KERNEL);
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 762 if (id < 0)
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 763 return ERR_PTR(id);
1236441f38b6a9 Mark M. Hoffman 2005-07-15 764
bab2243ce18978 Guenter Roeck 2013-07-06 765 hwdev = kzalloc(sizeof(*hwdev), GFP_KERNEL);
bab2243ce18978 Guenter Roeck 2013-07-06 766 if (hwdev == NULL) {
bab2243ce18978 Guenter Roeck 2013-07-06 767 err = -ENOMEM;
bab2243ce18978 Guenter Roeck 2013-07-06 768 goto ida_remove;
bab2243ce18978 Guenter Roeck 2013-07-06 769 }
1236441f38b6a9 Mark M. Hoffman 2005-07-15 770
57dab49995d01d Paul Cercueil 2022-01-05 771 if (device_property_present(dev, "label")) {
57dab49995d01d Paul Cercueil 2022-01-05 772 err = device_property_read_string(dev, "label", &label);
57dab49995d01d Paul Cercueil 2022-01-05 773 if (err < 0)
57dab49995d01d Paul Cercueil 2022-01-05 774 goto free_hwmon;
57dab49995d01d Paul Cercueil 2022-01-05 775
57dab49995d01d Paul Cercueil 2022-01-05 776 hwdev->label = kstrdup(label, GFP_KERNEL);
57dab49995d01d Paul Cercueil 2022-01-05 777 if (hwdev->label == NULL) {
57dab49995d01d Paul Cercueil 2022-01-05 778 err = -ENOMEM;
57dab49995d01d Paul Cercueil 2022-01-05 779 goto free_hwmon;
57dab49995d01d Paul Cercueil 2022-01-05 780 }
57dab49995d01d Paul Cercueil 2022-01-05 781 }
57dab49995d01d Paul Cercueil 2022-01-05 782
d560168b5d0fb4 Guenter Roeck 2015-08-26 783 hdev = &hwdev->dev;
d560168b5d0fb4 Guenter Roeck 2015-08-26 784
239552f495b91f Guenter Roeck 2016-10-16 785 if (chip) {
d560168b5d0fb4 Guenter Roeck 2015-08-26 786 struct attribute **attrs;
b2a4cc3a060da0 Guenter Roeck 2016-10-16 787 int ngroups = 2; /* terminating NULL plus &hwdev->groups */
d560168b5d0fb4 Guenter Roeck 2015-08-26 788
d560168b5d0fb4 Guenter Roeck 2015-08-26 789 if (groups)
d560168b5d0fb4 Guenter Roeck 2015-08-26 790 for (i = 0; groups[i]; i++)
d560168b5d0fb4 Guenter Roeck 2015-08-26 791 ngroups++;
d560168b5d0fb4 Guenter Roeck 2015-08-26 792
3bf8bdcf3bada7 Guenter Roeck 2020-01-16 793 hwdev->groups = kcalloc(ngroups, sizeof(*groups), GFP_KERNEL);
38d8ed65092ed2 Colin Ian King 2016-10-23 794 if (!hwdev->groups) {
38d8ed65092ed2 Colin Ian King 2016-10-23 795 err = -ENOMEM;
38d8ed65092ed2 Colin Ian King 2016-10-23 796 goto free_hwmon;
38d8ed65092ed2 Colin Ian King 2016-10-23 797 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 798
3bf8bdcf3bada7 Guenter Roeck 2020-01-16 799 attrs = __hwmon_create_attrs(drvdata, chip);
d560168b5d0fb4 Guenter Roeck 2015-08-26 800 if (IS_ERR(attrs)) {
d560168b5d0fb4 Guenter Roeck 2015-08-26 801 err = PTR_ERR(attrs);
d560168b5d0fb4 Guenter Roeck 2015-08-26 802 goto free_hwmon;
d560168b5d0fb4 Guenter Roeck 2015-08-26 803 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 804
d560168b5d0fb4 Guenter Roeck 2015-08-26 805 hwdev->group.attrs = attrs;
d560168b5d0fb4 Guenter Roeck 2015-08-26 806 ngroups = 0;
d560168b5d0fb4 Guenter Roeck 2015-08-26 807 hwdev->groups[ngroups++] = &hwdev->group;
d560168b5d0fb4 Guenter Roeck 2015-08-26 808
d560168b5d0fb4 Guenter Roeck 2015-08-26 809 if (groups) {
d560168b5d0fb4 Guenter Roeck 2015-08-26 810 for (i = 0; groups[i]; i++)
d560168b5d0fb4 Guenter Roeck 2015-08-26 811 hwdev->groups[ngroups++] = groups[i];
d560168b5d0fb4 Guenter Roeck 2015-08-26 812 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 813
d560168b5d0fb4 Guenter Roeck 2015-08-26 814 hdev->groups = hwdev->groups;
d560168b5d0fb4 Guenter Roeck 2015-08-26 815 } else {
d560168b5d0fb4 Guenter Roeck 2015-08-26 816 hdev->groups = groups;
d560168b5d0fb4 Guenter Roeck 2015-08-26 817 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 818
bab2243ce18978 Guenter Roeck 2013-07-06 819 hwdev->name = name;
d560168b5d0fb4 Guenter Roeck 2015-08-26 820 hdev->class = &hwmon_class;
d560168b5d0fb4 Guenter Roeck 2015-08-26 821 hdev->parent = dev;
d560168b5d0fb4 Guenter Roeck 2015-08-26 822 hdev->of_node = dev ? dev->of_node : NULL;
d560168b5d0fb4 Guenter Roeck 2015-08-26 823 hwdev->chip = chip;
d560168b5d0fb4 Guenter Roeck 2015-08-26 824 dev_set_drvdata(hdev, drvdata);
d560168b5d0fb4 Guenter Roeck 2015-08-26 825 dev_set_name(hdev, HWMON_ID_FORMAT, id);
d560168b5d0fb4 Guenter Roeck 2015-08-26 826 err = device_register(hdev);
ada61aa0b1184a Yang Yingliang 2021-10-12 827 if (err) {
ada61aa0b1184a Yang Yingliang 2021-10-12 828 put_device(hdev);
ada61aa0b1184a Yang Yingliang 2021-10-12 829 goto ida_remove;
ada61aa0b1184a Yang Yingliang 2021-10-12 830 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 831
1597b374af2226 Guenter Roeck 2020-05-28 832 INIT_LIST_HEAD(&hwdev->tzdata);
1597b374af2226 Guenter Roeck 2020-05-28 833
c41dd48e21fae3 Eduardo Valentin 2019-05-29 834 if (dev && dev->of_node && chip && chip->ops->read &&
d560168b5d0fb4 Guenter Roeck 2015-08-26 835 chip->info[0]->type == hwmon_chip &&
d560168b5d0fb4 Guenter Roeck 2015-08-26 836 (chip->info[0]->config[0] & HWMON_C_REGISTER_TZ)) {
44e3ad882bb268 Akinobu Mita 2020-05-04 837 err = hwmon_thermal_register_sensors(hdev);
74e3512731bd5c Dmitry Osipenko 2018-10-24 838 if (err) {
74e3512731bd5c Dmitry Osipenko 2018-10-24 839 device_unregister(hdev);
792eac18431967 Guenter Roeck 2019-06-06 840 /*
44e3ad882bb268 Akinobu Mita 2020-05-04 841 * Don't worry about hwdev; hwmon_dev_release(), called
44e3ad882bb268 Akinobu Mita 2020-05-04 842 * from device_unregister(), will free it.
792eac18431967 Guenter Roeck 2019-06-06 843 */
74e3512731bd5c Dmitry Osipenko 2018-10-24 844 goto ida_remove;
74e3512731bd5c Dmitry Osipenko 2018-10-24 845 }
47c332deb8e89f Linus Walleij 2017-12-05 846 }
bab2243ce18978 Guenter Roeck 2013-07-06 847
d560168b5d0fb4 Guenter Roeck 2015-08-26 848 return hdev;
bab2243ce18978 Guenter Roeck 2013-07-06 849
d560168b5d0fb4 Guenter Roeck 2015-08-26 850 free_hwmon:
3bf8bdcf3bada7 Guenter Roeck 2020-01-16 @851 hwmon_dev_release(hdev);
bab2243ce18978 Guenter Roeck 2013-07-06 852 ida_remove:
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 853 ida_simple_remove(&hwmon_ida, id);
bab2243ce18978 Guenter Roeck 2013-07-06 @854 return ERR_PTR(err);
bab2243ce18978 Guenter Roeck 2013-07-06 855 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 856
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/2] hwmon: Add "label" attribute
2022-01-05 15:15 ` [PATCH v2 2/2] hwmon: Add "label" attribute Paul Cercueil
2022-01-05 22:27 ` kernel test robot
@ 2022-01-10 1:29 ` Guenter Roeck
2022-01-10 10:48 ` Paul Cercueil
1 sibling, 1 reply; 10+ messages in thread
From: Guenter Roeck @ 2022-01-10 1:29 UTC (permalink / raw)
To: Paul Cercueil
Cc: Jean Delvare, Jonathan Corbet, linux-hwmon, linux-kernel,
linux-doc, list, Cosmin Tanislav
On Wed, Jan 05, 2022 at 03:15:51PM +0000, Paul Cercueil wrote:
> If a label is defined in the device tree for this device add that
> to the device specific attributes. This is useful for userspace to
> be able to identify an individual device when multiple identical
> chips are present in the system.
>
> Signed-off-by: Paul Cercueil <paul@crapouillou.net>
> Tested-by: Cosmin Tanislav <cosmin.tanislav@analog.com>
> Reported-by: kernel test robot <lkp@intel.com>
> ---
>
> Notes:
> v2: - Cache label into hwmon_device
> - Rename hwmon_dev_name_is_visible() to hwmon_dev_attr_is_visible()
> - Add missing <linux/property.h> include
>
> drivers/hwmon/hwmon.c | 34 +++++++++++++++++++++++++++++++---
> 1 file changed, 31 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c
> index 3501a3ead4ba..22e1b47c09fc 100644
> --- a/drivers/hwmon/hwmon.c
> +++ b/drivers/hwmon/hwmon.c
> @@ -18,6 +18,7 @@
> #include <linux/list.h>
> #include <linux/module.h>
> #include <linux/pci.h>
> +#include <linux/property.h>
> #include <linux/slab.h>
> #include <linux/string.h>
> #include <linux/thermal.h>
> @@ -30,6 +31,7 @@
>
> struct hwmon_device {
> const char *name;
> + const char *label;
> struct device dev;
> const struct hwmon_chip_info *chip;
> struct list_head tzdata;
> @@ -71,17 +73,29 @@ name_show(struct device *dev, struct device_attribute *attr, char *buf)
> }
> static DEVICE_ATTR_RO(name);
>
> +static ssize_t
> +label_show(struct device *dev, struct device_attribute *attr, char *buf)
> +{
> + return sysfs_emit(buf, "%s\n", to_hwmon_device(dev)->label);
> +}
> +static DEVICE_ATTR_RO(label);
> +
> static struct attribute *hwmon_dev_attrs[] = {
> &dev_attr_name.attr,
> + &dev_attr_label.attr,
> NULL
> };
>
> -static umode_t hwmon_dev_name_is_visible(struct kobject *kobj,
> +static umode_t hwmon_dev_attr_is_visible(struct kobject *kobj,
> struct attribute *attr, int n)
> {
> struct device *dev = kobj_to_dev(kobj);
> + struct hwmon_device *hdev = to_hwmon_device(dev);
>
> - if (to_hwmon_device(dev)->name == NULL)
> + if (attr == &dev_attr_name.attr && hdev->name == NULL)
> + return 0;
> +
> + if (attr == &dev_attr_label.attr && hdev->label == NULL)
> return 0;
>
> return attr->mode;
> @@ -89,7 +103,7 @@ static umode_t hwmon_dev_name_is_visible(struct kobject *kobj,
>
> static const struct attribute_group hwmon_dev_attr_group = {
> .attrs = hwmon_dev_attrs,
> - .is_visible = hwmon_dev_name_is_visible,
> + .is_visible = hwmon_dev_attr_is_visible,
> };
>
> static const struct attribute_group *hwmon_dev_attr_groups[] = {
> @@ -117,6 +131,7 @@ static void hwmon_dev_release(struct device *dev)
> if (hwdev->group.attrs)
> hwmon_free_attrs(hwdev->group.attrs);
> kfree(hwdev->groups);
> + kfree(hwdev->label);
> kfree(hwdev);
> }
>
> @@ -733,6 +748,7 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
> const struct attribute_group **groups)
> {
> struct hwmon_device *hwdev;
> + const char *label;
> struct device *hdev;
> int i, err, id;
>
> @@ -752,6 +768,18 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
> goto ida_remove;
> }
>
> + if (device_property_present(dev, "label")) {
> + err = device_property_read_string(dev, "label", &label);
> + if (err < 0)
> + goto free_hwmon;
> +
> + hwdev->label = kstrdup(label, GFP_KERNEL);
> + if (hwdev->label == NULL) {
> + err = -ENOMEM;
> + goto free_hwmon;
The code after free_hwmon: uses hdev, so 0-day has a point. Please fix.
Guenter
> + }
> + }
> +
> hdev = &hwdev->dev;
>
> if (chip) {
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/2] hwmon: Add "label" attribute
@ 2022-01-10 6:44 ` Dan Carpenter
0 siblings, 0 replies; 10+ messages in thread
From: Dan Carpenter @ 2022-01-10 6:44 UTC (permalink / raw)
To: kbuild, Paul Cercueil, Jean Delvare, Guenter Roeck, Jonathan Corbet
Cc: lkp, kbuild-all, linux-hwmon, linux-kernel, linux-doc, list,
Paul Cercueil, Cosmin Tanislav
Hi Paul,
url: https://github.com/0day-ci/linux/commits/Paul-Cercueil/hwmon-Add-label-attribute-v2/20220105-231930
base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next
config: i386-randconfig-m021-20220105 (https://download.01.org/0day-ci/archive/20220108/202201081730.TlHZabuC-lkp@intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
smatch warnings:
drivers/hwmon/hwmon.c:851 __hwmon_device_register() error: uninitialized symbol 'hdev'.
drivers/hwmon/hwmon.c:854 __hwmon_device_register() warn: possible memory leak of 'hwdev'
vim +/hdev +851 drivers/hwmon/hwmon.c
d560168b5d0fb4 Guenter Roeck 2015-08-26 745 static struct device *
d560168b5d0fb4 Guenter Roeck 2015-08-26 746 __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
d560168b5d0fb4 Guenter Roeck 2015-08-26 747 const struct hwmon_chip_info *chip,
bab2243ce18978 Guenter Roeck 2013-07-06 748 const struct attribute_group **groups)
1236441f38b6a9 Mark M. Hoffman 2005-07-15 749 {
bab2243ce18978 Guenter Roeck 2013-07-06 750 struct hwmon_device *hwdev;
57dab49995d01d Paul Cercueil 2022-01-05 751 const char *label;
d560168b5d0fb4 Guenter Roeck 2015-08-26 752 struct device *hdev;
44e3ad882bb268 Akinobu Mita 2020-05-04 753 int i, err, id;
ded2b666156130 Mark M. Hoffman 2006-03-05 754
74d3b6419772e4 Guenter Roeck 2017-01-27 755 /* Complain about invalid characters in hwmon name attribute */
648cd48c9e566f Guenter Roeck 2014-02-28 756 if (name && (!strlen(name) || strpbrk(name, "-* \t\n")))
74d3b6419772e4 Guenter Roeck 2017-01-27 757 dev_warn(dev,
74d3b6419772e4 Guenter Roeck 2017-01-27 758 "hwmon: '%s' is not a valid name attribute, please fix\n",
74d3b6419772e4 Guenter Roeck 2017-01-27 759 name);
648cd48c9e566f Guenter Roeck 2014-02-28 760
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 761 id = ida_simple_get(&hwmon_ida, 0, 0, GFP_KERNEL);
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 762 if (id < 0)
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 763 return ERR_PTR(id);
1236441f38b6a9 Mark M. Hoffman 2005-07-15 764
bab2243ce18978 Guenter Roeck 2013-07-06 765 hwdev = kzalloc(sizeof(*hwdev), GFP_KERNEL);
bab2243ce18978 Guenter Roeck 2013-07-06 766 if (hwdev == NULL) {
bab2243ce18978 Guenter Roeck 2013-07-06 767 err = -ENOMEM;
bab2243ce18978 Guenter Roeck 2013-07-06 768 goto ida_remove;
bab2243ce18978 Guenter Roeck 2013-07-06 769 }
1236441f38b6a9 Mark M. Hoffman 2005-07-15 770
57dab49995d01d Paul Cercueil 2022-01-05 771 if (device_property_present(dev, "label")) {
57dab49995d01d Paul Cercueil 2022-01-05 772 err = device_property_read_string(dev, "label", &label);
57dab49995d01d Paul Cercueil 2022-01-05 773 if (err < 0)
57dab49995d01d Paul Cercueil 2022-01-05 774 goto free_hwmon;
"hwdev" not freed on this goto path and "hdev" is uninitialized. Sort
of related bugs.
57dab49995d01d Paul Cercueil 2022-01-05 775
57dab49995d01d Paul Cercueil 2022-01-05 776 hwdev->label = kstrdup(label, GFP_KERNEL);
57dab49995d01d Paul Cercueil 2022-01-05 777 if (hwdev->label == NULL) {
57dab49995d01d Paul Cercueil 2022-01-05 778 err = -ENOMEM;
57dab49995d01d Paul Cercueil 2022-01-05 779 goto free_hwmon;
57dab49995d01d Paul Cercueil 2022-01-05 780 }
57dab49995d01d Paul Cercueil 2022-01-05 781 }
57dab49995d01d Paul Cercueil 2022-01-05 782
d560168b5d0fb4 Guenter Roeck 2015-08-26 783 hdev = &hwdev->dev;
d560168b5d0fb4 Guenter Roeck 2015-08-26 784
239552f495b91f Guenter Roeck 2016-10-16 785 if (chip) {
d560168b5d0fb4 Guenter Roeck 2015-08-26 786 struct attribute **attrs;
b2a4cc3a060da0 Guenter Roeck 2016-10-16 787 int ngroups = 2; /* terminating NULL plus &hwdev->groups */
d560168b5d0fb4 Guenter Roeck 2015-08-26 788
d560168b5d0fb4 Guenter Roeck 2015-08-26 789 if (groups)
d560168b5d0fb4 Guenter Roeck 2015-08-26 790 for (i = 0; groups[i]; i++)
d560168b5d0fb4 Guenter Roeck 2015-08-26 791 ngroups++;
d560168b5d0fb4 Guenter Roeck 2015-08-26 792
3bf8bdcf3bada7 Guenter Roeck 2020-01-16 793 hwdev->groups = kcalloc(ngroups, sizeof(*groups), GFP_KERNEL);
38d8ed65092ed2 Colin Ian King 2016-10-23 794 if (!hwdev->groups) {
38d8ed65092ed2 Colin Ian King 2016-10-23 795 err = -ENOMEM;
38d8ed65092ed2 Colin Ian King 2016-10-23 796 goto free_hwmon;
38d8ed65092ed2 Colin Ian King 2016-10-23 797 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 798
3bf8bdcf3bada7 Guenter Roeck 2020-01-16 799 attrs = __hwmon_create_attrs(drvdata, chip);
d560168b5d0fb4 Guenter Roeck 2015-08-26 800 if (IS_ERR(attrs)) {
d560168b5d0fb4 Guenter Roeck 2015-08-26 801 err = PTR_ERR(attrs);
d560168b5d0fb4 Guenter Roeck 2015-08-26 802 goto free_hwmon;
d560168b5d0fb4 Guenter Roeck 2015-08-26 803 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 804
d560168b5d0fb4 Guenter Roeck 2015-08-26 805 hwdev->group.attrs = attrs;
d560168b5d0fb4 Guenter Roeck 2015-08-26 806 ngroups = 0;
d560168b5d0fb4 Guenter Roeck 2015-08-26 807 hwdev->groups[ngroups++] = &hwdev->group;
d560168b5d0fb4 Guenter Roeck 2015-08-26 808
d560168b5d0fb4 Guenter Roeck 2015-08-26 809 if (groups) {
d560168b5d0fb4 Guenter Roeck 2015-08-26 810 for (i = 0; groups[i]; i++)
d560168b5d0fb4 Guenter Roeck 2015-08-26 811 hwdev->groups[ngroups++] = groups[i];
d560168b5d0fb4 Guenter Roeck 2015-08-26 812 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 813
d560168b5d0fb4 Guenter Roeck 2015-08-26 814 hdev->groups = hwdev->groups;
d560168b5d0fb4 Guenter Roeck 2015-08-26 815 } else {
d560168b5d0fb4 Guenter Roeck 2015-08-26 816 hdev->groups = groups;
d560168b5d0fb4 Guenter Roeck 2015-08-26 817 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 818
bab2243ce18978 Guenter Roeck 2013-07-06 819 hwdev->name = name;
d560168b5d0fb4 Guenter Roeck 2015-08-26 820 hdev->class = &hwmon_class;
d560168b5d0fb4 Guenter Roeck 2015-08-26 821 hdev->parent = dev;
d560168b5d0fb4 Guenter Roeck 2015-08-26 822 hdev->of_node = dev ? dev->of_node : NULL;
d560168b5d0fb4 Guenter Roeck 2015-08-26 823 hwdev->chip = chip;
d560168b5d0fb4 Guenter Roeck 2015-08-26 824 dev_set_drvdata(hdev, drvdata);
d560168b5d0fb4 Guenter Roeck 2015-08-26 825 dev_set_name(hdev, HWMON_ID_FORMAT, id);
d560168b5d0fb4 Guenter Roeck 2015-08-26 826 err = device_register(hdev);
ada61aa0b1184a Yang Yingliang 2021-10-12 827 if (err) {
ada61aa0b1184a Yang Yingliang 2021-10-12 828 put_device(hdev);
ada61aa0b1184a Yang Yingliang 2021-10-12 829 goto ida_remove;
ada61aa0b1184a Yang Yingliang 2021-10-12 830 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 831
1597b374af2226 Guenter Roeck 2020-05-28 832 INIT_LIST_HEAD(&hwdev->tzdata);
1597b374af2226 Guenter Roeck 2020-05-28 833
c41dd48e21fae3 Eduardo Valentin 2019-05-29 834 if (dev && dev->of_node && chip && chip->ops->read &&
d560168b5d0fb4 Guenter Roeck 2015-08-26 835 chip->info[0]->type == hwmon_chip &&
d560168b5d0fb4 Guenter Roeck 2015-08-26 836 (chip->info[0]->config[0] & HWMON_C_REGISTER_TZ)) {
44e3ad882bb268 Akinobu Mita 2020-05-04 837 err = hwmon_thermal_register_sensors(hdev);
74e3512731bd5c Dmitry Osipenko 2018-10-24 838 if (err) {
74e3512731bd5c Dmitry Osipenko 2018-10-24 839 device_unregister(hdev);
792eac18431967 Guenter Roeck 2019-06-06 840 /*
44e3ad882bb268 Akinobu Mita 2020-05-04 841 * Don't worry about hwdev; hwmon_dev_release(), called
44e3ad882bb268 Akinobu Mita 2020-05-04 842 * from device_unregister(), will free it.
792eac18431967 Guenter Roeck 2019-06-06 843 */
74e3512731bd5c Dmitry Osipenko 2018-10-24 844 goto ida_remove;
74e3512731bd5c Dmitry Osipenko 2018-10-24 845 }
47c332deb8e89f Linus Walleij 2017-12-05 846 }
bab2243ce18978 Guenter Roeck 2013-07-06 847
d560168b5d0fb4 Guenter Roeck 2015-08-26 848 return hdev;
bab2243ce18978 Guenter Roeck 2013-07-06 849
d560168b5d0fb4 Guenter Roeck 2015-08-26 850 free_hwmon:
3bf8bdcf3bada7 Guenter Roeck 2020-01-16 @851 hwmon_dev_release(hdev);
bab2243ce18978 Guenter Roeck 2013-07-06 852 ida_remove:
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 853 ida_simple_remove(&hwmon_ida, id);
bab2243ce18978 Guenter Roeck 2013-07-06 @854 return ERR_PTR(err);
bab2243ce18978 Guenter Roeck 2013-07-06 855 }
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/2] hwmon: Add "label" attribute
@ 2022-01-10 6:44 ` Dan Carpenter
0 siblings, 0 replies; 10+ messages in thread
From: Dan Carpenter @ 2022-01-10 6:44 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 9045 bytes --]
Hi Paul,
url: https://github.com/0day-ci/linux/commits/Paul-Cercueil/hwmon-Add-label-attribute-v2/20220105-231930
base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next
config: i386-randconfig-m021-20220105 (https://download.01.org/0day-ci/archive/20220108/202201081730.TlHZabuC-lkp(a)intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
smatch warnings:
drivers/hwmon/hwmon.c:851 __hwmon_device_register() error: uninitialized symbol 'hdev'.
drivers/hwmon/hwmon.c:854 __hwmon_device_register() warn: possible memory leak of 'hwdev'
vim +/hdev +851 drivers/hwmon/hwmon.c
d560168b5d0fb4 Guenter Roeck 2015-08-26 745 static struct device *
d560168b5d0fb4 Guenter Roeck 2015-08-26 746 __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
d560168b5d0fb4 Guenter Roeck 2015-08-26 747 const struct hwmon_chip_info *chip,
bab2243ce18978 Guenter Roeck 2013-07-06 748 const struct attribute_group **groups)
1236441f38b6a9 Mark M. Hoffman 2005-07-15 749 {
bab2243ce18978 Guenter Roeck 2013-07-06 750 struct hwmon_device *hwdev;
57dab49995d01d Paul Cercueil 2022-01-05 751 const char *label;
d560168b5d0fb4 Guenter Roeck 2015-08-26 752 struct device *hdev;
44e3ad882bb268 Akinobu Mita 2020-05-04 753 int i, err, id;
ded2b666156130 Mark M. Hoffman 2006-03-05 754
74d3b6419772e4 Guenter Roeck 2017-01-27 755 /* Complain about invalid characters in hwmon name attribute */
648cd48c9e566f Guenter Roeck 2014-02-28 756 if (name && (!strlen(name) || strpbrk(name, "-* \t\n")))
74d3b6419772e4 Guenter Roeck 2017-01-27 757 dev_warn(dev,
74d3b6419772e4 Guenter Roeck 2017-01-27 758 "hwmon: '%s' is not a valid name attribute, please fix\n",
74d3b6419772e4 Guenter Roeck 2017-01-27 759 name);
648cd48c9e566f Guenter Roeck 2014-02-28 760
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 761 id = ida_simple_get(&hwmon_ida, 0, 0, GFP_KERNEL);
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 762 if (id < 0)
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 763 return ERR_PTR(id);
1236441f38b6a9 Mark M. Hoffman 2005-07-15 764
bab2243ce18978 Guenter Roeck 2013-07-06 765 hwdev = kzalloc(sizeof(*hwdev), GFP_KERNEL);
bab2243ce18978 Guenter Roeck 2013-07-06 766 if (hwdev == NULL) {
bab2243ce18978 Guenter Roeck 2013-07-06 767 err = -ENOMEM;
bab2243ce18978 Guenter Roeck 2013-07-06 768 goto ida_remove;
bab2243ce18978 Guenter Roeck 2013-07-06 769 }
1236441f38b6a9 Mark M. Hoffman 2005-07-15 770
57dab49995d01d Paul Cercueil 2022-01-05 771 if (device_property_present(dev, "label")) {
57dab49995d01d Paul Cercueil 2022-01-05 772 err = device_property_read_string(dev, "label", &label);
57dab49995d01d Paul Cercueil 2022-01-05 773 if (err < 0)
57dab49995d01d Paul Cercueil 2022-01-05 774 goto free_hwmon;
"hwdev" not freed on this goto path and "hdev" is uninitialized. Sort
of related bugs.
57dab49995d01d Paul Cercueil 2022-01-05 775
57dab49995d01d Paul Cercueil 2022-01-05 776 hwdev->label = kstrdup(label, GFP_KERNEL);
57dab49995d01d Paul Cercueil 2022-01-05 777 if (hwdev->label == NULL) {
57dab49995d01d Paul Cercueil 2022-01-05 778 err = -ENOMEM;
57dab49995d01d Paul Cercueil 2022-01-05 779 goto free_hwmon;
57dab49995d01d Paul Cercueil 2022-01-05 780 }
57dab49995d01d Paul Cercueil 2022-01-05 781 }
57dab49995d01d Paul Cercueil 2022-01-05 782
d560168b5d0fb4 Guenter Roeck 2015-08-26 783 hdev = &hwdev->dev;
d560168b5d0fb4 Guenter Roeck 2015-08-26 784
239552f495b91f Guenter Roeck 2016-10-16 785 if (chip) {
d560168b5d0fb4 Guenter Roeck 2015-08-26 786 struct attribute **attrs;
b2a4cc3a060da0 Guenter Roeck 2016-10-16 787 int ngroups = 2; /* terminating NULL plus &hwdev->groups */
d560168b5d0fb4 Guenter Roeck 2015-08-26 788
d560168b5d0fb4 Guenter Roeck 2015-08-26 789 if (groups)
d560168b5d0fb4 Guenter Roeck 2015-08-26 790 for (i = 0; groups[i]; i++)
d560168b5d0fb4 Guenter Roeck 2015-08-26 791 ngroups++;
d560168b5d0fb4 Guenter Roeck 2015-08-26 792
3bf8bdcf3bada7 Guenter Roeck 2020-01-16 793 hwdev->groups = kcalloc(ngroups, sizeof(*groups), GFP_KERNEL);
38d8ed65092ed2 Colin Ian King 2016-10-23 794 if (!hwdev->groups) {
38d8ed65092ed2 Colin Ian King 2016-10-23 795 err = -ENOMEM;
38d8ed65092ed2 Colin Ian King 2016-10-23 796 goto free_hwmon;
38d8ed65092ed2 Colin Ian King 2016-10-23 797 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 798
3bf8bdcf3bada7 Guenter Roeck 2020-01-16 799 attrs = __hwmon_create_attrs(drvdata, chip);
d560168b5d0fb4 Guenter Roeck 2015-08-26 800 if (IS_ERR(attrs)) {
d560168b5d0fb4 Guenter Roeck 2015-08-26 801 err = PTR_ERR(attrs);
d560168b5d0fb4 Guenter Roeck 2015-08-26 802 goto free_hwmon;
d560168b5d0fb4 Guenter Roeck 2015-08-26 803 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 804
d560168b5d0fb4 Guenter Roeck 2015-08-26 805 hwdev->group.attrs = attrs;
d560168b5d0fb4 Guenter Roeck 2015-08-26 806 ngroups = 0;
d560168b5d0fb4 Guenter Roeck 2015-08-26 807 hwdev->groups[ngroups++] = &hwdev->group;
d560168b5d0fb4 Guenter Roeck 2015-08-26 808
d560168b5d0fb4 Guenter Roeck 2015-08-26 809 if (groups) {
d560168b5d0fb4 Guenter Roeck 2015-08-26 810 for (i = 0; groups[i]; i++)
d560168b5d0fb4 Guenter Roeck 2015-08-26 811 hwdev->groups[ngroups++] = groups[i];
d560168b5d0fb4 Guenter Roeck 2015-08-26 812 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 813
d560168b5d0fb4 Guenter Roeck 2015-08-26 814 hdev->groups = hwdev->groups;
d560168b5d0fb4 Guenter Roeck 2015-08-26 815 } else {
d560168b5d0fb4 Guenter Roeck 2015-08-26 816 hdev->groups = groups;
d560168b5d0fb4 Guenter Roeck 2015-08-26 817 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 818
bab2243ce18978 Guenter Roeck 2013-07-06 819 hwdev->name = name;
d560168b5d0fb4 Guenter Roeck 2015-08-26 820 hdev->class = &hwmon_class;
d560168b5d0fb4 Guenter Roeck 2015-08-26 821 hdev->parent = dev;
d560168b5d0fb4 Guenter Roeck 2015-08-26 822 hdev->of_node = dev ? dev->of_node : NULL;
d560168b5d0fb4 Guenter Roeck 2015-08-26 823 hwdev->chip = chip;
d560168b5d0fb4 Guenter Roeck 2015-08-26 824 dev_set_drvdata(hdev, drvdata);
d560168b5d0fb4 Guenter Roeck 2015-08-26 825 dev_set_name(hdev, HWMON_ID_FORMAT, id);
d560168b5d0fb4 Guenter Roeck 2015-08-26 826 err = device_register(hdev);
ada61aa0b1184a Yang Yingliang 2021-10-12 827 if (err) {
ada61aa0b1184a Yang Yingliang 2021-10-12 828 put_device(hdev);
ada61aa0b1184a Yang Yingliang 2021-10-12 829 goto ida_remove;
ada61aa0b1184a Yang Yingliang 2021-10-12 830 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 831
1597b374af2226 Guenter Roeck 2020-05-28 832 INIT_LIST_HEAD(&hwdev->tzdata);
1597b374af2226 Guenter Roeck 2020-05-28 833
c41dd48e21fae3 Eduardo Valentin 2019-05-29 834 if (dev && dev->of_node && chip && chip->ops->read &&
d560168b5d0fb4 Guenter Roeck 2015-08-26 835 chip->info[0]->type == hwmon_chip &&
d560168b5d0fb4 Guenter Roeck 2015-08-26 836 (chip->info[0]->config[0] & HWMON_C_REGISTER_TZ)) {
44e3ad882bb268 Akinobu Mita 2020-05-04 837 err = hwmon_thermal_register_sensors(hdev);
74e3512731bd5c Dmitry Osipenko 2018-10-24 838 if (err) {
74e3512731bd5c Dmitry Osipenko 2018-10-24 839 device_unregister(hdev);
792eac18431967 Guenter Roeck 2019-06-06 840 /*
44e3ad882bb268 Akinobu Mita 2020-05-04 841 * Don't worry about hwdev; hwmon_dev_release(), called
44e3ad882bb268 Akinobu Mita 2020-05-04 842 * from device_unregister(), will free it.
792eac18431967 Guenter Roeck 2019-06-06 843 */
74e3512731bd5c Dmitry Osipenko 2018-10-24 844 goto ida_remove;
74e3512731bd5c Dmitry Osipenko 2018-10-24 845 }
47c332deb8e89f Linus Walleij 2017-12-05 846 }
bab2243ce18978 Guenter Roeck 2013-07-06 847
d560168b5d0fb4 Guenter Roeck 2015-08-26 848 return hdev;
bab2243ce18978 Guenter Roeck 2013-07-06 849
d560168b5d0fb4 Guenter Roeck 2015-08-26 850 free_hwmon:
3bf8bdcf3bada7 Guenter Roeck 2020-01-16 @851 hwmon_dev_release(hdev);
bab2243ce18978 Guenter Roeck 2013-07-06 852 ida_remove:
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 853 ida_simple_remove(&hwmon_ida, id);
bab2243ce18978 Guenter Roeck 2013-07-06 @854 return ERR_PTR(err);
bab2243ce18978 Guenter Roeck 2013-07-06 855 }
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/2] hwmon: Add "label" attribute
2022-01-10 1:29 ` Guenter Roeck
@ 2022-01-10 10:48 ` Paul Cercueil
0 siblings, 0 replies; 10+ messages in thread
From: Paul Cercueil @ 2022-01-10 10:48 UTC (permalink / raw)
To: Guenter Roeck
Cc: Jean Delvare, Jonathan Corbet, linux-hwmon, linux-kernel,
linux-doc, list, Cosmin Tanislav
Hi,
Le dim., janv. 9 2022 at 17:29:24 -0800, Guenter Roeck
<linux@roeck-us.net> a écrit :
> On Wed, Jan 05, 2022 at 03:15:51PM +0000, Paul Cercueil wrote:
>> If a label is defined in the device tree for this device add that
>> to the device specific attributes. This is useful for userspace to
>> be able to identify an individual device when multiple identical
>> chips are present in the system.
>>
>> Signed-off-by: Paul Cercueil <paul@crapouillou.net>
>> Tested-by: Cosmin Tanislav <cosmin.tanislav@analog.com>
>> Reported-by: kernel test robot <lkp@intel.com>
>> ---
>>
>> Notes:
>> v2: - Cache label into hwmon_device
>> - Rename hwmon_dev_name_is_visible() to
>> hwmon_dev_attr_is_visible()
>> - Add missing <linux/property.h> include
>>
>> drivers/hwmon/hwmon.c | 34 +++++++++++++++++++++++++++++++---
>> 1 file changed, 31 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c
>> index 3501a3ead4ba..22e1b47c09fc 100644
>> --- a/drivers/hwmon/hwmon.c
>> +++ b/drivers/hwmon/hwmon.c
>> @@ -18,6 +18,7 @@
>> #include <linux/list.h>
>> #include <linux/module.h>
>> #include <linux/pci.h>
>> +#include <linux/property.h>
>> #include <linux/slab.h>
>> #include <linux/string.h>
>> #include <linux/thermal.h>
>> @@ -30,6 +31,7 @@
>>
>> struct hwmon_device {
>> const char *name;
>> + const char *label;
>> struct device dev;
>> const struct hwmon_chip_info *chip;
>> struct list_head tzdata;
>> @@ -71,17 +73,29 @@ name_show(struct device *dev, struct
>> device_attribute *attr, char *buf)
>> }
>> static DEVICE_ATTR_RO(name);
>>
>> +static ssize_t
>> +label_show(struct device *dev, struct device_attribute *attr, char
>> *buf)
>> +{
>> + return sysfs_emit(buf, "%s\n", to_hwmon_device(dev)->label);
>> +}
>> +static DEVICE_ATTR_RO(label);
>> +
>> static struct attribute *hwmon_dev_attrs[] = {
>> &dev_attr_name.attr,
>> + &dev_attr_label.attr,
>> NULL
>> };
>>
>> -static umode_t hwmon_dev_name_is_visible(struct kobject *kobj,
>> +static umode_t hwmon_dev_attr_is_visible(struct kobject *kobj,
>> struct attribute *attr, int n)
>> {
>> struct device *dev = kobj_to_dev(kobj);
>> + struct hwmon_device *hdev = to_hwmon_device(dev);
>>
>> - if (to_hwmon_device(dev)->name == NULL)
>> + if (attr == &dev_attr_name.attr && hdev->name == NULL)
>> + return 0;
>> +
>> + if (attr == &dev_attr_label.attr && hdev->label == NULL)
>> return 0;
>>
>> return attr->mode;
>> @@ -89,7 +103,7 @@ static umode_t hwmon_dev_name_is_visible(struct
>> kobject *kobj,
>>
>> static const struct attribute_group hwmon_dev_attr_group = {
>> .attrs = hwmon_dev_attrs,
>> - .is_visible = hwmon_dev_name_is_visible,
>> + .is_visible = hwmon_dev_attr_is_visible,
>> };
>>
>> static const struct attribute_group *hwmon_dev_attr_groups[] = {
>> @@ -117,6 +131,7 @@ static void hwmon_dev_release(struct device
>> *dev)
>> if (hwdev->group.attrs)
>> hwmon_free_attrs(hwdev->group.attrs);
>> kfree(hwdev->groups);
>> + kfree(hwdev->label);
>> kfree(hwdev);
>> }
>>
>> @@ -733,6 +748,7 @@ __hwmon_device_register(struct device *dev,
>> const char *name, void *drvdata,
>> const struct attribute_group **groups)
>> {
>> struct hwmon_device *hwdev;
>> + const char *label;
>> struct device *hdev;
>> int i, err, id;
>>
>> @@ -752,6 +768,18 @@ __hwmon_device_register(struct device *dev,
>> const char *name, void *drvdata,
>> goto ida_remove;
>> }
>>
>> + if (device_property_present(dev, "label")) {
>> + err = device_property_read_string(dev, "label", &label);
>> + if (err < 0)
>> + goto free_hwmon;
>> +
>> + hwdev->label = kstrdup(label, GFP_KERNEL);
>> + if (hwdev->label == NULL) {
>> + err = -ENOMEM;
>> + goto free_hwmon;
>
> The code after free_hwmon: uses hdev, so 0-day has a point. Please
> fix.
Yes indeed. I was going to send a v3.
-Paul
>
>> + }
>> + }
>> +
>> hdev = &hwdev->dev;
>>
>> if (chip) {
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2022-01-10 10:49 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-05 15:15 [PATCH v2 0/2] hwmon: Add "label" attribute v2 Paul Cercueil
2022-01-05 15:15 ` [PATCH v2 1/2] ABI: hwmon: Document "label" sysfs attribute Paul Cercueil
2022-01-05 15:15 ` [PATCH v2 2/2] hwmon: Add "label" attribute Paul Cercueil
2022-01-05 22:27 ` kernel test robot
2022-01-05 22:27 ` kernel test robot
2022-01-10 1:29 ` Guenter Roeck
2022-01-10 10:48 ` Paul Cercueil
2022-01-08 9:11 kernel test robot
2022-01-10 6:44 ` Dan Carpenter
2022-01-10 6:44 ` Dan Carpenter
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.