On Wed, Jun 04, 2008 at 07:17:55PM +0300, Muli Ben-Yehuda wrote:
> On Wed, Jun 04, 2008 at 06:09:24PM +0300, Ben-Ami Yassour1 wrote:
> 
> > > > We noticed that pfn_valid does not always works as expected by
> > > > this patch to indicate that a pfn has a backing page.  We have
> > > > seen a case where CONFIG_NUMA was not set and then where
> > > > pfn_valid returned 1 for an mmio pfn.  We then changed the
> > > > config file with CONFIG_NUMA set and it worked fine as expected
> > > > (since a different implementation of pfn_valid was used).
> > > >
> > > > How should we overcome this issue?
> > > 
> > > There's a page_is_ram() too, but that's the e820 map check and it
> > > means it's RAM not that there's a page backing store. Certainly if
> > > it's not ram we should go ahead with just the pfn but it'd be a
> > > workaround.
> > > 
> > > I really think it'd be better off to fix pfn_valid to work for
> > > NUMA.
> > 
> > It does work for NUMA, it does not work without the NUMA option.
> 
> Andrea, how would you suggest to fix pfn_valid for the CONFIG_NUMA
> disabled case?

I'm very surprised that this is broken for non-numa.

To be sure I understand, what exactly means that "pfn has not a
backing page"?

I think we must fix pfn_valid, so that when it returns true,
pfn_to_page returns an entry that is contained inside some mem_map
array allocated by mm/page_alloc.c. pfn_valid is totally right to
return true on mmio regions, as long as a 'struct page' exists. Like
for example the 640k-1M area. It'd be a waste to pay the price of a
discontiguous array to save a few struct pages (or perhaps these days
they're inefficiently using 4k tlb entries to map struct page dunno, I
surely prefer to waste a few struct pages and stay with 2M tlb).

As long as a 'struct page' exists and pfn_to_page returns a 'struct
page' checking PageReserved() should be enough to know if it's
pageable RAM owned by the VM or an mmio region. I don't know why but
when I did reserved-ram patch, the PageReserved check wasn't returning
true on the reserved-ram. Perhaps it's because it was ram, dunno, so I
had to use the page_count() hack. But for mmio !pfn_valid ||
PageReserved should work. Said that this mem_map code tends to change
all the time for whatever reason, so I wouldn't be shocked if
PageReserved doesn't actually work either. But mixing pfn_valid and
PageReserved sounds the right objective.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to