PERFORCE change 163778 for review
Edward Tomasz Napierala
trasz at FreeBSD.org
Mon Jun 8 12:36:37 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=163778
Change 163778 by trasz at trasz_victim on 2009/06/08 12:36:08
Minor renaming.
Affected files ...
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#5 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_resource.c#4 edit
.. //depot/projects/soc2009/trasz_limits/sys/sys/hrl.h#4 edit
.. //depot/projects/soc2009/trasz_limits/usr.sbin/hrl/hrl.c#4 edit
Differences ...
==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#5 (text+ko) ====
@@ -45,7 +45,7 @@
#include <vm/uma.h>
struct hrl_node {
- struct hrl_limit hn_limit;
+ struct hrl_rule hn_rule;
RB_ENTRY(hrl_node) hn_next;
};
@@ -56,29 +56,29 @@
static int
hn_compare(const struct hrl_node *a, const struct hrl_node *b)
{
- if (a->hn_limit.hl_subject < b->hn_limit.hl_subject)
+ if (a->hn_rule.hr_subject < b->hn_rule.hr_subject)
return (-1);
- else if (a->hn_limit.hl_subject > b->hn_limit.hl_subject)
+ else if (a->hn_rule.hr_subject > b->hn_rule.hr_subject)
return (1);
- if (a->hn_limit.hl_subject_id < b->hn_limit.hl_subject_id)
+ if (a->hn_rule.hr_subject_id < b->hn_rule.hr_subject_id)
return (-1);
- else if (a->hn_limit.hl_subject_id > b->hn_limit.hl_subject_id)
+ else if (a->hn_rule.hr_subject_id > b->hn_rule.hr_subject_id)
return (1);
- if (a->hn_limit.hl_per < b->hn_limit.hl_per)
+ if (a->hn_rule.hr_per < b->hn_rule.hr_per)
return (-1);
- else if (a->hn_limit.hl_per > b->hn_limit.hl_per)
+ else if (a->hn_rule.hr_per > b->hn_rule.hr_per)
return (1);
- if (a->hn_limit.hl_object < b->hn_limit.hl_object)
+ if (a->hn_rule.hr_resource < b->hn_rule.hr_resource)
return (-1);
- else if (a->hn_limit.hl_object > b->hn_limit.hl_object)
+ else if (a->hn_rule.hr_resource > b->hn_rule.hr_resource)
return (1);
- if (a->hn_limit.hl_action < b->hn_limit.hl_action)
+ if (a->hn_rule.hr_action < b->hn_rule.hr_action)
return (-1);
- else if (a->hn_limit.hl_action > b->hn_limit.hl_action)
+ else if (a->hn_rule.hr_action > b->hn_rule.hr_action)
return (1);
return (0);
@@ -100,7 +100,7 @@
MALLOC_DEFINE(M_HRL, "hrl", "Hierarchical Resource Limits");
int
-hrl_alloc(int object, uint64_t amount)
+hrl_alloc(int resource, uint64_t amount)
{
KASSERT(amount > 0, ("invalid amount"));
@@ -109,22 +109,22 @@
}
void
-hrl_free(int object, uint64_t amount)
+hrl_free(int resource, uint64_t amount)
{
KASSERT(amount > 0, ("invalid amount"));
}
void
-hrl_adjust(int subject, id_t subject_id, int per, int object, int action, int64_t amount)
+hrl_adjust(int subject, id_t subject_id, int per, int resource, int action, int64_t amount)
{
struct hrl_node searched, *node, *existing;
- searched.hn_limit.hl_subject = subject;
- searched.hn_limit.hl_subject_id = subject_id;
- searched.hn_limit.hl_per = per;
- searched.hn_limit.hl_object = object;
- searched.hn_limit.hl_action = action;
+ searched.hn_rule.hr_subject = subject;
+ searched.hn_rule.hr_subject_id = subject_id;
+ searched.hn_rule.hr_per = per;
+ searched.hn_rule.hr_resource = resource;
+ searched.hn_rule.hr_action = action;
/*
* Removing a limit.
@@ -151,9 +151,9 @@
mtx_lock(&hrl_lock);
existing = RB_INSERT(hrl_tree, &hrls, node);
if (existing != NULL) {
- existing->hn_limit.hl_amount = amount;
+ existing->hn_rule.hr_amount = amount;
} else {
- node->hn_limit.hl_amount = amount;
+ node->hn_rule.hr_amount = amount;
nhrls++;
}
mtx_unlock(&hrl_lock);
@@ -167,20 +167,20 @@
#if 0
static int
-hrl_check(struct hrl_limit *limits, int nlimits)
+hrl_check(struct hrl_rule *limits, int nlimits)
{
int i;
for (i = 0; i < nlimits; i++) {
- if (limits[i].hl_subject <= 0 || limits[i].hl_subject > HRL_SUBJECT_MAX)
+ if (limits[i].hr_subject <= 0 || limits[i].hr_subject > HRL_SUBJECT_MAX)
return (EINVAL);
- if (limits[i].hl_per <= 0 || limits[i].hl_per > HRL_SUBJECT_MAX)
+ if (limits[i].hr_per <= 0 || limits[i].hr_per > HRL_SUBJECT_MAX)
return (EINVAL);
- if (limits[i].hl_object <= 0 || limits[i].hl_object > HRL_OBJECT_MAX)
+ if (limits[i].hr_resource <= 0 || limits[i].hr_resource > HRL_RESOURCE_MAX)
return (EINVAL);
- if (limits[i].hl_action <= 0 || limits[i].hl_action > HRL_ACTION_MAX)
+ if (limits[i].hr_action <= 0 || limits[i].hr_action > HRL_ACTION_MAX)
return (EINVAL);
- if (limits[i].hl_amount <= 0)
+ if (limits[i].hr_amount <= 0)
return (EINVAL);
}
@@ -194,7 +194,7 @@
#if 0
int error;
size_t buflen;
- struct hrl_limit *newlimits;
+ struct hrl_rule *newlimits;
error = priv_check(td, PRIV_HRL_GET);
if (error)
@@ -220,7 +220,7 @@
return (0);
}
- buflen = sizeof(struct hrl_limit) * uap->nentries;
+ buflen = sizeof(struct hrl_rule) * uap->nentries;
newlimits = malloc(buflen, M_HRL, M_WAITOK);
error = copyin(uap->bufp, newlimits, buflen);
@@ -257,7 +257,7 @@
int error = 0, copied = 0;
size_t buflen;
struct hrl_node *node;
- struct hrl_limit *buf;
+ struct hrl_rule *buf;
if (uap->nentries == 0 && uap->bufp == NULL) {
mtx_lock(&hrl_lock);
@@ -270,7 +270,7 @@
if (uap->nentries < 0 || uap->nentries >= HRL_MAX_LIMITS)
return (EINVAL);
- buflen = sizeof(struct hrl_limit) * uap->nentries;
+ buflen = sizeof(struct hrl_rule) * uap->nentries;
buf = malloc(buflen, M_HRL, M_WAITOK);
/*
@@ -287,14 +287,14 @@
error = EFBIG;
break;
}
- *(buf + copied) = node->hn_limit;
+ *(buf + copied) = node->hn_rule;
copied++;
}
mtx_unlock(&hrl_lock);
if (error)
goto out;
- error = copyout(buf, uap->bufp, sizeof(struct hrl_limit) * copied);
+ error = copyout(buf, uap->bufp, sizeof(struct hrl_rule) * copied);
if (error)
goto out;
@@ -315,22 +315,21 @@
struct hrl_node *node, *next;
/*
- * Go through all the limits, looking for the ones with subject
- * equal to the exiting process, and remove them.
+ * Remove temporary rules created via setrlimit(2).
*
- * XXX: What are we gonna do - insert a HRL entry for every process
- * that inherits a limit set with setrlimit(2), or do some
- * magic here, moving limits from the parent process that's
- * exiting to its children?
+ * XXX: What are we gonna do with a children of a process that
+ * called setrlimit(2) - just copy the limits for every one
+ * of them, or do some magic here, moving limits from the
+ * parent process that's exiting to its children?
*/
restart:
mtx_lock(&hrl_lock);
for (node = RB_MIN(hrl_tree, &hrls); node != NULL; node = next) {
next = RB_NEXT(hrl_tree, &hrls, node);
- if (node->hn_limit.hl_subject != HRL_SUBJECT_PROCESS)
+ if (node->hn_rule.hr_subject != HRL_SUBJECT_PROCESS)
continue;
- if (node->hn_limit.hl_subject_id != p->p_pid)
+ if (node->hn_rule.hr_subject_id != p->p_pid)
continue;
node = RB_REMOVE(hrl_tree, &hrls, node);
==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_resource.c#4 (text+ko) ====
@@ -646,7 +646,7 @@
static void
hrl_handle_setrlimit(u_int which, struct rlimit *lim, struct thread *td)
{
- int object, subject, action = -1;
+ int resource, subject, action = -1;
id_t id;
/*
@@ -657,47 +657,47 @@
switch (which) {
case RLIMIT_CPU:
- object = HRL_OBJECT_CPUTIME;
+ resource = HRL_RESOURCE_CPUTIME;
action = HRL_ACTION_SIGXCPU;
break;
case RLIMIT_FSIZE:
- object = HRL_OBJECT_FILESIZE;
+ resource = HRL_RESOURCE_FILESIZE;
break;
case RLIMIT_DATA:
- object = HRL_OBJECT_DATASIZE;
+ resource = HRL_RESOURCE_DATASIZE;
break;
case RLIMIT_STACK:
- object = HRL_OBJECT_STACKSIZE;
+ resource = HRL_RESOURCE_STACKSIZE;
action = HRL_ACTION_SIGSEGV;
break;
case RLIMIT_CORE:
- object = HRL_OBJECT_COREDUMPSIZE;
+ resource = HRL_RESOURCE_COREDUMPSIZE;
break;
case RLIMIT_RSS:
- object = HRL_OBJECT_MEMORYUSE;
+ resource = HRL_RESOURCE_MEMORYUSE;
break;
case RLIMIT_MEMLOCK:
- object = HRL_OBJECT_MEMORYLOCKED;
+ resource = HRL_RESOURCE_MEMORYLOCKED;
break;
case RLIMIT_NPROC:
- object = HRL_OBJECT_MAXPROCESSES;
+ resource = HRL_RESOURCE_MAXPROCESSES;
subject = HRL_SUBJECT_USER;
id = td->td_ucred->cr_uid;
break;
case RLIMIT_NOFILE:
- object = HRL_OBJECT_OPENFILES;
+ resource = HRL_RESOURCE_OPENFILES;
action = HRL_ACTION_SIGXFSZ;
break;
case RLIMIT_SBSIZE:
- object = HRL_OBJECT_SBSIZE;
+ resource = HRL_RESOURCE_SBSIZE;
subject = HRL_SUBJECT_USER;
id = td->td_ucred->cr_uid;
break;
case RLIMIT_VMEM:
- object = HRL_OBJECT_VMEMORYUSE;
+ resource = HRL_RESOURCE_VMEMORYUSE;
break;
case RLIMIT_NPTS:
- object = HRL_OBJECT_PTY;
+ resource = HRL_RESOURCE_PTY;
subject = HRL_SUBJECT_USER;
id = td->td_ucred->cr_uid;
break;
@@ -706,15 +706,15 @@
}
if (lim->rlim_cur != RLIM_INFINITY) {
- hrl_adjust(subject, id, subject, object, HRL_ACTION_DENY,
+ hrl_adjust(subject, id, subject, resource, HRL_ACTION_DENY,
lim->rlim_cur);
if (action != -1)
- hrl_adjust(subject, id, subject, object, action,
+ hrl_adjust(subject, id, subject, resource, action,
lim->rlim_cur);
} else {
- hrl_adjust(subject, id, subject, object, HRL_ACTION_DENY, 0);
+ hrl_adjust(subject, id, subject, resource, HRL_ACTION_DENY, 0);
if (action != -1)
- hrl_adjust(subject, id, subject, object, action, 0);
+ hrl_adjust(subject, id, subject, resource, action, 0);
}
}
==== //depot/projects/soc2009/trasz_limits/sys/sys/hrl.h#4 (text+ko) ====
@@ -36,13 +36,22 @@
* Hierarchical Resource Limits.
*/
-struct hrl_limit {
- int hl_subject;
- id_t hl_subject_id;
- int hl_per;
- int hl_object;
- int hl_action;
- int64_t hl_amount;
+/*
+ * 'hrl_rule' describes a single limit configured by the system
+ * administrator or a temporary limit set using setrlimit(2).
+ * The difference between 'subject' and 'per' is best described
+ * by example: to specify that every process of user with uid 1984
+ * can consume 1gb of virtual memory, the 'hr_subject' would be
+ * HRL_SUBJECT_USER, 'hrl_subject_id' - 1984, and 'hr_per' -
+ * HRL_SUBJECT_PROCESS.
+ */
+struct hrl_rule {
+ int hr_subject;
+ id_t hr_subject_id;
+ int hr_per;
+ int hr_resource;
+ int hr_action;
+ int64_t hr_amount;
};
#define HRL_SUBJECT_PROCESS 0x0001
@@ -53,22 +62,22 @@
#define HRL_SUBJECT_MAX HRL_SUBJECT_JAIL
/*
- * 'hl_per' takes the same flags as 'hl_subject'.
+ * 'hr_per' takes the same flags as 'hr_subject'.
*/
-#define HRL_OBJECT_CPUTIME 0x0001
-#define HRL_OBJECT_FILESIZE 0x0002
-#define HRL_OBJECT_DATASIZE 0x0003
-#define HRL_OBJECT_STACKSIZE 0x0004
-#define HRL_OBJECT_COREDUMPSIZE 0x0005
-#define HRL_OBJECT_MEMORYUSE 0x0006
-#define HRL_OBJECT_MEMORYLOCKED 0x0007
-#define HRL_OBJECT_MAXPROCESSES 0x0008
-#define HRL_OBJECT_OPENFILES 0x0009
-#define HRL_OBJECT_SBSIZE 0x000a
-#define HRL_OBJECT_VMEMORYUSE 0x000b
-#define HRL_OBJECT_PTY 0x000c
-#define HRL_OBJECT_MAX HRL_OBJECT_PTY
+#define HRL_RESOURCE_CPUTIME 0x0001
+#define HRL_RESOURCE_FILESIZE 0x0002
+#define HRL_RESOURCE_DATASIZE 0x0003
+#define HRL_RESOURCE_STACKSIZE 0x0004
+#define HRL_RESOURCE_COREDUMPSIZE 0x0005
+#define HRL_RESOURCE_MEMORYUSE 0x0006
+#define HRL_RESOURCE_MEMORYLOCKED 0x0007
+#define HRL_RESOURCE_MAXPROCESSES 0x0008
+#define HRL_RESOURCE_OPENFILES 0x0009
+#define HRL_RESOURCE_SBSIZE 0x000a
+#define HRL_RESOURCE_VMEMORYUSE 0x000b
+#define HRL_RESOURCE_PTY 0x000c
+#define HRL_RESOURCE_MAX HRL_RESOURCE_PTY
#define HRL_ACTION_DENY 0x0001
#define HRL_ACTION_DELAY 0x0002
@@ -88,13 +97,13 @@
int hrl_alloc(int object, uint64_t amount);
void hrl_free(int object, uint64_t amount);
-void hrl_adjust(int subject, id_t subject_id, int per, int object, int action, int64_t amount);
+void hrl_adjust(int subject, id_t subject_id, int per, int resource, int action, int64_t amount);
#else /* !_KERNEL */
__BEGIN_DECLS
-int hrl_get(struct hrl_limit *bufp, int nentries, int *count);
-int hrl_set(struct hrl_limit *bufp, int nentries);
+int hrl_get(struct hrl_rule *bufp, int nentries, int *count);
+int hrl_set(struct hrl_rule *bufp, int nentries);
__END_DECLS
#endif /* !_KERNEL */
==== //depot/projects/soc2009/trasz_limits/usr.sbin/hrl/hrl.c#4 (text+ko) ====
@@ -71,48 +71,48 @@
}
static void
-print_object(int object)
+print_resource(int resource)
{
- switch (object) {
- case HRL_OBJECT_CPUTIME:
+ switch (resource) {
+ case HRL_RESOURCE_CPUTIME:
printf("cputime");
break;
- case HRL_OBJECT_FILESIZE:
+ case HRL_RESOURCE_FILESIZE:
printf("filesize");
break;
- case HRL_OBJECT_DATASIZE:
+ case HRL_RESOURCE_DATASIZE:
printf("datasize");
break;
- case HRL_OBJECT_STACKSIZE:
+ case HRL_RESOURCE_STACKSIZE:
printf("stacksize");
break;
- case HRL_OBJECT_COREDUMPSIZE:
+ case HRL_RESOURCE_COREDUMPSIZE:
printf("coredumpsize");
break;
- case HRL_OBJECT_MEMORYUSE:
+ case HRL_RESOURCE_MEMORYUSE:
printf("memoryuse");
break;
- case HRL_OBJECT_MEMORYLOCKED:
+ case HRL_RESOURCE_MEMORYLOCKED:
printf("memorylocked");
break;
- case HRL_OBJECT_MAXPROCESSES:
+ case HRL_RESOURCE_MAXPROCESSES:
printf("maxprocesses");
break;
- case HRL_OBJECT_OPENFILES:
+ case HRL_RESOURCE_OPENFILES:
printf("openfiles");
break;
- case HRL_OBJECT_SBSIZE:
+ case HRL_RESOURCE_SBSIZE:
printf("sbsize");
break;
- case HRL_OBJECT_VMEMORYUSE:
+ case HRL_RESOURCE_VMEMORYUSE:
printf("vmemoryuse");
break;
- case HRL_OBJECT_PTY:
+ case HRL_RESOURCE_PTY:
printf("pty");
break;
default:
- printf("undefined<0x%x>", object);
+ printf("undefined<0x%x>", resource);
}
}
@@ -205,16 +205,16 @@
printf("Defined resource limits:\n");
for (i = 0; i < nentries; i++) {
- print_subject(limits[i].hl_subject, limits[i].hl_subject_id);
+ print_subject(limits[i].hr_subject, limits[i].hr_subject_id);
printf(":");
- print_object(limits[i].hl_object);
+ print_resource(limits[i].hr_resource);
printf(":");
- print_action(limits[i].hl_action);
- printf(":");
- printf("%jd", limits[i].hl_amount);
- if (limits[i].hl_subject != limits[i].hl_per) {
+ print_action(limits[i].hr_action);
+ printf("=");
+ printf("%jd", limits[i].hr_amount);
+ if (limits[i].hr_subject != limits[i].hr_per) {
printf("/");
- print_per(limits[i].hl_per);
+ print_per(limits[i].hr_per);
}
printf("\n");
}
More information about the p4-projects
mailing list