diff options
author | phk <phk@FreeBSD.org> | 2003-03-15 21:59:06 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2003-03-15 21:59:06 +0000 |
commit | f432014308d6b21386e15affbbca62043615671d (patch) | |
tree | c322a33c0275fefd9ca33cd377e3d6f459cb9a8c /lib/libdevstat/devstat.h | |
parent | d16675cd85efe1cde6bf077376276f3de06f0263 (diff) | |
download | FreeBSD-src-f432014308d6b21386e15affbbca62043615671d.zip FreeBSD-src-f432014308d6b21386e15affbbca62043615671d.tar.gz |
Run a revision of the devstat interface:
Kernel:
Change statistics to use the *uptime() timescale (ie: relative to
boottime) rather than the UTC aligned timescale. This makes the
device statistics code oblivious to clock steps.
Change timestamps to bintime format, they are cheaper.
Remove the "busy_count", and replace it with two counter fields:
"start_count" and "end_count", which are updated in the down and
up paths respectively. This removes the locking constraint on
devstat.
Add a timestamp argument to devstat_start_transaction(), this will
normally be a timestamp set by the *_bio() function in bp->bio_t0.
Use this field to calculate duration of I/O operations.
Add two timestamp arguments to devstat_end_transaction(), one is
the current time, a NULL pointer means "take timestamp yourself",
the other is the timestamp of when this transaction started (see
above).
Change calculation of busy_time to operate on "the salami principle":
Only when we are idle, which we can determine by the start+end
counts being identical, do we update the "busy_from" field in the
down path. In the up path we accumulate the timeslice in busy_time
and update busy_from.
Change the byte_* and num_* fields into two arrays: bytes[] and
operations[].
Userland:
Change the misleading "busy_time" name to be called "snap_time" and
make the time long double since that is what most users need anyway,
fill it using clock_gettime(CLOCK_MONOTONIC) to put it on the same
timescale as the kernel fields.
Change devstat_compute_etime() to operate on struct bintime.
Remove the version 2 legacy interface: the change to bintime makes
compatibility far too expensive.
Fix a bug in systat's "vm" page where boot relative busy times would
be bogus.
Bump __FreeBSD_version to 500107
Review & Collaboration by: ken
Diffstat (limited to 'lib/libdevstat/devstat.h')
-rw-r--r-- | lib/libdevstat/devstat.h | 42 |
1 files changed, 14 insertions, 28 deletions
diff --git a/lib/libdevstat/devstat.h b/lib/libdevstat/devstat.h index c1ae355..09af217 100644 --- a/lib/libdevstat/devstat.h +++ b/lib/libdevstat/devstat.h @@ -35,6 +35,16 @@ #include <kvm.h> +/* + * Bumped every time we change the userland API. Hopefully this doesn't + * happen very often! This should be bumped every time we have to + * increment SHLIB_MAJOR in the libdevstat Makefile (for non-backwards + * compatible API changes) and should also be bumped every time we make + * backwards-compatible API changes, so application writers have a way to + * determine when a particular feature is available. + */ +#define DEVSTAT_USER_API_VER 4 + #define DEVSTAT_ERRBUF_SIZE 2048 /* size of the devstat library error string */ extern char devstat_errbuf[]; @@ -111,7 +121,7 @@ struct statinfo { long tk_nin; long tk_nout; struct devinfo *dinfo; - struct timeval busy_time; + long double snap_time; }; typedef enum { @@ -122,31 +132,7 @@ typedef enum { } devstat_select_mode; __BEGIN_DECLS -/* Legacy interfaces. */ -int getnumdevs(void); -long getgeneration(void); -int getversion(void); -int checkversion(void); -int getdevs(struct statinfo *stats); -int selectdevs(struct device_selection **dev_select, int *num_selected, - int *num_selections, long *select_generation, - long current_generation, struct devstat *devices, int numdevs, - struct devstat_match *matches, int num_matches, - char **dev_selections, int num_dev_selections, - devstat_select_mode select_mode, int maxshowdevs, - int perf_select); -int buildmatch(char *match_str, struct devstat_match **matches, - int *num_matches); -int compute_stats(struct devstat *current, struct devstat *previous, - long double etime, u_int64_t *total_bytes, - u_int64_t *total_transfers, u_int64_t *total_blocks, - long double *kb_per_transfer, - long double *transfers_per_second, long double *mb_per_second, - long double *blocks_per_second, - long double *ms_per_transaction); -long double compute_etime(struct timeval cur_time, struct timeval prev_time); - -/* New interfaces. */ + int devstat_getnumdevs(kvm_t *kd); long devstat_getgeneration(kvm_t *kd); int devstat_getversion(kvm_t *kd); @@ -164,8 +150,8 @@ int devstat_buildmatch(char *match_str, struct devstat_match **matches, int devstat_compute_statistics(struct devstat *current, struct devstat *previous, long double etime, ...); -long double devstat_compute_etime(struct timeval cur_time, - struct timeval prev_time); +long double devstat_compute_etime(struct bintime *cur_time, + struct bintime *prev_time); __END_DECLS #endif /* _DEVSTAT_H */ |