sgi-gru: macro for scanning all gru chiplets
Jack Steiner [Thu, 2 Apr 2009 23:59:10 +0000 (16:59 -0700)]
Add macro for scanning all active GRU chiplets.  Maximum chiplet id is
saved during GRU initialization.

Signed-off-by: Jack Steiner <steiner@sgi.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

drivers/misc/sgi-gru/grufault.c
drivers/misc/sgi-gru/grufile.c
drivers/misc/sgi-gru/gruprocfs.c
drivers/misc/sgi-gru/grutables.h

index bf6e9f7..15507d3 100644 (file)
@@ -600,18 +600,11 @@ static int gru_unload_all_contexts(void)
 {
        struct gru_thread_state *gts;
        struct gru_state *gru;
-       int maxgid, gid, ctxnum;
-       int nodesperblade;
+       int gid, ctxnum;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;
-       if (num_online_nodes() > 1 &&
-                       (uv_node_to_blade_id(1) == uv_node_to_blade_id(0)))
-               nodesperblade = 2;
-       else
-               nodesperblade = 1;
-       maxgid = GRU_CHIPLETS_PER_BLADE * num_online_nodes() / nodesperblade;
-       for (gid = 0; gid < maxgid; gid++) {
+       foreach_gid(gid) {
                gru = GID_TO_GRU(gid);
                spin_lock(&gru->gs_lock);
                for (ctxnum = 0; ctxnum < GRU_NUM_CCH; ctxnum++) {
index f8dcdb1..b7a21ce 100644 (file)
@@ -47,6 +47,7 @@
 struct gru_blade_state *gru_base[GRU_MAX_BLADES] __read_mostly;
 unsigned long gru_start_paddr __read_mostly;
 unsigned long gru_end_paddr __read_mostly;
+unsigned int gru_max_gids __read_mostly;
 struct gru_stats_s gru_stats;
 
 /* Guaranteed user available resources on each node */
@@ -276,6 +277,8 @@ static void gru_init_chiplet(struct gru_state *gru, unsigned long paddr,
        gru->gs_dsr_map = (1UL << GRU_DSR_AU) - 1;
        gru->gs_asid_limit = MAX_ASID;
        gru_tgh_flush_init(gru);
+       if (gru->gs_gid >= gru_max_gids)
+               gru_max_gids = gru->gs_gid + 1;
        gru_dbg(grudev, "bid %d, nid %d, gid %d, vaddr %p (0x%lx)\n",
                bid, nid, gru->gs_gid, gru->gs_gru_base_vaddr,
                gru->gs_gru_base_paddr);
index 8724551..ee74821 100644 (file)
@@ -226,7 +226,7 @@ static void seq_stop(struct seq_file *file, void *data)
 
 static void *seq_start(struct seq_file *file, loff_t *gid)
 {
-       if (*gid < GRU_MAX_GRUS)
+       if (*gid < gru_max_gids)
                return gid;
        return NULL;
 }
@@ -234,7 +234,7 @@ static void *seq_start(struct seq_file *file, loff_t *gid)
 static void *seq_next(struct seq_file *file, void *data, loff_t *gid)
 {
        (*gid)++;
-       if (*gid < GRU_MAX_GRUS)
+       if (*gid < gru_max_gids)
                return gid;
        return NULL;
 }
index 685db88..c6e0e3d 100644 (file)
 extern struct gru_stats_s gru_stats;
 extern struct gru_blade_state *gru_base[];
 extern unsigned long gru_start_paddr, gru_end_paddr;
+extern unsigned int gru_max_gids;
 
 #define GRU_MAX_BLADES         MAX_NUMNODES
 #define GRU_MAX_GRUS           (GRU_MAX_BLADES * GRU_CHIPLETS_PER_BLADE)
@@ -406,12 +407,12 @@ struct gru_state {
                                                           gru segments (64) */
        void                    *gs_gru_base_vaddr;     /* Virtual address of
                                                           gru segments (64) */
-       unsigned char           gs_gid;                 /* unique GRU number */
+       unsigned short          gs_gid;                 /* unique GRU number */
+       unsigned short          gs_blade_id;            /* blade of GRU */
        unsigned char           gs_tgh_local_shift;     /* used to pick TGH for
                                                           local flush */
        unsigned char           gs_tgh_first_remote;    /* starting TGH# for
                                                           remote flush */
-       unsigned short          gs_blade_id;            /* blade of GRU */
        spinlock_t              gs_asid_lock;           /* lock used for
                                                           assigning asids */
        spinlock_t              gs_lock;                /* lock used for
@@ -506,6 +507,10 @@ struct gru_blade_state {
                        (i) < GRU_CHIPLETS_PER_BLADE;                   \
                        (i)++, (gru)++)
 
+/* Scan all GRUs */
+#define foreach_gid(gid)                                               \
+       for ((gid) = 0; (gid) < gru_max_gids; (gid)++)
+
 /* Scan all active GTSs on a gru. Note: must hold ss_lock to use this macro. */
 #define for_each_gts_on_gru(gts, gru, ctxnum)                          \
        for ((ctxnum) = 0; (ctxnum) < GRU_NUM_CCH; (ctxnum)++)          \