Date: Thu, 10 May 2001 11:06:24 -0700 (PDT) From: Jim.Pirzyk@disney.com To: FreeBSD-gnats-submit@freebsd.org Subject: kern/27253: linprocfs does not have /proc/loadavg Message-ID: <200105101806.f4AI6OM38175@snoopy.fan.fa.disney.com>
next in thread | raw e-mail | index | archive | help
>Number: 27253 >Category: kern >Synopsis: linprocfs does not implement the loadavg file. >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Thu May 10 11:10:03 PDT 2001 >Closed-Date: >Last-Modified: >Originator: Jim Pirzyk >Release: FreeBSD 4.3-RELEASE i386 >Organization: >Environment: System: FreeBSD snoopy.fan.fa.disney.com 4.3-RELEASE FreeBSD 4.3-RELEASE #4: Fri Apr 27 01:14:59 PDT 2001 root@snoopy.fan.fa.disney.com:/auto/roy/dist/pub/FreeBSD/4.3-RELEASE/sys/compile/UP_WORKSTATION i386 >Description: We have linux binaries that need to access /proc/loadavg to get status of the system so we need this file. >How-To-Repeat: mount -t linprocfs /compat/linux/proc ls -la /compat/linux/proc/loadavg >Fix: *** ./sys/i386/linux/linprocfs/linprocfs.h.orig Mon Oct 30 11:57:04 2000 --- ./sys/i386/linux/linprocfs/linprocfs.h Tue May 8 09:09:50 2001 *************** *** 57,62 **** --- 57,63 ---- Pstat, /* kernel/system statistics */ Puptime, /* system uptime */ Pversion, /* system version */ + Ploadavg, /* system load average */ } pfstype; /* *************** *** 132,137 **** --- 133,139 ---- int linprocfs_doversion __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio)); int linprocfs_doprocstat __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio)); int linprocfs_doprocstatus __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio)); + int linprocfs_doloadavg __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio)); /* functions to check whether or not files should be displayed */ int linprocfs_validfile __P((struct proc *)); *** ./sys/i386/linux/linprocfs/linprocfs_misc.c.orig Thu Dec 7 05:17:55 2000 --- ./sys/i386/linux/linprocfs/linprocfs_misc.c Tue May 8 16:09:17 2001 *************** *** 495,498 **** --- 495,531 ---- ps = psbuf + uio->uio_offset; xlen = imin(xlen, uio->uio_resid); return (xlen <= 0 ? 0 : uiomove(ps, xlen, uio)); + } + + int + linprocfs_doloadavg(curp, p, pfs, uio) + struct proc *curp; + struct proc *p; + struct pfsnode *pfs; + struct uio *uio; + { + char *ps, psbuf[512]; + int xlen; + extern int nextpid; + + ps=psbuf; + + ps += sprintf(ps, + "%d.%02d %d.%02d %d.%02d %d/%d %d\n", + (int)(averunnable.ldavg[0] / averunnable.fscale), + (int)(averunnable.ldavg[0] * 100 / averunnable.fscale % 100), + (int)(averunnable.ldavg[1] / averunnable.fscale), + (int)(averunnable.ldavg[1] * 100 / averunnable.fscale % 100), + (int)(averunnable.ldavg[2] / averunnable.fscale), + (int)(averunnable.ldavg[2] * 100 / averunnable.fscale % 100), + 1, /* number of running tasks */ + -1, /* number of tasks */ + nextpid /* The last pid */ + ); + + xlen = ps - psbuf; + xlen -= uio->uio_offset; + ps = psbuf + uio->uio_offset; + xlen = imin(xlen, uio->uio_resid); + return (xlen <= 0 ? 0 : uiomove(ps, xlen, uio)); } *** ./sys/i386/linux/linprocfs/linprocfs_subr.c.orig Mon Oct 30 11:57:04 2000 --- ./sys/i386/linux/linprocfs/linprocfs_subr.c Tue May 8 09:13:20 2001 *************** *** 184,189 **** --- 184,190 ---- case Pstat: case Puptime: case Pversion: + case Ploadavg: pfs->pfs_mode = (VREAD) | (VREAD >> 3) | (VREAD >> 6); *************** *** 275,280 **** --- 276,284 ---- break; case Pversion: rtval = linprocfs_doversion(curp, p, pfs, uio); + break; + case Ploadavg: + rtval = linprocfs_doloadavg(curp, p, pfs, uio); break; default: rtval = EOPNOTSUPP; *** ./sys/i386/linux/linprocfs/linprocfs_vnops.c.orig Mon Oct 30 11:57:04 2000 --- ./sys/i386/linux/linprocfs/linprocfs_vnops.c Tue May 8 09:14:47 2001 *************** *** 529,534 **** --- 529,535 ---- case Pstat: case Puptime: case Pversion: + case Ploadavg: vap->va_bytes = vap->va_size = 0; vap->va_uid = 0; vap->va_gid = 0; *************** *** 706,711 **** --- 707,714 ---- return (linprocfs_allocvp(dvp->v_mount, vpp, 0, Puptime)); if (CNEQ(cnp, "version", 7)) return (linprocfs_allocvp(dvp->v_mount, vpp, 0, Pversion)); + if (CNEQ(cnp, "loadavg", 7)) + return (linprocfs_allocvp(dvp->v_mount, vpp, 0, Ploadavg)); pid = atopid(pname, cnp->cn_namelen); if (pid == NO_PID) *************** *** 901,906 **** --- 904,917 ---- bcopy("version", dp->d_name, 8); dp->d_type = DT_REG; break; + + case 8: + dp->d_fileno = PROCFS_FILENO(0, Ploadavg); + dp->d_namlen = 7; + bcopy("loadavg", dp->d_name, 8); + dp->d_type = DT_REG; + break; + default: while (pcnt < i) { >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200105101806.f4AI6OM38175>