* [PATCH] do_migrate_range: avoid failure as much as possible @ 2010-10-25 2:47 Bob Liu 2010-10-25 2:40 ` KAMEZAWA Hiroyuki 0 siblings, 1 reply; 15+ messages in thread From: Bob Liu @ 2010-10-25 2:47 UTC (permalink / raw) To: akpm; +Cc: linux-mm, fengguang.wu, kamezawa.hiroyu, mel, kosaki.motohiro, Bob Liu It's normal for isolate_lru_page() to fail at times. The failures are typically temporal and may well go away when offline_pages() retries the call. So it seems more reasonable to migrate as much as possible to increase the chance of complete success in next retry. This patch remove page_count() check and remove putback_lru_pages() and call migrate_pages() regardless of not_managed to reduce failure as much as possible. Signed-off-by: Bob Liu <lliubbo@gmail.com> --- mm/memory_hotplug.c | 12 ------------ 1 files changed, 0 insertions(+), 12 deletions(-) diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index a4cfcdc..b64cc9b 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -687,7 +687,6 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) unsigned long pfn; struct page *page; int move_pages = NR_OFFLINE_AT_ONCE_PAGES; - int not_managed = 0; int ret = 0; LIST_HEAD(source); @@ -709,10 +708,6 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) page_is_file_cache(page)); } else { - /* Becasue we don't have big zone->lock. we should - check this again here. */ - if (page_count(page)) - not_managed++; #ifdef CONFIG_DEBUG_VM printk(KERN_ALERT "removing pfn %lx from LRU failed\n", pfn); @@ -720,13 +715,6 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) #endif } } - ret = -EBUSY; - if (not_managed) { - if (!list_empty(&source)) - putback_lru_pages(&source); - goto out; - } - ret = 0; if (list_empty(&source)) goto out; /* this function returns # of failed pages */ -- 1.6.3.3 -- 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/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH] do_migrate_range: avoid failure as much as possible 2010-10-25 2:47 [PATCH] do_migrate_range: avoid failure as much as possible Bob Liu @ 2010-10-25 2:40 ` KAMEZAWA Hiroyuki 2010-10-25 2:57 ` Wu Fengguang 0 siblings, 1 reply; 15+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-10-25 2:40 UTC (permalink / raw) To: Bob Liu; +Cc: akpm, linux-mm, fengguang.wu, mel, kosaki.motohiro On Mon, 25 Oct 2010 10:47:31 +0800 Bob Liu <lliubbo@gmail.com> wrote: > It's normal for isolate_lru_page() to fail at times. The failures are > typically temporal and may well go away when offline_pages() retries > the call. So it seems more reasonable to migrate as much as possible > to increase the chance of complete success in next retry. > > This patch remove page_count() check and remove putback_lru_pages() and > call migrate_pages() regardless of not_managed to reduce failure as much > as possible. > > Signed-off-by: Bob Liu <lliubbo@gmail.com> -EBUSY should be returned. -Kame > --- > mm/memory_hotplug.c | 12 ------------ > 1 files changed, 0 insertions(+), 12 deletions(-) > > diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c > index a4cfcdc..b64cc9b 100644 > --- a/mm/memory_hotplug.c > +++ b/mm/memory_hotplug.c > @@ -687,7 +687,6 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) > unsigned long pfn; > struct page *page; > int move_pages = NR_OFFLINE_AT_ONCE_PAGES; > - int not_managed = 0; > int ret = 0; > LIST_HEAD(source); > > @@ -709,10 +708,6 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) > page_is_file_cache(page)); > > } else { > - /* Becasue we don't have big zone->lock. we should > - check this again here. */ > - if (page_count(page)) > - not_managed++; > #ifdef CONFIG_DEBUG_VM > printk(KERN_ALERT "removing pfn %lx from LRU failed\n", > pfn); > @@ -720,13 +715,6 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) > #endif > } > } > - ret = -EBUSY; > - if (not_managed) { > - if (!list_empty(&source)) > - putback_lru_pages(&source); > - goto out; > - } > - ret = 0; > if (list_empty(&source)) > goto out; > /* this function returns # of failed pages */ > -- > 1.6.3.3 > > -- 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/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] do_migrate_range: avoid failure as much as possible 2010-10-25 2:40 ` KAMEZAWA Hiroyuki @ 2010-10-25 2:57 ` Wu Fengguang 2010-10-25 3:05 ` KAMEZAWA Hiroyuki 2010-10-25 3:06 ` Wu Fengguang 0 siblings, 2 replies; 15+ messages in thread From: Wu Fengguang @ 2010-10-25 2:57 UTC (permalink / raw) To: KAMEZAWA Hiroyuki Cc: Bob Liu, akpm@linux-foundation.org, linux-mm@kvack.org, mel@csn.ul.ie, kosaki.motohiro@jp.fujitsu.com On Mon, Oct 25, 2010 at 10:40:17AM +0800, KAMEZAWA Hiroyuki wrote: > On Mon, 25 Oct 2010 10:47:31 +0800 > Bob Liu <lliubbo@gmail.com> wrote: > > > It's normal for isolate_lru_page() to fail at times. The failures are > > typically temporal and may well go away when offline_pages() retries > > the call. So it seems more reasonable to migrate as much as possible > > to increase the chance of complete success in next retry. > > > > This patch remove page_count() check and remove putback_lru_pages() and > > call migrate_pages() regardless of not_managed to reduce failure as much > > as possible. > > > > Signed-off-by: Bob Liu <lliubbo@gmail.com> > > -EBUSY should be returned. It does return -EBUSY when ALL pages cannot be isolated from LRU (or is non-LRU pages at all). That means offline_pages() will repeat calls to do_migrate_range() as fast as possible as long as it can make progress. Is that behavior good enough? It does need some comment for this non-obvious return value. btw, the caller side code can be simplified (no behavior change). diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index dd186c1..606d358 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -848,17 +848,13 @@ repeat: pfn = scan_lru_pages(start_pfn, end_pfn); if (pfn) { /* We have page on LRU */ ret = do_migrate_range(pfn, end_pfn); - if (!ret) { - drain = 1; - goto repeat; - } else { - if (ret < 0) - if (--retry_max == 0) - goto failed_removal; + if (ret < 0) { + if (--retry_max <= 0) + goto failed_removal; yield(); - drain = 1; - goto repeat; } + drain = 1; + goto repeat; } /* drain all zone's lru pagevec, this is asyncronous... */ lru_add_drain_all(); Thanks, Fengguang > > --- > > mm/memory_hotplug.c | 12 ------------ > > 1 files changed, 0 insertions(+), 12 deletions(-) > > > > diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c > > index a4cfcdc..b64cc9b 100644 > > --- a/mm/memory_hotplug.c > > +++ b/mm/memory_hotplug.c > > @@ -687,7 +687,6 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) > > unsigned long pfn; > > struct page *page; > > int move_pages = NR_OFFLINE_AT_ONCE_PAGES; > > - int not_managed = 0; > > int ret = 0; > > LIST_HEAD(source); > > > > @@ -709,10 +708,6 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) > > page_is_file_cache(page)); > > > > } else { > > - /* Becasue we don't have big zone->lock. we should > > - check this again here. */ > > - if (page_count(page)) > > - not_managed++; > > #ifdef CONFIG_DEBUG_VM > > printk(KERN_ALERT "removing pfn %lx from LRU failed\n", > > pfn); > > @@ -720,13 +715,6 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) > > #endif > > } > > } > > - ret = -EBUSY; > > - if (not_managed) { > > - if (!list_empty(&source)) > > - putback_lru_pages(&source); > > - goto out; > > - } > > - ret = 0; > > if (list_empty(&source)) > > goto out; > > /* this function returns # of failed pages */ > > -- > > 1.6.3.3 > > > > -- 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/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH] do_migrate_range: avoid failure as much as possible 2010-10-25 2:57 ` Wu Fengguang @ 2010-10-25 3:05 ` KAMEZAWA Hiroyuki 2010-10-25 3:09 ` KAMEZAWA Hiroyuki 2010-10-25 3:28 ` Wu Fengguang 2010-10-25 3:06 ` Wu Fengguang 1 sibling, 2 replies; 15+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-10-25 3:05 UTC (permalink / raw) To: Wu Fengguang Cc: Bob Liu, akpm@linux-foundation.org, linux-mm@kvack.org, mel@csn.ul.ie, kosaki.motohiro@jp.fujitsu.com On Mon, 25 Oct 2010 10:57:03 +0800 Wu Fengguang <fengguang.wu@intel.com> wrote: > On Mon, Oct 25, 2010 at 10:40:17AM +0800, KAMEZAWA Hiroyuki wrote: > > On Mon, 25 Oct 2010 10:47:31 +0800 > > Bob Liu <lliubbo@gmail.com> wrote: > > > > > It's normal for isolate_lru_page() to fail at times. The failures are > > > typically temporal and may well go away when offline_pages() retries > > > the call. So it seems more reasonable to migrate as much as possible > > > to increase the chance of complete success in next retry. > > > > > > This patch remove page_count() check and remove putback_lru_pages() and > > > call migrate_pages() regardless of not_managed to reduce failure as much > > > as possible. > > > > > > Signed-off-by: Bob Liu <lliubbo@gmail.com> > > > > -EBUSY should be returned. > > It does return -EBUSY when ALL pages cannot be isolated from LRU (or > is non-LRU pages at all). That means offline_pages() will repeat calls > to do_migrate_range() as fast as possible as long as it can make > progress. > I read the patch wrong ? "ret = -EBUSY" is dropped and "ret" will be 0 or just a return code of migrate_page(). > Is that behavior good enough? It does need some comment for this > non-obvious return value. > > btw, the caller side code can be simplified (no behavior change). > > diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c > index dd186c1..606d358 100644 > --- a/mm/memory_hotplug.c > +++ b/mm/memory_hotplug.c > @@ -848,17 +848,13 @@ repeat: > pfn = scan_lru_pages(start_pfn, end_pfn); > if (pfn) { /* We have page on LRU */ > ret = do_migrate_range(pfn, end_pfn); > - if (!ret) { > - drain = 1; > - goto repeat; > - } else { > - if (ret < 0) > - if (--retry_max == 0) > - goto failed_removal; > + if (ret < 0) { > + if (--retry_max <= 0) > + goto failed_removal; > yield(); > - drain = 1; > - goto repeat; > } > + drain = 1; > + goto repeat; > } This changes behavior. This "ret" can be > 0 because migrate_page()'s return code is "Return: Number of pages not migrated or error code." Then, ret < 0 ===> maybe ebusy ret > 0 ===> some pages are not migrated. maybe PG_writeback or some ret == 0 ===> ok, all condition green. try next chunk soon. Then, I added "yield()" and --retrym_max for !ret cases. Thanks, -Kame -- 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/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] do_migrate_range: avoid failure as much as possible 2010-10-25 3:05 ` KAMEZAWA Hiroyuki @ 2010-10-25 3:09 ` KAMEZAWA Hiroyuki 2010-10-25 3:48 ` Wu Fengguang 2010-10-25 3:28 ` Wu Fengguang 1 sibling, 1 reply; 15+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-10-25 3:09 UTC (permalink / raw) To: KAMEZAWA Hiroyuki Cc: Wu Fengguang, Bob Liu, akpm@linux-foundation.org, linux-mm@kvack.org, mel@csn.ul.ie, kosaki.motohiro@jp.fujitsu.com On Mon, 25 Oct 2010 12:05:50 +0900 KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > This changes behavior. > > This "ret" can be > 0 because migrate_page()'s return code is > "Return: Number of pages not migrated or error code." > > Then, > ret < 0 ===> maybe ebusy > ret > 0 ===> some pages are not migrated. maybe PG_writeback or some > ret == 0 ===> ok, all condition green. try next chunk soon. > > Then, I added "yield()" and --retrym_max for !ret cases. ^^^^^^^^ wrong. The code here does ret == 0 ==> ok, all condition green, try next chunk. ret > 0 ==> all pages are isolated but some pages cannot be migrated. maybe under I/O do yield. ret < 0 ==> some pages may not be able to be isolated. reduce retrycount and yield() Thanks, -Kame -- 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/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] do_migrate_range: avoid failure as much as possible 2010-10-25 3:09 ` KAMEZAWA Hiroyuki @ 2010-10-25 3:48 ` Wu Fengguang 2010-10-25 3:48 ` KAMEZAWA Hiroyuki 2010-10-25 4:00 ` Bob Liu 0 siblings, 2 replies; 15+ messages in thread From: Wu Fengguang @ 2010-10-25 3:48 UTC (permalink / raw) To: KAMEZAWA Hiroyuki Cc: Bob Liu, akpm@linux-foundation.org, linux-mm@kvack.org, mel@csn.ul.ie, kosaki.motohiro@jp.fujitsu.com On Mon, Oct 25, 2010 at 11:09:01AM +0800, KAMEZAWA Hiroyuki wrote: > On Mon, 25 Oct 2010 12:05:50 +0900 > KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > > This changes behavior. > > > > This "ret" can be > 0 because migrate_page()'s return code is > > "Return: Number of pages not migrated or error code." > > > > Then, > > ret < 0 ===> maybe ebusy > > ret > 0 ===> some pages are not migrated. maybe PG_writeback or some > > ret == 0 ===> ok, all condition green. try next chunk soon. > > > > Then, I added "yield()" and --retrym_max for !ret cases. > ^^^^^^^^ > wrong. > > The code here does > > ret == 0 ==> ok, all condition green, try next chunk. It seems reasonable to remove the drain operations for "ret == 0" case. That would help large NUMA boxes noticeably I guess. > ret > 0 ==> all pages are isolated but some pages cannot be migrated. maybe under I/O > do yield. Don't know how to deal with the possible "migration fail" pages -- sorry I have no idea about that situation at all. Perhaps, OOM while offlining pages? > ret < 0 ==> some pages may not be able to be isolated. reduce retrycount and yield() Makes good sense. Thanks, Fengguang -- 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/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] do_migrate_range: avoid failure as much as possible 2010-10-25 3:48 ` Wu Fengguang @ 2010-10-25 3:48 ` KAMEZAWA Hiroyuki 2010-10-25 4:06 ` Wu Fengguang 2010-10-25 4:00 ` Bob Liu 1 sibling, 1 reply; 15+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-10-25 3:48 UTC (permalink / raw) To: Wu Fengguang Cc: Bob Liu, akpm@linux-foundation.org, linux-mm@kvack.org, mel@csn.ul.ie, kosaki.motohiro@jp.fujitsu.com On Mon, 25 Oct 2010 11:48:33 +0800 Wu Fengguang <fengguang.wu@intel.com> wrote: > On Mon, Oct 25, 2010 at 11:09:01AM +0800, KAMEZAWA Hiroyuki wrote: > > On Mon, 25 Oct 2010 12:05:50 +0900 > > KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > > > > This changes behavior. > > > > > > This "ret" can be > 0 because migrate_page()'s return code is > > > "Return: Number of pages not migrated or error code." > > > > > > Then, > > > ret < 0 ===> maybe ebusy > > > ret > 0 ===> some pages are not migrated. maybe PG_writeback or some > > > ret == 0 ===> ok, all condition green. try next chunk soon. > > > > > > Then, I added "yield()" and --retrym_max for !ret cases. > > ^^^^^^^^ > > wrong. > > > > The code here does > > > > ret == 0 ==> ok, all condition green, try next chunk. > > It seems reasonable to remove the drain operations for "ret == 0" > case. That would help large NUMA boxes noticeably I guess. > Maybe. > > ret > 0 ==> all pages are isolated but some pages cannot be migrated. maybe under I/O > > do yield. > > Don't know how to deal with the possible "migration fail" pages -- > sorry I have no idea about that situation at all. > In typical case, page_count() > 0 by get_user_pages() or PG_writeback is set. All we can do is just waiting. > Perhaps, OOM while offlining pages? > I never see that..because memory offline is scheduled to be done only when there are free memory. Thanks, -Kame -- 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/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] do_migrate_range: avoid failure as much as possible 2010-10-25 3:48 ` KAMEZAWA Hiroyuki @ 2010-10-25 4:06 ` Wu Fengguang 2010-10-25 4:34 ` KAMEZAWA Hiroyuki 0 siblings, 1 reply; 15+ messages in thread From: Wu Fengguang @ 2010-10-25 4:06 UTC (permalink / raw) To: KAMEZAWA Hiroyuki Cc: Bob Liu, akpm@linux-foundation.org, linux-mm@kvack.org, mel@csn.ul.ie, kosaki.motohiro@jp.fujitsu.com On Mon, Oct 25, 2010 at 11:48:16AM +0800, KAMEZAWA Hiroyuki wrote: > On Mon, 25 Oct 2010 11:48:33 +0800 > Wu Fengguang <fengguang.wu@intel.com> wrote: > > > On Mon, Oct 25, 2010 at 11:09:01AM +0800, KAMEZAWA Hiroyuki wrote: > > > On Mon, 25 Oct 2010 12:05:50 +0900 > > > KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > > > > > > This changes behavior. > > > > > > > > This "ret" can be > 0 because migrate_page()'s return code is > > > > "Return: Number of pages not migrated or error code." > > > > > > > > Then, > > > > ret < 0 ===> maybe ebusy > > > > ret > 0 ===> some pages are not migrated. maybe PG_writeback or some > > > > ret == 0 ===> ok, all condition green. try next chunk soon. > > > > > > > > Then, I added "yield()" and --retrym_max for !ret cases. > > > ^^^^^^^^ > > > wrong. > > > > > > The code here does > > > > > > ret == 0 ==> ok, all condition green, try next chunk. > > > > It seems reasonable to remove the drain operations for "ret == 0" > > case. That would help large NUMA boxes noticeably I guess. > > > Maybe. > > > > ret > 0 ==> all pages are isolated but some pages cannot be migrated. maybe under I/O > > > do yield. > > > > Don't know how to deal with the possible "migration fail" pages -- > > sorry I have no idea about that situation at all. > > > > In typical case, page_count() > 0 by get_user_pages() or PG_writeback is set. > All we can do is just waiting. OK. > > Perhaps, OOM while offlining pages? > > > > I never see that..because memory offline is scheduled to be done only when > there are free memory. OK. On OOM migrate_page() will return -ENOMEM, which will be handled in the "ret < 0" case. So it will give up after some retries. migrate_page() has a comment /* Permanent failure */ when returning positive ret. So it looks safer not to retry indefinitely on the "ret > 0" case? Then it's reduced to two cases: "ret != 0, cannot make smooth progress, unconditional retries may livelock" and "ret ==0, makes some progress, safe to retry". Thanks, Fengguang -- 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/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] do_migrate_range: avoid failure as much as possible 2010-10-25 4:06 ` Wu Fengguang @ 2010-10-25 4:34 ` KAMEZAWA Hiroyuki 2010-10-25 4:55 ` Wu Fengguang 0 siblings, 1 reply; 15+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-10-25 4:34 UTC (permalink / raw) To: Wu Fengguang Cc: Bob Liu, akpm@linux-foundation.org, linux-mm@kvack.org, mel@csn.ul.ie, kosaki.motohiro@jp.fujitsu.com On Mon, 25 Oct 2010 12:06:04 +0800 Wu Fengguang <fengguang.wu@intel.com> wrote: > On Mon, Oct 25, 2010 at 11:48:16AM +0800, KAMEZAWA Hiroyuki wrote: > > On Mon, 25 Oct 2010 11:48:33 +0800 > > Wu Fengguang <fengguang.wu@intel.com> wrote: > > > > > On Mon, Oct 25, 2010 at 11:09:01AM +0800, KAMEZAWA Hiroyuki wrote: > > > > On Mon, 25 Oct 2010 12:05:50 +0900 > > > > KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > > > > > > > > This changes behavior. > > > > > > > > > > This "ret" can be > 0 because migrate_page()'s return code is > > > > > "Return: Number of pages not migrated or error code." > > > > > > > > > > Then, > > > > > ret < 0 ===> maybe ebusy > > > > > ret > 0 ===> some pages are not migrated. maybe PG_writeback or some > > > > > ret == 0 ===> ok, all condition green. try next chunk soon. > > > > > > > > > > Then, I added "yield()" and --retrym_max for !ret cases. > > > > ^^^^^^^^ > > > > wrong. > > > > > > > > The code here does > > > > > > > > ret == 0 ==> ok, all condition green, try next chunk. > > > > > > It seems reasonable to remove the drain operations for "ret == 0" > > > case. That would help large NUMA boxes noticeably I guess. > > > > > Maybe. > > > > > > ret > 0 ==> all pages are isolated but some pages cannot be migrated. maybe under I/O > > > > do yield. > > > > > > Don't know how to deal with the possible "migration fail" pages -- > > > sorry I have no idea about that situation at all. > > > > > > > In typical case, page_count() > 0 by get_user_pages() or PG_writeback is set. > > All we can do is just waiting. > > OK. > > > > Perhaps, OOM while offlining pages? > > > > > > > I never see that..because memory offline is scheduled to be done only when > > there are free memory. > > OK. > > On OOM migrate_page() will return -ENOMEM, which will be handled in > the "ret < 0" case. So it will give up after some retries. > > migrate_page() has a comment /* Permanent failure */ when returning > positive ret. So it looks safer not to retry indefinitely on the > "ret > 0" case? > > Then it's reduced to two cases: "ret != 0, cannot make smooth > progress, unconditional retries may livelock" and "ret ==0, makes some > progress, safe to retry". > Memory offline is designed to be able to stop by Ctrl-C. And it has timeout of 120 sec. I don't called as livelock. Thanks, -Kame -- 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/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] do_migrate_range: avoid failure as much as possible 2010-10-25 4:34 ` KAMEZAWA Hiroyuki @ 2010-10-25 4:55 ` Wu Fengguang 0 siblings, 0 replies; 15+ messages in thread From: Wu Fengguang @ 2010-10-25 4:55 UTC (permalink / raw) To: KAMEZAWA Hiroyuki Cc: Bob Liu, akpm@linux-foundation.org, linux-mm@kvack.org, mel@csn.ul.ie, kosaki.motohiro@jp.fujitsu.com On Mon, Oct 25, 2010 at 12:34:48PM +0800, KAMEZAWA Hiroyuki wrote: > On Mon, 25 Oct 2010 12:06:04 +0800 > Wu Fengguang <fengguang.wu@intel.com> wrote: > > > On Mon, Oct 25, 2010 at 11:48:16AM +0800, KAMEZAWA Hiroyuki wrote: > > > On Mon, 25 Oct 2010 11:48:33 +0800 > > > Wu Fengguang <fengguang.wu@intel.com> wrote: > > > > > > > On Mon, Oct 25, 2010 at 11:09:01AM +0800, KAMEZAWA Hiroyuki wrote: > > > > > On Mon, 25 Oct 2010 12:05:50 +0900 > > > > > KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > > > > > > > > > > This changes behavior. > > > > > > > > > > > > This "ret" can be > 0 because migrate_page()'s return code is > > > > > > "Return: Number of pages not migrated or error code." > > > > > > > > > > > > Then, > > > > > > ret < 0 ===> maybe ebusy > > > > > > ret > 0 ===> some pages are not migrated. maybe PG_writeback or some > > > > > > ret == 0 ===> ok, all condition green. try next chunk soon. > > > > > > > > > > > > Then, I added "yield()" and --retrym_max for !ret cases. > > > > > ^^^^^^^^ > > > > > wrong. > > > > > > > > > > The code here does > > > > > > > > > > ret == 0 ==> ok, all condition green, try next chunk. > > > > > > > > It seems reasonable to remove the drain operations for "ret == 0" > > > > case. That would help large NUMA boxes noticeably I guess. > > > > > > > Maybe. OK, I'll post a patch for it. > > > > > ret > 0 ==> all pages are isolated but some pages cannot be migrated. maybe under I/O > > > > > do yield. > > > > > > > > Don't know how to deal with the possible "migration fail" pages -- > > > > sorry I have no idea about that situation at all. > > > > > > > > > > In typical case, page_count() > 0 by get_user_pages() or PG_writeback is set. > > > All we can do is just waiting. > > > > OK. > > > > > > Perhaps, OOM while offlining pages? > > > > > > > > > > I never see that..because memory offline is scheduled to be done only when > > > there are free memory. > > > > OK. > > > > On OOM migrate_page() will return -ENOMEM, which will be handled in > > the "ret < 0" case. So it will give up after some retries. > > > > migrate_page() has a comment /* Permanent failure */ when returning > > positive ret. So it looks safer not to retry indefinitely on the > > "ret > 0" case? > > > > Then it's reduced to two cases: "ret != 0, cannot make smooth > > progress, unconditional retries may livelock" and "ret ==0, makes some > > progress, safe to retry". > > > Memory offline is designed to be able to stop by Ctrl-C. And it has timeout > of 120 sec. > > I don't called as livelock. Ah sorry for overlooking that! I should really think twice..(after thinking twice) I find it's even better. Unmigratible pages will be put back to LRU. Then -EBUSY will be returned when trying to isolate it the next time. So it's an imaginary problem. Thanks, Fengguang -- 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/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] do_migrate_range: avoid failure as much as possible 2010-10-25 3:48 ` Wu Fengguang 2010-10-25 3:48 ` KAMEZAWA Hiroyuki @ 2010-10-25 4:00 ` Bob Liu 1 sibling, 0 replies; 15+ messages in thread From: Bob Liu @ 2010-10-25 4:00 UTC (permalink / raw) To: Wu Fengguang Cc: KAMEZAWA Hiroyuki, akpm@linux-foundation.org, linux-mm@kvack.org, mel@csn.ul.ie, kosaki.motohiro@jp.fujitsu.com On Mon, Oct 25, 2010 at 11:48 AM, Wu Fengguang <fengguang.wu@intel.com> wrote: > On Mon, Oct 25, 2010 at 11:09:01AM +0800, KAMEZAWA Hiroyuki wrote: >> On Mon, 25 Oct 2010 12:05:50 +0900 >> KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: >> >> > This changes behavior. >> > >> > This "ret" can be > 0 because migrate_page()'s return code is >> > "Return: Number of pages not migrated or error code." >> > >> > Then, >> > ret < 0 ===> maybe ebusy >> > ret > 0 ===> some pages are not migrated. maybe PG_writeback or some >> > ret == 0 ===> ok, all condition green. try next chunk soon. >> > >> > Then, I added "yield()" and --retrym_max for !ret cases. >> ^^^^^^^^ >> wrong. >> >> The code here does >> >> ret == 0 ==> ok, all condition green, try next chunk. > > It seems reasonable to remove the drain operations for "ret == 0" > case. That would help large NUMA boxes noticeably I guess. > >> ret > 0 ==> all pages are isolated but some pages cannot be migrated. maybe under I/O >> do yield. > > Don't know how to deal with the possible "migration fail" pages -- > sorry I have no idea about that situation at all. > > Perhaps, OOM while offlining pages? > >> ret < 0 ==> some pages may not be able to be isolated. reduce retrycount and yield() > > Makes good sense. > > Thanks, > Fengguang > Hi, Wu What about acking these two patches first which doesn't change logic too much. [PATCH 2/3] do_migrate_range: exit loop if not_managed is true. [PATCH 3/3] do_migrate_range: reduce list_empty() check. For the current, I think more work&discussion is needed and make a clean one is better. Thanks. -- Regards, --Bob -- 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/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] do_migrate_range: avoid failure as much as possible 2010-10-25 3:05 ` KAMEZAWA Hiroyuki 2010-10-25 3:09 ` KAMEZAWA Hiroyuki @ 2010-10-25 3:28 ` Wu Fengguang 2010-10-25 3:50 ` KAMEZAWA Hiroyuki 1 sibling, 1 reply; 15+ messages in thread From: Wu Fengguang @ 2010-10-25 3:28 UTC (permalink / raw) To: KAMEZAWA Hiroyuki Cc: Bob Liu, akpm@linux-foundation.org, linux-mm@kvack.org, mel@csn.ul.ie, kosaki.motohiro@jp.fujitsu.com On Mon, Oct 25, 2010 at 11:05:50AM +0800, KAMEZAWA Hiroyuki wrote: > On Mon, 25 Oct 2010 10:57:03 +0800 > Wu Fengguang <fengguang.wu@intel.com> wrote: > > > On Mon, Oct 25, 2010 at 10:40:17AM +0800, KAMEZAWA Hiroyuki wrote: > > > On Mon, 25 Oct 2010 10:47:31 +0800 > > > Bob Liu <lliubbo@gmail.com> wrote: > > > > > > > It's normal for isolate_lru_page() to fail at times. The failures are > > > > typically temporal and may well go away when offline_pages() retries > > > > the call. So it seems more reasonable to migrate as much as possible > > > > to increase the chance of complete success in next retry. > > > > > > > > This patch remove page_count() check and remove putback_lru_pages() and > > > > call migrate_pages() regardless of not_managed to reduce failure as much > > > > as possible. > > > > > > > > Signed-off-by: Bob Liu <lliubbo@gmail.com> > > > > > > -EBUSY should be returned. > > > > It does return -EBUSY when ALL pages cannot be isolated from LRU (or > > is non-LRU pages at all). That means offline_pages() will repeat calls > > to do_migrate_range() as fast as possible as long as it can make > > progress. > > > I read the patch wrong ? "ret = -EBUSY" is dropped and "ret" will be > 0 or just a return code of migrate_page(). for () { ret = isolate_lru_page(page); } if (list_empty(&source)) goto out; out: return ret; So do_migrate_range() will return -EBUSY if the last isolate_lru_page() returns -EBUSY. > > > > > Is that behavior good enough? It does need some comment for this > > non-obvious return value. > > > > btw, the caller side code can be simplified (no behavior change). > > > > diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c > > index dd186c1..606d358 100644 > > --- a/mm/memory_hotplug.c > > +++ b/mm/memory_hotplug.c > > @@ -848,17 +848,13 @@ repeat: > > pfn = scan_lru_pages(start_pfn, end_pfn); > > if (pfn) { /* We have page on LRU */ > > ret = do_migrate_range(pfn, end_pfn); > > - if (!ret) { > > - drain = 1; > > - goto repeat; > > - } else { > > - if (ret < 0) > > - if (--retry_max == 0) > > - goto failed_removal; > > + if (ret < 0) { > > + if (--retry_max <= 0) > > + goto failed_removal; > > yield(); > > - drain = 1; > > - goto repeat; > > } > > + drain = 1; > > + goto repeat; > > } > > This changes behavior. Ah yes! > This "ret" can be > 0 because migrate_page()'s return code is > "Return: Number of pages not migrated or error code." > > Then, > ret < 0 ===> maybe ebusy > ret > 0 ===> some pages are not migrated. maybe PG_writeback or some > ret == 0 ===> ok, all condition green. try next chunk soon. > > Then, I added "yield()" and --retrym_max for !ret cases. You are right, there is the "ret > 0, some pages are not migrated" case. But I'm not sure it's PG_writeback pages, because migrate_pages() will wait on writeback after pass 2. Thanks, Fengguang -- 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/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] do_migrate_range: avoid failure as much as possible 2010-10-25 3:28 ` Wu Fengguang @ 2010-10-25 3:50 ` KAMEZAWA Hiroyuki 0 siblings, 0 replies; 15+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-10-25 3:50 UTC (permalink / raw) To: Wu Fengguang Cc: Bob Liu, akpm@linux-foundation.org, linux-mm@kvack.org, mel@csn.ul.ie, kosaki.motohiro@jp.fujitsu.com On Mon, 25 Oct 2010 11:28:27 +0800 Wu Fengguang <fengguang.wu@intel.com> wrote: > On Mon, Oct 25, 2010 at 11:05:50AM +0800, KAMEZAWA Hiroyuki wrote: > > On Mon, 25 Oct 2010 10:57:03 +0800 > > Wu Fengguang <fengguang.wu@intel.com> wrote: > > > > > On Mon, Oct 25, 2010 at 10:40:17AM +0800, KAMEZAWA Hiroyuki wrote: > > > > On Mon, 25 Oct 2010 10:47:31 +0800 > > > > Bob Liu <lliubbo@gmail.com> wrote: > > > > > > > > > It's normal for isolate_lru_page() to fail at times. The failures are > > > > > typically temporal and may well go away when offline_pages() retries > > > > > the call. So it seems more reasonable to migrate as much as possible > > > > > to increase the chance of complete success in next retry. > > > > > > > > > > This patch remove page_count() check and remove putback_lru_pages() and > > > > > call migrate_pages() regardless of not_managed to reduce failure as much > > > > > as possible. > > > > > > > > > > Signed-off-by: Bob Liu <lliubbo@gmail.com> > > > > > > > > -EBUSY should be returned. > > > > > > It does return -EBUSY when ALL pages cannot be isolated from LRU (or > > > is non-LRU pages at all). That means offline_pages() will repeat calls > > > to do_migrate_range() as fast as possible as long as it can make > > > progress. > > > > > I read the patch wrong ? "ret = -EBUSY" is dropped and "ret" will be > > 0 or just a return code of migrate_page(). > > for () { > ret = isolate_lru_page(page); > } > > if (list_empty(&source)) > goto out; > > out: > return ret; > > So do_migrate_range() will return -EBUSY if the last isolate_lru_page() returns > -EBUSY. > Then this patch should be put onto "immediately quit loop when not_managed++" patch. Please write it in description or make a patch series which other guys can see it. Thanks, -Kame -- 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/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] do_migrate_range: avoid failure as much as possible 2010-10-25 2:57 ` Wu Fengguang 2010-10-25 3:05 ` KAMEZAWA Hiroyuki @ 2010-10-25 3:06 ` Wu Fengguang 2010-10-25 3:16 ` Wu Fengguang 1 sibling, 1 reply; 15+ messages in thread From: Wu Fengguang @ 2010-10-25 3:06 UTC (permalink / raw) To: KAMEZAWA Hiroyuki Cc: Bob Liu, akpm@linux-foundation.org, linux-mm@kvack.org, mel@csn.ul.ie, kosaki.motohiro@jp.fujitsu.com On Mon, Oct 25, 2010 at 10:57:03AM +0800, Wu Fengguang wrote: > On Mon, Oct 25, 2010 at 10:40:17AM +0800, KAMEZAWA Hiroyuki wrote: > > On Mon, 25 Oct 2010 10:47:31 +0800 > > Bob Liu <lliubbo@gmail.com> wrote: > > > > > It's normal for isolate_lru_page() to fail at times. The failures are > > > typically temporal and may well go away when offline_pages() retries > > > the call. So it seems more reasonable to migrate as much as possible > > > to increase the chance of complete success in next retry. > > > > > > This patch remove page_count() check and remove putback_lru_pages() and > > > call migrate_pages() regardless of not_managed to reduce failure as much > > > as possible. > > > > > > Signed-off-by: Bob Liu <lliubbo@gmail.com> > > > > -EBUSY should be returned. > > It does return -EBUSY when ALL pages cannot be isolated from LRU (or > is non-LRU pages at all). That means offline_pages() will repeat calls > to do_migrate_range() as fast as possible as long as it can make > progress. > > Is that behavior good enough? It does need some comment for this > non-obvious return value. > > btw, the caller side code can be simplified (no behavior change). > > diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c > index dd186c1..606d358 100644 > --- a/mm/memory_hotplug.c > +++ b/mm/memory_hotplug.c > @@ -848,17 +848,13 @@ repeat: > pfn = scan_lru_pages(start_pfn, end_pfn); > if (pfn) { /* We have page on LRU */ > ret = do_migrate_range(pfn, end_pfn); > - if (!ret) { > - drain = 1; > - goto repeat; > - } else { > - if (ret < 0) > - if (--retry_max == 0) > - goto failed_removal; > + if (ret < 0) { > + if (--retry_max <= 0) > + goto failed_removal; > yield(); > - drain = 1; > - goto repeat; > } > + drain = 1; > + goto repeat; > } > /* drain all zone's lru pagevec, this is asyncronous... */ > lru_add_drain_all(); And it seems the costly drain operations could be avoided as long as it's making progress. What do you think? --- linux-next.orig/mm/memory_hotplug.c 2010-10-25 11:04:05.000000000 +0800 +++ linux-next/mm/memory_hotplug.c 2010-10-25 11:04:22.000000000 +0800 @@ -852,8 +852,8 @@ repeat: if (--retry_max <= 0) goto failed_removal; yield(); + drain = 1; } - drain = 1; goto repeat; } /* drain all zone's lru pagevec, this is asyncronous... */ -- 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/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] do_migrate_range: avoid failure as much as possible 2010-10-25 3:06 ` Wu Fengguang @ 2010-10-25 3:16 ` Wu Fengguang 0 siblings, 0 replies; 15+ messages in thread From: Wu Fengguang @ 2010-10-25 3:16 UTC (permalink / raw) To: KAMEZAWA Hiroyuki Cc: Bob Liu, akpm@linux-foundation.org, linux-mm@kvack.org, mel@csn.ul.ie, kosaki.motohiro@jp.fujitsu.com On Mon, Oct 25, 2010 at 11:06:34AM +0800, Wu Fengguang wrote: > On Mon, Oct 25, 2010 at 10:57:03AM +0800, Wu Fengguang wrote: > > On Mon, Oct 25, 2010 at 10:40:17AM +0800, KAMEZAWA Hiroyuki wrote: > > > On Mon, 25 Oct 2010 10:47:31 +0800 > > > Bob Liu <lliubbo@gmail.com> wrote: > > > > > > > It's normal for isolate_lru_page() to fail at times. The failures are > > > > typically temporal and may well go away when offline_pages() retries > > > > the call. So it seems more reasonable to migrate as much as possible > > > > to increase the chance of complete success in next retry. > > > > > > > > This patch remove page_count() check and remove putback_lru_pages() and > > > > call migrate_pages() regardless of not_managed to reduce failure as much > > > > as possible. > > > > > > > > Signed-off-by: Bob Liu <lliubbo@gmail.com> > > > > > > -EBUSY should be returned. > > > > It does return -EBUSY when ALL pages cannot be isolated from LRU (or > > is non-LRU pages at all). That means offline_pages() will repeat calls > > to do_migrate_range() as fast as possible as long as it can make > > progress. > > > > Is that behavior good enough? It does need some comment for this > > non-obvious return value. > > > > btw, the caller side code can be simplified (no behavior change). > > > > diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c > > index dd186c1..606d358 100644 > > --- a/mm/memory_hotplug.c > > +++ b/mm/memory_hotplug.c > > @@ -848,17 +848,13 @@ repeat: > > pfn = scan_lru_pages(start_pfn, end_pfn); > > if (pfn) { /* We have page on LRU */ > > ret = do_migrate_range(pfn, end_pfn); > > - if (!ret) { > > - drain = 1; > > - goto repeat; > > - } else { > > - if (ret < 0) > > - if (--retry_max == 0) > > - goto failed_removal; > > + if (ret < 0) { > > + if (--retry_max <= 0) > > + goto failed_removal; > > yield(); > > - drain = 1; > > - goto repeat; > > } > > + drain = 1; > > + goto repeat; > > } > > /* drain all zone's lru pagevec, this is asyncronous... */ > > lru_add_drain_all(); > > And it seems the costly drain operations could be avoided as long as > it's making progress. What do you think? > > --- linux-next.orig/mm/memory_hotplug.c 2010-10-25 11:04:05.000000000 +0800 > +++ linux-next/mm/memory_hotplug.c 2010-10-25 11:04:22.000000000 +0800 > @@ -852,8 +852,8 @@ repeat: > if (--retry_max <= 0) > goto failed_removal; > yield(); > + drain = 1; > } > - drain = 1; > goto repeat; > } > /* drain all zone's lru pagevec, this is asyncronous... */ This is a more heavy weight patch for the above one-liner change. I don't have real experiences to understand the requirements for memory hot remove, so the idea may be way too imaginary. --- linux-next.orig/mm/memory_hotplug.c 2010-10-25 11:04:05.000000000 +0800 +++ linux-next/mm/memory_hotplug.c 2010-10-25 11:12:07.000000000 +0800 @@ -788,7 +788,7 @@ static int offline_pages(unsigned long s { unsigned long pfn, nr_pages, expire; long offlined_pages; - int ret, drain, retry_max, node; + int ret, retry_max, node; struct zone *zone; struct memory_notify arg; @@ -827,7 +827,6 @@ static int offline_pages(unsigned long s pfn = start_pfn; expire = jiffies + timeout; - drain = 0; retry_max = 5; repeat: /* start memory hot removal */ @@ -838,13 +837,6 @@ repeat: if (signal_pending(current)) goto failed_removal; ret = 0; - if (drain) { - lru_add_drain_all(); - flush_scheduled_work(); - cond_resched(); - drain_all_pages(); - } - pfn = scan_lru_pages(start_pfn, end_pfn); if (pfn) { /* We have page on LRU */ ret = do_migrate_range(pfn, end_pfn); @@ -852,15 +844,19 @@ repeat: if (--retry_max <= 0) goto failed_removal; yield(); + lru_add_drain_all(); + flush_scheduled_work(); + cond_resched(); + drain_all_pages(); } - drain = 1; goto repeat; } - /* drain all zone's lru pagevec, this is asyncronous... */ + + /* drain all zone's lru pagevec, this is asynchronous... */ lru_add_drain_all(); flush_scheduled_work(); yield(); - /* drain pcp pages , this is synchrouns. */ + /* drain pcp pages , this is asynchronous. */ drain_all_pages(); /* check again */ offlined_pages = check_pages_isolated(start_pfn, end_pfn); @@ -869,7 +865,7 @@ repeat: goto failed_removal; } printk(KERN_INFO "Offlined Pages %ld\n", offlined_pages); - /* Ok, all of our target is islaoted. + /* Ok, all of our target is isolated. We cannot do rollback at this point. */ offline_isolated_pages(start_pfn, end_pfn); /* reset pagetype flags and makes migrate type to be MOVABLE */ Thanks, Fengguang -- 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/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2010-10-25 4:56 UTC | newest] Thread overview: 15+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-10-25 2:47 [PATCH] do_migrate_range: avoid failure as much as possible Bob Liu 2010-10-25 2:40 ` KAMEZAWA Hiroyuki 2010-10-25 2:57 ` Wu Fengguang 2010-10-25 3:05 ` KAMEZAWA Hiroyuki 2010-10-25 3:09 ` KAMEZAWA Hiroyuki 2010-10-25 3:48 ` Wu Fengguang 2010-10-25 3:48 ` KAMEZAWA Hiroyuki 2010-10-25 4:06 ` Wu Fengguang 2010-10-25 4:34 ` KAMEZAWA Hiroyuki 2010-10-25 4:55 ` Wu Fengguang 2010-10-25 4:00 ` Bob Liu 2010-10-25 3:28 ` Wu Fengguang 2010-10-25 3:50 ` KAMEZAWA Hiroyuki 2010-10-25 3:06 ` Wu Fengguang 2010-10-25 3:16 ` Wu Fengguang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).