diff options
author | Jack Steiner <steiner@sgi.com> | 2008-10-16 01:05:13 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-16 14:21:51 -0400 |
commit | 923f7f6970bd448b8e88b9e4be10fd01fc7106a4 (patch) | |
tree | 5e9f5646f547eaa345068f177815ebadd6a95454 /drivers/misc/sgi-gru/grufault.c | |
parent | ebf3f09c634906d371f2bfd71b41c7e0c52efe7e (diff) |
GRU driver: minor updates
A few minor updates for the GRU driver.
- documentation changes found in code reviews
- changes to #ifdefs to make them recognized by "unifdef"
(used in simulator testing)
- change GRU context load/unload to prefetch data
[akpm@linux-foundation.org: fix typo in comment]
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 | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c index 3d33015bbf31..8c389d606c30 100644 --- a/drivers/misc/sgi-gru/grufault.c +++ b/drivers/misc/sgi-gru/grufault.c | |||
@@ -214,12 +214,14 @@ static int non_atomic_pte_lookup(struct vm_area_struct *vma, | |||
214 | } | 214 | } |
215 | 215 | ||
216 | /* | 216 | /* |
217 | * | ||
218 | * atomic_pte_lookup | 217 | * atomic_pte_lookup |
219 | * | 218 | * |
220 | * Convert a user virtual address to a physical address | 219 | * Convert a user virtual address to a physical address |
221 | * Only supports Intel large pages (2MB only) on x86_64. | 220 | * Only supports Intel large pages (2MB only) on x86_64. |
222 | * ZZZ - hugepage support is incomplete | 221 | * ZZZ - hugepage support is incomplete |
222 | * | ||
223 | * NOTE: mmap_sem is already held on entry to this function. This | ||
224 | * guarantees existence of the page tables. | ||
223 | */ | 225 | */ |
224 | static int atomic_pte_lookup(struct vm_area_struct *vma, unsigned long vaddr, | 226 | static int atomic_pte_lookup(struct vm_area_struct *vma, unsigned long vaddr, |
225 | int write, unsigned long *paddr, int *pageshift) | 227 | int write, unsigned long *paddr, int *pageshift) |
@@ -229,9 +231,6 @@ static int atomic_pte_lookup(struct vm_area_struct *vma, unsigned long vaddr, | |||
229 | pud_t *pudp; | 231 | pud_t *pudp; |
230 | pte_t pte; | 232 | pte_t pte; |
231 | 233 | ||
232 | WARN_ON(irqs_disabled()); /* ZZZ debug */ | ||
233 | |||
234 | local_irq_disable(); | ||
235 | pgdp = pgd_offset(vma->vm_mm, vaddr); | 234 | pgdp = pgd_offset(vma->vm_mm, vaddr); |
236 | if (unlikely(pgd_none(*pgdp))) | 235 | if (unlikely(pgd_none(*pgdp))) |
237 | goto err; | 236 | goto err; |
@@ -250,8 +249,6 @@ static int atomic_pte_lookup(struct vm_area_struct *vma, unsigned long vaddr, | |||
250 | #endif | 249 | #endif |
251 | pte = *pte_offset_kernel(pmdp, vaddr); | 250 | pte = *pte_offset_kernel(pmdp, vaddr); |
252 | 251 | ||
253 | local_irq_enable(); | ||
254 | |||
255 | if (unlikely(!pte_present(pte) || | 252 | if (unlikely(!pte_present(pte) || |
256 | (write && (!pte_write(pte) || !pte_dirty(pte))))) | 253 | (write && (!pte_write(pte) || !pte_dirty(pte))))) |
257 | return 1; | 254 | return 1; |
@@ -324,6 +321,7 @@ static int gru_try_dropin(struct gru_thread_state *gts, | |||
324 | * Atomic lookup is faster & usually works even if called in non-atomic | 321 | * Atomic lookup is faster & usually works even if called in non-atomic |
325 | * context. | 322 | * context. |
326 | */ | 323 | */ |
324 | rmb(); /* Must/check ms_range_active before loading PTEs */ | ||
327 | ret = atomic_pte_lookup(vma, vaddr, write, &paddr, &pageshift); | 325 | ret = atomic_pte_lookup(vma, vaddr, write, &paddr, &pageshift); |
328 | if (ret) { | 326 | if (ret) { |
329 | if (!cb) | 327 | if (!cb) |
@@ -543,6 +541,7 @@ int gru_get_exception_detail(unsigned long arg) | |||
543 | ucbnum = get_cb_number((void *)excdet.cb); | 541 | ucbnum = get_cb_number((void *)excdet.cb); |
544 | cbrnum = thread_cbr_number(gts, ucbnum); | 542 | cbrnum = thread_cbr_number(gts, ucbnum); |
545 | cbe = get_cbe_by_index(gts->ts_gru, cbrnum); | 543 | cbe = get_cbe_by_index(gts->ts_gru, cbrnum); |
544 | prefetchw(cbe); /* Harmless on hardware, required for emulator */ | ||
546 | excdet.opc = cbe->opccpy; | 545 | excdet.opc = cbe->opccpy; |
547 | excdet.exopc = cbe->exopccpy; | 546 | excdet.exopc = cbe->exopccpy; |
548 | excdet.ecause = cbe->ecause; | 547 | excdet.ecause = cbe->ecause; |