• Miaohe Lin's avatar
    ksm: fix potential missing rmap_item for stable_node · 9fe7601b
    Miaohe Lin authored
    [ Upstream commit c89a384e ]
    
    When removing rmap_item from stable tree, STABLE_FLAG of rmap_item is
    cleared with head reserved.  So the following scenario might happen: For
    ksm page with rmap_item1:
    
    cmp_and_merge_page
      stable_node->head = &migrate_nodes;
      remove_rmap_item_from_tree, but head still equal to stable_node;
      try_to_merge_with_ksm_page failed;
      return;
    
    For the same ksm page with rmap_item2, stable node migration succeed this
    time.  The stable_node->head does not equal to migrate_nodes now.  For ksm
    page with rmap_item1 again:
    
    cmp_and_merge_page
     stable_node->head != &migrate_nodes && rmap_item->head == stable_node
     return;
    
    We would miss the rmap_item for stable_node and might result in failed
    rmap_walk_ksm().  Fix this by set rmap_item->head to NULL when rmap_item
    is removed from stable tree.
    
    Link: https://lkml.kernel.org/r/20210330140228.45635-5-linmiaohe@huawei.com
    Fixes: 4146d2d6 ("ksm: make !me...
    9fe7601b
ksm.c 64.5 KB