gru: improve GRU TLB dropin statistics
authorJack Steiner <steiner@sgi.com>
Wed, 16 Dec 2009 00:48:18 +0000 (16:48 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 16 Dec 2009 15:20:17 +0000 (07:20 -0800)
Update the TLB dropin statistics kept for each GRU context.  Count TLB
dropins separate from the misses - some misses do not result in a TLB
dropin.  Some of the diagnostics need both counts.

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/gru.h
drivers/misc/sgi-gru/grufault.c
drivers/misc/sgi-gru/grulib.h
drivers/misc/sgi-gru/grutables.h

index f93f03a..3ad76cd 100644 (file)
@@ -53,6 +53,17 @@ struct gru_chiplet_info {
        int     free_user_cbr;
 };
 
+/*
+ * Statictics kept for each context.
+ */
+struct gru_gseg_statistics {
+       unsigned long   fmm_tlbmiss;
+       unsigned long   upm_tlbmiss;
+       unsigned long   tlbdropin;
+       unsigned long   context_stolen;
+       unsigned long   reserved[10];
+};
+
 /* Flags for GRU options on the gru_create_context() call */
 /* Select one of the follow 4 options to specify how TLB misses are handled */
 #define GRU_OPT_MISS_DEFAULT   0x0000  /* Use default mode */
index 6ff6dfb..38657cd 100644 (file)
@@ -438,6 +438,7 @@ static int gru_try_dropin(struct gru_state *gru,
        }
 
        gru_cb_set_istatus_active(cbk);
+       gts->ustats.tlbdropin++;
        tfh_write_restart(tfh, gpa, GAA_RAM, vaddr, asid, write,
                          GRU_PAGESIZE(pageshift));
        gru_dbg(grudev,
@@ -580,9 +581,9 @@ static irqreturn_t gru_intr(int chiplet, int blade)
                 * This is running in interrupt context. Trylock the mmap_sem.
                 * If it fails, retry the fault in user context.
                 */
+               gts->ustats.fmm_tlbmiss++;
                if (!gts->ts_force_cch_reload &&
                                        down_read_trylock(&gts->ts_mm->mmap_sem)) {
-                       gts->ustats.fmm_tlbdropin++;
                        gru_try_dropin(gru, gts, tfh, NULL);
                        up_read(&gts->ts_mm->mmap_sem);
                } else {
@@ -624,7 +625,7 @@ static int gru_user_dropin(struct gru_thread_state *gts,
        struct gru_mm_struct *gms = gts->ts_gms;
        int ret;
 
-       gts->ustats.upm_tlbdropin++;
+       gts->ustats.upm_tlbmiss++;
        while (1) {
                wait_event(gms->ms_wait_queue,
                           atomic_read(&gms->ms_range_active) == 0);
index c6928af..e77d1b1 100644 (file)
 #define THREAD_POINTER(p, th)          (p + GRU_GSEG_PAGESIZE * (th))
 #define GSEG_START(cb)                 ((void *)((unsigned long)(cb) & ~(GRU_GSEG_PAGESIZE - 1)))
 
-/*
- * Statictics kept on a per-GTS basis.
- */
-struct gts_statistics {
-       unsigned long   fmm_tlbdropin;
-       unsigned long   upm_tlbdropin;
-       unsigned long   context_stolen;
-};
-
 struct gru_get_gseg_statistics_req {
-       unsigned long           gseg;
-       struct gts_statistics   stats;
+       unsigned long                   gseg;
+       struct gru_gseg_statistics      stats;
 };
 
 /*
index 54c3bb1..668ee37 100644 (file)
@@ -385,7 +385,7 @@ struct gru_thread_state {
                                                          allocated CB */
        int                     ts_data_valid;  /* Indicates if ts_gdata has
                                                   valid data */
-       struct gts_statistics   ustats;         /* User statistics */
+       struct gru_gseg_statistics ustats;      /* User statistics */
        unsigned long           ts_gdata[0];    /* save area for GRU data (CB,
                                                   DS, CBE) */
 };