• Mel Gorman's avatar
    futex: Calculate the futex key based on a tail page for file-based futexes · 077fa7ae
    Mel Gorman authored
    Mike Galbraith reported that the LTP test case futex_wake04 was broken
    by commit 65d8fc77 ("futex: Remove requirement for lock_page()
    in get_futex_key()").
    
    This test case uses futexes backed by hugetlbfs pages and so there is an
    associated inode with a futex stored on such pages. The problem is that
    the key is being calculated based on the head page index of the hugetlbfs
    page and not the tail page.
    
    Prior to the optimisation, the page lock was used to stabilise mappings and
    pin the inode is file-backed which is overkill. If the page was a compound
    page, the head page was automatically looked up as part of the page lock
    operation but the tail page index was used to calculate the futex key.
    
    After the optimisation, the compound head is looked up early and the page
    lock is only relied upon to identify truncated pages, special pages or a
    shmem page moving to swapcache. The head page is looked up because without
    the page lock, special care has to be taken to pin the inode correctly.
    However, the tail page is still required to calculate the futex key so
    this patch records the tail page.
    
    On vanilla 4.6, the output of the test case is;
    
    futex_wake04    0  TINFO  :  Hugepagesize 2097152
    futex_wake04    1  TFAIL  :  futex_wake04.c:126: Bug: wait_thread2 did not wake after 30 secs.
    
    With the patch applied
    
    futex_wake04    0  TINFO  :  Hugepagesize 2097152
    futex_wake04    1  TPASS  :  Hi hydra, thread2 awake!
    
    Fixes: 65d8fc77 "futex: Remove requirement for lock_page() in get_futex_key()"
    Reported-and-tested-by: default avatarMike Galbraith <umgwanakikbuti@gmail.com>
    Signed-off-by: default avatarMel Gorman <mgorman@techsingularity.net>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: default avatarDavidlohr Bueso <dave@stgolabs.net>
    Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Cc: stable@vger.kernel.org
    Link: http://lkml.kernel.org/r/20160608132522.GM2469@suse.deSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    077fa7ae
futex.c 88.6 KB