[S390] fix possible deadlock in gmap_map_segment
Fix possible deadlock reported by lockdep: qemu-system-s39/2963 is trying to acquire lock: (&mm->mmap_sem){++++++}, at: gmap_alloc_table+0x9c/0x120 but task is already holding lock: (&mm->mmap_sem){++++++}, at: gmap_map_segment+0xa6/0x27c Actually gmap_alloc_table is the only called in gmap_map_segment with mmap_sem held, thus it's safe to simply remove the inner lock. Signed-off-by: Carsten Otte <cotte@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
69ba974366
commit
a9162f238a
@ -256,6 +256,9 @@ void gmap_disable(struct gmap *gmap)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(gmap_disable);
|
EXPORT_SYMBOL_GPL(gmap_disable);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* gmap_alloc_table is assumed to be called with mmap_sem held
|
||||||
|
*/
|
||||||
static int gmap_alloc_table(struct gmap *gmap,
|
static int gmap_alloc_table(struct gmap *gmap,
|
||||||
unsigned long *table, unsigned long init)
|
unsigned long *table, unsigned long init)
|
||||||
{
|
{
|
||||||
@ -267,14 +270,12 @@ static int gmap_alloc_table(struct gmap *gmap,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
new = (unsigned long *) page_to_phys(page);
|
new = (unsigned long *) page_to_phys(page);
|
||||||
crst_table_init(new, init);
|
crst_table_init(new, init);
|
||||||
down_read(&gmap->mm->mmap_sem);
|
|
||||||
if (*table & _REGION_ENTRY_INV) {
|
if (*table & _REGION_ENTRY_INV) {
|
||||||
list_add(&page->lru, &gmap->crst_list);
|
list_add(&page->lru, &gmap->crst_list);
|
||||||
*table = (unsigned long) new | _REGION_ENTRY_LENGTH |
|
*table = (unsigned long) new | _REGION_ENTRY_LENGTH |
|
||||||
(*table & _REGION_ENTRY_TYPE_MASK);
|
(*table & _REGION_ENTRY_TYPE_MASK);
|
||||||
} else
|
} else
|
||||||
__free_pages(page, ALLOC_ORDER);
|
__free_pages(page, ALLOC_ORDER);
|
||||||
up_read(&gmap->mm->mmap_sem);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user