aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_resource.c
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2015-06-25 00:15:37 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2015-06-25 00:15:37 +0000
commit7150ce743ada19d612137e60f6aff57686ef2ad7 (patch)
tree981e42455effe610f81a091ebd80f8b62e822831 /sys/kern/kern_resource.c
parent67076e4d58477df88807c784c3c6446d76d13df8 (diff)
downloadsrc-7150ce743ada19d612137e60f6aff57686ef2ad7.tar.gz
src-7150ce743ada19d612137e60f6aff57686ef2ad7.zip
rlimit: deduplicate code in chg* functions
Notes
Notes: svn path=/head/; revision=284783
Diffstat (limited to 'sys/kern/kern_resource.c')
-rw-r--r--sys/kern/kern_resource.c73
1 files changed, 27 insertions, 46 deletions
diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c
index 546f3b298022..48427637338f 100644
--- a/sys/kern/kern_resource.c
+++ b/sys/kern/kern_resource.c
@@ -1371,49 +1371,52 @@ ui_racct_foreach(void (*callback)(struct racct *racct,
}
#endif
-/*
- * Change the count associated with number of processes
- * a given user is using. When 'max' is 0, don't enforce a limit
- */
-int
-chgproccnt(struct uidinfo *uip, int diff, rlim_t max)
+static inline int
+chglimit(struct uidinfo *uip, long *limit, int diff, rlim_t max, const char *name)
{
/* Don't allow them to exceed max, but allow subtraction. */
if (diff > 0 && max != 0) {
- if (atomic_fetchadd_long(&uip->ui_proccnt, (long)diff) + diff > max) {
- atomic_subtract_long(&uip->ui_proccnt, (long)diff);
+ if (atomic_fetchadd_long(limit, (long)diff) + diff > max) {
+ atomic_subtract_long(limit, (long)diff);
return (0);
}
} else {
- atomic_add_long(&uip->ui_proccnt, (long)diff);
- if (uip->ui_proccnt < 0)
- printf("negative proccnt for uid = %d\n", uip->ui_uid);
+ atomic_add_long(limit, (long)diff);
+ if (*limit < 0)
+ printf("negative %s for uid = %d\n", name, uip->ui_uid);
}
return (1);
}
/*
+ * Change the count associated with number of processes
+ * a given user is using. When 'max' is 0, don't enforce a limit
+ */
+int
+chgproccnt(struct uidinfo *uip, int diff, rlim_t max)
+{
+
+ return (chglimit(uip, &uip->ui_proccnt, diff, max, "proccnt"));
+}
+
+/*
* Change the total socket buffer size a user has used.
*/
int
chgsbsize(struct uidinfo *uip, u_int *hiwat, u_int to, rlim_t max)
{
- int diff;
+ int diff, rv;
diff = to - *hiwat;
- if (diff > 0) {
- if (atomic_fetchadd_long(&uip->ui_sbsize, (long)diff) + diff > max) {
- atomic_subtract_long(&uip->ui_sbsize, (long)diff);
- return (0);
- }
+ if (diff > 0 && max == 0) {
+ rv = 0;
} else {
- atomic_add_long(&uip->ui_sbsize, (long)diff);
- if (uip->ui_sbsize < 0)
- printf("negative sbsize for uid = %d\n", uip->ui_uid);
+ rv = chglimit(uip, &uip->ui_sbsize, diff, max, "sbsize");
+ if (rv != 0)
+ *hiwat = to;
}
- *hiwat = to;
- return (1);
+ return (rv);
}
/*
@@ -1424,36 +1427,14 @@ int
chgptscnt(struct uidinfo *uip, int diff, rlim_t max)
{
- /* Don't allow them to exceed max, but allow subtraction. */
- if (diff > 0 && max != 0) {
- if (atomic_fetchadd_long(&uip->ui_ptscnt, (long)diff) + diff > max) {
- atomic_subtract_long(&uip->ui_ptscnt, (long)diff);
- return (0);
- }
- } else {
- atomic_add_long(&uip->ui_ptscnt, (long)diff);
- if (uip->ui_ptscnt < 0)
- printf("negative ptscnt for uid = %d\n", uip->ui_uid);
- }
- return (1);
+ return (chglimit(uip, &uip->ui_ptscnt, diff, max, "ptscnt"));
}
int
chgkqcnt(struct uidinfo *uip, int diff, rlim_t max)
{
- if (diff > 0 && max != 0) {
- if (atomic_fetchadd_long(&uip->ui_kqcnt, (long)diff) +
- diff > max) {
- atomic_subtract_long(&uip->ui_kqcnt, (long)diff);
- return (0);
- }
- } else {
- atomic_add_long(&uip->ui_kqcnt, (long)diff);
- if (uip->ui_kqcnt < 0)
- printf("negative kqcnt for uid = %d\n", uip->ui_uid);
- }
- return (1);
+ return (chglimit(uip, &uip->ui_kqcnt, diff, max, "kqcnt"));
}
void