[lm-sensors] [PATCH v2] Add support for new attributes to libsensors and to the sensors command
Guenter Roeck
guenter.roeck at ericsson.com
Sun Jan 8 23:20:37 CET 2012
On Sun, Jan 08, 2012 at 04:45:02PM -0500, Jean Delvare wrote:
> Hi Guenter,
>
> Sorry for the late review.
>
> On Sun, 6 Nov 2011 14:46:22 -0800, Guenter Roeck wrote:
> > Add support for new sysfs attributes to libsensors and to the sensors command.
> >
> > v2: Use defines for array sizes. Some of the resulting arrays are larger than necessary,
> > but that is better than missing an array size update if the number of attributes
> > changes.
>
> I don't get the logic. I understand the point of computing the sizes
> automatically to avoid an overflow [1], but then why don't you compute
> the right values? It's only a matter of adding a "- 1" after every call
> to ARRAY_SIZE(), this seems fairly easy and cheap.
>
> Or maybe you were referring to the fact that some attributes are
> mutually exclusive per Documentation/hwmon/sysfs-interface (in
> particular, general alarm flag vs. limit-specific alarm flags.) It was
> probably a bad idea to rely on this in the first place anyway, so I
> have no objection in changing this.
>
Yes, correct, though I had mostly the power sensors in mind if I recall correctly.
> [1] Note that the overflows couldn't really happen, BTW, as we have
> code to catch them in get_sensor_limit_data(). Maybe these checks can
> go away if the array sizes are now guaranteed to be sufficient by
> construction?
>
> This should really be a separate patch, BTW, as this is not related to
> the original purpose of the patch.
>
Sure, no problem.
> > Index: doc/libsensors-API.txt
> > ===================================================================
> > --- doc/libsensors-API.txt (revision 5996)
> > +++ doc/libsensors-API.txt (working copy)
> > @@ -7,6 +7,16 @@
> > given new feature.
> >
> > 0x431 lm-sensors 3.3.0 to 3.3.1
> > +* Added support for new sysfs attributes
> > + enum sensors_subfeature_type SENSORS_SUBFEATURE_IN_AVERAGE
> > + enum sensors_subfeature_type SENSORS_SUBFEATURE_IN_LOWEST
> > + enum sensors_subfeature_type SENSORS_SUBFEATURE_IN_HIGHEST
> > + enum sensors_subfeature_type SENSORS_SUBFEATURE_TEMP_AVERAGE
>
> I don't see this one in Documentation/hwmon/sysfs-interface.
>
Me not either, nor am I aware of any sensors implementing it.
No idea where I got that idea from.
> > + enum sensors_subfeature_type SENSORS_SUBFEATURE_TEMP_LOWEST
> > + enum sensors_subfeature_type SENSORS_SUBFEATURE_TEMP_HIGHEST
> > + enum sensors_subfeature_type SENSORS_SUBFEATURE_CURR_AVERAGE
> > + enum sensors_subfeature_type SENSORS_SUBFEATURE_CURR_LOWEST
> > + enum sensors_subfeature_type SENSORS_SUBFEATURE_CURR_HIGHEST
> > * Added support for intrusion detection
> > enum sensors_feature_type SENSORS_FEATURE_INTRUSION
> > enum sensors_subfeature_type SENSORS_SUBFEATURE_INTRUSION_ALARM
> > Index: lib/sensors.h
> > ===================================================================
> > --- lib/sensors.h (revision 5996)
> > +++ lib/sensors.h (working copy)
> > @@ -157,6 +157,9 @@
> > SENSORS_SUBFEATURE_IN_MAX,
> > SENSORS_SUBFEATURE_IN_LCRIT,
> > SENSORS_SUBFEATURE_IN_CRIT,
> > + SENSORS_SUBFEATURE_IN_AVERAGE,
> > + SENSORS_SUBFEATURE_IN_LOWEST,
> > + SENSORS_SUBFEATURE_IN_HIGHEST,
> > SENSORS_SUBFEATURE_IN_ALARM = (SENSORS_FEATURE_IN << 8) | 0x80,
> > SENSORS_SUBFEATURE_IN_MIN_ALARM,
> > SENSORS_SUBFEATURE_IN_MAX_ALARM,
> > @@ -181,6 +184,9 @@
> > SENSORS_SUBFEATURE_TEMP_LCRIT,
> > SENSORS_SUBFEATURE_TEMP_EMERGENCY,
> > SENSORS_SUBFEATURE_TEMP_EMERGENCY_HYST,
> > + SENSORS_SUBFEATURE_TEMP_AVERAGE,
> > + SENSORS_SUBFEATURE_TEMP_LOWEST,
> > + SENSORS_SUBFEATURE_TEMP_HIGHEST,
> > SENSORS_SUBFEATURE_TEMP_ALARM = (SENSORS_FEATURE_TEMP << 8) | 0x80,
> > SENSORS_SUBFEATURE_TEMP_MAX_ALARM,
> > SENSORS_SUBFEATURE_TEMP_MIN_ALARM,
> > @@ -215,6 +221,9 @@
> > SENSORS_SUBFEATURE_CURR_MAX,
> > SENSORS_SUBFEATURE_CURR_LCRIT,
> > SENSORS_SUBFEATURE_CURR_CRIT,
> > + SENSORS_SUBFEATURE_CURR_AVERAGE,
> > + SENSORS_SUBFEATURE_CURR_LOWEST,
> > + SENSORS_SUBFEATURE_CURR_HIGHEST,
> > SENSORS_SUBFEATURE_CURR_ALARM = (SENSORS_FEATURE_CURR << 8) | 0x80,
> > SENSORS_SUBFEATURE_CURR_MIN_ALARM,
> > SENSORS_SUBFEATURE_CURR_MAX_ALARM,
> > Index: lib/sysfs.c
> > ===================================================================
> > --- lib/sysfs.c (revision 5996)
> > +++ lib/sysfs.c (working copy)
> > @@ -233,6 +233,9 @@
> > { "lcrit", SENSORS_SUBFEATURE_TEMP_LCRIT },
> > { "emergency", SENSORS_SUBFEATURE_TEMP_EMERGENCY },
> > { "emergency_hyst", SENSORS_SUBFEATURE_TEMP_EMERGENCY_HYST },
> > + { "average", SENSORS_SUBFEATURE_TEMP_AVERAGE },
> > + { "lowest", SENSORS_SUBFEATURE_TEMP_LOWEST },
> > + { "highest", SENSORS_SUBFEATURE_TEMP_HIGHEST },
> > { "alarm", SENSORS_SUBFEATURE_TEMP_ALARM },
> > { "min_alarm", SENSORS_SUBFEATURE_TEMP_MIN_ALARM },
> > { "max_alarm", SENSORS_SUBFEATURE_TEMP_MAX_ALARM },
> > @@ -252,6 +255,9 @@
> > { "max", SENSORS_SUBFEATURE_IN_MAX },
> > { "lcrit", SENSORS_SUBFEATURE_IN_LCRIT },
> > { "crit", SENSORS_SUBFEATURE_IN_CRIT },
> > + { "average", SENSORS_SUBFEATURE_IN_AVERAGE },
> > + { "lowest", SENSORS_SUBFEATURE_IN_LOWEST },
> > + { "highest", SENSORS_SUBFEATURE_IN_HIGHEST },
> > { "alarm", SENSORS_SUBFEATURE_IN_ALARM },
> > { "min_alarm", SENSORS_SUBFEATURE_IN_MIN_ALARM },
> > { "max_alarm", SENSORS_SUBFEATURE_IN_MAX_ALARM },
> > @@ -302,6 +308,9 @@
> > { "max", SENSORS_SUBFEATURE_CURR_MAX },
> > { "lcrit", SENSORS_SUBFEATURE_CURR_LCRIT },
> > { "crit", SENSORS_SUBFEATURE_CURR_CRIT },
> > + { "average", SENSORS_SUBFEATURE_CURR_AVERAGE },
> > + { "lowest", SENSORS_SUBFEATURE_CURR_LOWEST },
> > + { "highest", SENSORS_SUBFEATURE_CURR_HIGHEST },
> > { "alarm", SENSORS_SUBFEATURE_CURR_ALARM },
> > { "min_alarm", SENSORS_SUBFEATURE_CURR_MIN_ALARM },
> > { "max_alarm", SENSORS_SUBFEATURE_CURR_MAX_ALARM },
> > Index: prog/sensors/chips.c
> > ===================================================================
> > --- prog/sensors/chips.c (revision 5996)
> > +++ prog/sensors/chips.c (working copy)
> > @@ -280,15 +280,26 @@
> > { SENSORS_SUBFEATURE_TEMP_CRIT, temp_crit_sensors, 0, "crit" },
> > { SENSORS_SUBFEATURE_TEMP_EMERGENCY, temp_emergency_sensors, 0,
> > "emerg" },
> > + { SENSORS_SUBFEATURE_TEMP_AVERAGE, NULL, 0, "avg" },
> > + { SENSORS_SUBFEATURE_TEMP_LOWEST, NULL, 0, "lowest" },
> > + { SENSORS_SUBFEATURE_TEMP_HIGHEST, NULL, 0, "highest" },
> > { -1, NULL, 0, NULL }
> > };
> >
> > +#define NUM_TEMP_ALARMS 6
> > +#define NUM_TEMP_SENSORS (ARRAY_SIZE(temp_sensors) \
> > + + ARRAY_SIZE(temp_max_sensors) \
> > + + ARRAY_SIZE(temp_crit_sensors) \
> > + + ARRAY_SIZE(temp_emergency_sensors) \
> > + - NUM_TEMP_ALARMS)
> > +
> > +
> > static void print_chip_temp(const sensors_chip_name *name,
> > const sensors_feature *feature,
> > int label_size)
> > {
> > - struct sensor_subfeature_data sensors[8];
> > - struct sensor_subfeature_data alarms[5];
> > + struct sensor_subfeature_data sensors[NUM_TEMP_SENSORS];
> > + struct sensor_subfeature_data alarms[NUM_TEMP_ALARMS];
> > int sensor_count, alarm_count;
> > const sensors_subfeature *sf;
> > double val;
> > @@ -365,17 +376,23 @@
> > { SENSORS_SUBFEATURE_IN_MIN, NULL, 0, "min" },
> > { SENSORS_SUBFEATURE_IN_MAX, NULL, 0, "max" },
> > { SENSORS_SUBFEATURE_IN_CRIT, NULL, 0, "crit max" },
> > + { SENSORS_SUBFEATURE_IN_AVERAGE, NULL, 0, "avg" },
> > + { SENSORS_SUBFEATURE_IN_LOWEST, NULL, 0, "lowest" },
> > + { SENSORS_SUBFEATURE_IN_HIGHEST, NULL, 0, "highest" },
> > { -1, NULL, 0, NULL }
> > };
> >
> > +#define NUM_IN_ALARMS 5
> > +#define NUM_IN_SENSORS (ARRAY_SIZE(voltage_sensors) - NUM_IN_ALARMS)
> > +
> > static void print_chip_in(const sensors_chip_name *name,
> > const sensors_feature *feature,
> > int label_size)
> > {
> > const sensors_subfeature *sf;
> > char *label;
> > - struct sensor_subfeature_data sensors[4];
> > - struct sensor_subfeature_data alarms[4];
> > + struct sensor_subfeature_data sensors[NUM_IN_SENSORS];
> > + struct sensor_subfeature_data alarms[NUM_IN_ALARMS];
> > int sensor_count, alarm_count;
> > double val;
> >
> > @@ -504,6 +521,7 @@
> > };
> >
> > static const struct sensor_subfeature_list power_inst_sensors[] = {
> > + { SENSORS_SUBFEATURE_POWER_AVERAGE, NULL, 0, "avg" },
>
> I'm confused. This one was missing on purpose. For power sensors we
> consider instantaneous and averaging sensors as different types. The
> code in function print_chip_power is pretty clear about this. So, just
> as all _INPUT subfeatures aren't listed in limit arrays,
> SENSORS_SUBFEATURE_POWER_AVERAGE must not be listed.
>
LM25066 reports instantaneous, average, and peak power, and I wanted to be able
to display it all.
> > { SENSORS_SUBFEATURE_POWER_INPUT_LOWEST, NULL, 0, "lowest" },
> > { SENSORS_SUBFEATURE_POWER_INPUT_HIGHEST, NULL, 0, "highest" },
> > { -1, NULL, 0, NULL }
> > @@ -517,14 +535,20 @@
> > { -1, NULL, 0, NULL }
> > };
> >
> > +#define NUM_POWER_ALARMS 4
> > +#define NUM_POWER_SENSORS (ARRAY_SIZE(power_common_sensors) \
> > + + ARRAY_SIZE(power_inst_sensors) \
> > + + ARRAY_SIZE(power_avg_sensors) \
> > + - NUM_POWER_ALARMS)
>
> Due to the specificity of the power sensors described above, the
> computed value is larger than needed. We'll use power_inst_sensors or
> power_avg_sensors but never both. You could define a MAX() macro to
> select the right one for to compute NUM_POWER_SENSORS.
>
Yes, I know, thus the comment at the very beginning.
> If you want to change the code to display both types, this can be
> discussed, but please keep the definition of NUM_POWER_SENSORS in line
> with the code that uses it, for clarity.
>
> > +
> > static void print_chip_power(const sensors_chip_name *name,
> > const sensors_feature *feature,
> > int label_size)
> > {
> > double val;
> > const sensors_subfeature *sf;
> > - struct sensor_subfeature_data sensors[6];
> > - struct sensor_subfeature_data alarms[3];
> > + struct sensor_subfeature_data sensors[NUM_POWER_SENSORS];
> > + struct sensor_subfeature_data alarms[NUM_POWER_ALARMS];
> > int sensor_count, alarm_count;
> > char *label;
> > const char *unit;
> > @@ -653,9 +677,15 @@
> > { SENSORS_SUBFEATURE_CURR_MIN, NULL, 0, "min" },
> > { SENSORS_SUBFEATURE_CURR_MAX, NULL, 0, "max" },
> > { SENSORS_SUBFEATURE_CURR_CRIT, NULL, 0, "crit max" },
> > + { SENSORS_SUBFEATURE_CURR_AVERAGE, NULL, 0, "avg" },
> > + { SENSORS_SUBFEATURE_CURR_LOWEST, NULL, 0, "lowest" },
> > + { SENSORS_SUBFEATURE_CURR_HIGHEST, NULL, 0, "highest" },
> > { -1, NULL, 0, NULL }
> > };
> >
> > +#define NUM_CURR_ALARM 5
> > +#define NUM_CURR_SENSORS (ARRAY_SIZE(current_sensors) - NUM_CURR_ALARM)
> > +
> > static void print_chip_curr(const sensors_chip_name *name,
> > const sensors_feature *feature,
> > int label_size)
> > @@ -663,8 +693,8 @@
> > const sensors_subfeature *sf;
> > double val;
> > char *label;
> > - struct sensor_subfeature_data sensors[4];
> > - struct sensor_subfeature_data alarms[4];
> > + struct sensor_subfeature_data sensors[NUM_CURR_SENSORS];
> > + struct sensor_subfeature_data alarms[NUM_CURR_ALARM];
> > int sensor_count, alarm_count;
> >
> > if (!(label = sensors_get_label(name, feature))) {
> > Index: CHANGES
> > ===================================================================
> > --- CHANGES (revision 5996)
> > +++ CHANGES (working copy)
> > @@ -2,6 +2,10 @@
> > -----------------------
> >
> > SVN HEAD
> > + libsensors: Added support for new sysfs attributes
> > + sensors: Added support for new sysfs attributes
> > + For power sensors, display both instantaneous and average data
> > + if available
>
> Your patch doesn't actually implement that second change. Which is
> good, BTW, this unrelated change would really belong to a separate
> patch.
>
Hmm - I thought it did. I'll take it out for now and have another look.
Thanks a lot for the review.
Guenter
More information about the lm-sensors
mailing list