From: Balbir Singh <balbir@linux.vnet.ibm.com>
To: Pavel Emelianov <xemul@sw.ru>
Cc: Andrew Morton <akpm@osdl.org>, Paul Menage <menage@google.com>,
Srivatsa Vaddagiri <vatsa@in.ibm.com>,
Balbir Singh <balbir@in.ibm.com>,
devel@openvz.org,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Kirill Korotaev <dev@sw.ru>,
Chandra Seetharaman <sekharan@us.ibm.com>,
Cedric Le Goater <clg@fr.ibm.com>,
"Eric W. Biederman" <ebiederm@xmission.com>,
Rohit Seth <rohitseth@google.com>,
Linux Containers <containers@lists.osdl.org>,
Linux Memory Management List <linux-mm@kvack.org>
Subject: Re: [PATCH 8/8] Per-container pages reclamation
Date: Thu, 24 May 2007 13:29:55 +0530 [thread overview]
Message-ID: <465545FB.2080801@linux.vnet.ibm.com> (raw)
In-Reply-To: <4651B794.4040302@sw.ru>
[-- Attachment #1: Type: text/plain, Size: 1048 bytes --]
Pavel Emelianov wrote:
>> Index: linux-2.6.20/mm/rss_container.c
>> ===================================================================
>> --- linux-2.6.20.orig/mm/rss_container.c 2007-05-15 05:13:46.000000000 -0700
>> +++ linux-2.6.20/mm/rss_container.c 2007-05-16 20:45:45.000000000 -0700
>> @@ -212,6 +212,7 @@ void container_rss_del(struct page_conta
>>
>> css_put(&rss->css);
>> kfree(pc);
>> + init_page_container(page);
>
> This hunk is bad.
> See, when the page drops its mapcount to 0 it may be reused right
> after this if it belongs to a file map - another CPU can touch it.
> Thus you're risking to reset the wrong container.
>
> The main idea if the accounting is that you cannot trust the
> page_container(page) value after the page's mapcount became 0.
>
Good catch, I'll move the initialization to free_hot_cold_page().
I'm attaching a new patch. I've also gotten rid of the unused
variable page in container_rss_del().
I've compile and boot tested the fix
--
Thanks,
Balbir Singh
Linux Technology Center
IBM, ISTL
[-- Attachment #2: rss-fix-lru-race.patch --]
[-- Type: text/x-patch, Size: 2617 bytes --]
Signed-off-by: Balbir Singh <balbir@linux.vnet.ibm.com>
---
Index: linux-2.6.20/mm/page_alloc.c
===================================================================
--- linux-2.6.20.orig/mm/page_alloc.c 2007-05-16 10:30:10.000000000 -0700
+++ linux-2.6.20/mm/page_alloc.c 2007-05-24 00:41:00.000000000 -0700
@@ -41,6 +41,7 @@
#include <linux/pfn.h>
#include <linux/backing-dev.h>
#include <linux/fault-inject.h>
+#include <linux/rss_container.h>
#include <asm/tlbflush.h>
#include <asm/div64.h>
@@ -791,6 +792,7 @@ static void fastcall free_hot_cold_page(
if (!PageHighMem(page))
debug_check_no_locks_freed(page_address(page), PAGE_SIZE);
+ init_page_container(page);
arch_free_page(page, 0);
kernel_map_pages(page, 1, 0);
@@ -1977,6 +1979,7 @@ void __meminit memmap_init_zone(unsigned
set_page_links(page, zone, nid, pfn);
init_page_count(page);
reset_page_mapcount(page);
+ init_page_container(page);
SetPageReserved(page);
INIT_LIST_HEAD(&page->lru);
#ifdef WANT_PAGE_VIRTUAL
Index: linux-2.6.20/include/linux/rss_container.h
===================================================================
--- linux-2.6.20.orig/include/linux/rss_container.h 2007-05-16 10:31:04.000000000 -0700
+++ linux-2.6.20/include/linux/rss_container.h 2007-05-16 10:32:14.000000000 -0700
@@ -28,6 +28,11 @@ void container_rss_move_lists(struct pag
unsigned long isolate_pages_in_container(unsigned long nr_to_scan,
struct list_head *dst, unsigned long *scanned,
struct zone *zone, struct rss_container *, int active);
+static inline void init_page_container(struct page *page)
+{
+ page_container(page) = NULL;
+}
+
#else
static inline int container_rss_prepare(struct page *pg,
struct vm_area_struct *vma, struct page_container **pc)
@@ -56,6 +61,10 @@ static inline void mm_free_container(str
{
}
+static inline void init_page_container(struct page *page)
+{
+}
+
#define isolate_container_pages(nr, dst, scanned, rss, act, zone) ({ BUG(); 0;})
#define container_rss_move_lists(pg, active) do { } while (0)
#endif
Index: linux-2.6.20/mm/rss_container.c
===================================================================
--- linux-2.6.20.orig/mm/rss_container.c 2007-05-15 05:13:46.000000000 -0700
+++ linux-2.6.20/mm/rss_container.c 2007-05-24 00:58:43.000000000 -0700
@@ -199,12 +199,9 @@ void container_rss_add(struct page_conta
void container_rss_del(struct page_container *pc)
{
- struct page *page;
struct rss_container *rss;
- page = pc->page;
rss = pc->cnt;
-
spin_lock_irq(&rss->res.lock);
list_del(&pc->list);
res_counter_uncharge_locked(&rss->res, 1);
prev parent reply other threads:[~2007-05-24 8:01 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <461A3010.90403@sw.ru>
[not found] ` <461A397A.8080609@sw.ru>
2007-05-17 11:31 ` Balbir Singh
2007-05-21 15:15 ` Pavel Emelianov
2007-05-24 7:59 ` Balbir Singh [this message]
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=465545FB.2080801@linux.vnet.ibm.com \
--to=balbir@linux.vnet.ibm.com \
--cc=akpm@osdl.org \
--cc=balbir@in.ibm.com \
--cc=clg@fr.ibm.com \
--cc=containers@lists.osdl.org \
--cc=dev@sw.ru \
--cc=devel@openvz.org \
--cc=ebiederm@xmission.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=menage@google.com \
--cc=rohitseth@google.com \
--cc=sekharan@us.ibm.com \
--cc=vatsa@in.ibm.com \
--cc=xemul@sw.ru \
/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