Date: Mon, 29 Jun 2009 22:29:59 GMT From: Edward Tomasz Napierala <trasz@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 165452 for review Message-ID: <200906292229.n5TMTxke096155@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=165452 Change 165452 by trasz@trasz_victim on 2009/06/29 22:28:58 Get rid of passing structures in hrl(2) altogether. Affected files ... .. //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#22 edit .. //depot/projects/soc2009/trasz_limits/sys/sys/hrl.h#17 edit .. //depot/projects/soc2009/trasz_limits/usr.sbin/hrl/hrl.c#13 edit Differences ... ==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#22 (text+ko) ==== @@ -215,6 +215,32 @@ } static const char * +hrl_subject_name(int subject) +{ + int i; + + for (i = 0; subjectnames[i].d_name != NULL; i++) { + if (subjectnames[i].d_value == subject) + return (subjectnames[i].d_name); + } + + panic("hrl_subject_name: unknown subject"); +} + +static const char * +hrl_action_name(int action) +{ + int i; + + for (i = 0; actionnames[i].d_name != NULL; i++) { + if (actionnames[i].d_value == action) + return (actionnames[i].d_name); + } + + panic("hrl_action_name: unknown action"); +} + +static const char * hrl_resource_name(int resource) { int i; @@ -667,23 +693,43 @@ return (0); } +static struct sbuf * +hrl_rules_to_sbuf(struct hrl_rule *usage, int nrules) +{ + int i; + struct sbuf *sb; + + sb = sbuf_new_auto(); + for (i = 0; i < nrules; i++) { + sbuf_printf(sb, "%s:%d:%s:%s=%jd", + hrl_subject_name(usage[i].hr_subject), + (int)usage[i].hr_subject_id, + hrl_resource_name(usage[i].hr_resource), + hrl_action_name(usage[i].hr_action), + usage[i].hr_amount); + if (usage[i].hr_per != usage[i].hr_subject) + sbuf_printf(sb, "/%s,", + hrl_subject_name(usage[i].hr_per)); + else + sbuf_printf(sb, ","); + } + return (sb); +} + static int -hrl_get_rules(struct thread *td, char *inputstr, void *bufp, size_t buflen) +hrl_get_rules(struct thread *td, char *inputstr, struct sbuf **outputsbuf) { int error = 0, copied = 0; struct hrl_rule *buf, filter; struct hrl_node *node; - if (buflen > HRL_MAX_LIMITS * sizeof(struct hrl_rule)) - return (EINVAL); - if (inputstr != NULL) { error = hrl_rule_parse(&filter, inputstr); if (error) return (error); } - buf = malloc(buflen, M_HRL, M_WAITOK); + buf = malloc(HRL_MAX_RULES * sizeof(struct hrl_rule), M_HRL, M_WAITOK); /* * Copy the limits to the temporary buffer. We cannot @@ -695,9 +741,11 @@ * XXX: Do not show everything to the client; just the * nodes that affect him. */ - /* +1 to make room for the terminating NULL entry. */ - if ((copied + 1) * sizeof(*buf) >= buflen) { - error = EFBIG; + if (copied >= HRL_MAX_RULES) { + /* + * XXX: Hey, what to do now? + */ + error = EDOOFUS; break; } @@ -713,14 +761,7 @@ if (error) goto out; - /* Add terminating NULL entry. */ - bzero(buf + copied, sizeof(*buf)); - copied++; - - error = copyout(buf, bufp, sizeof(struct hrl_rule) * copied); - if (error) - goto out; - + *outputsbuf = hrl_rules_to_sbuf(buf, copied); out: free(buf, M_HRL); @@ -911,7 +952,7 @@ switch (uap->op) { case HRL_OP_GET_RULES: - error = hrl_get_rules(td, inputstr, uap->outbufp, uap->outbuflen); + error = hrl_get_rules(td, inputstr, &outputsbuf); break; case HRL_OP_ADD_RULE: error = hrl_add_rule(td, inputstr); @@ -935,10 +976,6 @@ error = EINVAL; } - /* - * XXX: Finish moving copyouts into this place. - */ - if (outputsbuf != NULL) { sbuf_finish(outputsbuf); if (uap->outbuflen < sbuf_len(outputsbuf) + 1) { ==== //depot/projects/soc2009/trasz_limits/sys/sys/hrl.h#17 (text+ko) ==== @@ -36,6 +36,16 @@ * Hierarchical Resource Limits. */ +#define HRL_OP_GET_RULES 1 +#define HRL_OP_ADD_RULE 6 +#define HRL_OP_REMOVE_RULE 7 +#define HRL_OP_GET_USAGE_PID 2 +#define HRL_OP_GET_USAGE_UID 3 +#define HRL_OP_GET_USAGE_GID 4 +#define HRL_OP_GET_USAGE_JAILID 5 + +#ifdef _KERNEL + /* * 'hrl_rule' describes a single limit configured by the system * administrator or a temporary limit set using setrlimit(2). @@ -93,17 +103,7 @@ #define HRL_ACTION_SIGXFSZ 0x0009 #define HRL_ACTION_MAX HRL_ACTION_SIGXFSZ -#define HRL_MAX_LIMITS 1024 - -#define HRL_OP_GET_RULES 1 -#define HRL_OP_ADD_RULE 6 -#define HRL_OP_REMOVE_RULE 7 -#define HRL_OP_GET_USAGE_PID 2 -#define HRL_OP_GET_USAGE_UID 3 -#define HRL_OP_GET_USAGE_GID 4 -#define HRL_OP_GET_USAGE_JAILID 5 - -#ifdef _KERNEL +#define HRL_MAX_RULES 1024 /* * 'hrl_usage' defines resource consumption for a particular ==== //depot/projects/soc2009/trasz_limits/usr.sbin/hrl/hrl.c#13 (text+ko) ==== @@ -40,6 +40,7 @@ #define BUFLEN_DEFAULT 1024 +#if 0 static void print_subject(int subject, id_t id) { @@ -75,115 +76,7 @@ break; } } - -static void -print_resource(int resource) -{ - - switch (resource) { - case HRL_RESOURCE_CPUTIME: - printf("cputime"); - break; - case HRL_RESOURCE_FILESIZE: - printf("filesize"); - break; - case HRL_RESOURCE_DATASIZE: - printf("datasize"); - break; - case HRL_RESOURCE_STACKSIZE: - printf("stacksize"); - break; - case HRL_RESOURCE_COREDUMPSIZE: - printf("coredumpsize"); - break; - case HRL_RESOURCE_MEMORYUSE: - printf("memoryuse"); - break; - case HRL_RESOURCE_MEMORYLOCKED: - printf("memorylocked"); - break; - case HRL_RESOURCE_MAXPROCESSES: - printf("maxprocesses"); - break; - case HRL_RESOURCE_FILEDESCRIPTORS: - printf("filedescriptors"); - break; - case HRL_RESOURCE_SBSIZE: - printf("sbsize"); - break; - case HRL_RESOURCE_VMEMORYUSE: - printf("vmemoryuse"); - break; - case HRL_RESOURCE_PTY: - printf("pty"); - break; - default: - printf("undefined<0x%x>", resource); - } -} - -static void -print_action(int action) -{ - - switch (action) { - case HRL_ACTION_DENY: - printf("deny"); - break; - case HRL_ACTION_DELAY: - printf("delay"); - break; - case HRL_ACTION_LOG: - printf("log"); - break; - case HRL_ACTION_SIGHUP: - printf("sighup"); - break; - case HRL_ACTION_SIGINT: - printf("sigint"); - break; - case HRL_ACTION_SIGKILL: - printf("sigkill"); - break; - case HRL_ACTION_SIGSEGV: - printf("sigsegv"); - break; - case HRL_ACTION_SIGXCPU: - printf("sigxcpu"); - break; - case HRL_ACTION_SIGXFSZ: - printf("sigxfsz"); - break; - default: - printf("undefined<0x%x>", action); - } -} - -static void -print_per(int per) -{ - - switch (per) { - case HRL_SUBJECT_PROCESS: - printf("process"); - break; - case HRL_SUBJECT_USER: - printf("user"); - break; - case HRL_SUBJECT_GROUP: - printf("group"); - break; - case HRL_SUBJECT_LOGINCLASS: - printf("class"); - break; - case HRL_SUBJECT_JAIL: - printf("jail"); - break; - default: - printf("undefined<0x%x>", per); - break; - } -} +#endif static id_t parse_pid(const char *s) @@ -240,58 +133,49 @@ return (id); } +/* + * Query the kernel about resource limit rules and print them out. + */ static void print_rules(char *filter) { int error; - size_t ruleslen, i; - struct hrl_rule *rules = NULL; + char *outbuf = NULL, *tmp; + size_t outbuflen = BUFLEN_DEFAULT / 4; - ruleslen = BUFLEN_DEFAULT / 4; do { - ruleslen *= 4; - rules = realloc(rules, ruleslen); - if (rules == NULL) + outbuflen *= 4; + outbuf = realloc(outbuf, outbuflen); + if (outbuf == NULL) err(1, "realloc"); if (filter != NULL) - error = hrl(HRL_OP_GET_RULES, filter, strlen(filter) + 1, rules, ruleslen); + error = hrl(HRL_OP_GET_RULES, filter, strlen(filter) + 1, outbuf, outbuflen); else - error = hrl(HRL_OP_GET_RULES, NULL, 0, rules, ruleslen); + error = hrl(HRL_OP_GET_RULES, NULL, 0, outbuf, outbuflen); if (error && errno != EFBIG) err(1, "hrl"); } while (error && errno == EFBIG); + for (tmp = outbuf; *tmp != '\0'; tmp++) + if (*tmp == ',') + *tmp = '\n'; + if (filter != NULL) - printf("Defined resource limits matching \"%s\":\n", filter); + printf("Defined resource limits matching \"%s\":\n%s\n", filter, outbuf); else - printf("Defined resource limits:\n"); + printf("Defined resource limits:\n%s\n", outbuf); - if (rules[0].hr_subject == 0) { - printf("No resource limits defined.\n"); + /* + * XXX: Resolve numeric ID-s back to names. + */ - 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); - 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"); - } + free(outbuf); } +/* + * Query the kernel about a resource usage and print it out. + */ static void print_usage(int op, id_t id) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906292229.n5TMTxke096155>