Error messages on ignored values

Jean Delvare khali at linux-fr.org
Fri Feb 4 12:34:43 CET 2005


Hi Michael,

> I am running Debian sarge, with a 2.6.10 kernel that I have built, the
> user programs of lm_sensors-2.9.0, and the 2.6.10 kernel patch.

Which patch are you talking about?

> I am able to run sensors, and get valid output, but the values that are
> marked ignore in the sensors.conf are reported as unreadable. I changed a
> label value in the conf file and saw the output of sensors change, so I
> know I am looking at the correct configuration file.
>
> I have added a debug message to progs/sensors/chips.c to print out the
> result of sensors_get_ignored, and see that the config file is being used
> to determine that the values should be ignored.
>
> mcarland at myth:~/lm_sensors-2.9.0/prog/sensors$ lsmod
> Module                  Size  Used by
> vt1211                 16692  0
> i2c_sensor              2784  1 vt1211
> i2c_isa                 1600  0
> lirc_serial            11328  0
> lirc_dev               11404  1 lirc_serial
> mcarland at myth:~/lm_sensors-2.9.0/prog/sensors$ uname -a
> Linux myth 2.6.10myth-via #5 Thu Feb 3 21:24:11 UTC 2005 i686 GNU/Linux

FWIW, the 2.6.10 linux kernel doesn't have a vt1211 driver, so we can
hardly support this.

> I see that the logic to print out the values checks the ignored status,
> but doesn't use it until after an attempt to read the values:
>
>  if (!sensors_get_label_and_valid(*name,SENSORS_VT1211_IN0,&label,&valid) &&
>      !sensors_get_feature(*name,SENSORS_VT1211_IN0,&cur) &&
>      !sensors_get_feature(*name,SENSORS_VT1211_IN0_MIN,&min) &&
>      !sensors_get_feature(*name,SENSORS_VT1211_IN0_MAX,&max)) {
>    if (valid) {
>      print_label(label,10);
>      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
>             cur,min,max,alarms&VT1211_ALARM_IN0?"ALARM":"");
>    }
>  } else
>    printf("ERROR: Can't get IN0 data!\n");
>  free_the_label(&label);

I agree with your analysis of the code. Looks suboptimal, since we do
read values even when we already know we'll ignore them.

> Shouldn't either sensors_get_feature(...) not do the read if the feature
> is not valid (only that function would have to be changed),

Bad idea, sensors_get_feature is part of libsensors, on which several
other monitoring tools are based. We better don't change the interface
without a solid reasons - and this one isn't.

> or more
> appropriately change the logic for each section like the one above to
> break if !valid, before sensors_get_feature(...) is called? Something like
>
>  if (sensors_get_label_and_valid(*name,SENSORS_VT1211_IN0,&label,&valid)) {
>    printf("ERROR: Can't get IN0 data!\n");
>  } else if (valid) {
>    if (!sensors_get_feature(*name,SENSORS_VT1211_IN0,&cur) &&
>        !sensors_get_feature(*name,SENSORS_VT1211_IN0_MIN,&min) &&
>        !sensors_get_feature(*name,SENSORS_VT1211_IN0_MAX,&max)) {
>        print_label(label,10);
>        printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
>               cur,min,max,alarms&VT1211_ALARM_IN0?"ALARM":"");
>    } else
>    printf("ERROR: Can't get IN0 data!\n");
>  }
>  free_the_label(&label);

Agreed, that would be better.

Now you might wonder why the problem was never noticed and fixed, since
it seems to spread across all chips print functions. The reason is
rather simple. In the times of Linux 2.4, hardware monitoring drivers
would use procfs as the user-space/kernel interface. With procfs, it was
difficult to add or remove individual interface files depending on a
given chip configuration, thus it wasn't done. As a result, "sensors"
could safely read any value, even if that value wouldn't make any
sense, and it was left to the user to add the proper "ignore" lines in
the configuration files.

When we started porting drivers to Linux 2.6 and sysfs, we found it was
now easy to disable specific interface files when they wouldn't mean a
thing for a specific chip configuration. That sounded like a sane thing
to do (let's not waste resources) but sensors started complaining in
this case. The solution that was used so far was to discard the
complaint itself, because a missing interface file was now considered
possible and no more necessarily an error.

The approach you propose is slightly different, since the user would have
to put "ignore" lines in his/her configuration file in order to
dismiss the error message. So, while it looks cleaner, I am not sure it
is the way to go. If we do what you propose, we are likely to get many
reports about the errors, which aren't really errors.

The idea of not reading values for ignored channels still makes sense
though, as it improves performance, and isn't incompatible with hiding
errors on missing interface files.

Feel tree to propose a patch for print_vt1211 that will remove the error
message for the files that now can possibly not be there, and would also
skip reads on ignored channels if you want. We'd apply such a patch.

Thanks,
--
Jean Delvare



More information about the lm-sensors mailing list