|
@@ -230,9 +230,14 @@ void global_flush_tlb(void)
|
|
|
struct page *pg, *next;
|
|
|
struct list_head l;
|
|
|
|
|
|
- down_read(&init_mm.mmap_sem);
|
|
|
+ /*
|
|
|
+ * Write-protect the semaphore, to exclude two contexts
|
|
|
+ * doing a list_replace_init() call in parallel and to
|
|
|
+ * exclude new additions to the deferred_pages list:
|
|
|
+ */
|
|
|
+ down_write(&init_mm.mmap_sem);
|
|
|
list_replace_init(&deferred_pages, &l);
|
|
|
- up_read(&init_mm.mmap_sem);
|
|
|
+ up_write(&init_mm.mmap_sem);
|
|
|
|
|
|
flush_map(&l);
|
|
|
|