/* * Linux compatible /proc/meminfo. Only active when the -o linux * mountflag is used. */ int procfs_domeminfo(struct proc *curp, struct proc *p, struct pfsnode *pfs, struct uio *uio) { char buf[512], *cp; int len, error; len = snprintf(buf, sizeof buf, " total: used: free: shared: buffers: cached:\n" "Mem: %8lu %8lu %8lu %8lu %8lu %8lu\n" "Swap: %8lu %8lu %8lu\n" "MemTotal: %8lu kB\n" "MemFree: %8lu kB\n" "MemShared: %8lu kB\n" "Buffers: %8lu kB\n" "Cached: %8lu kB\n" "SwapTotal: %8lu kB\n" "SwapFree: %8lu kB\n", PGTOB(uvmexp.npages), PGTOB(uvmexp.npages - uvmexp.free), PGTOB(uvmexp.free), 0L, 0L, 0L, PGTOB(uvmexp.swpages), PGTOB(uvmexp.swpginuse), PGTOB(uvmexp.swpages - uvmexp.swpginuse), PGTOKB(uvmexp.npages), PGTOKB(uvmexp.free), 0L, 0L, 0L, PGTOKB(uvmexp.swpages), PGTOKB(uvmexp.swpages - uvmexp.swpginuse)); if (len == 0) return 0; len -= uio->uio_offset; cp = buf + uio->uio_offset; len = imin(len, uio->uio_resid); if (len <= 0) error = 0; else error = uiomove(cp, len, uio); return error; }
/* * Linux compatible /proc/meminfo. Only active when the -o linux * mountflag is used. */ int procfs_domeminfo(struct lwp *curl, struct proc *p, struct pfsnode *pfs, struct uio *uio) { char *bf; int len; int error = 0; bf = malloc(LBFSZ, M_TEMP, M_WAITOK); len = snprintf(bf, LBFSZ, " total: used: free: shared: buffers: cached:\n" "Mem: %8lu %8lu %8lu %8lu %8lu %8lu\n" "Swap: %8lu %8lu %8lu\n" "MemTotal: %8lu kB\n" "MemFree: %8lu kB\n" "MemShared: %8lu kB\n" "Buffers: %8lu kB\n" "Cached: %8lu kB\n" "SwapTotal: %8lu kB\n" "SwapFree: %8lu kB\n", PGTOB(uvmexp.npages), PGTOB(uvmexp.npages - uvmexp.free), PGTOB(uvmexp.free), 0L, PGTOB(uvmexp.filepages), PGTOB(uvmexp.anonpages + uvmexp.filepages + uvmexp.execpages), PGTOB(uvmexp.swpages), PGTOB(uvmexp.swpginuse), PGTOB(uvmexp.swpages - uvmexp.swpginuse), PGTOKB(uvmexp.npages), PGTOKB(uvmexp.free), 0L, PGTOKB(uvmexp.filepages), PGTOKB(uvmexp.anonpages + uvmexp.filepages + uvmexp.execpages), PGTOKB(uvmexp.swpages), PGTOKB(uvmexp.swpages - uvmexp.swpginuse)); if (len == 0) goto out; error = uiomove_frombuf(bf, len, uio); out: free(bf, M_TEMP); return error; }
/* * Linux compatible /proc/<pid>/stat. Only active when the -o linux * mountflag is used. */ int procfs_do_pid_stat(struct lwp *curl, struct lwp *l, struct pfsnode *pfs, struct uio *uio) { char *bf; struct proc *p = l->l_proc; int len; struct rusage *cru = &p->p_stats->p_cru; unsigned long stext = 0, etext = 0, sstack = 0; struct timeval rt; struct vmspace *vm; struct kinfo_proc2 ki; int error = 0; bf = malloc(LBFSZ, M_TEMP, M_WAITOK); if ((error = proc_vmspace_getref(p, &vm)) != 0) { goto out; } get_proc_size_info(l, &stext, &etext, &sstack); mutex_enter(proc_lock); mutex_enter(p->p_lock); fill_kproc2(p, &ki, false); calcru(p, NULL, NULL, NULL, &rt); len = snprintf(bf, LBFSZ, "%d (%s) %c %d %d %d %u %d " "%u " "%"PRIu64" %lu %"PRIu64" %lu %"PRIu64" %"PRIu64" %"PRIu64" %"PRIu64" " "%d %d %"PRIu64" " "%lld %"PRIu64" %"PRId64" %lu %"PRIu64" " "%lu %lu %lu " "%u %u " "%u %u %u %u " "%"PRIu64" %"PRIu64" %"PRIu64" %d %"PRIu64"\n", ki.p_pid, /* 1 pid */ ki.p_comm, /* 2 tcomm */ "0RRSTZXR8"[(ki.p_stat > 8) ? 0 : (int)ki.p_stat], /* 3 state */ ki.p_ppid, /* 4 ppid */ ki.p__pgid, /* 5 pgrp */ ki.p_sid, /* 6 sid */ (ki.p_tdev != (uint32_t)NODEV) ? ki.p_tdev : 0, /* 7 tty_nr */ ki.p_tpgid, /* 8 tty_pgrp */ ki.p_flag, /* 9 flags */ ki.p_uru_minflt, /* 10 min_flt */ cru->ru_minflt, ki.p_uru_majflt, /* 12 maj_flt */ cru->ru_majflt, UTIME2TICKS(ki.p_uutime_sec, ki.p_uutime_usec), /* 14 utime */ UTIME2TICKS(ki.p_ustime_sec, ki.p_ustime_usec), /* 15 stime */ UTIME2TICKS(cru->ru_utime.tv_sec, cru->ru_utime.tv_usec), /* 16 cutime */ UTIME2TICKS(cru->ru_stime.tv_sec, cru->ru_stime.tv_usec), /* 17 cstime */ ki.p_priority, /* XXX: 18 priority */ ki.p_nice - NZERO, /* 19 nice */ ki.p_nlwps, /* 20 num_threads */ (long long)rt.tv_sec, UTIME2TICKS(ki.p_ustart_sec, ki.p_ustart_usec), /* 22 start_time */ ki.p_vm_msize, /* 23 vsize */ PGTOKB(ki.p_vm_rssize), /* 24 rss */ p->p_rlimit[RLIMIT_RSS].rlim_cur, /* 25 rsslim */ stext, /* 26 start_code */ etext, /* 27 end_code */ sstack, /* 28 start_stack */ 0, /* XXX: 29 esp */ 0, /* XXX: 30 eip */ ki.p_siglist.__bits[0], /* XXX: 31 pending */ 0, /* XXX: 32 blocked */ ki.p_sigignore.__bits[0], /* 33 sigign */ ki.p_sigcatch.__bits[0], /* 34 sigcatch */ ki.p_wchan, /* 35 wchan */ ki.p_uru_nvcsw, ki.p_uru_nivcsw, ki.p_exitsig, /* 38 exit_signal */ ki.p_cpuid); /* 39 task_cpu */ mutex_exit(p->p_lock); mutex_exit(proc_lock); uvmspace_free(vm); if (len == 0) goto out; error = uiomove_frombuf(bf, len, uio); out: free(bf, M_TEMP); return error; }