diff options
author | Jack Steiner <steiner@sgi.com> | 2009-04-03 03:59:12 +0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-03 06:05:07 +0400 |
commit | 7b8274e93fbabc7534aa51f95551c30aecdd0066 (patch) | |
tree | f1cfc0e87b07a4094ee06d2dc73673635b4b1775 /drivers/misc/sgi-gru/grufault.c | |
parent | 27ca8a7b2bdfb3e22e67fbd5df58e6b6f0bbcd48 (diff) | |
download | linux-7b8274e93fbabc7534aa51f95551c30aecdd0066.tar.xz |
sgi-gru: support multiple pagesizes in GRU
Add multiple pagesize support to the GRU driver.
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>
Diffstat (limited to 'drivers/misc/sgi-gru/grufault.c')
-rw-r--r-- | drivers/misc/sgi-gru/grufault.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c index 15507d31e62b..ab118558552e 100644 --- a/drivers/misc/sgi-gru/grufault.c +++ b/drivers/misc/sgi-gru/grufault.c @@ -360,6 +360,13 @@ static int gru_try_dropin(struct gru_thread_state *gts, if (ret == -2) goto failupm; + if (!(gts->ts_sizeavail & GRU_SIZEAVAIL(pageshift))) { + gts->ts_sizeavail |= GRU_SIZEAVAIL(pageshift); + if (atomic || !gru_update_cch(gts, 0)) { + gts->ts_force_cch_reload = 1; + goto failupm; + } + } gru_cb_set_istatus_active(cb); tfh_write_restart(tfh, gpa, GAA_RAM, vaddr, asid, write, GRU_PAGESIZE(pageshift)); @@ -535,6 +542,14 @@ int gru_handle_user_call_os(unsigned long cb) gts->ts_force_unload = 1; } + /* + * CCH may contain stale data if ts_force_cch_reload is set. + */ + if (gts->ts_gru && gts->ts_force_cch_reload) { + gru_update_cch(gts, 0); + gts->ts_force_cch_reload = 0; + } + ret = -EAGAIN; cbrnum = thread_cbr_number(gts, ucbnum); if (gts->ts_force_unload) { |