From 8da5f1d22cdae462733c7b844aed6e09ddde02f5 Mon Sep 17 00:00:00 2001 From: Daniel Hokka Zakrisson Date: Fri, 3 Aug 2007 14:28:22 +0000 Subject: [PATCH] Set the ulimits whenever pl_chcontext is called --- lib/planetlab.c | 80 +++++++++++++++++++++++++------------------------ lib/planetlab.h | 1 + 2 files changed, 42 insertions(+), 39 deletions(-) diff --git a/lib/planetlab.c b/lib/planetlab.c index b1a4e8e..34cf2b3 100644 --- a/lib/planetlab.c +++ b/lib/planetlab.c @@ -52,7 +52,6 @@ static int create_context(xid_t ctx, uint64_t bcaps, struct sliver_resources *slr) { struct vc_ctx_caps vc_caps; - struct vc_net_nx vc_net; struct vc_net_flags vc_nf; /* Create network context */ @@ -111,6 +110,8 @@ pl_chcontext(xid_t ctx, uint64_t bcaps, struct sliver_resources *slr) int retry_count = 0; int net_migrated = 0; + pl_set_ulimits(slr); + for (;;) { struct vc_ctx_flags vc_flags; @@ -360,61 +361,62 @@ adjust_lim(struct vc_rlimit *vcr, struct rlimit *lim) return adjusted; } +static inline void +set_one_ulimit(int resource, struct vc_rlimit *limit) +{ + struct rlimit lim; + getrlimit(resource, &lim); + adjust_lim(limit, &lim); + setrlimit(resource, &lim); +} + +void +pl_set_ulimits(struct sliver_resources *slr) +{ + if (!slr) + return; + + 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); +} + void pl_set_limits(xid_t ctx, struct sliver_resources *slr) { - struct rlimit lim; /* getrlimit values */ unsigned long long vs_cpu; uint32_t cpu_sched_flags; if (slr != 0) { /* set memory limits */ - getrlimit(RLIMIT_RSS,&lim); - if (adjust_lim(&slr->vs_rss, &lim)) { - setrlimit(RLIMIT_RSS, &lim); - if (vc_set_rlimit(ctx, RLIMIT_RSS, &slr->vs_rss)) - { - PERROR("pl_setrlimit(%u, RLIMIT_RSS)", ctx); - exit(1); - } + if (vc_set_rlimit(ctx, RLIMIT_RSS, &slr->vs_rss)) { + PERROR("pl_setrlimit(%u, RLIMIT_RSS)", ctx); + exit(1); } /* set address space limits */ - getrlimit(RLIMIT_AS,&lim); - if (adjust_lim(&slr->vs_as, &lim)) { - setrlimit(RLIMIT_AS, &lim); - if (vc_set_rlimit(ctx, RLIMIT_AS, &slr->vs_as)) - { - PERROR("pl_setrlimit(%u, RLIMIT_AS)", ctx); - exit(1); - } + if (vc_set_rlimit(ctx, RLIMIT_AS, &slr->vs_as)) { + PERROR("pl_setrlimit(%u, RLIMIT_AS)", ctx); + exit(1); } + /* set nrpoc limit */ - getrlimit(RLIMIT_NPROC,&lim); - if (adjust_lim(&slr->vs_nproc, &lim)) { - setrlimit(RLIMIT_NPROC, &lim); - if (vc_set_rlimit(ctx, RLIMIT_NPROC, &slr->vs_nproc)) - { - PERROR("pl_setrlimit(%u, RLIMIT_NPROC)", ctx); - exit(1); - } + if (vc_set_rlimit(ctx, RLIMIT_NPROC, &slr->vs_nproc)) { + PERROR("pl_setrlimit(%u, RLIMIT_NPROC)", ctx); + exit(1); } /* set openfd limit */ - getrlimit(RLIMIT_NOFILE,&lim); - if (adjust_lim(&slr->vs_openfd, &lim)) { - setrlimit(RLIMIT_NOFILE, &lim); - if (vc_set_rlimit(ctx, RLIMIT_NOFILE, &slr->vs_openfd)) - { - PERROR("pl_setrlimit(%u, RLIMIT_NOFILE)", ctx); - exit(1); - } - if (vc_set_rlimit(ctx, VC_VLIMIT_OPENFD, &slr->vs_openfd)) - { - PERROR("pl_setrlimit(%u, VLIMIT_OPENFD)", ctx); - exit(1); - } + if (vc_set_rlimit(ctx, RLIMIT_NOFILE, &slr->vs_openfd)) { + PERROR("pl_setrlimit(%u, RLIMIT_NOFILE)", ctx); + exit(1); } + if (vc_set_rlimit(ctx, VC_VLIMIT_OPENFD, &slr->vs_openfd)) { + PERROR("pl_setrlimit(%u, VLIMIT_OPENFD)", ctx); + exit(1); + } + vs_cpu = slr->vs_cpu; cpu_sched_flags = slr->vs_cpuguaranteed & VS_SCHED_CPU_GUARANTEED; diff --git a/lib/planetlab.h b/lib/planetlab.h index 38a5634..2f8aa64 100644 --- a/lib/planetlab.h +++ b/lib/planetlab.h @@ -65,6 +65,7 @@ pl_setsched(xid_t ctx, uint32_t cpu_share, uint32_t cpu_sched_flags); void pl_get_limits(char *, struct sliver_resources *); void pl_set_limits(xid_t, struct sliver_resources *); +void pl_set_ulimits(struct sliver_resources *); static int _PERROR(const char *format, char *file, int line, int _errno, ...) -- 2.43.0