From 250d9fd8aa9dc7be7fb62626f1c9ffc711d74e0c Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Sat, 12 Mar 2016 14:54:34 +0000 Subject: [PATCH] Fix handling of umtxp resource limit in sh(1)/ulimit(1), limits(1), add login.conf(5) support. Reviewed by: jilles Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D5610 --- bin/sh/miscbltin.c | 2 +- bin/sh/sh.1 | 7 ++++++- etc/login.conf | 1 + lib/libutil/login.conf.5 | 1 + lib/libutil/login_class.3 | 1 + lib/libutil/login_class.c | 1 + usr.bin/limits/limits.1 | 20 ++++++++++++++------ usr.bin/limits/limits.c | 5 +++-- 8 files changed, 28 insertions(+), 10 deletions(-) diff --git a/bin/sh/miscbltin.c b/bin/sh/miscbltin.c index 9dae4cb3c255..1537196709c2 100644 --- a/bin/sh/miscbltin.c +++ b/bin/sh/miscbltin.c @@ -452,7 +452,7 @@ ulimitcmd(int argc __unused, char **argv __unused) struct rlimit limit; what = 'f'; - while ((optc = nextopt("HSatfdsmcnuvlbpwk")) != '\0') + while ((optc = nextopt("HSatfdsmcnuvlbpwko")) != '\0') switch (optc) { case 'H': how = HARD; diff --git a/bin/sh/sh.1 b/bin/sh/sh.1 index 94067792e40e..1f2d67b3d9b5 100644 --- a/bin/sh/sh.1 +++ b/bin/sh/sh.1 @@ -2615,7 +2615,7 @@ and not found. For aliases the alias expansion is printed; for commands and tracked aliases the complete pathname of the command is printed. -.It Ic ulimit Oo Fl HSabcdfklmnpstuvw Oc Op Ar limit +.It Ic ulimit Oo Fl HSabcdfklmnopstuvw Oc Op Ar limit Set or display resource limits (see .Xr getrlimit 2 ) . If @@ -2674,6 +2674,11 @@ kilobytes. The maximal resident set size of a process, in kilobytes. .It Fl n Ar nofiles The maximal number of descriptors that could be opened by a process. +.It Fl o Ar umtxp +The maximal number of process-shared locks +(see +.Xr pthread 3 ) +for this user ID. .It Fl p Ar pseudoterminals The maximal number of pseudo-terminals for this user ID. .It Fl s Ar stacksize diff --git a/etc/login.conf b/etc/login.conf index 2cc67309ed39..e352f7f7aaf5 100644 --- a/etc/login.conf +++ b/etc/login.conf @@ -43,6 +43,7 @@ default:\ :swapuse=unlimited:\ :pseudoterminals=unlimited:\ :kqueues=unlimited:\ + :umtxp=unlimited:\ :priority=0:\ :ignoretime@:\ :umask=022: diff --git a/lib/libutil/login.conf.5 b/lib/libutil/login.conf.5 index e780940b7643..1c3cfee02e74 100644 --- a/lib/libutil/login.conf.5 +++ b/lib/libutil/login.conf.5 @@ -199,6 +199,7 @@ notation may be used. .It "stacksize size Maximum stack size limit." .It "pseudoterminals number Maximum number of pseudo-terminals." .It "swapuse size Maximum swap space size limit." +.It "umtxp number Maximum number of process-shared pthread locks." .El .Pp These resource limit entries actually specify both the maximum diff --git a/lib/libutil/login_class.3 b/lib/libutil/login_class.3 index c87faaeb8814..ab2e8af02db4 100644 --- a/lib/libutil/login_class.3 +++ b/lib/libutil/login_class.3 @@ -119,6 +119,7 @@ vmemoryuse RLIMIT_VMEM pseudoterminals RLIMIT_NPTS swapuse RLIMIT_SWAP kqueues RLIMIT_KQUEUES +umtxp RLIMIT_UMTXP .Ed .It LOGIN_SETPRIORITY Set the scheduling priority for the current process based on the diff --git a/lib/libutil/login_class.c b/lib/libutil/login_class.c index 9ffca8ea3628..ceee5c8912f7 100644 --- a/lib/libutil/login_class.c +++ b/lib/libutil/login_class.c @@ -67,6 +67,7 @@ static struct login_res { { "pseudoterminals", login_getcapnum, RLIMIT_NPTS }, { "swapuse", login_getcapsize, RLIMIT_SWAP }, { "kqueues", login_getcapsize, RLIMIT_KQUEUES }, + { "umtxp", login_getcapnum, RLIMIT_UMTXP }, { NULL, 0, 0 } }; diff --git a/usr.bin/limits/limits.1 b/usr.bin/limits/limits.1 index 3962feff1943..99136a4d36b2 100644 --- a/usr.bin/limits/limits.1 +++ b/usr.bin/limits/limits.1 @@ -30,11 +30,11 @@ .Op Fl C Ar class | Fl P Ar pid | Fl U Ar user .Op Fl SHB .Op Fl ea -.Op Fl bcdfklmnstuvpw Op Ar val +.Op Fl bcdfklmnopstuvw Op Ar val .Nm .Op Fl C Ar class | Fl U Ar user .Op Fl SHB -.Op Fl bcdfklmnstuvpw Op Ar val +.Op Fl bcdfklmnopstuvw Op Ar val .Op Fl E .Oo .Op Ar name Ns = Ns Ar value ... @@ -233,6 +233,18 @@ system is limited to the value displayed by the .Va kern.maxfiles .Xr sysctl 8 variable. +.It Fl o Op Ar val +Select or set the +.Va umtxp +resource limit. +The limit determines the maximal number of the process-shared locks +which may be simultaneously created by the processes owned by the +user, see +.Xr pthread 3 . +.It Fl p Op Ar val +Select or set the +.Va pseudoterminals +resource limit. .It Fl s Op Ar val Select or set the .Va stacksize @@ -266,10 +278,6 @@ and is inclusive of text, data, bss, stack, and .Xr mmap 2 Ns 'd space. -.It Fl p Op Ar val -Select or set the -.Va pseudoterminals -resource limit. .It Fl w Op Ar val Select or set the .Va swapuse diff --git a/usr.bin/limits/limits.c b/usr.bin/limits/limits.c index 093a367bad4c..3dd7a7169e84 100644 --- a/usr.bin/limits/limits.c +++ b/usr.bin/limits/limits.c @@ -254,7 +254,7 @@ static struct { * to be modified accordingly! */ -#define RCS_STRING "tfdscmlunbvpwk" +#define RCS_STRING "tfdscmlunbvpwko" static rlim_t resource_num(int which, int ch, const char *str); static void usage(void); @@ -551,7 +551,7 @@ usage(void) { (void)fprintf(stderr, "usage: limits [-C class|-P pid|-U user] [-eaSHBE] " - "[-bcdflmnstuvpwk [val]] [[name=val ...] cmd]\n"); + "[-bcdfklmnostuvpw [val]] [[name=val ...] cmd]\n"); exit(EXIT_FAILURE); } @@ -660,6 +660,7 @@ resource_num(int which, int ch, const char *str) case RLIMIT_NOFILE: case RLIMIT_NPTS: case RLIMIT_KQUEUES: + case RLIMIT_UMTXP: res = strtoq(s, &e, 0); s = e; break;