mirror of
https://github.com/torvalds/linux.git
synced 2024-10-25 22:44:30 +00:00
powerpc: Fix __get_user_pages_fast() irq handling
__get_user_pages_fast() may be called with interrupts disabled (see e.g. get_futex_key() in kernel/futex.c) and therefore should use local_irq_save() and local_irq_restore() instead of local_irq_disable()/enable(). Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> CC: <stable@vger.kernel.org> [v3.12] Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
0b5381a618
commit
95f715b08f
|
@ -123,6 +123,7 @@ int __get_user_pages_fast(unsigned long start, int nr_pages, int write,
|
||||||
struct mm_struct *mm = current->mm;
|
struct mm_struct *mm = current->mm;
|
||||||
unsigned long addr, len, end;
|
unsigned long addr, len, end;
|
||||||
unsigned long next;
|
unsigned long next;
|
||||||
|
unsigned long flags;
|
||||||
pgd_t *pgdp;
|
pgd_t *pgdp;
|
||||||
int nr = 0;
|
int nr = 0;
|
||||||
|
|
||||||
|
@ -156,7 +157,7 @@ int __get_user_pages_fast(unsigned long start, int nr_pages, int write,
|
||||||
* So long as we atomically load page table pointers versus teardown,
|
* So long as we atomically load page table pointers versus teardown,
|
||||||
* we can follow the address down to the the page and take a ref on it.
|
* we can follow the address down to the the page and take a ref on it.
|
||||||
*/
|
*/
|
||||||
local_irq_disable();
|
local_irq_save(flags);
|
||||||
|
|
||||||
pgdp = pgd_offset(mm, addr);
|
pgdp = pgd_offset(mm, addr);
|
||||||
do {
|
do {
|
||||||
|
@ -179,7 +180,7 @@ int __get_user_pages_fast(unsigned long start, int nr_pages, int write,
|
||||||
break;
|
break;
|
||||||
} while (pgdp++, addr = next, addr != end);
|
} while (pgdp++, addr = next, addr != end);
|
||||||
|
|
||||||
local_irq_enable();
|
local_irq_restore(flags);
|
||||||
|
|
||||||
return nr;
|
return nr;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user