Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 139740
b: refs/heads/master
c: ecdaf2b
h: refs/heads/master
v: v3
  • Loading branch information
Jack Steiner authored and Linus Torvalds committed Apr 3, 2009
1 parent 28c5592 commit 8d5ca9e
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 25 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 874194123718e625aa96632bac457d686ba1378e
refs/heads/master: ecdaf2b55251f718a1fbaf4a3f72bfd6e25c582c
68 changes: 44 additions & 24 deletions trunk/drivers/misc/sgi-gru/grufault.c
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,44 @@ static int atomic_pte_lookup(struct vm_area_struct *vma, unsigned long vaddr,
return 1;
}

static int gru_vtop(struct gru_thread_state *gts, unsigned long vaddr,
int write, int atomic, unsigned long *gpa, int *pageshift)
{
struct mm_struct *mm = gts->ts_mm;
struct vm_area_struct *vma;
unsigned long paddr;
int ret, ps;

vma = find_vma(mm, vaddr);
if (!vma)
goto inval;

/*
* Atomic lookup is faster & usually works even if called in non-atomic
* context.
*/
rmb(); /* Must/check ms_range_active before loading PTEs */
ret = atomic_pte_lookup(vma, vaddr, write, &paddr, &ps);
if (ret) {
if (atomic)
goto upm;
if (non_atomic_pte_lookup(vma, vaddr, write, &paddr, &ps))
goto inval;
}
if (is_gru_paddr(paddr))
goto inval;
paddr = paddr & ~((1UL << ps) - 1);
*gpa = uv_soc_phys_ram_to_gpa(paddr);
*pageshift = ps;
return 0;

inval:
return -1;
upm:
return -2;
}


/*
* Drop a TLB entry into the GRU. The fault is described by info in an TFH.
* Input:
Expand All @@ -281,10 +319,8 @@ static int gru_try_dropin(struct gru_thread_state *gts,
struct gru_tlb_fault_handle *tfh,
unsigned long __user *cb)
{
struct mm_struct *mm = gts->ts_mm;
struct vm_area_struct *vma;
int pageshift, asid, write, ret;
unsigned long paddr, gpa, vaddr;
int pageshift = 0, asid, write, ret, atomic = !cb;
unsigned long gpa = 0, vaddr = 0;

/*
* NOTE: The GRU contains magic hardware that eliminates races between
Expand Down Expand Up @@ -318,28 +354,12 @@ static int gru_try_dropin(struct gru_thread_state *gts,
if (atomic_read(&gts->ts_gms->ms_range_active))
goto failactive;

vma = find_vma(mm, vaddr);
if (!vma)
goto failinval;

/*
* Atomic lookup is faster & usually works even if called in non-atomic
* context.
*/
rmb(); /* Must/check ms_range_active before loading PTEs */
ret = atomic_pte_lookup(vma, vaddr, write, &paddr, &pageshift);
if (ret) {
if (!cb)
goto failupm;
if (non_atomic_pte_lookup(vma, vaddr, write, &paddr,
&pageshift))
goto failinval;
}
if (is_gru_paddr(paddr))
ret = gru_vtop(gts, vaddr, write, atomic, &gpa, &pageshift);
if (ret == -1)
goto failinval;
if (ret == -2)
goto failupm;

paddr = paddr & ~((1UL << pageshift) - 1);
gpa = uv_soc_phys_ram_to_gpa(paddr);
gru_cb_set_istatus_active(cb);
tfh_write_restart(tfh, gpa, GAA_RAM, vaddr, asid, write,
GRU_PAGESIZE(pageshift));
Expand Down

0 comments on commit 8d5ca9e

Please sign in to comment.