/etc/vservers/<name>/personality
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Wed, 27 Aug 2008 14:30:13 +0000 (14:30 +0000)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Wed, 27 Aug 2008 14:30:13 +0000 (14:30 +0000)
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

src/planetlab.c
src/planetlab.h

index 5211ba0..15cc7e5 100644 (file)
@@ -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);
 }
index 9d9bcb3..088eba0 100644 (file)
@@ -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, ...)