lkml.org 
[lkml]   [2010]   [Apr]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 14/14] mm,migration: Allow the migration of PageSwapCache pages
    On Thu, Apr 01, 2010 at 01:44:29PM +0900, Minchan Kim wrote:
    > On Thu, Apr 1, 2010 at 12:01 PM, KAMEZAWA Hiroyuki
    > <kamezawa.hiroyu@jp.fujitsu.com> wrote:
    > > On Thu, 1 Apr 2010 11:43:18 +0900
    > > Minchan Kim <minchan.kim@gmail.com> wrote:
    > >
    > >> On Wed, Mar 31, 2010 at 2:26 PM, KAMEZAWA Hiroyuki       /*
    > >> >> diff --git a/mm/rmap.c b/mm/rmap.c
    > >> >> index af35b75..d5ea1f2 100644
    > >> >> --- a/mm/rmap.c
    > >> >> +++ b/mm/rmap.c
    > >> >> @@ -1394,9 +1394,11 @@ int rmap_walk(struct page *page, int (*rmap_one)(struct page *,
    > >> >>
    > >> >>       if (unlikely(PageKsm(page)))
    > >> >>               return rmap_walk_ksm(page, rmap_one, arg);
    > >> >> -     else if (PageAnon(page))
    > >> >> +     else if (PageAnon(page)) {
    > >> >> +             if (PageSwapCache(page))
    > >> >> +                     return SWAP_AGAIN;
    > >> >>               return rmap_walk_anon(page, rmap_one, arg);
    > >> >
    > >> > SwapCache has a condition as (PageSwapCache(page) && page_mapped(page) == true.
    > >> >
    > >>
    > >> In case of tmpfs, page has swapcache but not mapped.
    > >>
    > >> > Please see do_swap_page(), PageSwapCache bit is cleared only when
    > >> >
    > >> > do_swap_page()...
    > >> >       swap_free(entry);
    > >> >        if (vm_swap_full() || (vma->vm_flags & VM_LOCKED) || PageMlocked(page))
    > >> >                try_to_free_swap(page);
    > >> >
    > >> > Then, PageSwapCache is cleared only when swap is freeable even if mapped.
    > >> >
    > >> > rmap_walk_anon() should be called and the check is not necessary.
    > >>
    > >> Frankly speaking, I don't understand what is Mel's problem, why he added
    > >> Swapcache check in rmap_walk, and why do you said we don't need it.
    > >>
    > >> Could you explain more detail if you don't mind?
    > >>
    > > I may miss something.
    > >
    > > unmap_and_move()
    > >  1. try_to_unmap(TTU_MIGRATION)
    > >  2. move_to_newpage
    > >  3. remove_migration_ptes
    > >        -> rmap_walk()
    > >
    > > Then, to map a page back we unmapped we call rmap_walk().
    > >
    > > Assume a SwapCache which is mapped, then, PageAnon(page) == true.
    > >
    > >  At 1. try_to_unmap() will rewrite pte with swp_entry of SwapCache.
    > >       mapcount goes to 0.
    > >  At 2. SwapCache is copied to a new page.
    > >  At 3. The new page is mapped back to the place. Now, newpage's mapcount is 0.
    > >       Before patch, the new page is mapped back to all ptes.
    > >       After patch, the new page is not mapped back because its mapcount is 0.
    > >
    > > I don't think shared SwapCache of anon is not an usual behavior, so, the logic
    > > before patch is more attractive.
    > >
    > > If SwapCache is not mapped before "1", we skip "1" and rmap_walk will do nothing
    > > because page->mapping is NULL.
    > >
    >
    > Thanks. I agree. We don't need the check.
    > Then, my question is why Mel added the check in rmap_walk.
    > He mentioned some BUG trigger and fixed things after this patch.
    > What's it?

    If I remove the check for (PageSwapCache(page) && !page_mapped(page))
    in rmap_walk(), then the bug below occurs. The first one is lockdep going
    bad because it's accessing a bad lock implying that anon_vma->lock is
    already invalid. The bug that triggers after it is the list walk.

    [ 373.951347] INFO: trying to register non-static key.
    [ 373.984314] the code is fine but needs lockdep annotation.
    [ 374.020512] turning off the locking correctness validator.
    [ 374.020512] Pid: 4272, comm: bench-stresshig Not tainted 2.6.34-rc2-mm1-compaction-v7r5 #2
    [ 374.020512] Call Trace:
    [ 374.020512] [<ffffffff810758f2>] __lock_acquire+0xf99/0x1776
    [ 374.020512] [<ffffffff810761c5>] lock_acquire+0xf6/0x122
    [ 374.020512] [<ffffffff810ef121>] ? rmap_walk+0x5c/0x16d
    [ 374.020512] [<ffffffff812fcfeb>] _raw_spin_lock+0x3b/0x47
    [ 374.020512] [<ffffffff810ef121>] ? rmap_walk+0x5c/0x16d
    [ 374.020512] [<ffffffff810ef121>] rmap_walk+0x5c/0x16d
    [ 374.020512] [<ffffffff81106396>] ? remove_migration_pte+0x0/0x234
    [ 374.677618] [<ffffffff81300dc1>] ? sub_preempt_count+0x9/0x83
    [ 374.677618] [<ffffffff81106914>] ? migrate_page_copy+0xa0/0x1ed
    [ 374.677618] [<ffffffff81106ea4>] migrate_pages+0x3fc/0x5d3
    [ 374.880569] [<ffffffff81106c56>] ? migrate_pages+0x1ae/0x5d3
    [ 374.994700] [<ffffffff81073a24>] ? trace_hardirqs_on_caller+0x110/0x134
    [ 375.018405] [<ffffffff81107e11>] ? compaction_alloc+0x0/0x283
    [ 375.097256] [<ffffffff811079b0>] ? compact_zone+0x14e/0x4bd
    [ 375.097256] [<ffffffff812fd851>] ? _raw_spin_unlock_irq+0x30/0x5d
    [ 375.097256] [<ffffffff81073a24>] ? trace_hardirqs_on_caller+0x110/0x134
    [ 375.097256] [<ffffffff81107b43>] compact_zone+0x2e1/0x4bd
    [ 375.097256] [<ffffffff811082f2>] try_to_compact_pages+0x1de/0x248
    [ 375.516928] [<ffffffff810d3cd2>] __alloc_pages_nodemask+0x45a/0x81c
    [ 375.516928] [<ffffffff812fde14>] ? restore_args+0x0/0x30
    [ 375.620035] [<ffffffff8103995e>] ? finish_task_switch+0x0/0xe3
    [ 375.684491] [<ffffffff810fe297>] alloc_pages_current+0x9b/0xa4
    [ 375.803591] [<ffffffffa00a9a58>] test_alloc_runtest+0x781/0x140a [highalloc]
    [ 375.803591] [<ffffffff81076398>] ? lock_release_non_nested+0x97/0x267
    [ 375.803591] [<ffffffffa00aa7ce>] vmr_write_proc+0xed/0x102 [highalloc]
    [ 375.803591] [<ffffffff81300dc1>] ? sub_preempt_count+0x9/0x83
    [ 375.803591] [<ffffffff812fd92e>] ? _raw_spin_unlock+0x35/0x51
    [ 375.803591] [<ffffffff810e5a17>] ? do_wp_page+0x6af/0x763
    [ 375.803591] [<ffffffff8115bb2a>] ? proc_file_write+0x45/0x92
    [ 376.322379] [<ffffffff8115bb5d>] proc_file_write+0x78/0x92
    [ 376.349787] [<ffffffff8115bae5>] ? proc_file_write+0x0/0x92
    [ 376.349787] [<ffffffff8115bae5>] ? proc_file_write+0x0/0x92
    [ 376.349787] [<ffffffff8115647a>] proc_reg_write+0x89/0xa6
    [ 376.349787] [<ffffffff8110c1f6>] vfs_write+0xb3/0x15a
    [ 376.349787] [<ffffffff8110c36b>] sys_write+0x4c/0x73
    [ 376.349787] [<ffffffff81002d32>] system_call_fastpath+0x16/0x1b
    [ 376.786203] BUG: unable to handle kernel NULL pointer dereference at (null)
    [ 376.857874] IP: [<ffffffff810ef170>] rmap_walk+0xab/0x16d
    [ 376.929206] PGD 7f561067 PUD 7eba2067 PMD 0
    [ 376.942703] Oops: 0000 [#1] PREEMPT SMP
    [ 376.942703] last sysfs file: /sys/block/sr0/capability
    [ 377.072011] CPU 3
    [ 377.116386] Modules linked in: highalloc trace_allocmap buddyinfo vmregress_core oprofile dm_crypt loop i2c_piix4 evdev processor serio_raw tpm_tis tpm tpm_bios i2c_core shpchp pci_hotplug button ext3 jbd mbcache dm_mirror dm_region_hash dm_log dm_snapshot dm_mod sg sr_mod sd_mod cdrom ata_generic ahci libahci r8169 libata mii ide_pci_generic ide_core ehci_hcd ohci_hcd scsi_mod floppy thermal fan thermal_sys
    [ 377.520011]
    [ 377.520011] Pid: 4272, comm: bench-stresshig Not tainted 2.6.34-rc2-mm1-compaction-v7r5 #2 GA-MA790GP-UD4H/GA-MA790GP-UD4H
    [ 377.637060] RIP: 0010:[<ffffffff810ef170>] [<ffffffff810ef170>] rmap_walk+0xab/0x16d
    [ 377.787277] RSP: 0000:ffff880037a797a8 EFLAGS: 00010202
    [ 377.787277] RAX: 0000000000000000 RBX: ffffffffffffffe0 RCX: 0000000000000000
    [ 377.895088] RDX: 0000000000000101 RSI: ffffffff8152ea0f RDI: ffffffff810ef121
    [ 377.895088] RBP: ffff880037a79828 R08: ffff880037a79458 R09: ffff880037044000
    [ 377.895088] R10: ffffffff81067358 R11: ffff880037a79228 R12: 0000000000000001
    [ 377.895088] R13: ffff88007bbf6af0 R14: ffffea00019bd798 R15: ffff88007bbf6b28
    [ 377.895088] FS: 00007fa3e984d6e0(0000) GS:ffff880002380000(0000) knlGS:0000000000000000
    [ 378.366669] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    [ 378.366669] CR2: 0000000000000000 CR3: 000000003784d000 CR4: 00000000000006e0
    [ 378.366669] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [ 378.366669] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    [ 378.366669] Process bench-stresshig (pid: 4272, threadinfo ffff880037a78000, task ffff880037044000)
    [ 378.800010] Stack:
    [ 378.800010] ffffea000027f920 ffffffff81106396 ffff880037a797f8 ffffffff81300dc1
    [ 378.907796] <0> ffff880037a797f8 ffffffff81106914 ffffea000027f920 ffffea000027f920
    [ 378.907796] <0> 0000000000000000 ffffea00019bd798 ffff880037a79828 ffffffff816a1cf0
    [ 378.907796] Call Trace:
    [ 378.907796] [<ffffffff81106396>] ? remove_migration_pte+0x0/0x234
    [ 379.214225] [<ffffffff81300dc1>] ? sub_preempt_count+0x9/0x83
    [ 379.296228] [<ffffffff81106914>] ? migrate_page_copy+0xa0/0x1ed
    [ 379.296228] [<ffffffff81106ea4>] migrate_pages+0x3fc/0x5d3
    [ 379.296228] [<ffffffff81106c56>] ? migrate_pages+0x1ae/0x5d3
    [ 379.492124] [<ffffffff81073a24>] ? trace_hardirqs_on_caller+0x110/0x134
    [ 379.492124] [<ffffffff81107e11>] ? compaction_alloc+0x0/0x283
    [ 379.492124] [<ffffffff811079b0>] ? compact_zone+0x14e/0x4bd
    [ 379.714743] [<ffffffff812fd851>] ? _raw_spin_unlock_irq+0x30/0x5d
    [ 379.714743] [<ffffffff81073a24>] ? trace_hardirqs_on_caller+0x110/0x134
    [ 379.714743] [<ffffffff81107b43>] compact_zone+0x2e1/0x4bd
    [ 379.714743] [<ffffffff811082f2>] try_to_compact_pages+0x1de/0x248
    [ 380.001915] [<ffffffff810d3cd2>] __alloc_pages_nodemask+0x45a/0x81c
    [ 380.093011] [<ffffffff812fde14>] ? restore_args+0x0/0x30
    [ 380.160604] [<ffffffff8103995e>] ? finish_task_switch+0x0/0xe3
    [ 380.160604] [<ffffffff810fe297>] alloc_pages_current+0x9b/0xa4
    [ 380.160604] [<ffffffffa00a9a58>] test_alloc_runtest+0x781/0x140a [highalloc]
    [ 380.160604] [<ffffffff81076398>] ? lock_release_non_nested+0x97/0x267
    [ 380.160604] [<ffffffffa00aa7ce>] vmr_write_proc+0xed/0x102 [highalloc]
    [ 380.527282] [<ffffffff81300dc1>] ? sub_preempt_count+0x9/0x83
    [ 380.600599] [<ffffffff812fd92e>] ? _raw_spin_unlock+0x35/0x51
    [ 380.640179] [<ffffffff810e5a17>] ? do_wp_page+0x6af/0x763
    [ 380.722097] [<ffffffff8115bb2a>] ? proc_file_write+0x45/0x92
    [ 380.776200] [<ffffffff8115bb5d>] proc_file_write+0x78/0x92
    [ 380.776200] [<ffffffff8115bae5>] ? proc_file_write+0x0/0x92
    [ 380.936426] [<ffffffff8115bae5>] ? proc_file_write+0x0/0x92
    [ 380.936426] [<ffffffff8115647a>] proc_reg_write+0x89/0xa6
    [ 380.936426] [<ffffffff8110c1f6>] vfs_write+0xb3/0x15a
    [ 380.936426] [<ffffffff8110c36b>] sys_write+0x4c/0x73
    [ 381.197157] [<ffffffff81002d32>] system_call_fastpath+0x16/0x1b
    [ 381.197157] Code: 22 48 3b 56 10 73 1c 48 83 fa f2 74 16 48 8b 4d 80 4c 89 f7 ff 55 88 83 f8 01 41 89 c4 0f 85 a8 00 00 00 48 8b 43 20 48 8d 58 e0 <48> 8b 43 20 0f 18 08 48 8d 43 20 49 39 c7 75 ab e9 8b 00 00 00
    [ 381.512188] RIP [<ffffffff810ef170>] rmap_walk+0xab/0x16d
    [ 381.541457] RSP <ffff880037a797a8>
    [ 381.541457] CR2: 0000000000000000
    [ 381.667153] ---[ end trace b72e829e744f4e05 ]---
    [ 381.722475] note: bench-stresshig[4272] exited with preempt_count 2
    [ 381.797590] BUG: scheduling while atomic: bench-stresshig/4272/0x10000003
    [ 381.878912] INFO: lockdep is turned off.
    [ 381.925924] Modules linked in: highalloc trace_allocmap buddyinfo vmregress_core oprofile dm_crypt loop i2c_piix4 evdev processor serio_raw tpm_tis tpm tpm_bios i2c_core shpchp pci_hotplug button ext3 jbd mbcache dm_mirror dm_region_hash dm_log dm_snapshot dm_mod sg sr_mod sd_mod cdrom ata_generic ahci libahci r8169 libata mii ide_pci_generic ide_core ehci_hcd ohci_hcd scsi_mod floppy thermal fan thermal_sys
    [ 382.368391] Pid: 4272, comm: bench-stresshig Tainted: G D 2.6.34-rc2-mm1-compaction-v7r5 #2
    [ 382.477829] Call Trace:
    [ 382.507155] [<ffffffff81072e3d>] ? __debug_show_held_locks+0x1b/0x24
    [ 382.584339] [<ffffffff81039959>] __schedule_bug+0x77/0x7c
    [ 382.650075] [<ffffffff812fa32d>] schedule+0xcc/0x723
    [ 382.710610] [<ffffffff8103bd9d>] __cond_resched+0x18/0x24
    [ 382.776348] [<ffffffff812faac0>] _cond_resched+0x29/0x34
    [ 382.841046] [<ffffffff810e6521>] unmap_vmas+0x76e/0x96b
    [ 382.904702] [<ffffffff810eb14f>] exit_mmap+0xd5/0x17a
    [ 382.966280] [<ffffffff81043be0>] mmput+0x46/0xf0
    [ 383.022654] [<ffffffff81048179>] ? exit_mm+0xd9/0x14c
    [ 383.084231] [<ffffffff810481dd>] exit_mm+0x13d/0x14c
    [ 383.144767] [<ffffffff812fd879>] ? _raw_spin_unlock_irq+0x58/0x5d
    [ 383.218825] [<ffffffff812237f6>] ? tty_audit_exit+0x28/0x91
    [ 383.286643] [<ffffffff81049e6b>] do_exit+0x20f/0x70d
    [ 383.347179] [<ffffffff810472e4>] ? kmsg_dump+0x153/0x16d
    [ 383.411878] [<ffffffff812fed94>] oops_end+0xbe/0xc6
    [ 383.471373] [<ffffffff81028005>] no_context+0x1f8/0x207
    [ 383.535029] [<ffffffff810281e7>] __bad_area_nosemaphore+0x1d3/0x1f9
    [ 383.611170] [<ffffffff810758f2>] ? __lock_acquire+0xf99/0x1776
    [ 383.682107] [<ffffffff812fcdd6>] ? trace_hardirqs_on_thunk+0x3a/0x3f
    [ 383.759289] [<ffffffff810a38e9>] ? __rcu_process_callbacks+0xa7/0x30b
    [ 383.837507] [<ffffffff81028220>] bad_area_nosemaphore+0x13/0x15
    [ 383.909484] [<ffffffff81300c4e>] do_page_fault+0x24e/0x3b8
    [ 383.976259] [<ffffffff81067358>] ? up+0x14/0x3e
    [ 384.031597] [<ffffffff812fe075>] page_fault+0x25/0x30
    [ 384.093169] [<ffffffff81067358>] ? up+0x14/0x3e
    [ 384.148504] [<ffffffff810ef121>] ? rmap_walk+0x5c/0x16d
    [ 384.212163] [<ffffffff810ef170>] ? rmap_walk+0xab/0x16d
    [ 384.275818] [<ffffffff810ef121>] ? rmap_walk+0x5c/0x16d
    [ 384.339476] [<ffffffff81106396>] ? remove_migration_pte+0x0/0x234
    [ 384.413536] [<ffffffff81300dc1>] ? sub_preempt_count+0x9/0x83
    [ 384.483434] [<ffffffff81106914>] ? migrate_page_copy+0xa0/0x1ed
    [ 384.555412] [<ffffffff81106ea4>] migrate_pages+0x3fc/0x5d3
    [ 384.622190] [<ffffffff81106c56>] ? migrate_pages+0x1ae/0x5d3
    [ 384.691046] [<ffffffff81073a24>] ? trace_hardirqs_on_caller+0x110/0x134
    [ 384.771347] [<ffffffff81107e11>] ? compaction_alloc+0x0/0x283
    [ 384.841246] [<ffffffff811079b0>] ? compact_zone+0x14e/0x4bd
    [ 384.909062] [<ffffffff812fd851>] ? _raw_spin_unlock_irq+0x30/0x5d
    [ 384.983120] [<ffffffff81073a24>] ? trace_hardirqs_on_caller+0x110/0x134
    [ 385.063421] [<ffffffff81107b43>] compact_zone+0x2e1/0x4bd
    [ 385.129158] [<ffffffff811082f2>] try_to_compact_pages+0x1de/0x248
    [ 385.203215] [<ffffffff810d3cd2>] __alloc_pages_nodemask+0x45a/0x81c
    [ 385.279353] [<ffffffff812fde14>] ? restore_args+0x0/0x30
    [ 385.344053] [<ffffffff8103995e>] ? finish_task_switch+0x0/0xe3
    [ 385.414988] [<ffffffff810fe297>] alloc_pages_current+0x9b/0xa4
    [ 385.485927] [<ffffffffa00a9a58>] test_alloc_runtest+0x781/0x140a [highalloc]
    [ 385.571427] [<ffffffff81076398>] ? lock_release_non_nested+0x97/0x267
    [ 385.649647] [<ffffffffa00aa7ce>] vmr_write_proc+0xed/0x102 [highalloc]
    [ 385.728907] [<ffffffff81300dc1>] ? sub_preempt_count+0x9/0x83
    [ 385.798800] [<ffffffff812fd92e>] ? _raw_spin_unlock+0x35/0x51
    [ 385.868700] [<ffffffff810e5a17>] ? do_wp_page+0x6af/0x763
    [ 385.934436] [<ffffffff8115bb2a>] ? proc_file_write+0x45/0x92
    [ 386.003294] [<ffffffff8115bb5d>] proc_file_write+0x78/0x92
    [ 386.070072] [<ffffffff8115bae5>] ? proc_file_write+0x0/0x92
    [ 386.137888] [<ffffffff8115bae5>] ? proc_file_write+0x0/0x92
    [ 386.205708] [<ffffffff8115647a>] proc_reg_write+0x89/0xa6
    [ 386.271442] [<ffffffff8110c1f6>] vfs_write+0xb3/0x15a
    [ 386.333019] [<ffffffff8110c36b>] sys_write+0x4c/0x73
    [ 386.393556] [<ffffffff81002d32>] system_call_fastpath+0x16/0x1b

    > Is it really related to this logic?
    > I don't think so or we are missing something.
    >

    --
    Mel Gorman
    Part-time Phd Student Linux Technology Center
    University of Limerick IBM Dublin Software Lab
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2010-04-01 11:33    [W:0.040 / U:64.252 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site