diff options
| author | Donghai Qiao <Donghai.Qiao@Sun.COM> | 2010-02-19 13:53:37 -0500 |
|---|---|---|
| committer | Donghai Qiao <Donghai.Qiao@Sun.COM> | 2010-02-19 13:53:37 -0500 |
| commit | 5c16be9bcb9ce6b0a40e4ab3620800310de0bf58 (patch) | |
| tree | ee5e3a837eb660803e785591cf0b9404c396821e /usr/src | |
| parent | d2365b013d4199b49b3a1438d57aea23423e02ad (diff) | |
| download | illumos-joyent-5c16be9bcb9ce6b0a40e4ab3620800310de0bf58.tar.gz | |
4926117 page_mark_migrate() could be a bit efficient if kmem_zallc can be eliminated
Diffstat (limited to 'usr/src')
| -rw-r--r-- | usr/src/uts/common/vm/vm_page.c | 48 |
1 files changed, 16 insertions, 32 deletions
diff --git a/usr/src/uts/common/vm/vm_page.c b/usr/src/uts/common/vm/vm_page.c index 61ff0c16c0..f2c3763591 100644 --- a/usr/src/uts/common/vm/vm_page.c +++ b/usr/src/uts/common/vm/vm_page.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. + * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -5337,7 +5337,6 @@ page_mark_migrate(struct seg *seg, caddr_t addr, size_t len, struct anon *ap; vnode_t *curvp; lgrp_t *from; - pgcnt_t i; pgcnt_t nlocked; u_offset_t off; pfn_t pfn; @@ -5345,9 +5344,7 @@ page_mark_migrate(struct seg *seg, caddr_t addr, size_t len, size_t segpgsz; pgcnt_t pages; uint_t pszc; - page_t **ppa; - pgcnt_t ppa_nentries; - page_t *pp; + page_t *pp0, *pp; caddr_t va; ulong_t an_idx; anon_sync_obj_t cookie; @@ -5370,13 +5367,6 @@ page_mark_migrate(struct seg *seg, caddr_t addr, size_t len, len = P2ROUNDUP(len, segpgsz); /* - * Allocate page array to accommodate largest page size - */ - pgsz = page_get_pagesize(page_num_pagesizes() - 1); - ppa_nentries = btop(pgsz); - ppa = kmem_zalloc(ppa_nentries * sizeof (page_t *), KM_SLEEP); - - /* * Do one (large) page at a time */ va = addr; @@ -5432,10 +5422,10 @@ page_mark_migrate(struct seg *seg, caddr_t addr, size_t len, pgsz > segpgsz) { pgsz = MIN(pgsz, segpgsz); page_unlock(pp); - i = btop(P2END((uintptr_t)va, pgsz) - + pages = btop(P2END((uintptr_t)va, pgsz) - (uintptr_t)va); va = (caddr_t)P2END((uintptr_t)va, pgsz); - lgrp_stat_add(from->lgrp_id, LGRP_PMM_FAIL_PGS, i); + lgrp_stat_add(from->lgrp_id, LGRP_PMM_FAIL_PGS, pages); continue; } @@ -5450,10 +5440,7 @@ page_mark_migrate(struct seg *seg, caddr_t addr, size_t len, continue; } - /* - * Remember pages locked exclusively and how many - */ - ppa[0] = pp; + pp0 = pp++; nlocked = 1; /* @@ -5464,8 +5451,7 @@ page_mark_migrate(struct seg *seg, caddr_t addr, size_t len, * Lock all constituents except root page, since it * should be locked already. */ - for (i = 1; i < pages; i++) { - pp++; + for (; nlocked < pages; nlocked++) { if (!page_trylock(pp, SE_EXCL)) { break; } @@ -5478,8 +5464,7 @@ page_mark_migrate(struct seg *seg, caddr_t addr, size_t len, page_unlock(pp); break; } - ppa[nlocked] = pp; - nlocked++; + pp++; } } @@ -5487,9 +5472,10 @@ page_mark_migrate(struct seg *seg, caddr_t addr, size_t len, * If all constituent pages couldn't be locked, * unlock pages locked so far and skip to next page. */ - if (nlocked != pages) { - for (i = 0; i < nlocked; i++) - page_unlock(ppa[i]); + if (nlocked < pages) { + while (pp0 < pp) { + page_unlock(pp0++); + } va += pgsz; lgrp_stat_add(from->lgrp_id, LGRP_PMM_FAIL_PGS, btop(pgsz)); @@ -5509,18 +5495,16 @@ page_mark_migrate(struct seg *seg, caddr_t addr, size_t len, * constituent pages, so a fault will occur on any part of the * large page */ - PP_SETMIGRATE(ppa[0]); - for (i = 0; i < nlocked; i++) { - pp = ppa[i]; - (void) hat_pageunload(pp, HAT_FORCE_PGUNLOAD); - ASSERT(hat_page_getshare(pp) == 0); - page_unlock(pp); + PP_SETMIGRATE(pp0); + while (pp0 < pp) { + (void) hat_pageunload(pp0, HAT_FORCE_PGUNLOAD); + ASSERT(hat_page_getshare(pp0) == 0); + page_unlock(pp0++); } lgrp_stat_add(from->lgrp_id, LGRP_PMM_PGS, nlocked); va += pgsz; } - kmem_free(ppa, ppa_nentries * sizeof (page_t *)); } /* |
