lkml.org 
[lkml]   [2008]   [Jan]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] [11/31] CPA: Change 32bit back to init_mm semaphore locking
    Date

    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);

    \
     
     \ /
      Last update: 2008-01-14 23:23    [W:3.566 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site