Date: Sun, 14 Jun 2009 10:49:06 GMT From: Edward Tomasz Napierala <trasz@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 164326 for review Message-ID: <200906141049.n5EAn6gt094651@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=164326 Change 164326 by trasz@trasz_victim on 2009/06/14 10:48:25 Working resource accounting retrieval. Affected files ... .. //depot/projects/soc2009/trasz_limits/lib/libc/sys/Symbol.map#3 edit .. //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#8 edit .. //depot/projects/soc2009/trasz_limits/sys/sys/hrl.h#7 edit .. //depot/projects/soc2009/trasz_limits/sys/sys/proc.h#4 edit .. //depot/projects/soc2009/trasz_limits/sys/sys/resourcevar.h#3 edit .. //depot/projects/soc2009/trasz_limits/usr.sbin/hrl/hrl.c#7 edit Differences ... ==== //depot/projects/soc2009/trasz_limits/lib/libc/sys/Symbol.map#3 (text) ==== @@ -357,8 +357,7 @@ setfib; symlinkat; unlinkat; - hrl_get; - hrl_set; + hrl; }; FBSDprivate_1.0 { ==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#8 (text+ko) ==== @@ -34,6 +34,7 @@ #include <sys/kernel.h> #include <sys/priv.h> #include <sys/proc.h> +#include <sys/resourcevar.h> #include <sys/sysent.h> #include <sys/sysproto.h> #include <sys/systm.h> @@ -107,7 +108,8 @@ /* * XXX: Obviously wrong, fix later. */ - p->p_resources[resource] += amount; + p->p_accounting.ha_resources[resource] += amount; + p->p_ucred->cr_ruidinfo->ui_accounting.ha_resources[resource] += amount; /* * XXX: When denying, return proper errno - EFSIZ, ENOMEM etc. @@ -119,6 +121,12 @@ int hrl_allocated_proc(struct proc *p, int resource, uint64_t amount) { + int64_t diff; + + diff = amount - p->p_accounting.ha_resources[resource]; + p->p_accounting.ha_resources[resource] += diff; + p->p_ucred->cr_ruidinfo->ui_accounting.ha_resources[resource] += diff; + /* * XXX: Make sure process can lower its resource consumption, * even when already above the limit. @@ -133,7 +141,8 @@ KASSERT(amount > 0, ("invalid amount")); - p->p_resources[resource] -= amount; + p->p_accounting.ha_resources[resource] -= amount; + p->p_ucred->cr_ruidinfo->ui_accounting.ha_resources[resource] -= amount; } int @@ -221,7 +230,7 @@ static int hrl_get_rules(struct thread *td, void *bufp, size_t buflen) { - int error, copied = 0; + int error = 0, copied = 0; struct hrl_rule *buf; struct hrl_node *node; @@ -266,23 +275,78 @@ return (error); } +static int +hrl_get_acc_pid(struct thread *td, id_t pid, void *bufp, size_t buflen) +{ + int error; + struct proc *p; + + if ((p = pfind(pid)) == NULL) { + if ((p = zpfind(pid)) == NULL) + return (ESRCH); + } + error = copyout(&p->p_accounting, bufp, sizeof(p->p_accounting)); + PROC_UNLOCK(p); + + return (error); +} + +static int +hrl_get_acc_uid(struct thread *td, id_t pid, void *bufp, size_t buflen) +{ + int error; + struct uidinfo *uip; + + uip = uifind(pid); + if (uip == NULL) + return (ESRCH); + error = copyout(&uip->ui_accounting, bufp, sizeof(uip->ui_accounting)); + uifree(uip); + + return (error); +} + int hrl(struct thread *td, struct hrl_args *uap) { - switch (uap->op) { - case HRL_OP_GET_RULES: + int error; + id_t id; + + if (uap->op == HRL_OP_GET_RULES) return (hrl_get_rules(td, uap->outbufp, uap->outbuflen)); - case HRL_OP_GET_ACC_PID: - return (hrl_get_acc_pid(td, uap->outbufp, uap->outbuflen)); - default: + + if (uap->inbuflen != sizeof(id_t)) + return (EINVAL); + + error = copyin(uap->inbufp, &id, sizeof(id_t)); + if (error) + return (error); + + if (id <= 0) return (EINVAL); - } + + if (uap->outbuflen < sizeof(struct hrl_acc)) + return (EFBIG); + + if (uap->op == HRL_OP_GET_ACC_PID) + return (hrl_get_acc_pid(td, id, uap->outbufp, uap->outbuflen)); + + if (uap->op == HRL_OP_GET_ACC_UID) + return (hrl_get_acc_uid(td, id, uap->outbufp, uap->outbuflen)); + + return (EINVAL); } static void hrl_proc_exit(void *arg __unused, struct proc *p) { + int i; struct hrl_node *node, *next; + struct uidinfo *uip; + + uip = p->p_ucred->cr_ruidinfo; + for (i = 0; i < HRL_RESOURCE_MAX + 1; i++) + uip->ui_accounting.ha_resources[i] -= p->p_accounting.ha_resources[i]; /* * Remove temporary rules created via setrlimit(2). ==== //depot/projects/soc2009/trasz_limits/sys/sys/hrl.h#7 (text+ko) ==== @@ -90,13 +90,21 @@ #define HRL_ACTION_SIGXFSZ 0x0009 #define HRL_ACTION_MAX HRL_ACTION_SIGXFSZ -#define HRL_MAX_LIMITS 128 +#define HRL_MAX_LIMITS 1024 #define HRL_OP_GET_RULES 1 #define HRL_OP_GET_ACC_PID 2 #define HRL_OP_GET_ACC_UID 3 #define HRL_OP_GET_ACC_GID 4 +/* + * 'hrl_acc' defines resource consumption for a particular + * object, such as process or user. + */ +struct hrl_acc { + int64_t ha_resources[HRL_RESOURCE_MAX + 1]; +}; + #ifdef _KERNEL struct proc; ==== //depot/projects/soc2009/trasz_limits/sys/sys/proc.h#4 (text+ko) ==== @@ -513,6 +513,7 @@ int p_boundary_count;/* (c) Num threads at user boundary */ int p_pendingcnt; /* how many signals are pending */ struct itimers *p_itimers; /* (c) POSIX interval timers. */ + struct hrl_acc p_accounting; /* (*) HRL resource accounting */ /* End area that is zeroed on creation. */ #define p_endzero p_magic @@ -546,7 +547,6 @@ LIST_HEAD(, mqueue_notifier) p_mqnotifier; /* (c) mqueue notifiers.*/ struct kdtrace_proc *p_dtrace; /* (*) DTrace-specific data. */ struct cv p_pwait; /* (*) wait cv for exit/exec */ - int64_t p_resources[HRL_RESOURCE_MAX + 1]; }; #define p_session p_pgrp->pg_session ==== //depot/projects/soc2009/trasz_limits/sys/sys/resourcevar.h#3 (text+ko) ==== @@ -95,7 +95,7 @@ long ui_ptscnt; /* (b) number of pseudo-terminals */ uid_t ui_uid; /* (a) uid */ u_int ui_ref; /* (b) reference count */ - int64_t ui_resources[HRL_RESOURCE_MAX + 1]; + struct hrl_acc ui_accounting; /* (*) HRL resource accounting */ }; struct proc; ==== //depot/projects/soc2009/trasz_limits/usr.sbin/hrl/hrl.c#7 (text+ko) ==== @@ -248,9 +248,9 @@ err(1, "realloc"); error = hrl(HRL_OP_GET_RULES, NULL, 0, rules, ruleslen); - if (error != 0 && error != EFBIG) - err(1, "hrl_get"); - } while (error == EFBIG); + if (error && errno != EFBIG) + err(1, "hrl"); + } while (error && errno == EFBIG); printf("Defined resource limits:\n"); @@ -282,46 +282,19 @@ static void print_accounting(int op, id_t id) { - int error; - size_t ruleslen, i; - struct hrl_rule *rules = NULL; + int error, i; + struct hrl_acc acc; - ruleslen = BUFLEN_DEFAULT / 4; - do { - ruleslen *= 4; - rules = realloc(rules, ruleslen); - if (rules == NULL) - err(1, "realloc"); - - error = hrl(op, &id, sizeof(id), rules, ruleslen); - if (error != 0 && error != EFBIG) - err(1, "hrl_get"); - } while (error == EFBIG); + error = hrl(op, &id, sizeof(id), &acc, sizeof(acc)); + if (error) + err(1, "hrl"); printf("Resource utilisation:\n"); - if (rules[0].hr_subject == 0) { - printf("No resource utilisation recorded.\n"); - - return; - } - - for (i = 0; i < ruleslen / sizeof(*rules); i++) { - /* NULL entry terminating the table? */ - if (rules[i].hr_subject == 0) - break; - print_subject(rules[i].hr_subject, rules[i].hr_subject_id); - printf(":"); - print_resource(rules[i].hr_resource); - printf(":"); - print_action(rules[i].hr_action); + for (i = 1; i < HRL_RESOURCE_MAX + 1; i++) { + print_resource(i); printf("="); - printf("%jd", rules[i].hr_amount); - if (rules[i].hr_subject != rules[i].hr_per) { - printf("/"); - print_per(rules[i].hr_per); - } - printf("\n"); + printf("%jd\n", acc.ha_resources[i]); } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906141049.n5EAn6gt094651>