PERFORCE change 80926 for review
Victor Cruceru
soc-victor at FreeBSD.org
Sun Jul 24 22:16:36 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=80926
Change 80926 by soc-victor at soc-victor_82.76.158.176 on 2005/07/24 22:16:09
Added the SNMP instrumentation for hrProcessorTable and updated the hrDeviceTable accordingly.
Still need to improve the per CPU load statistics as the HR-MIB requires ( load average per last minute).
Affected files ...
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/Makefile#12 edit
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c#3 edit
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_processor_tbl.c#1 add
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.c#10 edit
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.h#14 edit
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_swrun_tbl.c#4 edit
Differences ...
==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/Makefile#12 (text+ko) ====
@@ -32,7 +32,9 @@
SRCS= hostres_snmp.c hostres_scalars.c \
hostres_storage_tbl.c hostres_fs_tbl.c \
hostres_swrun_tbl.c hostres_swrunperf_tbl.c \
- hostres_device_tbl.c
+ hostres_device_tbl.c \
+ hostres_processor_tbl.c
+
WARNS?= 6
#Not having NDEBUG defined will enable assertions and a lot of output on stderr
CFLAGS+= -DNDEBUG
@@ -53,5 +55,5 @@
DEFS= ${MOD}_tree.def
BMIBS= HOST-RESOURCES-MIB.txt HOST-RESOURCES-TYPES.txt
-LDADD= -lkvm -ldevinfo
+LDADD= -lkvm -ldevinfo -lm
.include <bsd.lib.mk>
==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c#3 (text+ko) ====
@@ -171,6 +171,12 @@
assert(out_type_p != NULL);
if(dev_p == NULL)
return;
+
+ if (strncmp(dev_p->dd_name, "cpu", strlen("cpu")) == 0 &&
+ strstr(dev_p->dd_location, ".CPU") != NULL) {
+ *out_type_p = (struct asn_oid)OIDX_hrDeviceProcessor;
+ return;
+ }
*out_type_p = (struct asn_oid)OIDX_hrDeviceOther; /*FIX ME*/
}
@@ -179,10 +185,9 @@
hrDevice_getStatus(struct devinfo_dev *dev) {
assert(dev != NULL);
switch (dev->dd_state) {
+ case DIS_ALIVE: /* probe succeeded */
case DIS_NOTPRESENT: /* not probed or probe failed */
return (DS_DOWN);
- case DIS_ALIVE: /* probe succeeded */
- return (DS_TESTING);
case DIS_ATTACHED: /* attach method called */
case DIS_BUSY: /* device is open */
return (DR_RUNNING);
==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.c#10 (text+ko) ====
@@ -94,40 +94,50 @@
hrState_g.hrSWOSIndex = 0;
+ /*data structures initialization for hrStrorageTable*/
hrState_g.next_hrStorage_index = 1;
STAILQ_INIT(&hrState_g.storage_name_map);
TAILQ_INIT(&hrState_g.hr_storage_tbl);
-
+ /*data structures initialization for hrFSTable*/
hrState_g.next_hrFS_index = 1;
STAILQ_INIT(&hrState_g.fs_name_map);
TAILQ_INIT(&hrState_g.hr_fs_tbl);
-
+
+ /*data structure initialization for hrSWRunTable & hrSWRunTable*/
TAILQ_INIT(&hrState_g.hr_swrun_tbl);
-
+ /*data structures initialization for hrDeviceTable*/
hrState_g.next_hrDevice_index = 1;
STAILQ_INIT(&hrState_g.device_name_map);
TAILQ_INIT(&hrState_g.hr_device_tbl);
+ /*data structure initialization for hrProcessorTable*/
+ hrState_g.detected_processor_count = 0;
+ hrState_g.hw_ncpu = 0;
+ hrState_g.fscale = 0;
+ hrState_g.ccpu = 0;
+ TAILQ_INIT(&hrState_g.hr_processor_tbl);
hrState_g.hr_storage_tick = 0;
hrState_g.hr_fs_tick = 0;
hrState_g.hr_swrun_tick = 0;
hrState_g.hr_device_tick = 0;
-
+ hrState_g.hr_processor_tick = 0;
+
hrState_g.hrStorage_tbl_age = 0;
hrState_g.hrFS_tbl_age = 0;
hrState_g.hrSWRun_tbl_age = 0;
hrState_g.hrDevice_tbl_age = 0;
-
+ hrState_g.hrProcessor_tbl_age = 0;
init_hrStorage_tbl_v();
init_hrFS_tbl_v();
init_hrSWRun_tbl_v(); /*also the hrSWRunPerfTable's
support is initialized here */
init_hrDevice_tbl_v();
-
+ init_hrProcessor_tbl_v();
+
HR_DPRINTF((stderr, "[%s] done.\n", __func__));
return (0);
@@ -172,21 +182,28 @@
fini_hrFS_tbl_v();
fini_hrSWRun_tbl_v();
fini_hrDevice_tbl_v();
+ fini_hrProcessor_tbl_v();
hrState_g.hr_storage_tick = 0;
hrState_g.hr_fs_tick = 0;
hrState_g.hr_swrun_tick = 0;
hrState_g.hr_device_tick = 0;
+ hrState_g.hr_processor_tick = 0;
hrState_g.hrStorage_tbl_age = 0;
hrState_g.hrFS_tbl_age = 0;
hrState_g.hrSWRun_tbl_age = 0;
hrState_g.hrDevice_tbl_age = 0;
-
+ hrState_g.hrProcessor_tbl_age = 0;
+
hrState_g.dev_root = NULL;
hrState_g.hrSWOSIndex = 0;
-
+
+ hrState_g.hw_ncpu = 0;
+ hrState_g.fscale = 0;
+ hrState_g.ccpu = 0;
+
if( host_registration_id > 0){
or_unregister(host_registration_id);
}
@@ -219,6 +236,11 @@
refresh_hrDevice_tbl_v();
}
+ if ( (time(NULL) - hrState_g.hrProcessor_tbl_age) > HR_PROCESSOR_TBL_REFRESH ) {
+ HR_DPRINTF((stderr, "%s: hrProcessorTable needs refresh\n ", __func__));
+ refresh_hrProcessor_tbl_v();
+ }
+
HR_DPRINTF((stderr, "[%s] done.\n ", __func__));
}
@@ -291,14 +313,6 @@
*/
-int op_hrProcessorTable(struct snmp_context *ctx __unused,
- struct snmp_value *value __unused,
- u_int sub __unused,
- u_int iidx __unused,
- enum snmp_op curr_op __unused)
-{
- return (SNMP_ERR_NOSUCHNAME);
-}
int op_hrNetworkTable(struct snmp_context *ctx __unused,
==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.h#14 (text+ko) ====
@@ -46,6 +46,7 @@
#include <sys/vmmeter.h>
#include <devinfo.h>
+#include <sys/types.h>
/*a debug macro*/
#ifndef NDEBUG
@@ -57,8 +58,8 @@
#define HR_DPRINTF(ARGS)
#endif /*NDEBUG*/
+#define IS_KERNPROC(kp) ( ((kp)->ki_flag & P_KTHREAD) == P_KTHREAD )
-
/*
* This structure is used to hold a SNMP table entry
* for HOST-RESOURCES-MIB's hrStorageTable
@@ -193,13 +194,31 @@
TAILQ_HEAD(swrun_tbl, hrSWRunTblEntry);
+/*
+ * This structure is used to hold a SNMP table entry
+ * for HOST-RESOURCES-MIB's hrProcessorTable
+ * Note that index is external being allocated & mainatined
+ * by the hrDeviceTable code.
+ */
+struct hrProcessorTblEntry {
+ int32_t index;
+ struct asn_oid frwId;
+ int32_t load;
+ TAILQ_ENTRY(hrProcessorTblEntry) link;
+ /*not from SNMP table definition, only used internally*/
+ u_char cpu_no; /*which cpu, counted from 0*/
+ pid_t idle_pid; /*the PID of ide process for this CPU */
+};
+
+TAILQ_HEAD(processor_tbl, hrProcessorTblEntry);
+
enum DeviceStatus {
DS_UNKNOWN = 1,
DR_RUNNING = 2,
DS_WARNING = 3,
DS_TESTING = 4,
- DS_DOWN = 4
+ DS_DOWN = 5
};
@@ -313,7 +332,20 @@
struct
devinfo_dev *dev_root;
-
+
+ /*
+ * next items are used for hrProcessorTable
+ */
+ struct
+ processor_tbl hr_processor_tbl; /*the head of the list with hrDeviceTable's entries */
+ int32_t detected_processor_count;
+ int hw_ncpu; /*get it via sysctlbyname(hw.ncpu)*/
+ fixpt_t ccpu; /* kernel _ccpu variable */
+ int fscale; /* kernel _fscale variable */
+
+ time_t hrProcessor_tbl_age;
+ uint64_t hr_processor_tick; /*last (agent) tick when hrProcessorTable was updated */
+
};
@@ -445,5 +477,28 @@
*/
void refresh_hrDevice_tbl_v(void);
+/*
+ * Init the things for hrProcessorTable
+ */
+void init_hrProcessor_tbl_v(void);
+
+/*
+ * Finalization routine for hrProcessorTable
+ * It destroys the lists and frees any allocated heap memory
+ */
+void fini_hrProcessor_tbl_v(void);
+
+/*
+ * Next macro represents the number of seconds
+ * between two consecutive queries to the OS for getting the new data
+ * for hrProcessorTable (only for load numbers)
+ */
+#define HR_PROCESSOR_TBL_REFRESH 5
+/*
+ * Refresh routine for hrProcessorTable
+ * Usable for polling the system for load numbers.
+ */
+void refresh_hrProcessor_tbl_v(void);
+
#endif /*__HOSTRES_SNMP_H_INCLUDED__ */
==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_swrun_tbl.c#4 (text+ko) ====
@@ -45,7 +45,6 @@
#include <signal.h>
-#define IS_KERNPROC(kp) ( ((kp)->ki_flag & P_KTHREAD) == P_KTHREAD )
/*
* Ugly thing: PID_MAX, NO_PID defined only in kernel
*/
More information about the p4-projects
mailing list