x86: fix global_flush_tlb() bug
[sfrench/cifs-2.6.git] / arch / x86 / mm / pageattr_64.c
index 8a4f65bf956ea85ef45ecb6157eccceca82f92a5..c7b7dfe1d405153717fa8f91fa15ecbde809b2b7 100644 (file)
@@ -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);