@@ -396,6 +396,9 @@ static ssize_t show_val(struct device *dev,
struct acpi_device *acpi_dev = to_acpi_device(dev);
struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
u64 val = 0;
+ int ret;
+
+ guard(mutex)(&resource->lock);
switch (attr->index) {
case 0:
@@ -423,6 +426,13 @@ static ssize_t show_val(struct device *dev,
val = 0;
break;
case 6:
+ ret = update_meter(resource);
+ if (ret)
+ return ret;
+ ret = update_cap(resource);
+ if (ret)
+ return ret;
+
if (resource->power > resource->cap)
val = 1;
else
The 'power1_alarm' attribute uses the 'power' and 'cap' in the acpi_power_meter_resource structure. However, these two fields are just updated when user query 'power' and 'cap' attribute, or hardware enforced limit. If user directly query the 'power1_alarm' attribute without queryng above two attributes, driver will use the uninitialized variables to judge. In addition, the 'power1_alarm' attribute needs to update power and cap to show the real state. Signed-off-by: Huisong Li <lihuisong@huawei.com> --- drivers/hwmon/acpi_power_meter.c | 10 ++++++++++ 1 file changed, 10 insertions(+)