diff options
| author | Jack Steiner <steiner@sgi.com> | 2009-12-15 19:48:18 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-16 10:20:17 -0500 |
| commit | 5958ab88f721d312b531d17705fc3ed54102fa05 (patch) | |
| tree | 0fdd2a982c1fa0370d496a25f7b3ef70ccb96bde | |
| parent | 2ce4d4c937ce4c14704f02ae60e2e07e3906c68a (diff) | |
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>
| -rw-r--r-- | drivers/misc/sgi-gru/gru.h | 11 | ||||
| -rw-r--r-- | drivers/misc/sgi-gru/grufault.c | 5 | ||||
| -rw-r--r-- | drivers/misc/sgi-gru/grulib.h | 13 | ||||
| -rw-r--r-- | drivers/misc/sgi-gru/grutables.h | 2 |
4 files changed, 17 insertions, 14 deletions
diff --git a/drivers/misc/sgi-gru/gru.h b/drivers/misc/sgi-gru/gru.h index f93f03a9e6e9..3ad76cd18b4b 100644 --- a/drivers/misc/sgi-gru/gru.h +++ b/drivers/misc/sgi-gru/gru.h | |||
| @@ -53,6 +53,17 @@ struct gru_chiplet_info { | |||
| 53 | int free_user_cbr; | 53 | int free_user_cbr; |
| 54 | }; | 54 | }; |
| 55 | 55 | ||
| 56 | /* | ||
| 57 | * Statictics kept for each context. | ||
| 58 | */ | ||
| 59 | struct gru_gseg_statistics { | ||
| 60 | unsigned long fmm_tlbmiss; | ||
| 61 | unsigned long upm_tlbmiss; | ||
| 62 | unsigned long tlbdropin; | ||
| 63 | unsigned long context_stolen; | ||
| 64 | unsigned long reserved[10]; | ||
| 65 | }; | ||
| 66 | |||
| 56 | /* Flags for GRU options on the gru_create_context() call */ | 67 | /* Flags for GRU options on the gru_create_context() call */ |
| 57 | /* Select one of the follow 4 options to specify how TLB misses are handled */ | 68 | /* Select one of the follow 4 options to specify how TLB misses are handled */ |
| 58 | #define GRU_OPT_MISS_DEFAULT 0x0000 /* Use default mode */ | 69 | #define GRU_OPT_MISS_DEFAULT 0x0000 /* Use default mode */ |
diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c index 6ff6dfb7516d..38657cdaf54d 100644 --- a/drivers/misc/sgi-gru/grufault.c +++ b/drivers/misc/sgi-gru/grufault.c | |||
| @@ -438,6 +438,7 @@ static int gru_try_dropin(struct gru_state *gru, | |||
| 438 | } | 438 | } |
| 439 | 439 | ||
| 440 | gru_cb_set_istatus_active(cbk); | 440 | gru_cb_set_istatus_active(cbk); |
| 441 | gts->ustats.tlbdropin++; | ||
| 441 | tfh_write_restart(tfh, gpa, GAA_RAM, vaddr, asid, write, | 442 | tfh_write_restart(tfh, gpa, GAA_RAM, vaddr, asid, write, |
| 442 | GRU_PAGESIZE(pageshift)); | 443 | GRU_PAGESIZE(pageshift)); |
| 443 | gru_dbg(grudev, | 444 | gru_dbg(grudev, |
| @@ -580,9 +581,9 @@ static irqreturn_t gru_intr(int chiplet, int blade) | |||
| 580 | * This is running in interrupt context. Trylock the mmap_sem. | 581 | * This is running in interrupt context. Trylock the mmap_sem. |
| 581 | * If it fails, retry the fault in user context. | 582 | * If it fails, retry the fault in user context. |
| 582 | */ | 583 | */ |
| 584 | gts->ustats.fmm_tlbmiss++; | ||
| 583 | if (!gts->ts_force_cch_reload && | 585 | if (!gts->ts_force_cch_reload && |
| 584 | down_read_trylock(>s->ts_mm->mmap_sem)) { | 586 | down_read_trylock(>s->ts_mm->mmap_sem)) { |
| 585 | gts->ustats.fmm_tlbdropin++; | ||
| 586 | gru_try_dropin(gru, gts, tfh, NULL); | 587 | gru_try_dropin(gru, gts, tfh, NULL); |
| 587 | up_read(>s->ts_mm->mmap_sem); | 588 | up_read(>s->ts_mm->mmap_sem); |
| 588 | } else { | 589 | } else { |
| @@ -624,7 +625,7 @@ static int gru_user_dropin(struct gru_thread_state *gts, | |||
| 624 | struct gru_mm_struct *gms = gts->ts_gms; | 625 | struct gru_mm_struct *gms = gts->ts_gms; |
| 625 | int ret; | 626 | int ret; |
| 626 | 627 | ||
| 627 | gts->ustats.upm_tlbdropin++; | 628 | gts->ustats.upm_tlbmiss++; |
| 628 | while (1) { | 629 | while (1) { |
| 629 | wait_event(gms->ms_wait_queue, | 630 | wait_event(gms->ms_wait_queue, |
| 630 | atomic_read(&gms->ms_range_active) == 0); | 631 | atomic_read(&gms->ms_range_active) == 0); |
diff --git a/drivers/misc/sgi-gru/grulib.h b/drivers/misc/sgi-gru/grulib.h index c6928af7393a..e77d1b1f9d05 100644 --- a/drivers/misc/sgi-gru/grulib.h +++ b/drivers/misc/sgi-gru/grulib.h | |||
| @@ -63,18 +63,9 @@ | |||
| 63 | #define THREAD_POINTER(p, th) (p + GRU_GSEG_PAGESIZE * (th)) | 63 | #define THREAD_POINTER(p, th) (p + GRU_GSEG_PAGESIZE * (th)) |
| 64 | #define GSEG_START(cb) ((void *)((unsigned long)(cb) & ~(GRU_GSEG_PAGESIZE - 1))) | 64 | #define GSEG_START(cb) ((void *)((unsigned long)(cb) & ~(GRU_GSEG_PAGESIZE - 1))) |
| 65 | 65 | ||
| 66 | /* | ||
| 67 | * Statictics kept on a per-GTS basis. | ||
| 68 | */ | ||
| 69 | struct gts_statistics { | ||
| 70 | unsigned long fmm_tlbdropin; | ||
| 71 | unsigned long upm_tlbdropin; | ||
| 72 | unsigned long context_stolen; | ||
| 73 | }; | ||
| 74 | |||
| 75 | struct gru_get_gseg_statistics_req { | 66 | struct gru_get_gseg_statistics_req { |
| 76 | unsigned long gseg; | 67 | unsigned long gseg; |
| 77 | struct gts_statistics stats; | 68 | struct gru_gseg_statistics stats; |
| 78 | }; | 69 | }; |
| 79 | 70 | ||
| 80 | /* | 71 | /* |
diff --git a/drivers/misc/sgi-gru/grutables.h b/drivers/misc/sgi-gru/grutables.h index 54c3bb171eef..668ee377aa70 100644 --- a/drivers/misc/sgi-gru/grutables.h +++ b/drivers/misc/sgi-gru/grutables.h | |||
| @@ -385,7 +385,7 @@ struct gru_thread_state { | |||
| 385 | allocated CB */ | 385 | allocated CB */ |
| 386 | int ts_data_valid; /* Indicates if ts_gdata has | 386 | int ts_data_valid; /* Indicates if ts_gdata has |
| 387 | valid data */ | 387 | valid data */ |
| 388 | struct gts_statistics ustats; /* User statistics */ | 388 | struct gru_gseg_statistics ustats; /* User statistics */ |
| 389 | unsigned long ts_gdata[0]; /* save area for GRU data (CB, | 389 | unsigned long ts_gdata[0]; /* save area for GRU data (CB, |
| 390 | DS, CBE) */ | 390 | DS, CBE) */ |
| 391 | }; | 391 | }; |
