Commit 5958ab88 authored by Jack Steiner's avatar Jack Steiner Committed by Linus Torvalds

gru: improve GRU TLB dropin statistics

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: default avatarJack Steiner <steiner@sgi.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 2ce4d4c9
...@@ -53,6 +53,17 @@ struct gru_chiplet_info { ...@@ -53,6 +53,17 @@ struct gru_chiplet_info {
int free_user_cbr; 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 */ /* Flags for GRU options on the gru_create_context() call */
/* Select one of the follow 4 options to specify how TLB misses are handled */ /* Select one of the follow 4 options to specify how TLB misses are handled */
#define GRU_OPT_MISS_DEFAULT 0x0000 /* Use default mode */ #define GRU_OPT_MISS_DEFAULT 0x0000 /* Use default mode */
......
...@@ -438,6 +438,7 @@ static int gru_try_dropin(struct gru_state *gru, ...@@ -438,6 +438,7 @@ static int gru_try_dropin(struct gru_state *gru,
} }
gru_cb_set_istatus_active(cbk); gru_cb_set_istatus_active(cbk);
gts->ustats.tlbdropin++;
tfh_write_restart(tfh, gpa, GAA_RAM, vaddr, asid, write, tfh_write_restart(tfh, gpa, GAA_RAM, vaddr, asid, write,
GRU_PAGESIZE(pageshift)); GRU_PAGESIZE(pageshift));
gru_dbg(grudev, gru_dbg(grudev,
...@@ -580,9 +581,9 @@ static irqreturn_t gru_intr(int chiplet, int blade) ...@@ -580,9 +581,9 @@ static irqreturn_t gru_intr(int chiplet, int blade)
* This is running in interrupt context. Trylock the mmap_sem. * This is running in interrupt context. Trylock the mmap_sem.
* If it fails, retry the fault in user context. * If it fails, retry the fault in user context.
*/ */
gts->ustats.fmm_tlbmiss++;
if (!gts->ts_force_cch_reload && if (!gts->ts_force_cch_reload &&
down_read_trylock(&gts->ts_mm->mmap_sem)) { down_read_trylock(&gts->ts_mm->mmap_sem)) {
gts->ustats.fmm_tlbdropin++;
gru_try_dropin(gru, gts, tfh, NULL); gru_try_dropin(gru, gts, tfh, NULL);
up_read(&gts->ts_mm->mmap_sem); up_read(&gts->ts_mm->mmap_sem);
} else { } else {
...@@ -624,7 +625,7 @@ static int gru_user_dropin(struct gru_thread_state *gts, ...@@ -624,7 +625,7 @@ static int gru_user_dropin(struct gru_thread_state *gts,
struct gru_mm_struct *gms = gts->ts_gms; struct gru_mm_struct *gms = gts->ts_gms;
int ret; int ret;
gts->ustats.upm_tlbdropin++; gts->ustats.upm_tlbmiss++;
while (1) { while (1) {
wait_event(gms->ms_wait_queue, wait_event(gms->ms_wait_queue,
atomic_read(&gms->ms_range_active) == 0); atomic_read(&gms->ms_range_active) == 0);
......
...@@ -63,18 +63,9 @@ ...@@ -63,18 +63,9 @@
#define THREAD_POINTER(p, th) (p + GRU_GSEG_PAGESIZE * (th)) #define THREAD_POINTER(p, th) (p + GRU_GSEG_PAGESIZE * (th))
#define GSEG_START(cb) ((void *)((unsigned long)(cb) & ~(GRU_GSEG_PAGESIZE - 1))) #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 { struct gru_get_gseg_statistics_req {
unsigned long gseg; unsigned long gseg;
struct gts_statistics stats; struct gru_gseg_statistics stats;
}; };
/* /*
......
...@@ -385,7 +385,7 @@ struct gru_thread_state { ...@@ -385,7 +385,7 @@ struct gru_thread_state {
allocated CB */ allocated CB */
int ts_data_valid; /* Indicates if ts_gdata has int ts_data_valid; /* Indicates if ts_gdata has
valid data */ 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, unsigned long ts_gdata[0]; /* save area for GRU data (CB,
DS, CBE) */ DS, CBE) */
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment