From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
Zwane Mwaikambo <zwane@arm.linux.org.uk>,
"Theodore Ts'o" <tytso@mit.edu>,
Randy Dunlap <rdunlap@xenotime.net>,
Dave Jones <davej@redhat.com>,
Chuck Wolber <chuckw@quantumlinux.com>,
Chris Wedgwood <reviews@ml.cw.f00f.org>,
Michael Krufky <mkrufky@linuxtv.org>,
Chuck Ebbert <cebbert@redhat.com>,
Domenico Andreoli <cavokz@gmail.com>, Willy Tarreau <w@1wt.eu>,
Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
alan@lxorguk.ukuu.org.uk
Subject: [patch 10/10] Fix ZERO_PAGE breakage with vmware
Date: Mon, 23 Jun 2008 16:04:52 -0700 [thread overview]
Message-ID: <20080623230452.GD29853@suse.de> (raw)
In-Reply-To: <20080623230417.GA29853@suse.de>
[-- Attachment #1: fix-zero_page-breakage-with-vmware.patch --]
[-- Type: text/plain, Size: 2689 bytes --]
2.6.25.9-stable review patch. If anyone has any objections, please let
us know.
Note, I had to merge this patch by hand, can someone verify that I
didn't mess it up?
------------------
From: Linus Torvalds <torvalds@linux-foundation.org>
commit 672ca28e300c17bf8d792a2a7a8631193e580c74 upstream
Commit 89f5b7da2a6bad2e84670422ab8192382a5aeb9f ("Reinstate ZERO_PAGE
optimization in 'get_user_pages()' and fix XIP") broke vmware, as
reported by Jeff Chua:
"This broke vmware 6.0.4.
Jun 22 14:53:03.845: vmx| NOT_IMPLEMENTED
/build/mts/release/bora-93057/bora/vmx/main/vmmonPosix.c:774"
and the reason seems to be that there's an old bug in how we handle do
FOLL_ANON on VM_SHARED areas in get_user_pages(), but since it only
triggered if the whole page table was missing, nobody had apparently hit
it before.
The recent changes to 'follow_page()' made the FOLL_ANON logic trigger
not just for whole missing page tables, but for individual pages as
well, and exposed this problem.
This fixes it by making the test for when FOLL_ANON is used more
careful, and also makes the code easier to read and understand by moving
the logic to a separate inline function.
Reported-and-tested-by: Jeff Chua <jeff.chua.linux@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
mm/memory.c | 24 +++++++++++++++++++++---
1 file changed, 21 insertions(+), 3 deletions(-)
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -989,6 +989,26 @@ no_page_table:
return page;
}
+/* Can we do the FOLL_ANON optimization? */
+static inline int use_zero_page(struct vm_area_struct *vma)
+{
+ /*
+ * We don't want to optimize FOLL_ANON for make_pages_present()
+ * when it tries to page in a VM_LOCKED region. As to VM_SHARED,
+ * we want to get the page from the page tables to make sure
+ * that we serialize and update with any other user of that
+ * mapping.
+ */
+ if (vma->vm_flags & (VM_LOCKED | VM_SHARED))
+ return 0;
+ /*
+ * And if we have a fault or a nopfn routine, it's not an
+ * anonymous region.
+ */
+ return !vma->vm_ops ||
+ (!vma->vm_ops->fault && !vma->vm_ops->nopfn);
+}
+
int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
unsigned long start, int len, int write, int force,
struct page **pages, struct vm_area_struct **vmas)
@@ -1063,9 +1083,7 @@ int get_user_pages(struct task_struct *t
foll_flags = FOLL_TOUCH;
if (pages)
foll_flags |= FOLL_GET;
- if (!write && !(vma->vm_flags & VM_LOCKED) &&
- (!vma->vm_ops || (!vma->vm_ops->nopage &&
- !vma->vm_ops->fault)))
+ if (!write && use_zero_page(vma))
foll_flags |= FOLL_ANON;
do {
--
next prev parent reply other threads:[~2008-06-23 23:08 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20080623225737.837265824@mini.kroah.org>
2008-06-23 23:04 ` [patch 00/10] 2.6.28.9-rc2 review Greg KH
2008-06-23 23:04 ` [patch 08/10] hwmon: (lm85) Fix function RANGE_TO_REG() Greg KH
2008-06-23 23:04 ` [patch 09/10] hwmon: (adt7473) Initialize max_duty_at_overheat before use Greg KH
2008-06-23 23:04 ` Greg KH [this message]
2008-06-23 23:28 ` [patch 10/10] Fix ZERO_PAGE breakage with vmware Linus Torvalds
2008-06-24 6:04 ` Greg KH
2008-06-23 23:04 ` [patch 05/10] x86: set PAE PHYSICAL_MASK_SHIFT to 44 bits Greg KH
2008-06-23 23:04 ` [patch 06/10] Add return value to reserve_bootmem_node() Greg KH
2008-06-24 11:06 ` Adrian Bunk
2008-06-24 21:07 ` Greg KH
2008-06-23 23:05 ` [patch 07/10] watchdog: hpwdt: fix use of inline assembly Greg KH
2008-06-23 23:05 ` [patch 01/10] atl1: relax eeprom mac address error check Greg KH
2008-06-23 23:05 ` [patch 02/10] Reinstate ZERO_PAGE optimization in get_user_pages() and fix XIP Greg KH
2008-06-23 23:05 ` [patch 03/10] sctp: Make sure N * sizeof(union sctp_addr) does not overflow Greg KH
2008-06-23 23:05 ` [patch 04/10] x86: use BOOTMEM_EXCLUSIVE on 32-bit Greg KH
2008-06-23 23:22 ` [patch 00/10] 2.6.28.9-rc2 review Greg KH
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=20080623230452.GD29853@suse.de \
--to=gregkh@suse.de \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=cavokz@gmail.com \
--cc=cebbert@redhat.com \
--cc=chuckw@quantumlinux.com \
--cc=davej@redhat.com \
--cc=jmforbes@linuxtx.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mkrufky@linuxtv.org \
--cc=rbranco@la.checkpoint.com \
--cc=rdunlap@xenotime.net \
--cc=reviews@ml.cw.f00f.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
--cc=w@1wt.eu \
--cc=zwane@arm.linux.org.uk \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.