5/6: numtasks_forkrate Adds support to control the forkrate in the system. --
Signed-Off-By: Chandra Seetharaman <[EMAIL PROTECTED]> Signed-Off-By: Matt Helsley <[EMAIL PROTECTED]> numtasks.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 75 insertions(+) Index: linux-2617-rc3/kernel/res_group/numtasks.c =================================================================== --- linux-2617-rc3.orig/kernel/res_group/numtasks.c 2006-04-27 10:18:50.000000000 -0700 +++ linux-2617-rc3/kernel/res_group/numtasks.c 2006-04-27 10:18:51.000000000 -0700 @@ -27,6 +27,11 @@ static int total_numtasks __read_mostly static struct resource_group *root_rgroup; static int total_cnt_alloc = 0; +#define DEF_FORKRATE UNLIMITED +#define DEF_FORKRATE_INTERVAL (1) +static int forkrate __read_mostly = DEF_FORKRATE; +static int forkrate_interval __read_mostly = DEF_FORKRATE_INTERVAL; + struct numtasks { struct resource_group *rgroup;/* resource group i am part of... */ struct res_shares shares; @@ -41,6 +46,11 @@ struct numtasks { /* stats */ int successes; int failures; + int forkrate_failures; + + /* Fork rate fields */ + int forks_in_period; + unsigned long period_start; }; struct res_controller numtasks_ctlr; @@ -58,8 +68,24 @@ static struct numtasks *get_numtasks(str &numtasks_ctlr)); } +static inline int check_forkrate(struct numtasks *res) +{ + if (time_after(jiffies, res->period_start + forkrate_interval * HZ)) { + res->period_start = jiffies; + res->forks_in_period = 0; + } + + if (res->forks_in_period >= forkrate) { + res->forkrate_failures++; + return -ENOSPC; + } + res->forks_in_period++; + return 0; +} + int numtasks_allow_fork(struct resource_group *rgroup) { + int rc; struct numtasks *res; /* controller is not registered; no resource group is given */ @@ -71,6 +97,11 @@ int numtasks_allow_fork(struct resource_ if (!res) return 0; + /* Check forkrate before checking resource group's usage */ + rc = check_forkrate(res); + if (rc) + return rc; + if (res->cnt_max_shares == SHARE_DONT_CARE) return 0; @@ -146,6 +177,7 @@ static void numtasks_res_init_one(struct numtasks_res->cnt_min_shares = SHARE_DONT_CARE; numtasks_res->cnt_unused = SHARE_DONT_CARE; numtasks_res->cnt_max_shares = SHARE_DONT_CARE; + numtasks_res->period_start = jiffies; } static struct res_shares *numtasks_alloc_shares_struct( @@ -306,6 +338,9 @@ static ssize_t numtasks_show_stats(struc buf += i; j += i; buf_size -= i; i = snprintf(buf, buf_size, "%s: Number of failures %d\n", res_ctlr_name, res->failures); + buf += i; j += i; buf_size -= i; + i = snprintf(buf, buf_size, "%s: Number of forkrate failures %d\n", + res_ctlr_name, res->forkrate_failures); j += i; return j; } @@ -365,6 +400,46 @@ static int set_total_numtasks(const char module_param_set_call(total_numtasks, int, set_total_numtasks, S_IRUGO | S_IWUSR); +static void reset_forkrates(struct resource_group *rgroup, unsigned long now) +{ + struct numtasks *res; + struct resource_group *child = NULL; + + res = get_numtasks(rgroup); + if (!res) + return; + res->forks_in_period = 0; + res->period_start = now; + + spin_lock(&rgroup->group_lock); + for_each_child(child, rgroup) + reset_forkrates(child, now); + spin_unlock(&rgroup->group_lock); +} + +static int set_forkrate(const char *val, struct kernel_param *kp) +{ + int prev = forkrate; + int rc = set_numtasks_config_val(&forkrate, prev, val, kp); + if (rc < 0) + return rc; + reset_forkrates(root_rgroup, jiffies); + return 0; +} +module_param_set_call(forkrate, int, set_forkrate, S_IRUGO | S_IWUSR); + +static int set_forkrate_interval(const char *val, struct kernel_param *kp) +{ + int prev = forkrate_interval; + int rc = set_numtasks_config_val(&forkrate_interval, prev, val, kp); + if (rc < 0) + return rc; + reset_forkrates(root_rgroup, jiffies); + return 0; +} +module_param_set_call(forkrate_interval, int, set_forkrate_interval, + S_IRUGO | S_IWUSR); + int __init init_numtasks_res(void) { if (numtasks_ctlr.ctlr_id != NO_RES_ID) -- ---------------------------------------------------------------------- Chandra Seetharaman | Be careful what you choose.... - [EMAIL PROTECTED] | .......you may get it. ---------------------------------------------------------------------- ------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ ckrm-tech mailing list https://lists.sourceforge.net/lists/listinfo/ckrm-tech