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: Jack Steiner <steiner@sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
2ce4d4c937
commit
5958ab88f7
4 changed files with 17 additions and 14 deletions
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
* 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(>s->ts_mm->mmap_sem)) {
|
down_read_trylock(>s->ts_mm->mmap_sem)) {
|
||||||
gts->ustats.fmm_tlbdropin++;
|
|
||||||
gru_try_dropin(gru, gts, tfh, NULL);
|
gru_try_dropin(gru, gts, tfh, NULL);
|
||||||
up_read(>s->ts_mm->mmap_sem);
|
up_read(>s->ts_mm->mmap_sem);
|
||||||
} else {
|
} else {
|
||||||
|
@ -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 @@
|
||||||
#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 {
|
||||||
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) */
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue