blob: a91e3848b21099e35c4049149a712f02b7659aec [file] [log] [blame] [raw]
diff -ru --exclude-from freebsd-src-diff-exclude-names --new-file /var/archive3/public/freebsd-releng-10.4-src/sys/compat/linprocfs/linprocfs.c freebsd-10.4/sys/compat/linprocfs/linprocfs.c
--- /var/archive3/public/freebsd-releng-10.4-src/sys/compat/linprocfs/linprocfs.c 2017-09-29 08:19:56.000000000 +0800
+++ freebsd-10.4/sys/compat/linprocfs/linprocfs.c 2025-01-09 14:08:08.398734000 +0800
@@ -39,6 +39,13 @@
* @(#)procfs_status.c 8.4 (Berkeley) 6/15/94
*/
+#include "linprocfs_version.h"
+#ifndef LINPROCFS_VERSION
+#define LINPROCFS_VERSION LINRPOCFS_VERSION_BUILD_VERSION " " LINPROCFS_VERSION_BUILD_TIME
+#endif
+
+#define _NO_CONVERT_IFNAME 1
+
#include <sys/cdefs.h>
__FBSDID("$FreeBSD: releng/10.4/sys/compat/linprocfs/linprocfs.c 299221 2016-05-07 19:05:39Z dchagin $");
@@ -119,6 +126,13 @@
#define P2K(x) ((x) << (PAGE_SHIFT - 10)) /* pages to kbytes */
#define TV2J(x) ((x)->tv_sec * 100UL + (x)->tv_usec / 10000)
+static SYSCTL_NODE(_vfs, OID_AUTO, linprocfs, CTLFLAG_RW, 0, "Linux procfs");
+
+int compatible_unit_prefix = 1;
+SYSCTL_INT(_vfs_linprocfs, OID_AUTO, compatible_unit_prefix, CTLFLAG_RW,
+ &compatible_unit_prefix, 0,
+ "use Linux-compatible (but incorrect) unit prefix names for byte values");
+
/**
* @brief Mapping of ki_stat in struct kinfo_proc to the linux state
*
@@ -133,7 +147,7 @@
* This character array is used with ki_stati-1 as an index and tries to
* map our states to suitable linux states.
*/
-static char linux_state[] = "RRSTZDD";
+static char linux_state[] = "RRSTZID";
/*
* Filler function for proc/meminfo
@@ -141,68 +155,69 @@
static int
linprocfs_domeminfo(PFS_FILL_ARGS)
{
+ size_t len;
unsigned long memtotal; /* total memory in bytes */
unsigned long memused; /* used memory in bytes */
unsigned long memfree; /* free memory in bytes */
unsigned long memshared; /* shared memory ??? */
- unsigned long buffers, cached; /* buffer / cache memory ??? */
+ unsigned long cached; /* file system cache */
unsigned long long swaptotal; /* total swap space in bytes */
unsigned long long swapused; /* used swap space in bytes */
unsigned long long swapfree; /* free swap space in bytes */
vm_object_t object;
int i, j;
+ int e;
+ const char *kibibyte_name = compatible_unit_prefix ? "kB" : "KiB";
memtotal = physmem * PAGE_SIZE;
- /*
- * The correct thing here would be:
- *
+#if 1
memfree = cnt.v_free_count * PAGE_SIZE;
memused = memtotal - memfree;
- *
- * but it might mislead linux binaries into thinking there
- * is very little memory left, so we cheat and tell them that
- * all memory that isn't wired down is free.
- */
- memused = cnt.v_wire_count * PAGE_SIZE;
+#else
+ memused = (cnt.v_active_count + cnt.v_wire_count + cnt.v_inactive_count + cnt.v_cache_count) * PAGE_SIZE;
memfree = memtotal - memused;
+#endif
swap_pager_status(&i, &j);
swaptotal = (unsigned long long)i * PAGE_SIZE;
swapused = (unsigned long long)j * PAGE_SIZE;
swapfree = swaptotal - swapused;
memshared = 0;
mtx_lock(&vm_object_list_mtx);
- TAILQ_FOREACH(object, &vm_object_list, object_list)
- if (object->shadow_count > 1)
+ TAILQ_FOREACH(object, &vm_object_list, object_list) {
+ if (object->shadow_count > 1) {
memshared += object->resident_page_count;
+ }
+ }
mtx_unlock(&vm_object_list_mtx);
memshared *= PAGE_SIZE;
- /*
- * We'd love to be able to write:
- *
- buffers = bufspace;
- *
- * but bufspace is internal to vfs_bio.c and we don't feel
- * like unstaticizing it just for linprocfs's sake.
- */
- buffers = 0;
- cached = cnt.v_cache_count * PAGE_SIZE;
+
+ len = sizeof cached;
+ e = kernel_sysctlbyname(td, "vfs.bufspace", &cached, &len, NULL, 0, NULL, 0);
+ if(e) cached = 0;
+ cached += cnt.v_cache_count * PAGE_SIZE;
sbuf_printf(sb,
- " total: used: free: shared: buffers: cached:\n"
- "Mem: %lu %lu %lu %lu %lu %lu\n"
- "Swap: %llu %llu %llu\n"
- "MemTotal: %9lu kB\n"
- "MemFree: %9lu kB\n"
- "MemShared:%9lu kB\n"
- "Buffers: %9lu kB\n"
- "Cached: %9lu kB\n"
- "SwapTotal:%9llu kB\n"
- "SwapFree: %9llu kB\n",
- memtotal, memused, memfree, memshared, buffers, cached,
+ " total: used: free: shared: buffers: cached:\n"
+ "Mem: %8lu %8lu %8lu %8lu %8lu %8lu\n"
+ "Swap: %8llu %8llu %8llu\n"
+ "MemTotal: %9lu %s\n"
+ "MemFree: %9lu %s\n"
+ "MemShared:%9lu %s\n"
+ "Cached: %9lu %s\n"
+ "Active: %9lu %s\n"
+ "Inactive: %9lu %s\n"
+ "SwapTotal:%9llu %s\n"
+ "SwapFree: %9llu %s\n",
+ memtotal, memused, memfree, memshared, 0, cached,
swaptotal, swapused, swapfree,
- B2K(memtotal), B2K(memfree),
- B2K(memshared), B2K(buffers), B2K(cached),
- B2K(swaptotal), B2K(swapfree));
+ B2K(memtotal), kibibyte_name,
+ B2K(memfree), kibibyte_name,
+ B2K(memshared), kibibyte_name,
+ B2K(cached), kibibyte_name,
+ P2K((unsigned long int)cnt.v_active_count), kibibyte_name,
+ P2K((unsigned long int)cnt.v_inactive_count), kibibyte_name,
+ B2K(swaptotal), kibibyte_name,
+ B2K(swapfree), kibibyte_name);
return (0);
}
@@ -350,26 +365,24 @@
/* determine mount point */
mntto = mp->mnt_stat.f_mntonname;
if (strncmp(mntto, lep, lep_len) == 0 &&
- mntto[lep_len] == '/')
+ mntto[lep_len] == '/') {
mntto += lep_len;
+ }
/* determine fs type */
fstype = mp->mnt_stat.f_fstypename;
- if (strcmp(fstype, pn->pn_info->pi_name) == 0)
- mntfrom = fstype = "proc";
- else if (strcmp(fstype, "procfs") == 0)
+ if (strcmp(fstype, pn->pn_info->pi_name) == 0) {
+ fstype = "proc";
+ } else if (strcmp(fstype, "procfs") == 0) {
continue;
-
- if (strcmp(fstype, "linsysfs") == 0) {
- sbuf_printf(sb, "/sys %s sysfs %s", mntto,
- mp->mnt_stat.f_flags & MNT_RDONLY ? "ro" : "rw");
- } else {
+ } else if(strcmp(fstype, "linsysfs") == 0) {
+ fstype = "sysfs";
+ } else if (strcmp(fstype, "msdosfs") == 0) {
/* For Linux msdosfs is called vfat */
- if (strcmp(fstype, "msdosfs") == 0)
- fstype = "vfat";
- sbuf_printf(sb, "%s %s %s %s", mntfrom, mntto, fstype,
- mp->mnt_stat.f_flags & MNT_RDONLY ? "ro" : "rw");
+ fstype = "vfat";
}
+ sbuf_printf(sb, "%s %s %s %s", mntfrom, mntto, fstype,
+ mp->mnt_stat.f_flags & MNT_RDONLY ? "ro" : "rw");
#define ADD_OPTION(opt, name) \
if (mp->mnt_stat.f_flags & (opt)) sbuf_printf(sb, "," name);
ADD_OPTION(MNT_SYNCHRONOUS, "sync");
@@ -429,6 +442,37 @@
return (0);
}
+/*
+ * Filler function for proc/diskstats
+ */
+static int
+linprocfs_dodiskstats(PFS_FILL_ARGS)
+{
+ struct g_class *cp;
+ struct g_geom *gp;
+ struct g_provider *pp;
+ int major, minor;
+
+ g_topology_lock();
+ LIST_FOREACH(cp, &g_classes, class) {
+ if(strcmp(cp->name, "DISK") == 0) {
+ LIST_FOREACH(gp, &cp->geom, geom) {
+ LIST_FOREACH(pp, &gp->provider, provider) {
+ if (linux_driver_get_major_minor(
+ pp->name, &major, &minor) != 0) {
+ major = 0;
+ minor = 0;
+ }
+ sbuf_printf(sb, "%4d %7d %s \n",
+ major, minor, pp->name);
+ }
+ }
+ }
+ }
+ g_topology_unlock();
+
+ return 0;
+}
/*
* Filler function for proc/stat
@@ -541,7 +585,8 @@
sbuf_printf(sb, "%s%s", cp1, cp2 + 1);
else
#endif
- sbuf_cat(sb, "#4 Sun Dec 18 04:30:00 CET 1977");
+ // sbuf_cat(sb, "#4 Sun Dec 18 04:30:00 CET 1977");
+ sbuf_cat(sb, LINPROCFS_VERSION);
}
/*
@@ -566,7 +611,8 @@
sbuf_cat(sb, builder);
else
#endif
- sbuf_cat(sb, "des@freebsd.org");
+ // sbuf_cat(sb, "des@freebsd.org");
+ sbuf_cat(sb, LINPROCFS_VERSION_BUILD_BY);
}
/*
@@ -642,8 +688,10 @@
kp.ki_stat, sizeof(linux_state));
++ratelimit;
}
- } else
- state = linux_state[kp.ki_stat - 1];
+ } else {
+ state = kp.ki_stat == SRUN ?
+ ((kp.ki_tdflags & TDF_SINTR) ? 'S' : 'D') : linux_state[kp.ki_stat - 1];
+ }
PS_ADD("state", "%c", state);
PS_ADD("ppid", "%d", p->p_pptr ? p->p_pptr->p_pid : 0);
PS_ADD("pgrp", "%d", p->p_pgid);
@@ -1096,6 +1144,7 @@
return (error);
}
+#ifndef _NO_CONVERT_IFNAME
/*
* Criteria for interface name translation
*/
@@ -1124,6 +1173,7 @@
return (0);
}
+#endif
/*
* Filler function for proc/net/dev
@@ -1131,7 +1181,9 @@
static int
linprocfs_donetdev(PFS_FILL_ARGS)
{
+#ifndef _NO_CONVERT_IFNAME
char ifname[16]; /* XXX LINUX_IFNAMSIZ */
+#endif
struct ifnet *ifp;
sbuf_printf(sb, "%6s|%58s|%s\n"
@@ -1144,8 +1196,12 @@
CURVNET_SET(TD_TO_VNET(curthread));
IFNET_RLOCK();
TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
+#ifdef _NO_CONVERT_IFNAME
+ sbuf_printf(sb, "%6.6s: ", ifp->if_xname);
+#else
linux_ifname(ifp, ifname, sizeof ifname);
sbuf_printf(sb, "%6.6s: ", ifname);
+#endif
sbuf_printf(sb, "%7lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu ",
ifp->if_ibytes, /* rx_bytes */
ifp->if_ipackets, /* rx_packets */
@@ -1522,6 +1578,8 @@
NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, "devices", &linprocfs_dodevices,
NULL, NULL, NULL, PFS_RD);
+ pfs_create_file(root, "diskstats", &linprocfs_dodiskstats,
+ NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, "filesystems", &linprocfs_dofilesystems,
NULL, NULL, NULL, PFS_RD);
pfs_create_file(root, "loadavg", &linprocfs_doloadavg,
diff -ru --exclude-from freebsd-src-diff-exclude-names /var/archive3/public/freebsd-releng-10.4-src/sys/modules/linprocfs/Makefile freebsd-10.4/sys/modules/linprocfs/Makefile
--- /var/archive3/public/freebsd-releng-10.4-src/sys/modules/linprocfs/Makefile 2017-09-29 08:19:59.000000000 +0800
+++ freebsd-10.4/sys/modules/linprocfs/Makefile 2019-08-17 22:23:56.243622065 +0800
@@ -5,6 +5,12 @@
KMOD= linprocfs
SRCS= vnode_if.h \
device_if.h bus_if.h \
- linprocfs.c
+ linprocfs.c \
+ linprocfs_version.h
+
+CLEANFILES += linprocfs_version.h .linprocfs_build_version
+
+linprocfs_version.h: generate-linprocfs-version.sh linprocfs.c
+ sh ${.CURDIR}/generate-linprocfs-version.sh > $@
.include <bsd.kmod.mk>
--- /dev/null 2019-08-17 22:27:18.000000000 +0800
+++ freebsd-10.4/sys/modules/linprocfs/generate-linprocfs-version.sh 2019-08-17 22:24:15.370617775 +0800
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+export LANG=C
+if [ -f .linprocfs_build_version ]; then
+ build_version="`cat .linprocfs_build_version`"
+else
+ build_version=1
+fi
+printf '#define LINRPOCFS_VERSION_BUILD_VERSION "#%s"\n' "$build_version"
+printf '#define LINPROCFS_VERSION_BUILD_TIME "%s"\n' "`date`"
+printf '#define LINPROCFS_VERSION LINRPOCFS_VERSION_BUILD_VERSION " " LINPROCFS_VERSION_BUILD_TIME\n'
+printf '#define LINPROCFS_VERSION_BUILD_BY "%s@%s"\n' "`whoami`" "`hostname`"
+echo $((build_version+1)) > .linprocfs_build_version