From 0de2dfc95b476830d1628c20c45eb6762b2c1cb8 Mon Sep 17 00:00:00 2001 From: Giacomo Tesio Date: Thu, 12 Jan 2017 00:35:27 +0100 Subject: [PATCH] kernel: fix /dev/swap and `stats -m` --- sys/src/cmd/stats.c | 2 +- sys/src/kern/port/devcons.c | 33 +++++++++++++-------------------- sys/src/kern/port/umem/pages.c | 19 +++++++++++-------- sys/src/kern/port/umem/umem.h | 12 ++++++++++-- 4 files changed, 35 insertions(+), 31 deletions(-) diff --git a/sys/src/cmd/stats.c b/sys/src/cmd/stats.c index e725218..1fc58d5 100644 --- a/sys/src/cmd/stats.c +++ b/sys/src/cmd/stats.c @@ -467,7 +467,7 @@ readswap(Machine *m, uint64_t *a) { if(strstr(m->buf, "memory\n")){ /* new /dev/swap - skip first 3 numbers */ - if(!readnums(m, 7, a, 1)) + if(!readnums(m, 5, a, 1)) return 0; a[0] = a[3]; a[1] = a[4]; diff --git a/sys/src/kern/port/devcons.c b/sys/src/kern/port/devcons.c index 47b61a3..0218fe4 100644 --- a/sys/src/kern/port/devcons.c +++ b/sys/src/kern/port/devcons.c @@ -831,7 +831,8 @@ consread(Chan *c, void *buf, long n, int64_t off) { uint64_t l; Mach *mp; - char *b, *bp, *s, ch; + MemoryStats mstats; + char *b, *bp, ch; char tmp[6*NUMSIZE+1]; /* must be >= 6*NUMSIZE (Qcputime) */ int i, id, send; long offset; @@ -997,26 +998,18 @@ consread(Chan *c, void *buf, long n, int64_t off) return n; case Qswap: - bp = smalloc(READSTR); - if(waserror()){ - free(bp); - nexterror(); - } - s = pages_stats(bp, bp+READSTR); - s = seprintphysstats(s, bp+READSTR); - l = s - bp; - b = buf; - i = readstr(offset, b, n, bp); - poperror(); - free(bp); - b += i; - n -= i; - if(offset > l) - offset -= l; - else - offset = 0; + memory_stats(&mstats); + snprint(tmp, sizeof tmp, + "%llud memory\n" + "%llud pagesize\n" + "%lud kernel\n" + "%lud/%lud user\n", + mstats.memory, + (unsigned long)PGSZ, + mstats.kernel, + mstats.user, mstats.user_available); - return i + mallocreadsummary(c, b, n, offset); + return readstr(offset, buf, n, tmp); case Qsysname: if(sysname == nil) diff --git a/sys/src/kern/port/umem/pages.c b/sys/src/kern/port/umem/pages.c index 25b5f85..8ffb3ac 100644 --- a/sys/src/kern/port/umem/pages.c +++ b/sys/src/kern/port/umem/pages.c @@ -100,15 +100,18 @@ umem_init(void) } -char* -pages_stats(char *s, char *e) +void +memory_stats(MemoryStats *stats) { - plock(); - s = seprint(s, e, "%lud/%lud %dK user pages avail\n", - pool.freepages + pool.blankpages, - pool.npages, (pool.freepages + pool.blankpages)*PGSZ/KiB); - punlock(); - return s; + uintptr_t km; + if(stats == nil) + panic("memory_stats: nil pointer, pc %#p", getcallerpc()); + km = ROUNDUP((uintptr_t)end - KTZERO, PGSZ); + km += ROUNDDN(sys->vmunmapped - (uintptr_t)end, PGSZ); + stats->memory = sys->pmoccupied; + stats->kernel = km; + stats->user_available = pool.npages*PGSZ; + stats->user = (pool.npages - pool.blankpages - pool.freepages)*PGSZ; } KMap* diff --git a/sys/src/kern/port/umem/umem.h b/sys/src/kern/port/umem/umem.h index 29702a5..23f345d 100644 --- a/sys/src/kern/port/umem/umem.h +++ b/sys/src/kern/port/umem/umem.h @@ -55,8 +55,6 @@ extern int page_dispose(PagePointer *slot); */ extern int page_assign(PagePointer *target, PagePointer page); -extern char* pages_stats(char *s, char *e); - /* Replace the page in *slot with a copy * * Returns 1 on success, 0 on failure. @@ -247,3 +245,13 @@ extern void proc_check_pages(void); extern int proc_own_pagepool(Proc *p); extern int proc_segment_detach(Proc *p, uintptr_t va); +typedef struct MemoryStats +{ + unsigned long memory; + unsigned long kernel; + unsigned long user_available; + unsigned long user; +} MemoryStats; + +/* fills stats with memory statistics */ +extern void memory_stats(MemoryStats *stats);