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:
Родитель
33f3648342
Коммит
e006043a4d
|
@ -90,19 +90,22 @@ static struct gru_thread_state *gru_alloc_locked_gts(unsigned long vaddr)
|
|||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
struct vm_area_struct *vma;
|
||||
struct gru_thread_state *gts = NULL;
|
||||
struct gru_thread_state *gts = ERR_PTR(-EINVAL);
|
||||
|
||||
down_write(&mm->mmap_sem);
|
||||
vma = gru_find_vma(vaddr);
|
||||
if (vma)
|
||||
gts = gru_alloc_thread_state(vma, TSID(vaddr, vma));
|
||||
if (!IS_ERR(gts)) {
|
||||
mutex_lock(>s->ts_ctxlock);
|
||||
downgrade_write(&mm->mmap_sem);
|
||||
} else {
|
||||
up_write(&mm->mmap_sem);
|
||||
}
|
||||
if (!vma)
|
||||
goto err;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче