diff options
author | Jerry Jelinek <jerry.jelinek@joyent.com> | 2015-07-03 13:18:53 +0000 |
---|---|---|
committer | Jerry Jelinek <jerry.jelinek@joyent.com> | 2015-07-03 13:18:53 +0000 |
commit | 162addd17bf2abc53e0a206fe1c9db52d3b37de9 (patch) | |
tree | 5a0756203e95fad6ba97a5a235eae498e594ac59 | |
parent | b9d7280783ffdfad9a0495681eb53bc010c4b1bb (diff) | |
download | illumos-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.h | 5 | ||||
-rw-r--r-- | usr/src/uts/common/brand/lx/procfs/lx_prsubr.c | 2 | ||||
-rw-r--r-- | usr/src/uts/common/brand/lx/procfs/lx_prvnops.c | 155 | ||||
-rw-r--r-- | usr/src/uts/common/brand/lx/sys/lx_brand.h | 4 |
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 |