From: Mike Galbraith <umgwanakikbuti@gmail.com>
To: Mel Gorman <mgorman@suse.de>
Cc: lkml <linux-kernel@vger.kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Subject: [patch] futex: Fix v4.6+ ltp futex_wait04 regression
Date: Mon, 06 Jun 2016 11:40:41 +0200 [thread overview]
Message-ID: <1465206041.6397.14.camel@gmail.com> (raw)
Hi Mel (who is out of the office today),
I initially reported this on the rt-users list, thinking at the time
that it was only showing up in -rt kernels, but that turned out to not
be the case, it just requires an enterprise config for some reason mm
folks will likely recognize instantly. I just happen to use same when
building devel -rt trees to at least get some build warning coverage.
Below is a stab at fixing the thing up while you're off doing whatever
an Irishman does on a national holiday (hm;). If it's ok as is, fine,
I saved you a couple minutes. If not, oh well, consider it diagnosis.
65d8fc77 futex: Remove requirement for lock_page() in get_futex_key()
introduced a regression of futex_wait04 when an enterprise size config is
used. Per trace_printk(), when we assign page = compound_head(page), we're
subsequently using a different page than the one we locked into memory,
thus mucking up references.
Fixes: 65d8fc77 futex: Remove requirement for lock_page() in get_futex_key()
Signed-off-by: Mike Galbraith <umgwanakikbuit@gmail.com>
---
kernel/futex.c | 26 ++++++++++++++++++++------
1 file changed, 20 insertions(+), 6 deletions(-)
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -469,7 +469,7 @@ get_futex_key(u32 __user *uaddr, int fsh
{
unsigned long address = (unsigned long)uaddr;
struct mm_struct *mm = current->mm;
- struct page *page;
+ struct page *page, *pinned = NULL;
struct address_space *mapping;
int err, ro = 0;
@@ -530,8 +530,18 @@ get_futex_key(u32 __user *uaddr, int fsh
* considered here and page lock forces unnecessarily serialization
* From this point on, mapping will be re-verified if necessary and
* page lock will be acquired only if it is unavoidable
- */
+ *
+ * If we're dealing with a compound page, save our reference to the
+ * page we locked in memory above, and take a new reference on the
+ * page head, dropping the previously pinned page reference on retry.
+ */
+ if (unlikely(pinned && page != pinned))
+ put_page(pinned);
+ pinned = page;
page = compound_head(page);
+ if (unlikely(pinned != page))
+ get_page(page);
+
mapping = READ_ONCE(page->mapping);
/*
@@ -560,12 +570,14 @@ get_futex_key(u32 __user *uaddr, int fsh
lock_page(page);
shmem_swizzled = PageSwapCache(page) || page->mapping;
unlock_page(page);
- put_page(page);
- if (shmem_swizzled)
+ if (shmem_swizzled) {
+ put_page(page);
goto again;
+ }
- return -EFAULT;
+ err = -EFAULT;
+ goto out;
}
/*
@@ -654,12 +666,14 @@ get_futex_key(u32 __user *uaddr, int fsh
key->both.offset |= FUT_OFF_INODE; /* inode-based key */
key->shared.inode = inode;
- key->shared.pgoff = basepage_index(page);
+ key->shared.pgoff = basepage_index(pinned);
rcu_read_unlock();
}
out:
put_page(page);
+ if (unlikely(pinned != page))
+ put_page(pinned);
return err;
}
next reply other threads:[~2016-06-06 9:40 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-06 9:40 Mike Galbraith [this message]
2016-06-06 13:07 ` [patch] futex: Fix v4.6+ ltp futex_wait04 regression Peter Zijlstra
2016-06-06 13:34 ` Mike Galbraith
2016-06-06 13:46 ` Mike Galbraith
2016-06-07 10:50 ` Mel Gorman
2016-06-07 11:20 ` Mel Gorman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1465206041.6397.14.camel@gmail.com \
--to=umgwanakikbuti@gmail.com \
--cc=bigeasy@linutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mgorman@suse.de \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox