Messages in this thread Patch in this message | | | From | Andi Kleen <> | Subject | [PATCH] [11/31] CPA: Change 32bit back to init_mm semaphore locking | Date | Mon, 14 Jan 2008 23:16:43 +0100 (CET) |
| |
Now that debug pagealloc uses a separate function it is better to change standard change_page_attr back to init_mm semaphore locking like 64bit. Various things are simpler when sleeping is allowed.
Signed-off-by: Andi Kleen <ak@suse.de>
--- arch/x86/mm/pageattr_32.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-)
Index: linux/arch/x86/mm/pageattr_32.c =================================================================== --- linux.orig/arch/x86/mm/pageattr_32.c +++ linux/arch/x86/mm/pageattr_32.c @@ -14,10 +14,9 @@ #include <asm/pgalloc.h> #include <asm/sections.h> -static DEFINE_SPINLOCK(cpa_lock); +/* Protected by init_mm.mmap_sem */ static struct list_head df_list = LIST_HEAD_INIT(df_list); - pte_t *lookup_address(unsigned long address, int *level) { pgd_t *pgd = pgd_offset_k(address); @@ -46,9 +45,7 @@ static struct page *split_large_page(uns struct page *base; pte_t *pbase; - spin_unlock_irq(&cpa_lock); base = alloc_pages(GFP_KERNEL, 0); - spin_lock_irq(&cpa_lock); if (!base) return NULL; @@ -224,15 +221,14 @@ int change_page_attr(struct page *page, { int err = 0; int i; - unsigned long flags; - spin_lock_irqsave(&cpa_lock, flags); + down_write(&init_mm.mmap_sem); for (i = 0; i < numpages; i++, page++) { err = __change_page_attr(page, prot); if (err) break; } - spin_unlock_irqrestore(&cpa_lock, flags); + up_write(&init_mm.mmap_sem); return err; } @@ -243,9 +239,9 @@ void global_flush_tlb(void) BUG_ON(irqs_disabled()); - spin_lock_irq(&cpa_lock); + down_write(&init_mm.mmap_sem); list_replace_init(&df_list, &l); - spin_unlock_irq(&cpa_lock); + up_write(&init_mm.mmap_sem); flush_map(&l); list_for_each_entry_safe(pg, next, &l, lru) { list_del(&pg->lru);
| |