gru: check for valid vma
Fix bug caused by failure to allocate a GRU gts structure. The old code failed to handle the case where the vma was invalid. 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>
This commit is contained in:
parent
33f3648342
commit
e006043a4d
@ -90,19 +90,22 @@ static struct gru_thread_state *gru_alloc_locked_gts(unsigned long vaddr)
|
|||||||
{
|
{
|
||||||
struct mm_struct *mm = current->mm;
|
struct mm_struct *mm = current->mm;
|
||||||
struct vm_area_struct *vma;
|
struct vm_area_struct *vma;
|
||||||
struct gru_thread_state *gts = NULL;
|
struct gru_thread_state *gts = ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
down_write(&mm->mmap_sem);
|
down_write(&mm->mmap_sem);
|
||||||
vma = gru_find_vma(vaddr);
|
vma = gru_find_vma(vaddr);
|
||||||
if (vma)
|
if (!vma)
|
||||||
gts = gru_alloc_thread_state(vma, TSID(vaddr, vma));
|
goto err;
|
||||||
if (!IS_ERR(gts)) {
|
|
||||||
mutex_lock(>s->ts_ctxlock);
|
|
||||||
downgrade_write(&mm->mmap_sem);
|
|
||||||
} else {
|
|
||||||
up_write(&mm->mmap_sem);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
gts = gru_alloc_thread_state(vma, TSID(vaddr, vma));
|
||||||
|
if (IS_ERR(gts))
|
||||||
|
goto err;
|
||||||
|
mutex_lock(>s->ts_ctxlock);
|
||||||
|
downgrade_write(&mm->mmap_sem);
|
||||||
|
return gts;
|
||||||
|
|
||||||
|
err:
|
||||||
|
up_write(&mm->mmap_sem);
|
||||||
return gts;
|
return gts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user