From: Thierry Parmentelat Date: Wed, 27 Aug 2008 14:30:13 +0000 (+0000) Subject: /etc/vservers//personality X-Git-Tag: util-vserver-pl-0.3-11~2 X-Git-Url: http://git.onelab.eu/?p=util-vserver-pl.git;a=commitdiff_plain;h=569c62a4ed4d2ab13516bbf1f68e1a71205aa2c6 /etc/vservers//personality this is a first draft; it is expected that vserver sartup now reads this file and performs the appropriate personality setting Goes with NodeManager-1.7-17 --- diff --git a/src/planetlab.c b/src/planetlab.c index 5211ba0..15cc7e5 100644 --- a/src/planetlab.c +++ b/src/planetlab.c @@ -134,7 +134,8 @@ pl_chcontext(xid_t ctx, uint64_t bcaps, const struct sliver_resources *slr) int retry_count = 0; int net_migrated = 0; - pl_set_ulimits(slr); + if (pl_set_ulimits(slr) != 0) + return -1; for (;;) { @@ -231,9 +232,18 @@ pl_setsched(xid_t ctx, uint32_t cpu_min, uint32_t cpu_share) return 0; } +enum { + TYPE_LONG = 1, + TYPE_PERS = 2, +}; + struct pl_resources { char *name; - unsigned long long *limit; + unsigned type; + union { + unsigned long long *limit; + unsigned long int *personality; + }; }; #define WHITESPACE(buffer,index,len) \ @@ -250,23 +260,25 @@ pl_get_limits(const char *context, struct sliver_resources *slr) char *conf = (char *)malloc(len + strlen("rlimits/openfd.hard")); struct pl_resources *r; struct pl_resources sliver_list[] = { - {"sched/fill-rate2", &slr->vs_cpu}, + {"sched/fill-rate2", TYPE_LONG, &slr->vs_cpu}, - {"rlimits/nproc.hard", &slr->vs_nproc.hard}, - {"rlimits/nproc.soft", &slr->vs_nproc.soft}, - {"rlimits/nproc.min", &slr->vs_nproc.min}, + {"rlimits/nproc.hard", TYPE_LONG, &slr->vs_nproc.hard}, + {"rlimits/nproc.soft", TYPE_LONG, &slr->vs_nproc.soft}, + {"rlimits/nproc.min", TYPE_LONG, &slr->vs_nproc.min}, - {"rlimits/rss.hard", &slr->vs_rss.hard}, - {"rlimits/rss.soft", &slr->vs_rss.soft}, - {"rlimits/rss.min", &slr->vs_rss.min}, + {"rlimits/rss.hard", TYPE_LONG, &slr->vs_rss.hard}, + {"rlimits/rss.soft", TYPE_LONG, &slr->vs_rss.soft}, + {"rlimits/rss.min", TYPE_LONG, &slr->vs_rss.min}, - {"rlimits/as.hard", &slr->vs_as.hard}, - {"rlimits/as.soft", &slr->vs_as.soft}, - {"rlimits/as.min", &slr->vs_as.min}, + {"rlimits/as.hard", TYPE_LONG, &slr->vs_as.hard}, + {"rlimits/as.soft", TYPE_LONG, &slr->vs_as.soft}, + {"rlimits/as.min", TYPE_LONG, &slr->vs_as.min}, - {"rlimits/openfd.hard", &slr->vs_openfd.hard}, - {"rlimits/openfd.soft", &slr->vs_openfd.soft}, - {"rlimits/openfd.min", &slr->vs_openfd.min}, + {"rlimits/openfd.hard", TYPE_LONG, &slr->vs_openfd.hard}, + {"rlimits/openfd.soft", TYPE_LONG, &slr->vs_openfd.soft}, + {"rlimits/openfd.min", TYPE_LONG, &slr->vs_openfd.min}, + + {"personality", TYPE_PERS, &slr->personality}, {0,0} }; @@ -289,6 +301,8 @@ pl_get_limits(const char *context, struct sliver_resources *slr) slr->vs_openfd.soft = VC_LIM_KEEP; slr->vs_openfd.min = VC_LIM_KEEP; + slr->personality = 0; + cwd = open(".", O_RDONLY); if (cwd == -1) { perror("cannot get a handle on ."); @@ -305,8 +319,24 @@ pl_get_limits(const char *context, struct sliver_resources *slr) fb = fopen(r->name, "r"); if (fb == NULL) continue; - if (fgets(buf, sizeof(buf), fb) != NULL && isdigit(*buf)) - *r->limit = atoi(buf); + if (fgets(buf, sizeof(buf), fb) != NULL) { + len=strlen(buf); + /* remove trailing newline */ + if (buf[len-1] == '\n') { + buf[len-1]='\0'; + len --; + } + if ( (r->type == TYPE_LONG) && isdigit(*buf)) { + *r->limit = atoi(buf); + } else if ( (r->type == TYPE_PERS) && isalpha(*buf)) { + unsigned long int res; + res = vc_str2personalitytype(buf,len); + if (res != VC_BAD_PERSONALITY) { + *r->personality = res; + } + } + } + fclose(fb); } @@ -365,14 +395,26 @@ set_one_ulimit(int resource, const struct vc_rlimit *limit) setrlimit(resource, &lim); } -void +static inline int +set_personality(unsigned long int personality_arg) +{ + if (personality_arg == 0) + return 0; + if (personality(personality_arg) < 0) { + return -1; + } + return 0; +} + +int pl_set_ulimits(const struct sliver_resources *slr) { if (!slr) - return; + return 0; set_one_ulimit(RLIMIT_RSS, &slr->vs_rss); set_one_ulimit(RLIMIT_AS, &slr->vs_as); set_one_ulimit(RLIMIT_NPROC, &slr->vs_nproc); set_one_ulimit(RLIMIT_NOFILE, &slr->vs_openfd); + return set_personality(slr->personality); } diff --git a/src/planetlab.h b/src/planetlab.h index 9d9bcb3..088eba0 100644 --- a/src/planetlab.h +++ b/src/planetlab.h @@ -46,6 +46,7 @@ struct sliver_resources { struct vc_rlimit vs_as; struct vc_rlimit vs_nproc; struct vc_rlimit vs_openfd; + unsigned long int personality; }; int adjust_lim(const struct vc_rlimit *vcr, struct rlimit *lim); @@ -63,7 +64,7 @@ pl_setsched(xid_t ctx, uint32_t cpu_min, uint32_t cpu_share); #define NULLBYTE_SIZE 1 void pl_get_limits(const char *, struct sliver_resources *); -void pl_set_ulimits(const struct sliver_resources *); +int pl_set_ulimits(const struct sliver_resources *); static inline int _PERROR(const char *format, char *file, int line, int _errno, ...)