Module Name:    src
Committed By:   pgoyette
Date:           Tue Jan 26 14:22:00 UTC 2010

Modified Files:
        src/sys/dev/sysmon: sysmon_envsys_events.c
        src/sys/sys: envsys.h

Log Message:
Move the limits out of the event structure and into the main sensor.

Use the limits_flags only for calls to the {get,set}_limits() callbacks
and merge the results into upropset, rather than trying to maintain both
values (error prone).


To generate a diff of this commit:
cvs rdiff -u -r1.75 -r1.76 src/sys/dev/sysmon/sysmon_envsys_events.c
cvs rdiff -u -r1.26 -r1.27 src/sys/sys/envsys.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/sysmon/sysmon_envsys_events.c
diff -u src/sys/dev/sysmon/sysmon_envsys_events.c:1.75 src/sys/dev/sysmon/sysmon_envsys_events.c:1.76
--- src/sys/dev/sysmon/sysmon_envsys_events.c:1.75	Mon Jan 18 21:48:15 2010
+++ src/sys/dev/sysmon/sysmon_envsys_events.c	Tue Jan 26 14:22:00 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmon_envsys_events.c,v 1.75 2010/01/18 21:48:15 pgoyette Exp $ */
+/* $NetBSD: sysmon_envsys_events.c,v 1.76 2010/01/26 14:22:00 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 2007, 2008 Juan Romero Pardines.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_events.c,v 1.75 2010/01/18 21:48:15 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_events.c,v 1.76 2010/01/26 14:22:00 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -90,7 +90,9 @@
 	int error = 0;
 	const char *objkey;
 
-	KASSERT(sdict != NULL || edata != NULL || sme != NULL);
+	KASSERT(sdict != NULL);
+	KASSERT(edata != NULL);
+	KASSERT(sme != NULL);
 
 	/* 
 	 * check if the event is already on the list and return
@@ -103,12 +105,18 @@
 		if (crittype != osee->see_type)
 			continue;
 
+		/*
+		 * We found an existing event for this sensor.  Make 
+		 * sure it references the correct edata
+		 */
+		KASSERT(edata == osee->see_edata);
+
 		DPRINTF(("%s: dev %s sensor %s lim_flags 0x%04x event exists\n",
 		    __func__, sme->sme_name, edata->desc, lims->sel_flags));
 
 		see = osee;
 		if (lims->sel_flags & PROP_CRITMAX) {
-			if (lims->sel_critmax == see->see_lims.sel_critmax) {
+			if (lims->sel_critmax == edata->limits.sel_critmax) {
 				DPRINTF(("%s: type=%d (critmax exists)\n",
 				    __func__, crittype));
 				error = EEXIST;
@@ -116,7 +124,7 @@
 			}
 		}
 		if (lims->sel_flags & PROP_WARNMAX) {
-			if (lims->sel_warnmax == see->see_lims.sel_warnmax) {
+			if (lims->sel_warnmax == edata->limits.sel_warnmax) {
 				DPRINTF(("%s: type=%d (warnmax exists)\n",
 				    __func__, crittype));
 				error = EEXIST;
@@ -124,19 +132,21 @@
 			}
 		}
 		if (lims->sel_flags & (PROP_WARNMIN | PROP_BATTWARN)) {
-			if (lims->sel_warnmin == see->see_lims.sel_warnmin) {
+			if (lims->sel_warnmin == edata->limits.sel_warnmin) {
 				DPRINTF(("%s: type=%d (warnmin exists)\n",
 				    __func__, crittype));
 				error = EEXIST;
-				lims->sel_flags &= ~(PROP_WARNMIN | PROP_BATTWARN);
+				lims->sel_flags &=
+					~(PROP_WARNMIN | PROP_BATTWARN);
 			}
 		}
 		if (lims->sel_flags & (PROP_CRITMIN | PROP_BATTCAP)) {
-			if (lims->sel_critmin == see->see_lims.sel_critmin) {
+			if (lims->sel_critmin == edata->limits.sel_critmin) {
 				DPRINTF(("%s: type=%d (critmin exists)\n",
 				    __func__, crittype));
 				error = EEXIST;
-				lims->sel_flags &= ~(PROP_CRITMIN | PROP_BATTCAP);
+				lims->sel_flags &=
+					~(PROP_CRITMIN | PROP_BATTCAP);
 			}
 		}
 		break;
@@ -199,7 +209,7 @@
 			    __func__, sme->sme_name, objkey));
 			error = ENOTSUP;
 		} else {
-			see->see_lims.sel_critmax = lims->sel_critmax;
+			edata->limits.sel_critmax = lims->sel_critmax;
 			error = sme_sensor_upint32(sdict, objkey,
 						   lims->sel_critmax);
 			DPRINTF(("%s: (%s) event [sensor=%s type=%d] "
@@ -208,8 +218,7 @@
 		}
 		if (error && error != EEXIST)
 			goto out;
-		see->see_edata->upropset |= PROP_CRITMAX;
-		see->see_lims.sel_flags |= PROP_CRITMAX;
+		edata->upropset |= PROP_CRITMAX;
 	}
 
 	if (lims->sel_flags & PROP_WARNMAX) {
@@ -220,7 +229,7 @@
 			    __func__, sme->sme_name, objkey));
 			error = ENOTSUP;
 		} else {
-			see->see_lims.sel_warnmax = lims->sel_warnmax;
+			edata->limits.sel_warnmax = lims->sel_warnmax;
 			error = sme_sensor_upint32(sdict, objkey,
 						   lims->sel_warnmax);
 			DPRINTF(("%s: (%s) event [sensor=%s type=%d] "
@@ -229,8 +238,7 @@
 		}
 		if (error && error != EEXIST)
 			goto out;
-		see->see_edata->upropset |= PROP_WARNMAX;
-		see->see_lims.sel_flags |= PROP_WARNMAX;
+		edata->upropset |= PROP_WARNMAX;
 	}
 
 	if (lims->sel_flags & PROP_WARNMIN) {
@@ -241,7 +249,7 @@
 			    __func__, sme->sme_name, objkey));
 			error = ENOTSUP;
 		} else {
-			see->see_lims.sel_warnmin = lims->sel_warnmin;
+			edata->limits.sel_warnmin = lims->sel_warnmin;
 			error = sme_sensor_upint32(sdict, objkey,
 						   lims->sel_warnmin);
 			DPRINTF(("%s: (%s) event [sensor=%s type=%d] "
@@ -250,8 +258,7 @@
 		}
 		if (error && error != EEXIST)
 			goto out;
-		see->see_edata->upropset |= PROP_WARNMIN;
-		see->see_lims.sel_flags |= PROP_WARNMIN;
+		edata->upropset |= PROP_WARNMIN;
 	}
 
 	if (lims->sel_flags & PROP_CRITMIN) {
@@ -262,7 +269,7 @@
 			    __func__, sme->sme_name, objkey));
 			error = ENOTSUP;
 		} else {
-			see->see_lims.sel_critmin = lims->sel_critmin;
+			edata->limits.sel_critmin = lims->sel_critmin;
 			error = sme_sensor_upint32(sdict, objkey,
 						   lims->sel_critmin);
 			DPRINTF(("%s: (%s) event [sensor=%s type=%d] "
@@ -271,8 +278,7 @@
 		}
 		if (error && error != EEXIST)
 			goto out;
-		see->see_edata->upropset |= PROP_CRITMIN;
-		see->see_lims.sel_flags |= PROP_CRITMIN;
+		edata->upropset |= PROP_CRITMIN;
 	}
 
 	if (lims->sel_flags & PROP_BATTWARN) {
@@ -283,7 +289,7 @@
 			    __func__, sme->sme_name, objkey));
 			error = ENOTSUP;
 		} else {
-			see->see_lims.sel_warnmin = lims->sel_warnmin;
+			edata->limits.sel_warnmin = lims->sel_warnmin;
 			error = sme_sensor_upint32(sdict, objkey,
 						   lims->sel_warnmin);
 			DPRINTF(("%s: (%s) event [sensor=%s type=%d] "
@@ -292,8 +298,7 @@
 		}
 		if (error && error != EEXIST)
 			goto out;
-		see->see_edata->upropset |= PROP_BATTWARN;
-		see->see_lims.sel_flags |= PROP_BATTWARN;
+		edata->upropset |= PROP_BATTWARN;
 	}
 
 	if (lims->sel_flags & PROP_BATTCAP) {
@@ -304,7 +309,7 @@
 			    __func__, sme->sme_name, objkey));
 			error = ENOTSUP;
 		} else {
-			see->see_lims.sel_critmin = lims->sel_critmin;
+			edata->limits.sel_critmin = lims->sel_critmin;
 			error = sme_sensor_upint32(sdict, objkey,
 						   lims->sel_critmin);
 			DPRINTF(("%s: (%s) event [sensor=%s type=%d] "
@@ -313,20 +318,21 @@
 		}
 		if (error && error != EEXIST)
 			goto out;
-		see->see_edata->upropset |= PROP_BATTCAP;
-		see->see_lims.sel_flags |= PROP_BATTCAP;
+		edata->upropset |= PROP_BATTCAP;
 	}
 
 	if (lims->sel_flags & PROP_DRIVER_LIMITS)
-		see->see_lims.sel_flags |= PROP_DRIVER_LIMITS;
+		edata->upropset |= PROP_DRIVER_LIMITS;
+	else
+		edata->upropset &= ~PROP_DRIVER_LIMITS;
 
 	DPRINTF(("%s: (%s) event registered (sensor=%s snum=%d type=%d "
 	    "critmin=%" PRIu32 " warnmin=%" PRIu32 " warnmax=%" PRIu32
 	    " critmax=%" PRIu32 " props 0x%04x)\n", __func__,
 	    see->see_sme->sme_name, see->see_pes.pes_sensname,
-	    see->see_edata->sensor, see->see_type, see->see_lims.sel_critmin,
-	    see->see_lims.sel_warnmin, see->see_lims.sel_warnmax,
-	    see->see_lims.sel_critmax, see->see_edata->upropset));
+	    edata->sensor, see->see_type, edata->limits.sel_critmin,
+	    edata->limits.sel_warnmin, edata->limits.sel_warnmax,
+	    edata->limits.sel_critmax, edata->upropset));
 	/*
 	 * Initialize the events framework if it wasn't initialized before.
 	 */
