typedef struct {
/* registered state */
- OSStatusHandler *handler;
const char *name_verbose;
const char *name;
} os_status;
}
-/*
- *-----------------------------------------------------------------------------
- *
- * OS_Snprintf --
- *
- * Print a string into a bounded memory location.
- *
- * Results:
- * Number of character printed including trailing \0.
- *
- * Side effects:
- * None
- *
- *-----------------------------------------------------------------------------
- */
-
-int
-OS_Snprintf(char *buf, // OUT
- size_t size, // IN
- const char *format, // IN
- ...) // IN
-{
- int result;
- va_list args;
-
- va_start(args, format);
- result = vsnprintf(buf, size, format, args);
- va_end(args);
-
- return result;
-}
-
-
/*
*-----------------------------------------------------------------------------
*
Bool
OS_Init(const char *name, // IN
- const char *nameVerbose, // IN
- OSStatusHandler *handler) // IN
+ const char *nameVerbose) // IN
{
os_state *state = &global_state;
os_pmap *pmap = &state->pmap;
callout_handle_init(&state->timer.callout_handle);
/* initialize status state */
- state->status.handler = handler;
state->status.name = name;
state->status.name_verbose = nameVerbose;
static int
vmmemctl_sysctl(SYSCTL_HANDLER_ARGS)
{
- char stats[PAGE_SIZE];
- size_t len;
-
- len = 1 + global_state.status.handler(stats, PAGE_SIZE);
-
- return SYSCTL_OUT(req, stats, len);
+ char buf[PAGE_SIZE];
+ size_t len = 0;
+ const BalloonStats *stats = Balloon_GetStats();
+
+ /* format size info */
+ len += snprintf(buf + len, sizeof(buf) - len,
+ "target: %8d pages\n"
+ "current: %8d pages\n",
+ stats->nPagesTarget,
+ stats->nPages);
+
+ /* format rate info */
+ len += snprintf(buf + len, sizeof(buf) - len,
+ "rateNoSleepAlloc: %8d pages/sec\n"
+ "rateSleepAlloc: %8d pages/sec\n"
+ "rateFree: %8d pages/sec\n",
+ stats->rateNoSleepAlloc,
+ stats->rateAlloc,
+ stats->rateFree);
+
+ len += snprintf(buf + len, sizeof(buf) - len,
+ "\n"
+ "timer: %8u\n"
+ "start: %8u (%4u failed)\n"
+ "guestType: %8u (%4u failed)\n"
+ "lock: %8u (%4u failed)\n"
+ "unlock: %8u (%4u failed)\n"
+ "target: %8u (%4u failed)\n"
+ "primNoSleepAlloc: %8u (%4u failed)\n"
+ "primCanSleepAlloc: %8u (%4u failed)\n"
+ "primFree: %8u\n"
+ "errAlloc: %8u\n"
+ "errFree: %8u\n",
+ stats->timer,
+ stats->start, stats->startFail,
+ stats->guestType, stats->guestTypeFail,
+ stats->lock, stats->lockFail,
+ stats->unlock, stats->unlockFail,
+ stats->target, stats->targetFail,
+ stats->primAlloc[BALLOON_PAGE_ALLOC_NOSLEEP],
+ stats->primAllocFail[BALLOON_PAGE_ALLOC_NOSLEEP],
+ stats->primAlloc[BALLOON_PAGE_ALLOC_CANSLEEP],
+ stats->primAllocFail[BALLOON_PAGE_ALLOC_CANSLEEP],
+ stats->primFree,
+ stats->primErrorPageAlloc,
+ stats->primErrorPageFree);
+
+ return SYSCTL_OUT(req, buf, len + 1);
}
*/
extern Bool OS_Init(const char *name,
- const char *nameVerbose,
- OSStatusHandler *handler);
+ const char *nameVerbose);
extern void OS_Cleanup(void);
extern BalloonGuest OS_Identity(void);
extern void OS_MemZero(void *ptr, size_t size);
extern void OS_MemCopy(void *dest, const void *src, size_t size);
-extern int OS_Snprintf(char *buf, size_t size, const char *format, ...);
extern void *OS_Malloc(size_t size);
extern void OS_Free(void *ptr, size_t size);
#define BALLOON_DEBUG_VERBOSE 0
#define BALLOON_STATS
-#define BALLOON_STATS_PROCFS
/*
* Includes
#define STATS_INC(stat)
#endif
-/*
- *----------------------------------------------------------------------
- *
- * BalloonProcRead --
- *
- * Ballon driver status reporting routine. Note that this is only
- * used for Linux.
- *
- * Results:
- * Writes ASCII status information into "buf".
- * Returns number of bytes written.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-BalloonProcRead(char *buf, // OUT
- size_t size) // IN
-{
- int len = 0;
- BalloonStats stats;
-
- Balloon_GetStats(&stats);
-
- /* format size info */
- len += OS_Snprintf(buf + len, size - len,
- "target: %8d pages\n"
- "current: %8d pages\n",
- stats.nPagesTarget,
- stats.nPages);
-
- /* format rate info */
- len += OS_Snprintf(buf + len, size - len,
- "rateNoSleepAlloc: %8d pages/sec\n"
- "rateSleepAlloc: %8d pages/sec\n"
- "rateFree: %8d pages/sec\n",
- BALLOON_NOSLEEP_ALLOC_MAX,
- stats.rateAlloc,
- stats.rateFree);
-
-#ifdef BALLOON_STATS_PROCFS
- len += OS_Snprintf(buf + len, size - len,
- "\n"
- "timer: %8u\n"
- "start: %8u (%4u failed)\n"
- "guestType: %8u (%4u failed)\n"
- "lock: %8u (%4u failed)\n"
- "unlock: %8u (%4u failed)\n"
- "target: %8u (%4u failed)\n"
- "primNoSleepAlloc: %8u (%4u failed)\n"
- "primCanSleepAlloc: %8u (%4u failed)\n"
- "primFree: %8u\n"
- "errAlloc: %8u\n"
- "errFree: %8u\n",
- stats.timer,
- stats.start, stats.startFail,
- stats.guestType, stats.guestTypeFail,
- stats.lock, stats.lockFail,
- stats.unlock, stats.unlockFail,
- stats.target, stats.targetFail,
- stats.primAlloc[BALLOON_PAGE_ALLOC_NOSLEEP],
- stats.primAllocFail[BALLOON_PAGE_ALLOC_NOSLEEP],
- stats.primAlloc[BALLOON_PAGE_ALLOC_CANSLEEP],
- stats.primAllocFail[BALLOON_PAGE_ALLOC_CANSLEEP],
- stats.primFree,
- stats.primErrorPageAlloc,
- stats.primErrorPageFree);
-#endif
-
- return len;
-}
-
/*
*----------------------------------------------------------------------
*----------------------------------------------------------------------
*/
-void
-Balloon_GetStats(BalloonStats *stats) // OUT
+const BalloonStats *
+Balloon_GetStats(void)
{
Balloon *b = &globalBalloon;
-
- /*
- * Copy statistics out of global structure.
- */
- OS_MemCopy(stats, &b->stats, sizeof *stats);
+ BalloonStats *stats = &b->stats;
/*
* Fill in additional information about size and rates, which is
*/
stats->nPages = b->nPages;
stats->nPagesTarget = b->nPagesTarget;
+ stats->rateNoSleepAlloc = BALLOON_NOSLEEP_ALLOC_MAX;
stats->rateAlloc = b->rateAlloc;
stats->rateFree = b->rateFree;
+
+ return stats;
}
Balloon *b = &globalBalloon;
/* os-specific initialization */
- if (!OS_Init(BALLOON_NAME, BALLOON_NAME_VERBOSE, BalloonProcRead)) {
+ if (!OS_Init(BALLOON_NAME, BALLOON_NAME_VERBOSE)) {
return BALLOON_FAILURE;
}
uint32 nPagesTarget;
/* adjustment rates */
+ uint32 rateNoSleepAlloc;
uint32 rateAlloc;
uint32 rateFree;
extern int Balloon_ModuleInit(void);
extern void Balloon_ModuleCleanup(void);
-extern void Balloon_GetStats(BalloonStats *stats);
+extern const BalloonStats *Balloon_GetStats(void);
#endif /* VMBALLOON_H */
}
-/*
- *-----------------------------------------------------------------------------
- *
- * OS_Snprintf --
- *
- * Print a string into a bounded memory location.
- *
- * Results:
- * Number of character printed including trailing \0.
- *
- * Side effects:
- * None
- *
- *-----------------------------------------------------------------------------
- */
-
-int
-OS_Snprintf(char *buf, // OUT
- size_t size, // IN
- const char *format, // IN
- ...) // IN
-{
- ASSERT(0);
- /*
- * XXX disabled because the varargs header file doesn't seem to
- * work in the current (gcc 2.95.3) cross-compiler environment.
- * Not used for Solaris anyway.
- */
- return 0;
-}
-
-
/*
*-----------------------------------------------------------------------------
*
Bool
OS_Init(const char *name, // IN
- const char *nameVerbose, // IN
- OSStatusHandler *handler) // IN
+ const char *nameVerbose) // IN
{
os_state *state = &global_state;
static int initialized = 0;
* Compile-Time Options
*/
-#define BALLOON_STATS
-#define BALLOON_STATS_PROCFS
-
#include <sys/types.h>
#include <sys/kstat.h>
#include <sys/errno.h>
BalloonKstatUpdate(kstat_t *ksp, int rw)
{
int i;
- BalloonStats stats;
+ const BalloonStats *stats;
BalloonKstats *bkp = ksp->ks_data;
if (rw == KSTAT_WRITE)
return (EACCES);
- Balloon_GetStats(&stats);
+ stats = Balloon_GetStats();
/* size info */
- bkp->nPagesTarget.value.ui32 = stats.nPagesTarget;
- bkp->nPages.value.ui32 = stats.nPages;
+ bkp->nPagesTarget.value.ui32 = stats->nPagesTarget;
+ bkp->nPages.value.ui32 = stats->nPages;
/* rate info */
- bkp->rateAlloc.value.ui32 = stats.rateAlloc;
- bkp->rateFree.value.ui32 = stats.rateFree;
+ bkp->rateAlloc.value.ui32 = stats->rateAlloc;
+ bkp->rateFree.value.ui32 = stats->rateFree;
/* statistics */
- bkp->timer.value.ui32 = stats.timer;
- bkp->start.value.ui32 = stats.start;
- bkp->startFail.value.ui32 = stats.startFail;
- bkp->guestType.value.ui32 = stats.guestType;
- bkp->guestTypeFail.value.ui32 = stats.guestTypeFail;
- bkp->lock.value.ui32 = stats.lock;
- bkp->lockFail.value.ui32 = stats.lockFail;
- bkp->unlock.value.ui32 = stats.unlock;
- bkp->unlockFail.value.ui32 = stats.unlockFail;
- bkp->target.value.ui32 = stats.target;
- bkp->targetFail.value.ui32 = stats.targetFail;
+ bkp->timer.value.ui32 = stats->timer;
+ bkp->start.value.ui32 = stats->start;
+ bkp->startFail.value.ui32 = stats->startFail;
+ bkp->guestType.value.ui32 = stats->guestType;
+ bkp->guestTypeFail.value.ui32 = stats->guestTypeFail;
+ bkp->lock.value.ui32 = stats->lock;
+ bkp->lockFail.value.ui32 = stats->lockFail;
+ bkp->unlock.value.ui32 = stats->unlock;
+ bkp->unlockFail.value.ui32 = stats->unlockFail;
+ bkp->target.value.ui32 = stats->target;
+ bkp->targetFail.value.ui32 = stats->targetFail;
for (i = 0; i < BALLOON_PAGE_ALLOC_TYPES_NR; i++) {
- bkp->primAlloc[i].value.ui32 = stats.primAlloc[i];
- bkp->primAllocFail[i].value.ui32 = stats.primAllocFail[i];
+ bkp->primAlloc[i].value.ui32 = stats->primAlloc[i];
+ bkp->primAllocFail[i].value.ui32 = stats->primAllocFail[i];
}
- bkp->primFree.value.ui32 = stats.primFree;
- bkp->primErrorPageAlloc.value.ui32 = stats.primErrorPageAlloc;
- bkp->primErrorPageFree.value.ui32 = stats.primErrorPageFree;
+ bkp->primFree.value.ui32 = stats->primFree;
+ bkp->primErrorPageAlloc.value.ui32 = stats->primErrorPageAlloc;
+ bkp->primErrorPageFree.value.ui32 = stats->primErrorPageFree;
return 0;
}