201 { "pages_notenqueued", KSTAT_DATA_UINT64},
202 { "pages_notdequeued", KSTAT_DATA_UINT64},
203 { "pages_pending", KSTAT_DATA_UINT64},
204 { "pages_pending_kas", KSTAT_DATA_UINT64},
205 { "pages_deferred", KSTAT_DATA_UINT64},
206 { "pages_deferred_kernel", KSTAT_DATA_UINT64},
207 { "pages_limit", KSTAT_DATA_UINT64},
208 { "pages_limit_exceeded", KSTAT_DATA_UINT64},
209 { "pages_fma", KSTAT_DATA_UINT64},
210 { "pages_multiple_ce", KSTAT_DATA_UINT64},
211 { "pages_ue", KSTAT_DATA_UINT64},
212 { "pages_ue_cleared_retired", KSTAT_DATA_UINT64},
213 { "pages_ue_cleared_freed", KSTAT_DATA_UINT64},
214 { "pages_ue_persistent", KSTAT_DATA_UINT64},
215 { "pages_unretired", KSTAT_DATA_UINT64},
216 };
217
218 static kstat_t *page_retire_ksp = NULL;
219
220 #define PR_INCR_KSTAT(stat) \
221 atomic_add_64(&(page_retire_kstat.stat.value.ui64), 1)
222 #define PR_DECR_KSTAT(stat) \
223 atomic_add_64(&(page_retire_kstat.stat.value.ui64), -1)
224
225 #define PR_KSTAT_RETIRED_CE (page_retire_kstat.pr_mce.value.ui64)
226 #define PR_KSTAT_RETIRED_FMA (page_retire_kstat.pr_fma.value.ui64)
227 #define PR_KSTAT_RETIRED_NOTUE (PR_KSTAT_RETIRED_CE + PR_KSTAT_RETIRED_FMA)
228 #define PR_KSTAT_PENDING (page_retire_kstat.pr_pending.value.ui64)
229 #define PR_KSTAT_PENDING_KAS (page_retire_kstat.pr_pending_kas.value.ui64)
230 #define PR_KSTAT_EQFAIL (page_retire_kstat.pr_enqueue_fail.value.ui64)
231 #define PR_KSTAT_DQFAIL (page_retire_kstat.pr_dequeue_fail.value.ui64)
232
233 /*
234 * page retire kstats to list all retired pages
235 */
236 static int pr_list_kstat_update(kstat_t *ksp, int rw);
237 static int pr_list_kstat_snapshot(kstat_t *ksp, void *buf, int rw);
238 kmutex_t pr_list_kstat_mutex;
239
240 /*
241 * Limit the number of multiple CE page retires.
242 * The default is 0.1% of physmem, or 1 in 1000 pages. This is set in
243 * basis points, where 100 basis points equals one percent.
|
201 { "pages_notenqueued", KSTAT_DATA_UINT64},
202 { "pages_notdequeued", KSTAT_DATA_UINT64},
203 { "pages_pending", KSTAT_DATA_UINT64},
204 { "pages_pending_kas", KSTAT_DATA_UINT64},
205 { "pages_deferred", KSTAT_DATA_UINT64},
206 { "pages_deferred_kernel", KSTAT_DATA_UINT64},
207 { "pages_limit", KSTAT_DATA_UINT64},
208 { "pages_limit_exceeded", KSTAT_DATA_UINT64},
209 { "pages_fma", KSTAT_DATA_UINT64},
210 { "pages_multiple_ce", KSTAT_DATA_UINT64},
211 { "pages_ue", KSTAT_DATA_UINT64},
212 { "pages_ue_cleared_retired", KSTAT_DATA_UINT64},
213 { "pages_ue_cleared_freed", KSTAT_DATA_UINT64},
214 { "pages_ue_persistent", KSTAT_DATA_UINT64},
215 { "pages_unretired", KSTAT_DATA_UINT64},
216 };
217
218 static kstat_t *page_retire_ksp = NULL;
219
220 #define PR_INCR_KSTAT(stat) \
221 atomic_inc_64(&(page_retire_kstat.stat.value.ui64))
222 #define PR_DECR_KSTAT(stat) \
223 atomic_dec_64(&(page_retire_kstat.stat.value.ui64))
224
225 #define PR_KSTAT_RETIRED_CE (page_retire_kstat.pr_mce.value.ui64)
226 #define PR_KSTAT_RETIRED_FMA (page_retire_kstat.pr_fma.value.ui64)
227 #define PR_KSTAT_RETIRED_NOTUE (PR_KSTAT_RETIRED_CE + PR_KSTAT_RETIRED_FMA)
228 #define PR_KSTAT_PENDING (page_retire_kstat.pr_pending.value.ui64)
229 #define PR_KSTAT_PENDING_KAS (page_retire_kstat.pr_pending_kas.value.ui64)
230 #define PR_KSTAT_EQFAIL (page_retire_kstat.pr_enqueue_fail.value.ui64)
231 #define PR_KSTAT_DQFAIL (page_retire_kstat.pr_dequeue_fail.value.ui64)
232
233 /*
234 * page retire kstats to list all retired pages
235 */
236 static int pr_list_kstat_update(kstat_t *ksp, int rw);
237 static int pr_list_kstat_snapshot(kstat_t *ksp, void *buf, int rw);
238 kmutex_t pr_list_kstat_mutex;
239
240 /*
241 * Limit the number of multiple CE page retires.
242 * The default is 0.1% of physmem, or 1 in 1000 pages. This is set in
243 * basis points, where 100 basis points equals one percent.
|