On Thu 2009-10-08 16:57:32, Wu Zhangjin wrote: > When CONFIG_FLAGMEM enabled, STD/Hiberation will fail on YeeLoong > laptop, This patch fix it: > > if pfn is between min_low_pfn and max_mapnr, the old pfn_valid() will > return TRUE, but in reality, if the memory is not continuous, it should > be false. for example: > > $ cat /proc/iomem | grep "System RAM" > 00000000-0fffffff : System RAM > 90000000-bfffffff : System RAM > > as we can see, it is not continuous, so, some of the memory is not valid > but regarded as valid by pfn_valid(), and at last make STD/Hibernate > fail when shrinking a too large number of invalid memory. > > Here, we fix it via checking pfn is in the "System RAM" or not, if yes, > return TRUE. "return FALSE"? > Signed-off-by: Wu Zhangjin <wuzhangjin@xxxxxxxxx> Looks mostly ok, small comments below. > @@ -168,13 +168,10 @@ typedef struct { unsigned long pgprot; } pgprot_t; > > #ifdef CONFIG_FLATMEM > > -#define pfn_valid(pfn) \ > -({ \ > - unsigned long __pfn = (pfn); \ > - /* avoid <linux/bootmem.h> include hell */ \ > - extern unsigned long min_low_pfn; \ > - \ > - __pfn >= min_low_pfn && __pfn < max_mapnr; \ > +#define pfn_valid(pfn) \ > +({ \ > + extern int is_pfn_valid(unsigned long); \ > + is_pfn_valid(pfn); \ > }) "extern int pfn_valid here" ...and get away without the ugly macro? > #elif defined(CONFIG_SPARSEMEM) > diff --git a/arch/mips/mm/page.c b/arch/mips/mm/page.c > index f5c7375..48a4d2a 100644 > --- a/arch/mips/mm/page.c > +++ b/arch/mips/mm/page.c > @@ -689,3 +689,20 @@ void copy_page(void *to, void *from) > } > > #endif /* CONFIG_SIBYTE_DMA_PAGEOPS */ > + > +#ifdef CONFIG_FLATMEM > +int is_pfn_valid(unsigned long pfn) ...with simple function rename? Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html