Lines 1-221
Link Here
|
1 |
--- agent/mibgroup/host/hr_storage.c.orig Fri Oct 7 07:55:23 2005 |
|
|
2 |
+++ agent/mibgroup/host/hr_storage.c Wed Nov 30 12:01:05 2005 |
3 |
@@ -233,6 +233,10 @@ |
4 |
void sol_get_swapinfo(int *, int *); |
5 |
#endif |
6 |
|
7 |
+#if defined(__FreeBSD__) && __FreeBSD_version >= 500102 |
8 |
+void collect_mbuf(long *long_mbuf, long *long_mbufc); |
9 |
+#endif |
10 |
+ |
11 |
#define HRSTORE_MEMSIZE 1 |
12 |
#define HRSTORE_INDEX 2 |
13 |
#define HRSTORE_TYPE 3 |
14 |
@@ -472,7 +476,8 @@ |
15 |
NULL, |
16 |
"Memory Buffers", /* HRS_TYPE_MBUF */ |
17 |
"Real Memory", /* HRS_TYPE_MEM */ |
18 |
- "Swap Space" /* HRS_TYPE_SWAP */ |
19 |
+ "Swap Space", /* HRS_TYPE_SWAP */ |
20 |
+ "Memory Buffer Clusters" /* HRS_TYPE_MBUFCLUSTER */ |
21 |
}; |
22 |
|
23 |
|
24 |
@@ -611,6 +616,7 @@ |
25 |
storage_type_id[storage_type_len - 1] = 3; /* Virtual Mem */ |
26 |
break; |
27 |
case HRS_TYPE_MBUF: |
28 |
+ case HRS_TYPE_MBUFCLUSTER: |
29 |
storage_type_id[storage_type_len - 1] = 1; /* Other */ |
30 |
break; |
31 |
default: |
32 |
@@ -704,7 +710,7 @@ |
33 |
long_return = memory_totals.t_vm; |
34 |
#endif |
35 |
break; |
36 |
-#else /* !linux && !solaris2 && !hpux10 && !hpux11 && ... */ |
37 |
+#else |
38 |
case HRS_TYPE_MEM: |
39 |
long_return = physmem; |
40 |
break; |
41 |
@@ -726,13 +732,45 @@ |
42 |
i++) |
43 |
long_return += mbstat.m_mtypes[i]; |
44 |
#elif defined(MBSTAT_SYMBOL) && defined(STRUCT_MBSTAT_HAS_M_MBUFS) |
45 |
+#if !defined(__FreeBSD__) || __FreeBSD_version < 500021 |
46 |
long_return = mbstat.m_mbufs; |
47 |
+#elif defined(__FreeBSD__) && __FreeBSD_version < 500024 |
48 |
+ /* mbuf stats disabled */ |
49 |
+ return NULL; |
50 |
+#elif defined(__FreeBSD__) |
51 |
+ { |
52 |
+ size_t mlen = sizeof(int); |
53 |
+ int nmbufs; |
54 |
+ if (sysctlbyname("kern.ipc.nmbufs", &nmbufs, &mlen, |
55 |
+ NULL, 0) < 0) { |
56 |
+ return NULL; |
57 |
+ } |
58 |
+ long_return = nmbufs; |
59 |
+ break; |
60 |
+ } |
61 |
+#else |
62 |
+#error "XXX" |
63 |
+ /* XXX TODO: implement new method */ |
64 |
+ return NULL; |
65 |
+#endif /* __FreeBSD__ */ |
66 |
#elif defined(NO_DUMMY_VALUES) |
67 |
goto try_next; |
68 |
#else |
69 |
long_return = 0; |
70 |
#endif |
71 |
break; |
72 |
+#if defined(__FreeBSD__) && __FreeBSD_version >= 500024 |
73 |
+ case HRS_TYPE_MBUFCLUSTER: { |
74 |
+ size_t mlen = sizeof(int); |
75 |
+ int nmbclusters; |
76 |
+ if (sysctlbyname("kern.ipc.nmbclusters", &nmbclusters, &mlen, |
77 |
+ NULL, 0) < 0) { |
78 |
+ return NULL; |
79 |
+ } |
80 |
+ long_return = nmbclusters; |
81 |
+ break; |
82 |
+ } |
83 |
+#endif |
84 |
default: |
85 |
#if NO_DUMMY_VALUES |
86 |
goto try_next; |
87 |
@@ -796,6 +834,12 @@ |
88 |
#endif |
89 |
#elif defined(MBSTAT_SYMBOL) && defined(STRUCT_MBSTAT_HAS_M_CLUSTERS) |
90 |
long_return = mbstat.m_clusters - mbstat.m_clfree; /* unlikely, but... */ |
91 |
+#elif defined(__FreeBSD__) && __FreeBSD_version < 500102 |
92 |
+ /* mbuf stats disabled */ |
93 |
+ return NULL; |
94 |
+#elif defined(__FreeBSD__) |
95 |
+ collect_mbuf((long*)&long_return, (long*)NULL); |
96 |
+ break; |
97 |
#elif defined(NO_DUMMY_VALUES) |
98 |
goto try_next; |
99 |
#else |
100 |
@@ -803,6 +847,11 @@ |
101 |
#endif |
102 |
break; |
103 |
#endif /* !linux && !solaris2 && !hpux10 && !hpux11 && ... */ |
104 |
+#if defined(__FreeBSD__) && __FreeBSD_version >= 500102 |
105 |
+ case HRS_TYPE_MBUFCLUSTER: |
106 |
+ collect_mbuf(NULL, &long_return); |
107 |
+ break; |
108 |
+#endif |
109 |
default: |
110 |
#if NO_DUMMY_VALUES |
111 |
goto try_next; |
112 |
@@ -829,7 +878,11 @@ |
113 |
break; |
114 |
#if !defined(linux) && !defined(solaris2) && !defined(hpux10) && !defined(hpux11) && defined(MBSTAT_SYMBOL) |
115 |
case HRS_TYPE_MBUF: |
116 |
+#if defined(__FreeBSD__) && __FreeBSD_version >= 502113 |
117 |
+ long_return = mbstat.m_mcfail + mbstat.m_mpfail; |
118 |
+#else |
119 |
long_return = mbstat.m_drops; |
120 |
+#endif |
121 |
break; |
122 |
#endif /* !linux && !solaris2 && !hpux10 && !hpux11 && MBSTAT_SYMBOL */ |
123 |
default: |
124 |
@@ -955,3 +1008,97 @@ |
125 |
*usedP = ainfo.ani_resv; |
126 |
} |
127 |
#endif /* solaris2 */ |
128 |
+ |
129 |
+#if defined(__FreeBSD__) && __FreeBSD_version >= 500102 |
130 |
+void |
131 |
+collect_mbuf(long *long_mbuf, long *long_mbufc) |
132 |
+{ |
133 |
+#if __FreeBSD_version >= 502113 |
134 |
+ size_t mlen; |
135 |
+ struct mbstat mbstat; |
136 |
+ |
137 |
+ mlen = sizeof mbstat; |
138 |
+ if (sysctlbyname("kern.ipc.mbstat", &mbstat, &mlen, NULL, 0) < 0) { |
139 |
+ warn("sysctl: retrieving mbstat"); |
140 |
+ return; |
141 |
+ } |
142 |
+ if (mbstat.m_mbufs < 0) mbstat.m_mbufs = 0; /* XXX */ |
143 |
+ if (mbstat.m_mclusts < 0) mbstat.m_mclusts = 0; /* XXX */ |
144 |
+ if (long_mbuf) { |
145 |
+ *long_mbuf = mbstat.m_mbufs; |
146 |
+ } |
147 |
+ if (long_mbufc) { |
148 |
+ *long_mbufc = mbstat.m_mclusts; |
149 |
+ } |
150 |
+#else |
151 |
+ int i, j, num_objs; |
152 |
+ size_t mlen; |
153 |
+ u_long totused[2]; |
154 |
+ u_long totnum, totfree; |
155 |
+ struct mbstat mbstat; |
156 |
+ struct mbpstat **mbpstat = NULL; |
157 |
+ |
158 |
+ if (sysctlbyname("kern.ipc.mb_statpcpu", NULL, &mlen, NULL, 0) < 0) { |
159 |
+ warn("sysctl: retrieving mb_statpcpu len"); |
160 |
+ goto err; |
161 |
+ } |
162 |
+ num_objs = (int)(mlen / sizeof(struct mbpstat)); |
163 |
+ if ((mbpstat = calloc(num_objs, sizeof(struct mbpstat *))) == NULL) { |
164 |
+ warn("calloc: cannot allocate memory for mbpstats pointers"); |
165 |
+ goto err; |
166 |
+ } |
167 |
+ if ((mbpstat[0] = calloc(num_objs, sizeof(struct mbpstat))) == NULL) { |
168 |
+ warn("calloc: cannot allocate memory for mbpstats"); |
169 |
+ goto err; |
170 |
+ } |
171 |
+ |
172 |
+ if (sysctlbyname("kern.ipc.mb_statpcpu", mbpstat[0], &mlen, NULL, 0) < 0) { |
173 |
+ warn("sysctl: retrieving mb_statpcpu"); |
174 |
+ goto err; |
175 |
+ } |
176 |
+ mlen = sizeof mbstat; |
177 |
+ if (sysctlbyname("kern.ipc.mbstat", &mbstat, &mlen, NULL, 0) < 0) { |
178 |
+ warn("sysctl: retrieving mbstat"); |
179 |
+ goto err; |
180 |
+ } |
181 |
+ |
182 |
+ for (i = 0; i < num_objs; i++) |
183 |
+ mbpstat[i] = mbpstat[0] + i; |
184 |
+ |
185 |
+#define GENLST (num_objs - 1) |
186 |
+ |
187 |
+ totnum = mbpstat[GENLST]->mb_mbbucks * mbstat.m_mbperbuck; |
188 |
+ totfree = mbpstat[GENLST]->mb_mbfree; |
189 |
+ for (i = 0; i < (num_objs - 1); i++) { |
190 |
+ if (mbpstat[i]->mb_active == 0) |
191 |
+ continue; |
192 |
+ totnum += mbpstat[i]->mb_mbbucks * mbstat.m_mbperbuck; |
193 |
+ totfree += mbpstat[i]->mb_mbfree; |
194 |
+ } |
195 |
+ totused[0] = totnum - totfree; |
196 |
+ totnum = mbpstat[GENLST]->mb_clbucks * mbstat.m_clperbuck; |
197 |
+ totfree = mbpstat[GENLST]->mb_clfree; |
198 |
+ for (i = 0; i < (num_objs - 1); i++) { |
199 |
+ if (mbpstat[i]->mb_active == 0) |
200 |
+ continue; |
201 |
+ totnum += mbpstat[i]->mb_clbucks * mbstat.m_clperbuck; |
202 |
+ totfree += mbpstat[i]->mb_clfree; |
203 |
+ } |
204 |
+ totused[1] = totnum - totfree; |
205 |
+ |
206 |
+ if (long_mbuf) { |
207 |
+ *long_mbuf = totused[0]; |
208 |
+ } |
209 |
+ if (long_mbufc) { |
210 |
+ *long_mbufc = totused[1]; |
211 |
+ } |
212 |
+ |
213 |
+ err: |
214 |
+ if (mbpstat != NULL) { |
215 |
+ if (mbpstat[0] != NULL) |
216 |
+ free(mbpstat[0]); |
217 |
+ free(mbpstat); |
218 |
+ } |
219 |
+#endif |
220 |
+} |
221 |
+#endif |