summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Mooney <pmooney@pfmooney.com>2016-01-20 19:57:43 +0000
committerPatrick Mooney <pmooney@pfmooney.com>2016-01-20 20:27:00 +0000
commit51a0341a7a6132c2a6b88a155ebd507963f9e8be (patch)
tree09488e9a305aef647f7f108cd717a19aa29eb75f
parentf4926b818bc9655013f761560bc515207b30f648 (diff)
downloadillumos-joyent-51a0341a7a6132c2a6b88a155ebd507963f9e8be.tar.gz
OS-5098 lxbrand want kernel.shmmni and kernel.sem tunables
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
-rw-r--r--usr/src/uts/common/brand/lx/procfs/lx_proc.h6
-rw-r--r--usr/src/uts/common/brand/lx/procfs/lx_prvnops.c61
2 files changed, 65 insertions, 2 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 29434c8146..3e2b70f4fc 100644
--- a/usr/src/uts/common/brand/lx/procfs/lx_proc.h
+++ b/usr/src/uts/common/brand/lx/procfs/lx_proc.h
@@ -21,7 +21,7 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
- * Copyright 2015 Joyent, Inc.
+ * Copyright 2016 Joyent, Inc.
*/
#ifndef _LX_PROC_H
@@ -208,7 +208,9 @@ typedef enum lxpr_nodetype {
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_SEM, /* /proc/sys/kernel/sem */
+ LXPR_SYS_KERNEL_SHMMAX, /* /proc/sys/kernel/shmmax */
+ LXPR_SYS_KERNEL_SHMMNI, /* /proc/sys/kernel/shmmni */
LXPR_SYS_KERNEL_THREADS_MAX, /* /proc/sys/kernel/threads-max */
LXPR_SYS_NETDIR, /* /proc/sys/net */
LXPR_SYS_NET_COREDIR, /* /proc/sys/net/core */
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 849cfa376b..5899b3c884 100644
--- a/usr/src/uts/common/brand/lx/procfs/lx_prvnops.c
+++ b/usr/src/uts/common/brand/lx/procfs/lx_prvnops.c
@@ -217,7 +217,9 @@ 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_sem(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_shmmni(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_net_core_somaxc(lxpr_node_t *, lxpr_uiobuf_t *);
static void lxpr_read_sys_vm_minfr_kb(lxpr_node_t *, lxpr_uiobuf_t *);
@@ -238,8 +240,13 @@ static int lxpr_write_sys_kernel_corepatt(lxpr_node_t *, uio_t *, cred_t *,
#define ttolxlwp(t) ((struct lx_lwp_data *)ttolwpbrand(t))
+extern rctl_hndl_t rc_process_semmsl;
+extern rctl_hndl_t rc_process_semopm;
+extern rctl_hndl_t rc_zone_semmni;
+
extern rctl_hndl_t rc_zone_msgmni;
extern rctl_hndl_t rc_zone_shmmax;
+extern rctl_hndl_t rc_zone_shmmni;
#define FOURGB 4294967295
/*
@@ -462,7 +469,9 @@ static lxpr_dirent_t sys_kerneldir[] = {
{ LXPR_SYS_KERNEL_OSREL, "osrelease" },
{ LXPR_SYS_KERNEL_PID_MAX, "pid_max" },
{ LXPR_SYS_KERNEL_RANDDIR, "random" },
+ { LXPR_SYS_KERNEL_SEM, "sem" },
{ LXPR_SYS_KERNEL_SHMMAX, "shmmax" },
+ { LXPR_SYS_KERNEL_SHMMNI, "shmmni" },
{ LXPR_SYS_KERNEL_THREADS_MAX, "threads-max" },
};
@@ -700,7 +709,9 @@ static void (*lxpr_read_function[LXPR_NFILES])() = {
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_sem, /* /proc/sys/kernel/sem */
lxpr_read_sys_kernel_shmmax, /* /proc/sys/kernel/shmmax */
+ lxpr_read_sys_kernel_shmmni, /* /proc/sys/kernel/shmmni */
lxpr_read_sys_kernel_threads_max, /* /proc/sys/kernel/threads-max */
lxpr_read_invalid, /* /proc/sys/net */
lxpr_read_invalid, /* /proc/sys/net/core */
@@ -818,7 +829,9 @@ static vnode_t *(*lxpr_lookup_function[LXPR_NFILES])() = {
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/sem */
lxpr_lookup_not_a_dir, /* /proc/sys/kernel/shmmax */
+ lxpr_lookup_not_a_dir, /* /proc/sys/kernel/shmmni */
lxpr_lookup_not_a_dir, /* /proc/sys/kernel/threads-max */
lxpr_lookup_sys_netdir, /* /proc/sys/net */
lxpr_lookup_sys_net_coredir, /* /proc/sys/net/core */
@@ -936,7 +949,9 @@ static int (*lxpr_readdir_function[LXPR_NFILES])() = {
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/sem */
lxpr_readdir_not_a_dir, /* /proc/sys/kernel/shmmax */
+ lxpr_readdir_not_a_dir, /* /proc/sys/kernel/shmmni */
lxpr_readdir_not_a_dir, /* /proc/sys/kernel/threads-max */
lxpr_readdir_sys_netdir, /* /proc/sys/net */
lxpr_readdir_sys_net_coredir, /* /proc/sys/net/core */
@@ -4112,6 +4127,34 @@ lxpr_read_sys_kernel_rand_bootid(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf)
}
static void
+lxpr_read_sys_kernel_sem(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf)
+{
+ proc_t *pp = curproc;
+ rctl_qty_t vmsl, vopm, vmni, vmns;
+
+ ASSERT(lxpnp->lxpr_type == LXPR_SYS_KERNEL_SEM);
+
+ mutex_enter(&pp->p_lock);
+ vmsl = rctl_enforced_value(rc_process_semmsl, pp->p_rctls, pp);
+ vopm = rctl_enforced_value(rc_process_semopm, pp->p_rctls, pp);
+ vmni = rctl_enforced_value(rc_zone_semmni, pp->p_zone->zone_rctls, pp);
+ mutex_exit(&pp->p_lock);
+ vmns = vmsl * vmni;
+ if (vmns < vmsl || vmns < vmni) {
+ vmns = ULLONG_MAX;
+ }
+ /*
+ * Format: semmsl semmns semopm semmni
+ * - semmsl: Limit semaphores in a sempahore set.
+ * - semmns: Limit semaphores in all semaphore sets
+ * - semopm: Limit operations in a single semop call
+ * - semmni: Limit number of semaphore sets
+ */
+ lxpr_uiobuf_printf(uiobuf, "%llu\t%llu\t%llu\t%llu\n",
+ vmsl, vmns, vopm, vmni);
+}
+
+static void
lxpr_read_sys_kernel_shmmax(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf)
{
rctl_qty_t val;
@@ -4130,6 +4173,24 @@ lxpr_read_sys_kernel_shmmax(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf)
}
static void
+lxpr_read_sys_kernel_shmmni(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf)
+{
+ rctl_qty_t val;
+
+ ASSERT(lxpnp->lxpr_type == LXPR_SYS_KERNEL_SHMMNI);
+
+ mutex_enter(&curproc->p_lock);
+ val = rctl_enforced_value(rc_zone_shmmni,
+ curproc->p_zone->zone_rctls, curproc);
+ mutex_exit(&curproc->p_lock);
+
+ if (val > FOURGB)
+ val = FOURGB;
+
+ lxpr_uiobuf_printf(uiobuf, "%u\n", (uint_t)val);
+}
+
+static void
lxpr_read_sys_kernel_threads_max(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf)
{
ASSERT(lxpnp->lxpr_type == LXPR_SYS_KERNEL_THREADS_MAX);