]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/x86/mm/init_64.c
x86, mm: Hold mm->page_table_lock while doing vmalloc_sync
[karo-tx-linux.git] / arch / x86 / mm / init_64.c
index 1ad7c0ff5d2b57831387bbaa8b81d20f4507b69a..4d323fb770c28937f48496a392e2129fa297754d 100644 (file)
@@ -116,12 +116,19 @@ void sync_global_pgds(unsigned long start, unsigned long end)
                spin_lock_irqsave(&pgd_lock, flags);
                list_for_each_entry(page, &pgd_list, lru) {
                        pgd_t *pgd;
+                       spinlock_t *pgt_lock;
+
                        pgd = (pgd_t *)page_address(page) + pgd_index(address);
+                       pgt_lock = &pgd_page_get_mm(page)->page_table_lock;
+                       spin_lock(pgt_lock);
+
                        if (pgd_none(*pgd))
                                set_pgd(pgd, *pgd_ref);
                        else
                                BUG_ON(pgd_page_vaddr(*pgd)
                                       != pgd_page_vaddr(*pgd_ref));
+
+                       spin_unlock(pgt_lock);
                }
                spin_unlock_irqrestore(&pgd_lock, flags);
        }