Commit df921d4d authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] misc rmap speedups

Even a BUG_ON() makes a measurable difference.  So remove some gratuitous
ones which will just trigger a null pointer deref anyway.

Also remove some debug code which isn't really being maintained any more.

Also replace (effectively):

	test_bit(N, foo);
	set_bit(N, foo);

with

	set_bit(N, foo);
	test_bit(N, foo);

In the first case we'll go onto the bus twice: once for the cache miss and
once to get exclusive write access.  In the second case we only go on the bus
once.  I think.  Certainly this trick chaved 40% off the cost of
shrink_list() when I did it there...

This patch is worth 1% or so on the bash script testing.
parent 3523bd55
...@@ -170,43 +170,10 @@ page_add_rmap(struct page *page, pte_t *ptep, struct pte_chain *pte_chain) ...@@ -170,43 +170,10 @@ page_add_rmap(struct page *page, pte_t *ptep, struct pte_chain *pte_chain)
pte_addr_t pte_paddr = ptep_to_paddr(ptep); pte_addr_t pte_paddr = ptep_to_paddr(ptep);
struct pte_chain *cur_pte_chain; struct pte_chain *cur_pte_chain;
#ifdef DEBUG_RMAP
if (!page || !ptep)
BUG();
if (!pte_present(*ptep))
BUG();
if (!ptep_to_mm(ptep))
BUG();
#endif
if (!pfn_valid(page_to_pfn(page)) || PageReserved(page))
return pte_chain;
pte_chain_lock(page); pte_chain_lock(page);
#ifdef DEBUG_RMAP if (!pfn_valid(page_to_pfn(page)) || PageReserved(page))
/* goto out;
* This stuff needs help to get up to highmem speed.
*/
{
struct pte_chain *pc;
int i;
if (PageDirect(page)) {
if (page->pte.direct == pte_paddr)
BUG();
} else {
for (pc = page->pte.chain; pc; pc=pte_chain_next(pc)) {
for (i = 0; i < NRPTE; i++) {
pte_addr_t p = pc->ptes[i];
if (p && p == pte_paddr)
BUG();
}
}
}
}
#endif
if (page->pte.direct == 0) { if (page->pte.direct == 0) {
page->pte.direct = pte_paddr; page->pte.direct = pte_paddr;
...@@ -253,19 +220,18 @@ page_add_rmap(struct page *page, pte_t *ptep, struct pte_chain *pte_chain) ...@@ -253,19 +220,18 @@ page_add_rmap(struct page *page, pte_t *ptep, struct pte_chain *pte_chain)
* the page. * the page.
* Caller needs to hold the mm->page_table_lock. * Caller needs to hold the mm->page_table_lock.
*/ */
void page_remove_rmap(struct page * page, pte_t * ptep) void page_remove_rmap(struct page *page, pte_t *ptep)
{ {
pte_addr_t pte_paddr = ptep_to_paddr(ptep); pte_addr_t pte_paddr = ptep_to_paddr(ptep);
struct pte_chain *pc; struct pte_chain *pc;
if (!page || !ptep) pte_chain_lock(page);
BUG();
if (!pfn_valid(page_to_pfn(page)) || PageReserved(page)) if (!pfn_valid(page_to_pfn(page)) || PageReserved(page))
return; goto out_unlock;
if (!page_mapped(page))
return; /* remap_page_range() from a driver? */
pte_chain_lock(page); if (!page_mapped(page))
goto out_unlock; /* remap_page_range() from a driver? */
if (PageDirect(page)) { if (PageDirect(page)) {
if (page->pte.direct == pte_paddr) { if (page->pte.direct == pte_paddr) {
...@@ -304,27 +270,11 @@ void page_remove_rmap(struct page * page, pte_t * ptep) ...@@ -304,27 +270,11 @@ void page_remove_rmap(struct page * page, pte_t * ptep)
} }
} }
} }
#ifdef DEBUG_RMAP
/* Not found. This should NEVER happen! */
printk(KERN_ERR "page_remove_rmap: pte_chain %p not present.\n", ptep);
printk(KERN_ERR "page_remove_rmap: only found: ");
if (PageDirect(page)) {
printk("%llx", (u64)page->pte.direct);
} else {
for (pc = page->pte.chain; pc; pc = pte_chain_next(pc)) {
int i;
for (i = 0; i < NRPTE; i++)
printk(" %d:%llx", i, (u64)pc->ptes[i]);
}
}
printk("\n");
printk(KERN_ERR "page_remove_rmap: driver cleared PG_reserved ?\n");
#endif
out: out:
pte_chain_unlock(page);
if (!page_mapped(page)) if (!page_mapped(page))
dec_page_state(nr_mapped); dec_page_state(nr_mapped);
out_unlock:
pte_chain_unlock(page);
return; return;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment