lkml.org 
[lkml]   [2005]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 3/3] CPUMETER: connect the CPU resource controller to CPUMETER
    This patch puts the CPU resource controller into CPUMETER framework.
    With this patch, we can control the CPU resource from the cpuset
    filesystem.

    Signed-off-by: KUROSAWA Takahiro <kurosawa@valinux.co.jp>

    --- from-0003/init/Kconfig
    +++ to-work/init/Kconfig 2005-09-26 17:31:40.247109876 +0900
    @@ -249,6 +249,7 @@ config CPUMETER

    config CPU_RC
    bool "CPU resource controller"
    + depends on CPUMETER
    help
    This options will let you control the CPU resource by scaling
    the timeslice allocated for each tasks.
    --- from-0003/kernel/cpu_rc.c
    +++ to-work/kernel/cpu_rc.c 2005-09-22 11:51:57.000000000 +0900
    @@ -228,6 +228,124 @@ void cpu_rc_collect_hunger(task_t *tsk)
    tsk->last_activated = 0;
    }

    +/*
    + * interface functions for cpumeter
    + */
    +static void *cpu_rc_create_rcdomain(struct cpuset *cs,
    + cpumask_t cpus, nodemask_t mems)
    +{
    + struct cpu_rc_domain *rcd;
    +
    + if (cpus_empty(cpus)) {
    + return NULL;
    + }
    +
    + rcd = kmalloc(sizeof(*rcd), GFP_KERNEL);
    + if (rcd == NULL) {
    + return NULL;
    + }
    +
    + rcd->cpus = cpus;
    + spin_lock_init(&rcd->lock);
    + rcd->hungry_groups = 0;
    +
    + rcd->numcpus = cpus_weight(cpus);
    +
    + return rcd;
    +}
    +
    +static void cpu_rc_destroy_rcdomain(void *rcd)
    +{
    + kfree(rcd);
    +}
    +
    +static void *cpu_rc_create(void *rcd, struct cpuset *cs)
    +{
    + struct cpu_rc *cr;
    +
    + cr = kmalloc(sizeof(*cr), GFP_KERNEL);
    + if (cr == NULL) {
    + return NULL;
    + }
    +
    + memset(cr, 0, sizeof(*cr));
    + cr->rcd = rcd;
    + cr->ts_factor = CPU_RC_TSFACTOR_MAX;
    +
    + return cr;
    +}
    +
    +static void cpu_rc_destroy(void *p)
    +{
    + struct cpu_rc *cr = p;
    +
    + cpu_rc_lock(cr);
    + cpu_rc_set_satisfied(cr);
    + cpu_rc_unlock(cr);
    +
    + kfree(p);
    +}
    +
    +static int cpu_rc_set_guar(void *ctldata, unsigned long val)
    +{
    + struct cpu_rc *cr = ctldata;
    +
    + if (cr == NULL) {
    + return -EINVAL;
    + }
    +
    + cpu_rc_lock(cr);
    + cr->guarantee = val;
    + cpu_rc_unlock(cr);
    +
    + return 0;
    +}
    +
    +static int cpu_rc_get_cur(void *ctldata, unsigned long *valp)
    +{
    + struct cpu_rc *cr = ctldata;
    + unsigned int load;
    + int i, n;
    +
    + if (cr == NULL) {
    + return -EINVAL;
    + }
    +
    + load = 0;
    + n = 0;
    +
    + /* Just displaying the value, so no locking... */
    + for_each_cpu_mask(i, cr->rcd->cpus) {
    + load += cr->stat[i].load;
    + n++;
    + }
    +
    + *valp = load / n * CPU_RC_GUAR_SCALE / CPU_RC_LOAD_SCALE;
    +
    + return 0;
    +}
    +
    +static struct cpumeter_ctlr cpu_rc_ctlr = {
    + .name = "cpu",
    + .create_rcdomain = cpu_rc_create_rcdomain,
    + .destroy_rcdomain = cpu_rc_destroy_rcdomain,
    + .create = cpu_rc_create,
    + .destroy = cpu_rc_destroy,
    + .set_lim = NULL,
    + .set_guar = cpu_rc_set_guar,
    + .get_cur = cpu_rc_get_cur,
    +};
    +
    void cpu_rc_init(void)
    {
    + int err;
    + err = cpumeter_register_controller(&cpu_rc_ctlr);
    + if (err) {
    + printk(KERN_ERR "cpu_rc: register to cpumeter failed\n");
    + }
    +}
    +
    +static struct cpu_rc *cpu_rc_get(task_t *tsk)
    +{
    + return cpumeter_get_controller_data(tsk->cpuset, &cpu_rc_ctlr);
    }
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2005-09-26 11:38    [W:0.023 / U:150.112 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site