A few changes to make it possible to read UVM histories from userland:
- Protect option headers from inclusion if ! _KERNEL or if _LKM. - Make sure struct uvm_history is always the same size (not dependent on NCPU). - Add fmtlen and fnlen members to struct uvm_history_ent, which specify the lengths fo the fmt and fn strings. - Add name, namelen, and a list entry to struct uvm_history. - When a history is initialized, place it on the global list of all histories.
This commit is contained in:
parent
cb5f8ef1df
commit
872181c2f2
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: uvm_stat.h,v 1.8 1998/02/12 20:10:18 thorpej Exp $ */
|
/* $NetBSD: uvm_stat.h,v 1.9 1998/02/13 04:55:14 thorpej Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XXXCDC: "ROUGH DRAFT" QUALITY UVM PRE-RELEASE FILE!
|
* XXXCDC: "ROUGH DRAFT" QUALITY UVM PRE-RELEASE FILE!
|
||||||
|
@ -41,7 +41,11 @@
|
||||||
#ifndef _UVM_UVM_STAT_H_
|
#ifndef _UVM_UVM_STAT_H_
|
||||||
#define _UVM_UVM_STAT_H_
|
#define _UVM_UVM_STAT_H_
|
||||||
|
|
||||||
|
#if defined(_KERNEL) && !defined(_LKM)
|
||||||
#include "opt_uvmhist.h"
|
#include "opt_uvmhist.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <sys/queue.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* uvm_stat: monitor what is going on with uvm (or whatever)
|
* uvm_stat: monitor what is going on with uvm (or whatever)
|
||||||
|
@ -97,20 +101,25 @@ extern struct uvm_cnt *uvm_cnt_head;
|
||||||
struct uvm_history_ent {
|
struct uvm_history_ent {
|
||||||
struct timeval tv; /* time stamp */
|
struct timeval tv; /* time stamp */
|
||||||
char *fmt; /* printf format */
|
char *fmt; /* printf format */
|
||||||
|
size_t fmtlen; /* length of printf format */
|
||||||
char *fn; /* function name */
|
char *fn; /* function name */
|
||||||
|
size_t fnlen; /* length of function name */
|
||||||
u_long call; /* function call number */
|
u_long call; /* function call number */
|
||||||
u_long v[4]; /* values */
|
u_long v[4]; /* values */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct uvm_history {
|
struct uvm_history {
|
||||||
|
const char *name; /* name of this this history */
|
||||||
|
size_t namelen; /* length of name, not including null */
|
||||||
|
LIST_ENTRY(uvm_history) list; /* link on list of all histories */
|
||||||
int n; /* number of entries */
|
int n; /* number of entries */
|
||||||
int f; /* next free one */
|
int f; /* next free one */
|
||||||
#if NCPU > 1
|
|
||||||
simple_lock_data_t l; /* lock on this history */
|
simple_lock_data_t l; /* lock on this history */
|
||||||
#endif /* NCPU */
|
|
||||||
struct uvm_history_ent *e; /* the malloc'd entries */
|
struct uvm_history_ent *e; /* the malloc'd entries */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
LIST_HEAD(uvm_history_head, uvm_history);
|
||||||
|
|
||||||
#ifndef UVMHIST
|
#ifndef UVMHIST
|
||||||
#define UVMHIST_DECL(NAME)
|
#define UVMHIST_DECL(NAME)
|
||||||
#define UVMHIST_INIT(NAME,N)
|
#define UVMHIST_INIT(NAME,N)
|
||||||
|
@ -120,9 +129,13 @@ struct uvm_history {
|
||||||
#define UVMHIST_FUNC(FNAME)
|
#define UVMHIST_FUNC(FNAME)
|
||||||
#define uvmhist_dump(NAME)
|
#define uvmhist_dump(NAME)
|
||||||
#else
|
#else
|
||||||
|
extern struct uvm_history_head uvm_histories;
|
||||||
|
|
||||||
#define UVMHIST_DECL(NAME) struct uvm_history NAME
|
#define UVMHIST_DECL(NAME) struct uvm_history NAME
|
||||||
|
|
||||||
#define UVMHIST_INIT(NAME,N) { \
|
#define UVMHIST_INIT(NAME,N) { \
|
||||||
|
(NAME).name = __STRING(NAME); \
|
||||||
|
(NAME).namelen = strlen((NAME).name); \
|
||||||
(NAME).n = (N); \
|
(NAME).n = (N); \
|
||||||
(NAME).f = 0; \
|
(NAME).f = 0; \
|
||||||
simple_lock_init(&(NAME).l); \
|
simple_lock_init(&(NAME).l); \
|
||||||
|
@ -130,14 +143,18 @@ struct uvm_history {
|
||||||
malloc(sizeof(struct uvm_history_ent) * (N), M_TEMP, \
|
malloc(sizeof(struct uvm_history_ent) * (N), M_TEMP, \
|
||||||
M_WAITOK); \
|
M_WAITOK); \
|
||||||
bzero((NAME).e, sizeof(struct uvm_history_ent) * (N)); \
|
bzero((NAME).e, sizeof(struct uvm_history_ent) * (N)); \
|
||||||
|
LIST_INSERT_HEAD(&uvm_histories, &(NAME), list); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define UVMHIST_INIT_STATIC(NAME,BUF) { \
|
#define UVMHIST_INIT_STATIC(NAME,BUF) { \
|
||||||
|
(NAME).name = __STRING(NAME); \
|
||||||
|
(NAME).namelen = strlen((NAME).name); \
|
||||||
(NAME).n = sizeof(BUF) / sizeof(struct uvm_history_ent); \
|
(NAME).n = sizeof(BUF) / sizeof(struct uvm_history_ent); \
|
||||||
(NAME).f = 0; \
|
(NAME).f = 0; \
|
||||||
simple_lock_init(&(NAME).l); \
|
simple_lock_init(&(NAME).l); \
|
||||||
(NAME).e = (struct uvm_history_ent *) (BUF); \
|
(NAME).e = (struct uvm_history_ent *) (BUF); \
|
||||||
bzero((NAME).e, sizeof(struct uvm_history_ent) * (NAME).n); \
|
bzero((NAME).e, sizeof(struct uvm_history_ent) * (NAME).n); \
|
||||||
|
LIST_INSERT_HEAD(&uvm_histories, &(NAME), list); \
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int cold;
|
extern int cold;
|
||||||
|
@ -164,7 +181,9 @@ extern int uvmhist_print_enabled;
|
||||||
splx(s); \
|
splx(s); \
|
||||||
if (!cold) microtime(&(NAME).e[i].tv); \
|
if (!cold) microtime(&(NAME).e[i].tv); \
|
||||||
(NAME).e[i].fmt = (FMT); \
|
(NAME).e[i].fmt = (FMT); \
|
||||||
|
(NAME).e[i].fmtlen = strlen((NAME).e[i].fmt); \
|
||||||
(NAME).e[i].fn = _uvmhist_name; \
|
(NAME).e[i].fn = _uvmhist_name; \
|
||||||
|
(NAME).e[i].fnlen = strlen((NAME).e[i].fn); \
|
||||||
(NAME).e[i].call = _uvmhist_call; \
|
(NAME).e[i].call = _uvmhist_call; \
|
||||||
(NAME).e[i].v[0] = (u_long)(A); \
|
(NAME).e[i].v[0] = (u_long)(A); \
|
||||||
(NAME).e[i].v[1] = (u_long)(B); \
|
(NAME).e[i].v[1] = (u_long)(B); \
|
||||||
|
|
Loading…
Reference in New Issue