Re: [PATCH v2] Add support for new attributes to libsensors and to the sensors command

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.

[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.

> --
> 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.

> +  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.

>  	{ 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.

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.

>    sensors-detect: Stop calling for PIIX5 SMBus testers
>                    Improve filtering of fake DMI data
>                    Print DMI system/product version if available


-- 
Jean Delvare

_______________________________________________
lm-sensors mailing list
lm-sensors@xxxxxxxxxxxxxx
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors


[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux