From: Konstantin Khlebnikov <khlebnikov@openvz.org>
To: <linux-mm@kvack.org>, Andrew Morton <akpm@linux-foundation.org>
Cc: Andi Kleen <andi@firstfloor.org>, <linux-kernel@vger.kernel.org>
Subject: [PATCH 3/3] mm: strictly require elevated page refcount in isolate_lru_page()
Date: Thu, 21 Apr 2011 17:12:42 +0400 [thread overview]
Message-ID: <20110421131242.17363.49785.stgit@localhost6> (raw)
In-Reply-To: <20110421131239.17363.82750.stgit@localhost6>
isolate_lru_page() must be called only with stable reference to the page,
this is what is written in the comment above it, this is reasonable.
current isolate_lru_page() users and its page extra reference sources:
mm/huge_memory.c
__collapse_huge_page_isolate() - reference from pte
mm/memcontrol.c
mem_cgroup_move_parent() - get_page_unless_zero()
mem_cgroup_move_charge_pte_range() - reference from pte
mm/memory-failure.c
soft_offline_page() - fixed, reference from get_any_page()
delete_from_lru_cache() - reference from caller or get_page_unless_zero()
[seems like there bug, because __memory_failure() can call page_action() for
hpages tail, but it is ok for isolate_lru_page(), tail getted and not in lru]
mm/memory_hotplug.c
do_migrate_range() - fixed, get_page_unless_zero()
mm/mempolicy.c
migrate_page_add() - reference from pte
mm/migrate.c
do_move_page_to_node_array() - reference from follow_page()
mlock.c - various external references
mm/vmscan.c
putback_lru_page() - reference from isolate_lru_page()
It seems that all isolate_lru_page() users are ready now for this restriction.
So, let's replace redundant get_page_unless_zero() with get_page() and
add page initial reference count check with VM_BUG_ON()
Signed-off-by: Konstantin Khlebnikov <khlebnikov@openvz.org>
---
mm/vmscan.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/mm/vmscan.c b/mm/vmscan.c
index f6b435c..0175f39 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1201,13 +1201,16 @@ int isolate_lru_page(struct page *page)
{
int ret = -EBUSY;
+ VM_BUG_ON(!page_count(page));
+
if (PageLRU(page)) {
struct zone *zone = page_zone(page);
spin_lock_irq(&zone->lru_lock);
- if (PageLRU(page) && get_page_unless_zero(page)) {
+ if (PageLRU(page)) {
int lru = page_lru(page);
ret = 0;
+ get_page(page);
ClearPageLRU(page);
del_page_from_lru_list(zone, page, lru);
WARNING: multiple messages have this Message-ID (diff)
From: Konstantin Khlebnikov <khlebnikov@openvz.org>
To: linux-mm@kvack.org, Andrew Morton <akpm@linux-foundation.org>
Cc: Andi Kleen <andi@firstfloor.org>, linux-kernel@vger.kernel.org
Subject: [PATCH 3/3] mm: strictly require elevated page refcount in isolate_lru_page()
Date: Thu, 21 Apr 2011 17:12:42 +0400 [thread overview]
Message-ID: <20110421131242.17363.49785.stgit@localhost6> (raw)
In-Reply-To: <20110421131239.17363.82750.stgit@localhost6>
isolate_lru_page() must be called only with stable reference to the page,
this is what is written in the comment above it, this is reasonable.
current isolate_lru_page() users and its page extra reference sources:
mm/huge_memory.c
__collapse_huge_page_isolate() - reference from pte
mm/memcontrol.c
mem_cgroup_move_parent() - get_page_unless_zero()
mem_cgroup_move_charge_pte_range() - reference from pte
mm/memory-failure.c
soft_offline_page() - fixed, reference from get_any_page()
delete_from_lru_cache() - reference from caller or get_page_unless_zero()
[seems like there bug, because __memory_failure() can call page_action() for
hpages tail, but it is ok for isolate_lru_page(), tail getted and not in lru]
mm/memory_hotplug.c
do_migrate_range() - fixed, get_page_unless_zero()
mm/mempolicy.c
migrate_page_add() - reference from pte
mm/migrate.c
do_move_page_to_node_array() - reference from follow_page()
mlock.c - various external references
mm/vmscan.c
putback_lru_page() - reference from isolate_lru_page()
It seems that all isolate_lru_page() users are ready now for this restriction.
So, let's replace redundant get_page_unless_zero() with get_page() and
add page initial reference count check with VM_BUG_ON()
Signed-off-by: Konstantin Khlebnikov <khlebnikov@openvz.org>
---
mm/vmscan.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/mm/vmscan.c b/mm/vmscan.c
index f6b435c..0175f39 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1201,13 +1201,16 @@ int isolate_lru_page(struct page *page)
{
int ret = -EBUSY;
+ VM_BUG_ON(!page_count(page));
+
if (PageLRU(page)) {
struct zone *zone = page_zone(page);
spin_lock_irq(&zone->lru_lock);
- if (PageLRU(page) && get_page_unless_zero(page)) {
+ if (PageLRU(page)) {
int lru = page_lru(page);
ret = 0;
+ get_page(page);
ClearPageLRU(page);
del_page_from_lru_list(zone, page, lru);
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2011-04-21 13:12 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-21 13:12 [PATCH 1/3] mem-hotplug: call isolate_lru_page with elevated refcount Konstantin Khlebnikov
2011-04-21 13:12 ` Konstantin Khlebnikov
2011-04-21 13:12 ` [PATCH 2/3] mem-hwpoison: fix page refcount around isolate_lru_page() Konstantin Khlebnikov
2011-04-21 13:12 ` Konstantin Khlebnikov
2011-04-21 13:12 ` Konstantin Khlebnikov [this message]
2011-04-21 13:12 ` [PATCH 3/3] mm: strictly require elevated page refcount in isolate_lru_page() Konstantin Khlebnikov
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=20110421131242.17363.49785.stgit@localhost6 \
--to=khlebnikov@openvz.org \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
/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.