diff options
author | Jack Steiner <steiner@sgi.com> | 2009-04-02 19:59:09 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-02 22:05:06 -0400 |
commit | ecdaf2b55251f718a1fbaf4a3f72bfd6e25c582c (patch) | |
tree | 2c85778f12e1423d8cc05ce6be6da6e8d2c9a475 /drivers/misc | |
parent | 874194123718e625aa96632bac457d686ba1378e (diff) |
sgi-gru: restructure the GRU vtop functions
Restructure the GRU vtop functions in preparation for future changes.
This patch simply moves code around & does not change the algorithm.
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')
-rw-r--r-- | drivers/misc/sgi-gru/grufault.c | 68 |
1 files changed, 44 insertions, 24 deletions
diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c index 8ae426edc854..bf6e9f7bed54 100644 --- a/drivers/misc/sgi-gru/grufault.c +++ b/drivers/misc/sgi-gru/grufault.c | |||
@@ -267,6 +267,44 @@ err: | |||
267 | return 1; | 267 | return 1; |
268 | } | 268 | } |
269 | 269 | ||
270 | static int gru_vtop(struct gru_thread_state *gts, unsigned long vaddr, | ||
271 | int write, int atomic, unsigned long *gpa, int *pageshift) | ||
272 | { | ||
273 | struct mm_struct *mm = gts->ts_mm; | ||
274 | struct vm_area_struct *vma; | ||
275 | unsigned long paddr; | ||
276 | int ret, ps; | ||
277 | |||
278 | vma = find_vma(mm, vaddr); | ||
279 | if (!vma) | ||
280 | goto inval; | ||
281 | |||
282 | /* | ||
283 | * Atomic lookup is faster & usually works even if called in non-atomic | ||
284 | * context. | ||
285 | */ | ||
286 | rmb(); /* Must/check ms_range_active before loading PTEs */ | ||
287 | ret = atomic_pte_lookup(vma, vaddr, write, &paddr, &ps); | ||
288 | if (ret) { | ||
289 | if (atomic) | ||
290 | goto upm; | ||
291 | if (non_atomic_pte_lookup(vma, vaddr, write, &paddr, &ps)) | ||
292 | goto inval; | ||
293 | } | ||
294 | if (is_gru_paddr(paddr)) | ||
295 | goto inval; | ||
296 | paddr = paddr & ~((1UL << ps) - 1); | ||
297 | *gpa = uv_soc_phys_ram_to_gpa(paddr); | ||
298 | *pageshift = ps; | ||
299 | return 0; | ||
300 | |||
301 | inval: | ||
302 | return -1; | ||
303 | upm: | ||
304 | return -2; | ||
305 | } | ||
306 | |||
307 | |||
270 | /* | 308 | /* |
271 | * Drop a TLB entry into the GRU. The fault is described by info in an TFH. | 309 | * Drop a TLB entry into the GRU. The fault is described by info in an TFH. |
272 | * Input: | 310 | * Input: |
@@ -281,10 +319,8 @@ static int gru_try_dropin(struct gru_thread_state *gts, | |||
281 | struct gru_tlb_fault_handle *tfh, | 319 | struct gru_tlb_fault_handle *tfh, |
282 | unsigned long __user *cb) | 320 | unsigned long __user *cb) |
283 | { | 321 | { |
284 | struct mm_struct *mm = gts->ts_mm; | 322 | int pageshift = 0, asid, write, ret, atomic = !cb; |
285 | struct vm_area_struct *vma; | 323 | unsigned long gpa = 0, vaddr = 0; |
286 | int pageshift, asid, write, ret; | ||
287 | unsigned long paddr, gpa, vaddr; | ||
288 | 324 | ||
289 | /* | 325 | /* |
290 | * NOTE: The GRU contains magic hardware that eliminates races between | 326 | * NOTE: The GRU contains magic hardware that eliminates races between |
@@ -318,28 +354,12 @@ static int gru_try_dropin(struct gru_thread_state *gts, | |||
318 | if (atomic_read(>s->ts_gms->ms_range_active)) | 354 | if (atomic_read(>s->ts_gms->ms_range_active)) |
319 | goto failactive; | 355 | goto failactive; |
320 | 356 | ||
321 | vma = find_vma(mm, vaddr); | 357 | ret = gru_vtop(gts, vaddr, write, atomic, &gpa, &pageshift); |
322 | if (!vma) | 358 | if (ret == -1) |
323 | goto failinval; | ||
324 | |||
325 | /* | ||
326 | * Atomic lookup is faster & usually works even if called in non-atomic | ||
327 | * context. | ||
328 | */ | ||
329 | rmb(); /* Must/check ms_range_active before loading PTEs */ | ||
330 | ret = atomic_pte_lookup(vma, vaddr, write, &paddr, &pageshift); | ||
331 | if (ret) { | ||
332 | if (!cb) | ||
333 | goto failupm; | ||
334 | if (non_atomic_pte_lookup(vma, vaddr, write, &paddr, | ||
335 | &pageshift)) | ||
336 | goto failinval; | ||
337 | } | ||
338 | if (is_gru_paddr(paddr)) | ||
339 | goto failinval; | 359 | goto failinval; |
360 | if (ret == -2) | ||
361 | goto failupm; | ||
340 | 362 | ||
341 | paddr = paddr & ~((1UL << pageshift) - 1); | ||
342 | gpa = uv_soc_phys_ram_to_gpa(paddr); | ||
343 | gru_cb_set_istatus_active(cb); | 363 | gru_cb_set_istatus_active(cb); |
344 | tfh_write_restart(tfh, gpa, GAA_RAM, vaddr, asid, write, | 364 | tfh_write_restart(tfh, gpa, GAA_RAM, vaddr, asid, write, |
345 | GRU_PAGESIZE(pageshift)); | 365 | GRU_PAGESIZE(pageshift)); |