Use kvm_getcptime(3) to fetch the global CPU time stats from a crashdump

since the 'cp_time' symbol doesn't exist in recent kernels.  This fixes
iostat and vmstat on crash dumps.

MFC after:	1 week
This commit is contained in:
John Baldwin 2008-08-19 21:33:09 +00:00
parent f110b23b7d
commit 32c9e3bd01
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=181881
2 changed files with 28 additions and 23 deletions

View File

@ -81,29 +81,27 @@ __FBSDID("$FreeBSD$");
static char da[] = "da"; static char da[] = "da";
static struct nlist namelist[] = { static struct nlist namelist[] = {
#define X_CPTIME 0 #define X_SUM 0
{ "_cp_time" },
#define X_SUM 1
{ "_cnt" }, { "_cnt" },
#define X_BOOTTIME 2 #define X_BOOTTIME 1
{ "_boottime" }, { "_boottime" },
#define X_HZ 3 #define X_HZ 2
{ "_hz" }, { "_hz" },
#define X_STATHZ 4 #define X_STATHZ 3
{ "_stathz" }, { "_stathz" },
#define X_NCHSTATS 5 #define X_NCHSTATS 4
{ "_nchstats" }, { "_nchstats" },
#define X_INTRNAMES 6 #define X_INTRNAMES 5
{ "_intrnames" }, { "_intrnames" },
#define X_EINTRNAMES 7 #define X_EINTRNAMES 6
{ "_eintrnames" }, { "_eintrnames" },
#define X_INTRCNT 8 #define X_INTRCNT 7
{ "_intrcnt" }, { "_intrcnt" },
#define X_EINTRCNT 9 #define X_EINTRCNT 8
{ "_eintrcnt" }, { "_eintrcnt" },
#define X_KMEMSTATS 10 #define X_KMEMSTATS 9
{ "_kmemstatistics" }, { "_kmemstatistics" },
#define X_KMEMZONES 11 #define X_KMEMZONES 10
{ "_kmemzones" }, { "_kmemzones" },
#ifdef notyet #ifdef notyet
#define X_DEFICIT XXX #define X_DEFICIT XXX
@ -116,7 +114,7 @@ static struct nlist namelist[] = {
{ "_xstats" }, { "_xstats" },
#define X_END XXX #define X_END XXX
#else #else
#define X_END 12 #define X_END 11
#endif #endif
{ "" }, { "" },
}; };
@ -610,7 +608,8 @@ dovmstat(unsigned int interval, int reps)
if (!--hdrcnt) if (!--hdrcnt)
printhdr(ncpus, cpumask); printhdr(ncpus, cpumask);
if (kd != NULL) { if (kd != NULL) {
kread(X_CPTIME, cur.cp_time, sizeof(cur.cp_time)); if (kvm_getcptime(kd, cur.cp_time) < 0)
errx(1, "kvm_getcptime: %s", kvm_geterr(kd));
} else { } else {
size = sizeof(cur.cp_time); size = sizeof(cur.cp_time);
mysysctl("kern.cp_time", &cur.cp_time, &size, NULL, 0); mysysctl("kern.cp_time", &cur.cp_time, &size, NULL, 0);

View File

@ -124,11 +124,9 @@ struct nlist namelist[] = {
{ "_tk_nin" }, { "_tk_nin" },
#define X_TK_NOUT 1 #define X_TK_NOUT 1
{ "_tk_nout" }, { "_tk_nout" },
#define X_CP_TIME 2 #define X_BOOTTIME 2
{ "_cp_time" },
#define X_BOOTTIME 3
{ "_boottime" }, { "_boottime" },
#define X_END 3 #define X_END 2
{ NULL }, { NULL },
}; };
@ -463,11 +461,19 @@ main(int argc, char **argv)
} }
if (Cflag > 0) { if (Cflag > 0) {
if (readvar(kd, "kern.cp_time", X_CP_TIME, if (kd == NULL) {
&cur.cp_time, sizeof(cur.cp_time)) != 0) { if (readvar(kd, "kern.cp_time", 0,
Cflag = 0; &cur.cp_time, sizeof(cur.cp_time)) != 0)
warnx("disabling CPU time statistics"); Cflag = 0;
} else {
if (kvm_getcptime(kd, cur.cp_time) < 0) {
warnx("kvm_getcptime: %s",
kvm_geterr(kd));
Cflag = 0;
}
} }
if (Cflag == 0)
warnx("disabling CPU time statistics");
} }
if (!--headercount) { if (!--headercount) {