summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry Jelinek <jerry.jelinek@joyent.com>2015-07-03 13:18:53 +0000
committerJerry Jelinek <jerry.jelinek@joyent.com>2015-07-03 13:18:53 +0000
commit162addd17bf2abc53e0a206fe1c9db52d3b37de9 (patch)
tree5a0756203e95fad6ba97a5a235eae498e594ac59
parentb9d7280783ffdfad9a0495681eb53bc010c4b1bb (diff)
downloadillumos-joyent-162addd17bf2abc53e0a206fe1c9db52d3b37de9.tar.gz
OS-4467 journald depends on /proc/sys/kernel/random/boot_id
OS-4473 rkt needs /proc/sys/kernel/osrelease OS-4464 ltp futex_wake04 fails, needs /proc/sys/vm/nr_hugepages
-rw-r--r--usr/src/uts/common/brand/lx/procfs/lx_proc.h5
-rw-r--r--usr/src/uts/common/brand/lx/procfs/lx_prsubr.c2
-rw-r--r--usr/src/uts/common/brand/lx/procfs/lx_prvnops.c155
-rw-r--r--usr/src/uts/common/brand/lx/sys/lx_brand.h4
4 files changed, 166 insertions, 0 deletions
diff --git a/usr/src/uts/common/brand/lx/procfs/lx_proc.h b/usr/src/uts/common/brand/lx/procfs/lx_proc.h
index cd0c9ed2cb..3cd9d99735 100644
--- a/usr/src/uts/common/brand/lx/procfs/lx_proc.h
+++ b/usr/src/uts/common/brand/lx/procfs/lx_proc.h
@@ -197,9 +197,14 @@ typedef enum lxpr_nodetype {
LXPR_SYS_KERNEL_HOSTNAME, /* /proc/sys/kernel/hostname */
LXPR_SYS_KERNEL_MSGMNI, /* /proc/sys/kernel/msgmni */
LXPR_SYS_KERNEL_NGROUPS_MAX, /* /proc/sys/kernel/ngroups_max */
+ LXPR_SYS_KERNEL_OSREL, /* /proc/sys/kernel/osrelease */
LXPR_SYS_KERNEL_PID_MAX, /* /proc/sys/kernel/pid_max */
+ LXPR_SYS_KERNEL_RANDDIR, /* /proc/sys/kernel/random */
+ LXPR_SYS_KERNEL_RAND_BOOTID, /* /proc/sys/kernel/random/boot_id */
LXPR_SYS_KERNEL_SHMMAX, /* /proc/sys/kernel/shmmax */
LXPR_SYS_KERNEL_THREADS_MAX, /* /proc/sys/kernel/threads-max */
+ LXPR_SYS_VMDIR, /* /proc/sys/vm */
+ LXPR_SYS_KERNEL_VM_NHUGEP, /* /proc/sys/vm/nr_hugepages */
LXPR_UPTIME, /* /proc/uptime */
LXPR_VERSION, /* /proc/version */
LXPR_NFILES /* number of lx /proc file types */
diff --git a/usr/src/uts/common/brand/lx/procfs/lx_prsubr.c b/usr/src/uts/common/brand/lx/procfs/lx_prsubr.c
index 6dad5ce7d2..c621406f92 100644
--- a/usr/src/uts/common/brand/lx/procfs/lx_prsubr.c
+++ b/usr/src/uts/common/brand/lx/procfs/lx_prsubr.c
@@ -518,6 +518,8 @@ lxpr_getnode(vnode_t *dp, lxpr_nodetype_t type, proc_t *p, int desc)
case LXPR_SYS_FSDIR:
case LXPR_SYS_FS_INOTIFYDIR:
case LXPR_SYS_KERNELDIR:
+ case LXPR_SYS_KERNEL_RANDDIR:
+ case LXPR_SYS_VMDIR:
case LXPR_NETDIR:
vp->v_type = VDIR;
lxpnp->lxpr_mode = 0555; /* read-search by all */
diff --git a/usr/src/uts/common/brand/lx/procfs/lx_prvnops.c b/usr/src/uts/common/brand/lx/procfs/lx_prvnops.c
index 9f3ee2ebf6..be49912b3b 100644
--- a/usr/src/uts/common/brand/lx/procfs/lx_prvnops.c
+++ b/usr/src/uts/common/brand/lx/procfs/lx_prvnops.c
@@ -121,6 +121,8 @@ static vnode_t *lxpr_lookup_sysdir(vnode_t *, char *);
static vnode_t *lxpr_lookup_sys_fsdir(vnode_t *, char *);
static vnode_t *lxpr_lookup_sys_fs_inotifydir(vnode_t *, char *);
static vnode_t *lxpr_lookup_sys_kerneldir(vnode_t *, char *);
+static vnode_t *lxpr_lookup_sys_kdir_randdir(vnode_t *, char *);
+static vnode_t *lxpr_lookup_sys_vmdir(vnode_t *, char *);
static vnode_t *lxpr_lookup_taskdir(vnode_t *, char *);
static vnode_t *lxpr_lookup_task_tid_dir(vnode_t *, char *);
@@ -133,6 +135,8 @@ static int lxpr_readdir_sysdir(lxpr_node_t *, uio_t *, int *);
static int lxpr_readdir_sys_fsdir(lxpr_node_t *, uio_t *, int *);
static int lxpr_readdir_sys_fs_inotifydir(lxpr_node_t *, uio_t *, int *);
static int lxpr_readdir_sys_kerneldir(lxpr_node_t *, uio_t *, int *);
+static int lxpr_readdir_sys_kdir_randdir(lxpr_node_t *, uio_t *, int *);
+static int lxpr_readdir_sys_vmdir(lxpr_node_t *, uio_t *, int *);
static int lxpr_readdir_taskdir(lxpr_node_t *, uio_t *, int *);
static int lxpr_readdir_task_tid_dir(lxpr_node_t *, uio_t *, int *);
@@ -200,9 +204,12 @@ static void lxpr_read_sys_fs_inotify_max_user_watches(lxpr_node_t *,
static void lxpr_read_sys_kernel_hostname(lxpr_node_t *, lxpr_uiobuf_t *);
static void lxpr_read_sys_kernel_msgmni(lxpr_node_t *, lxpr_uiobuf_t *);
static void lxpr_read_sys_kernel_ngroups_max(lxpr_node_t *, lxpr_uiobuf_t *);
+static void lxpr_read_sys_kernel_osrel(lxpr_node_t *, lxpr_uiobuf_t *);
static void lxpr_read_sys_kernel_pid_max(lxpr_node_t *, lxpr_uiobuf_t *);
+static void lxpr_read_sys_kernel_rand_bootid(lxpr_node_t *, lxpr_uiobuf_t *);
static void lxpr_read_sys_kernel_shmmax(lxpr_node_t *, lxpr_uiobuf_t *);
static void lxpr_read_sys_kernel_threads_max(lxpr_node_t *, lxpr_uiobuf_t *);
+static void lxpr_read_sys_vm_nhpages(lxpr_node_t *, lxpr_uiobuf_t *);
/*
* Simple conversion
@@ -395,6 +402,7 @@ static lxpr_dirent_t netdir[] = {
static lxpr_dirent_t sysdir[] = {
{ LXPR_SYS_FSDIR, "fs" },
{ LXPR_SYS_KERNELDIR, "kernel" },
+ { LXPR_SYS_VMDIR, "vm" },
};
#define SYSDIRFILES (sizeof (sysdir) / sizeof (sysdir[0]))
@@ -427,7 +435,9 @@ static lxpr_dirent_t sys_kerneldir[] = {
{ LXPR_SYS_KERNEL_HOSTNAME, "hostname" },
{ LXPR_SYS_KERNEL_MSGMNI, "msgmni" },
{ LXPR_SYS_KERNEL_NGROUPS_MAX, "ngroups_max" },
+ { LXPR_SYS_KERNEL_OSREL, "osrelease" },
{ LXPR_SYS_KERNEL_PID_MAX, "pid_max" },
+ { LXPR_SYS_KERNEL_RANDDIR, "random" },
{ LXPR_SYS_KERNEL_SHMMAX, "shmmax" },
{ LXPR_SYS_KERNEL_THREADS_MAX, "threads-max" },
};
@@ -435,6 +445,24 @@ static lxpr_dirent_t sys_kerneldir[] = {
#define SYS_KERNELDIRFILES (sizeof (sys_kerneldir) / sizeof (sys_kerneldir[0]))
/*
+ * contents of /proc/sys/kernel/random directory
+ */
+static lxpr_dirent_t sys_randdir[] = {
+ { LXPR_SYS_KERNEL_RAND_BOOTID, "boot_id" },
+};
+
+#define SYS_RANDDIRFILES (sizeof (sys_randdir) / sizeof (sys_randdir[0]))
+
+/*
+ * contents of /proc/sys/vm directory
+ */
+static lxpr_dirent_t sys_vmdir[] = {
+ { LXPR_SYS_KERNEL_VM_NHUGEP, "nr_hugepages" },
+};
+
+#define SYS_VMDIRFILES (sizeof (sys_vmdir) / sizeof (sys_vmdir[0]))
+
+/*
* lxpr_open(): Vnode operation for VOP_OPEN()
*/
static int
@@ -605,9 +633,14 @@ static void (*lxpr_read_function[LXPR_NFILES])() = {
lxpr_read_sys_kernel_hostname, /* /proc/sys/kernel/hostname */
lxpr_read_sys_kernel_msgmni, /* /proc/sys/kernel/msgmni */
lxpr_read_sys_kernel_ngroups_max, /* /proc/sys/kernel/ngroups_max */
+ lxpr_read_sys_kernel_osrel, /* /proc/sys/kernel/osrelease */
lxpr_read_sys_kernel_pid_max, /* /proc/sys/kernel/pid_max */
+ lxpr_read_invalid, /* /proc/sys/kernel/random */
+ lxpr_read_sys_kernel_rand_bootid, /* /proc/sys/kernel/random/boot_id */
lxpr_read_sys_kernel_shmmax, /* /proc/sys/kernel/shmmax */
lxpr_read_sys_kernel_threads_max, /* /proc/sys/kernel/threads-max */
+ lxpr_read_invalid, /* /proc/sys/vm */
+ lxpr_read_sys_vm_nhpages, /* /proc/sys/vm/nr_hugepages */
lxpr_read_uptime, /* /proc/uptime */
lxpr_read_version, /* /proc/version */
};
@@ -708,9 +741,14 @@ static vnode_t *(*lxpr_lookup_function[LXPR_NFILES])() = {
lxpr_lookup_not_a_dir, /* /proc/sys/kernel/hostname */
lxpr_lookup_not_a_dir, /* /proc/sys/kernel/msgmni */
lxpr_lookup_not_a_dir, /* /proc/sys/kernel/ngroups_max */
+ lxpr_lookup_not_a_dir, /* /proc/sys/kernel/osrelease */
lxpr_lookup_not_a_dir, /* /proc/sys/kernel/pid_max */
+ lxpr_lookup_sys_kdir_randdir, /* /proc/sys/kernel/random */
+ lxpr_lookup_not_a_dir, /* /proc/sys/kernel/random/boot_id */
lxpr_lookup_not_a_dir, /* /proc/sys/kernel/shmmax */
lxpr_lookup_not_a_dir, /* /proc/sys/kernel/threads-max */
+ lxpr_lookup_sys_vmdir, /* /proc/sys/vm */
+ lxpr_lookup_not_a_dir, /* /proc/sys/vm/nr_hugepages */
lxpr_lookup_not_a_dir, /* /proc/uptime */
lxpr_lookup_not_a_dir, /* /proc/version */
};
@@ -811,9 +849,14 @@ static int (*lxpr_readdir_function[LXPR_NFILES])() = {
lxpr_readdir_not_a_dir, /* /proc/sys/kernel/hostname */
lxpr_readdir_not_a_dir, /* /proc/sys/kernel/msgmni */
lxpr_readdir_not_a_dir, /* /proc/sys/kernel/ngroups_max */
+ lxpr_readdir_not_a_dir, /* /proc/sys/kernel/osrelease */
lxpr_readdir_not_a_dir, /* /proc/sys/kernel/pid_max */
+ lxpr_readdir_sys_kdir_randdir, /* /proc/sys/kernel/random */
+ lxpr_readdir_not_a_dir, /* /proc/sys/kernel/random/boot_id */
lxpr_readdir_not_a_dir, /* /proc/sys/kernel/shmmax */
lxpr_readdir_not_a_dir, /* /proc/sys/kernel/threads-max */
+ lxpr_readdir_sys_vmdir, /* /proc/sys/vm */
+ lxpr_readdir_not_a_dir, /* /proc/sys/vm/nr_hugepages */
lxpr_readdir_not_a_dir, /* /proc/uptime */
lxpr_readdir_not_a_dir, /* /proc/version */
};
@@ -3634,6 +3677,21 @@ lxpr_read_sys_kernel_ngroups_max(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf)
}
static void
+lxpr_read_sys_kernel_osrel(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf)
+{
+ lx_zone_data_t *br_data;
+
+ ASSERT(lxpnp->lxpr_type == LXPR_SYS_KERNEL_OSREL);
+ br_data = ztolxzd(curproc->p_zone);
+ if (curproc->p_zone->zone_brand == &lx_brand) {
+ lxpr_uiobuf_printf(uiobuf, "%s\n",
+ br_data->lxzd_kernel_version);
+ } else {
+ lxpr_uiobuf_printf(uiobuf, "\n");
+ }
+}
+
+static void
lxpr_read_sys_kernel_pid_max(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf)
{
ASSERT(lxpnp->lxpr_type == LXPR_SYS_KERNEL_PID_MAX);
@@ -3641,6 +3699,64 @@ lxpr_read_sys_kernel_pid_max(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf)
}
static void
+lxpr_read_sys_kernel_rand_bootid(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf)
+{
+ /*
+ * This file isn't documented on the Linux proc(5) man page but
+ * according to the blog of the author of systemd/journald (the
+ * consumer), he says:
+ * boot_id: A random ID that is regenerated on each boot. As such it
+ * can be used to identify the local machine's current boot. It's
+ * universally available on any recent Linux kernel. It's a good and
+ * safe choice if you need to identify a specific boot on a specific
+ * booted kernel.
+ *
+ * We'll just generate a random ID if necessary. On Linux the format
+ * appears to resemble a uuid but since it is not documented to be a
+ * uuid, we don't worry about that.
+ */
+ lx_zone_data_t *br_data;
+
+ ASSERT(lxpnp->lxpr_type == LXPR_SYS_KERNEL_RAND_BOOTID);
+
+ if (curproc->p_zone->zone_brand != &lx_brand) {
+ lxpr_uiobuf_printf(uiobuf, "0\n");
+ return;
+ }
+
+ br_data = ztolxzd(curproc->p_zone);
+ if (br_data->lxzd_bootid[0] == '\0') {
+ extern int getrandom(void *, size_t, int);
+ int i;
+
+ for (i = 0; i < 5; i++) {
+ u_longlong_t n;
+ char s[32];
+
+ (void) random_get_bytes((uint8_t *)&n, sizeof (n));
+ switch (i) {
+ case 0: (void) snprintf(s, sizeof (s), "%08llx", n);
+ s[8] = '\0';
+ break;
+ case 4: (void) snprintf(s, sizeof (s), "%012llx", n);
+ s[12] = '\0';
+ break;
+ default: (void) snprintf(s, sizeof (s), "%04llx", n);
+ s[4] = '\0';
+ break;
+ }
+ if (i > 0)
+ strlcat(br_data->lxzd_bootid, "-",
+ sizeof (br_data->lxzd_bootid));
+ strlcat(br_data->lxzd_bootid, s,
+ sizeof (br_data->lxzd_bootid));
+ }
+ }
+
+ lxpr_uiobuf_printf(uiobuf, "%s\n", br_data->lxzd_bootid);
+}
+
+static void
lxpr_read_sys_kernel_shmmax(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf)
{
rctl_qty_t val;
@@ -3665,6 +3781,13 @@ lxpr_read_sys_kernel_threads_max(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf)
lxpr_uiobuf_printf(uiobuf, "%d\n", curproc->p_zone->zone_nlwps_ctl);
}
+static void
+lxpr_read_sys_vm_nhpages(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf)
+{
+ ASSERT(lxpnp->lxpr_type == LXPR_SYS_KERNEL_VM_NHUGEP);
+ lxpr_uiobuf_printf(uiobuf, "%d\n", 0);
+}
+
/*
* lxpr_read_uptime(): read the contents of the "uptime" file.
*
@@ -4577,6 +4700,22 @@ lxpr_lookup_sys_kerneldir(vnode_t *dp, char *comp)
}
static vnode_t *
+lxpr_lookup_sys_kdir_randdir(vnode_t *dp, char *comp)
+{
+ ASSERT(VTOLXP(dp)->lxpr_type == LXPR_SYS_KERNEL_RANDDIR);
+ return (lxpr_lookup_common(dp, comp, NULL, sys_randdir,
+ SYS_RANDDIRFILES));
+}
+
+static vnode_t *
+lxpr_lookup_sys_vmdir(vnode_t *dp, char *comp)
+{
+ ASSERT(VTOLXP(dp)->lxpr_type == LXPR_SYS_VMDIR);
+ return (lxpr_lookup_common(dp, comp, NULL, sys_vmdir,
+ SYS_VMDIRFILES));
+}
+
+static vnode_t *
lxpr_lookup_sys_fsdir(vnode_t *dp, char *comp)
{
ASSERT(VTOLXP(dp)->lxpr_type == LXPR_SYS_FSDIR);
@@ -5250,6 +5389,22 @@ lxpr_readdir_sys_kerneldir(lxpr_node_t *lxpnp, uio_t *uiop, int *eofp)
SYS_KERNELDIRFILES));
}
+static int
+lxpr_readdir_sys_kdir_randdir(lxpr_node_t *lxpnp, uio_t *uiop, int *eofp)
+{
+ ASSERT(lxpnp->lxpr_type == LXPR_SYS_KERNEL_RANDDIR);
+ return (lxpr_readdir_common(lxpnp, uiop, eofp, sys_randdir,
+ SYS_RANDDIRFILES));
+}
+
+static int
+lxpr_readdir_sys_vmdir(lxpr_node_t *lxpnp, uio_t *uiop, int *eofp)
+{
+ ASSERT(lxpnp->lxpr_type == LXPR_SYS_VMDIR);
+ return (lxpr_readdir_common(lxpnp, uiop, eofp, sys_vmdir,
+ SYS_VMDIRFILES));
+}
+
/*
* lxpr_readlink(): Vnode operation for VOP_READLINK()
*/
diff --git a/usr/src/uts/common/brand/lx/sys/lx_brand.h b/usr/src/uts/common/brand/lx/sys/lx_brand.h
index f8e630a1a0..8b9b4241eb 100644
--- a/usr/src/uts/common/brand/lx/sys/lx_brand.h
+++ b/usr/src/uts/common/brand/lx/sys/lx_brand.h
@@ -419,6 +419,9 @@ typedef ulong_t lx_affmask_t[LX_AFF_ULONGS];
/* Max. length of kernel version string */
#define LX_VERS_MAX 16
+/* Length of proc boot_id string */
+#define LX_BOOTID_LEN 37
+
/*
* Flag values for uc_brand_data[0] in the ucontext_t:
*/
@@ -627,6 +630,7 @@ struct lx_lwp_data {
typedef struct lx_zone_data {
char lxzd_kernel_version[LX_VERS_MAX];
ksocket_t lxzd_ioctl_sock;
+ char lxzd_bootid[LX_BOOTID_LEN]; /* procfs boot_id */
} lx_zone_data_t;
#define BR_CPU_BOUND 0x0001