@@ -338,9 +344,8 @@
 	 * limit values
 	 */
 	if (sme->sme_set_limits) {
-		see->see_lims.sel_flags = see->see_edata->upropset &
-					  PROP_LIMITS;
-		(*sme->sme_set_limits)(sme, edata, &(see->see_lims));
+		edata->limits.sel_flags = edata->upropset & PROP_LIMITS;
+		(*sme->sme_set_limits)(sme, edata, &(edata->limits));
 	}
 
 out:
@@ -673,10 +678,10 @@
 	case PENVSYS_EVENT_LIMITS:
 	case PENVSYS_EVENT_CAPACITY:
 #define	__EXCEED_LIM(valid, lim, rel) \
-		((see->see_lims.sel_flags & (valid)) && \
-		 (edata->value_cur rel (see->see_lims.lim)))
+		((edata->limits.sel_flags & (valid)) && \
+		 (edata->value_cur rel (edata->limits.lim)))
 
-		if ((see->see_lims.sel_flags & PROP_DRIVER_LIMITS) == 0) {
+		if ((edata->limits.sel_flags & PROP_DRIVER_LIMITS) == 0) {
 			if __EXCEED_LIM(PROP_CRITMIN | PROP_BATTCAP,
 					sel_critmin, <)
 				edata->state = ENVSYS_SCRITUNDER;

Index: src/sys/sys/envsys.h
diff -u src/sys/sys/envsys.h:1.26 src/sys/sys/envsys.h:1.27
--- src/sys/sys/envsys.h:1.26	Sat Jun 13 16:08:25 2009
+++ src/sys/sys/envsys.h	Tue Jan 26 14:22:00 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: envsys.h,v 1.26 2009/06/13 16:08:25 pgoyette Exp $ */
+/* $NetBSD: envsys.h,v 1.27 2010/01/26 14:22:00 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 1999, 2007 The NetBSD Foundation, Inc.
@@ -47,6 +47,20 @@
 #define ENVSYS_MAXSENSORS	512
 #define ENVSYS_DESCLEN		32
 
+/*
+ * Thresholds/limits that are being monitored
+ */
+struct sysmon_envsys_lim {
+	int32_t		sel_flags;	/* Which limits are valid during
+					 * get_limits()/set_limits calls */
+	int32_t		sel_critmax;
+	int32_t		sel_warnmax;
+	int32_t		sel_warnmin;
+	int32_t		sel_critmin;
+};
+
+typedef struct sysmon_envsys_lim sysmon_envsys_lim_t;
+
 /* struct used by a sensor */
 struct envsys_data {
 	TAILQ_ENTRY(envsys_data)	sensors_head;
@@ -60,6 +74,7 @@
 	int32_t		value_max;	/* max value */
 	int32_t		value_min;	/* min value */
 	int32_t		value_avg;	/* avg value */
+	sysmon_envsys_lim_t limits;	/* thresholds for monitoring */
 	int		upropset;	/* userland property set? */
 	bool		monitor;	/* monitoring enabled/disabled */
 	char		desc[ENVSYS_DESCLEN];	/* sensor description */
@@ -161,19 +176,6 @@
 #define	PROP_LIMITS		0x003f
 
 /*
- * Thresholds/limits that are being monitored
- */
-struct sysmon_envsys_lim {
-	uint32_t	sel_flags;	/* Flag which limits are present */
-	int32_t		sel_critmax;
-	int32_t		sel_warnmax;
-	int32_t		sel_warnmin;
-	int32_t		sel_critmin;
-};
-
-typedef struct sysmon_envsys_lim sysmon_envsys_lim_t;
-
-/*
  * Compatibility with old interface. Only ENVSYS_GTREDATA
  * and ENVSYS_GTREINFO ioctls are supported.
  */

Reply via email to