mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-04 12:54:37 +08:00
ixgbe: Convert to use devm_hwmon_device_register_with_groups
Simplify the code. Attach hwmon sysfs attributes to hwmon device instead of pci device. Avoid race conditions caused by attributes being created after hwmon device registration. Implicitly (through hwmon API) add mandatory 'name' sysfs attribute. Other cleanup: Instead of allocating memory for hwmon attributes, move attributes and all other hwmon related data into struct hwmon_buff and allocate the entire structure using devm_kzalloc. Check return value from calls to igb_add_hwmon_attr() one by one instead of logically combining them all together. Signed-off-by: Guenter Roeck <linux@roeck-us.net> Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
220fe050da
commit
03b77d8180
@ -552,8 +552,10 @@ struct hwmon_attr {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct hwmon_buff {
|
struct hwmon_buff {
|
||||||
struct device *device;
|
struct attribute_group group;
|
||||||
struct hwmon_attr *hwmon_list;
|
const struct attribute_group *groups[2];
|
||||||
|
struct attribute *attrs[IXGBE_MAX_SENSORS * 4 + 1];
|
||||||
|
struct hwmon_attr hwmon_list[IXGBE_MAX_SENSORS * 4];
|
||||||
unsigned int n_hwmon;
|
unsigned int n_hwmon;
|
||||||
};
|
};
|
||||||
#endif /* CONFIG_IXGBE_HWMON */
|
#endif /* CONFIG_IXGBE_HWMON */
|
||||||
@ -775,7 +777,7 @@ struct ixgbe_adapter {
|
|||||||
u32 vferr_refcount;
|
u32 vferr_refcount;
|
||||||
struct kobject *info_kobj;
|
struct kobject *info_kobj;
|
||||||
#ifdef CONFIG_IXGBE_HWMON
|
#ifdef CONFIG_IXGBE_HWMON
|
||||||
struct hwmon_buff ixgbe_hwmon_buff;
|
struct hwmon_buff *ixgbe_hwmon_buff;
|
||||||
#endif /* CONFIG_IXGBE_HWMON */
|
#endif /* CONFIG_IXGBE_HWMON */
|
||||||
#ifdef CONFIG_DEBUG_FS
|
#ifdef CONFIG_DEBUG_FS
|
||||||
struct dentry *ixgbe_dbg_adapter;
|
struct dentry *ixgbe_dbg_adapter;
|
||||||
|
@ -111,8 +111,8 @@ static int ixgbe_add_hwmon_attr(struct ixgbe_adapter *adapter,
|
|||||||
unsigned int n_attr;
|
unsigned int n_attr;
|
||||||
struct hwmon_attr *ixgbe_attr;
|
struct hwmon_attr *ixgbe_attr;
|
||||||
|
|
||||||
n_attr = adapter->ixgbe_hwmon_buff.n_hwmon;
|
n_attr = adapter->ixgbe_hwmon_buff->n_hwmon;
|
||||||
ixgbe_attr = &adapter->ixgbe_hwmon_buff.hwmon_list[n_attr];
|
ixgbe_attr = &adapter->ixgbe_hwmon_buff->hwmon_list[n_attr];
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case IXGBE_HWMON_TYPE_LOC:
|
case IXGBE_HWMON_TYPE_LOC:
|
||||||
@ -147,32 +147,17 @@ static int ixgbe_add_hwmon_attr(struct ixgbe_adapter *adapter,
|
|||||||
ixgbe_attr->dev_attr.store = NULL;
|
ixgbe_attr->dev_attr.store = NULL;
|
||||||
ixgbe_attr->dev_attr.attr.mode = S_IRUGO;
|
ixgbe_attr->dev_attr.attr.mode = S_IRUGO;
|
||||||
ixgbe_attr->dev_attr.attr.name = ixgbe_attr->name;
|
ixgbe_attr->dev_attr.attr.name = ixgbe_attr->name;
|
||||||
|
sysfs_attr_init(&ixgbe_attr->dev_attr.attr);
|
||||||
|
|
||||||
rc = device_create_file(&adapter->pdev->dev,
|
adapter->ixgbe_hwmon_buff->attrs[n_attr] = &ixgbe_attr->dev_attr.attr;
|
||||||
&ixgbe_attr->dev_attr);
|
|
||||||
|
|
||||||
if (rc == 0)
|
++adapter->ixgbe_hwmon_buff->n_hwmon;
|
||||||
++adapter->ixgbe_hwmon_buff.n_hwmon;
|
|
||||||
|
|
||||||
return rc;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ixgbe_sysfs_del_adapter(struct ixgbe_adapter *adapter)
|
static void ixgbe_sysfs_del_adapter(struct ixgbe_adapter *adapter)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
if (adapter == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (i = 0; i < adapter->ixgbe_hwmon_buff.n_hwmon; i++) {
|
|
||||||
device_remove_file(&adapter->pdev->dev,
|
|
||||||
&adapter->ixgbe_hwmon_buff.hwmon_list[i].dev_attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
kfree(adapter->ixgbe_hwmon_buff.hwmon_list);
|
|
||||||
|
|
||||||
if (adapter->ixgbe_hwmon_buff.device)
|
|
||||||
hwmon_device_unregister(adapter->ixgbe_hwmon_buff.device);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* called from ixgbe_main.c */
|
/* called from ixgbe_main.c */
|
||||||
@ -184,9 +169,9 @@ void ixgbe_sysfs_exit(struct ixgbe_adapter *adapter)
|
|||||||
/* called from ixgbe_main.c */
|
/* called from ixgbe_main.c */
|
||||||
int ixgbe_sysfs_init(struct ixgbe_adapter *adapter)
|
int ixgbe_sysfs_init(struct ixgbe_adapter *adapter)
|
||||||
{
|
{
|
||||||
struct hwmon_buff *ixgbe_hwmon = &adapter->ixgbe_hwmon_buff;
|
struct hwmon_buff *ixgbe_hwmon;
|
||||||
|
struct device *hwmon_dev;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int n_attrs;
|
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
/* If this method isn't defined we don't support thermals */
|
/* If this method isn't defined we don't support thermals */
|
||||||
@ -198,23 +183,13 @@ int ixgbe_sysfs_init(struct ixgbe_adapter *adapter)
|
|||||||
if (adapter->hw.mac.ops.init_thermal_sensor_thresh(&adapter->hw))
|
if (adapter->hw.mac.ops.init_thermal_sensor_thresh(&adapter->hw))
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
/*
|
ixgbe_hwmon = devm_kzalloc(&adapter->pdev->dev, sizeof(*ixgbe_hwmon),
|
||||||
* Allocation space for max attributs
|
|
||||||
* max num sensors * values (loc, temp, max, caution)
|
|
||||||
*/
|
|
||||||
n_attrs = IXGBE_MAX_SENSORS * 4;
|
|
||||||
ixgbe_hwmon->hwmon_list = kcalloc(n_attrs, sizeof(struct hwmon_attr),
|
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!ixgbe_hwmon->hwmon_list) {
|
if (ixgbe_hwmon == NULL) {
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
goto err;
|
goto exit;
|
||||||
}
|
|
||||||
|
|
||||||
ixgbe_hwmon->device = hwmon_device_register(&adapter->pdev->dev);
|
|
||||||
if (IS_ERR(ixgbe_hwmon->device)) {
|
|
||||||
rc = PTR_ERR(ixgbe_hwmon->device);
|
|
||||||
goto err;
|
|
||||||
}
|
}
|
||||||
|
adapter->ixgbe_hwmon_buff = ixgbe_hwmon;
|
||||||
|
|
||||||
for (i = 0; i < IXGBE_MAX_SENSORS; i++) {
|
for (i = 0; i < IXGBE_MAX_SENSORS; i++) {
|
||||||
/*
|
/*
|
||||||
@ -226,17 +201,28 @@ int ixgbe_sysfs_init(struct ixgbe_adapter *adapter)
|
|||||||
|
|
||||||
/* Bail if any hwmon attr struct fails to initialize */
|
/* Bail if any hwmon attr struct fails to initialize */
|
||||||
rc = ixgbe_add_hwmon_attr(adapter, i, IXGBE_HWMON_TYPE_CAUTION);
|
rc = ixgbe_add_hwmon_attr(adapter, i, IXGBE_HWMON_TYPE_CAUTION);
|
||||||
rc |= ixgbe_add_hwmon_attr(adapter, i, IXGBE_HWMON_TYPE_LOC);
|
|
||||||
rc |= ixgbe_add_hwmon_attr(adapter, i, IXGBE_HWMON_TYPE_TEMP);
|
|
||||||
rc |= ixgbe_add_hwmon_attr(adapter, i, IXGBE_HWMON_TYPE_MAX);
|
|
||||||
if (rc)
|
if (rc)
|
||||||
goto err;
|
goto exit;
|
||||||
|
rc = ixgbe_add_hwmon_attr(adapter, i, IXGBE_HWMON_TYPE_LOC);
|
||||||
|
if (rc)
|
||||||
|
goto exit;
|
||||||
|
rc = ixgbe_add_hwmon_attr(adapter, i, IXGBE_HWMON_TYPE_TEMP);
|
||||||
|
if (rc)
|
||||||
|
goto exit;
|
||||||
|
rc = ixgbe_add_hwmon_attr(adapter, i, IXGBE_HWMON_TYPE_MAX);
|
||||||
|
if (rc)
|
||||||
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
goto exit;
|
ixgbe_hwmon->groups[0] = &ixgbe_hwmon->group;
|
||||||
|
ixgbe_hwmon->group.attrs = ixgbe_hwmon->attrs;
|
||||||
|
|
||||||
err:
|
hwmon_dev = devm_hwmon_device_register_with_groups(&adapter->pdev->dev,
|
||||||
ixgbe_sysfs_del_adapter(adapter);
|
"ixgbe",
|
||||||
|
ixgbe_hwmon,
|
||||||
|
ixgbe_hwmon->groups);
|
||||||
|
if (IS_ERR(hwmon_dev))
|
||||||
|
rc = PTR_ERR(hwmon_dev);
|
||||||
exit:
|
exit:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user