powerpc/spufs: add atomic busy_spus counter to struct cbe_spu_info
authorMaxim Shchetynin <maxim@de.ibm.com>
Fri, 4 Jul 2008 19:05:39 +0000 (05:05 +1000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 9 Jul 2008 06:30:42 +0000 (16:30 +1000)
As nr_active counter includes also spus waiting for syscalls to return
we need a seperate counter that only counts spus that are currently running
on spu side. This counter shall be used by a cpufreq governor that targets
a frequency dependent from the number of running spus.

Signed-off-by: Christian Krafft <krafft@de.ibm.com>
Acked-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/platforms/cell/spufs/sched.c
include/asm-powerpc/spu.h

index afb92d4fbcf5d89ec0d64bd31333a9d315c414d6..34654743363dccf871534441f36bbcf2149459ef 100644 (file)
@@ -994,6 +994,7 @@ void spuctx_switch_state(struct spu_context *ctx,
        struct timespec ts;
        struct spu *spu;
        enum spu_utilization_state old_state;
+       int node;
 
        ktime_get_ts(&ts);
        curtime = timespec_to_ns(&ts);
@@ -1015,6 +1016,11 @@ void spuctx_switch_state(struct spu_context *ctx,
                spu->stats.times[old_state] += delta;
                spu->stats.util_state = new_state;
                spu->stats.tstamp = curtime;
+               node = spu->node;
+               if (old_state == SPU_UTIL_USER)
+                       atomic_dec(&cbe_spu_info[node].busy_spus);
+               if (new_state == SPU_UTIL_USER);
+                       atomic_inc(&cbe_spu_info[node].busy_spus);
        }
 }
 
index 99348c1f4cab3360ff697ead7cd21a55acf39c5a..8b2eb044270ad65b02f9a6bc145701df04c921ce 100644 (file)
@@ -191,6 +191,7 @@ struct cbe_spu_info {
        struct list_head spus;
        int n_spus;
        int nr_active;
+       atomic_t busy_spus;
        atomic_t reserved_spus;
 };