diff options
author | Peter Rival <Frank.Rival@oracle.com> | 2010-04-23 13:26:05 -0400 |
---|---|---|
committer | Peter Rival <Frank.Rival@oracle.com> | 2010-04-23 13:26:05 -0400 |
commit | cb15d5d96b3b2730714c28bfe06cfe7421758b8c (patch) | |
tree | 7fd5c3cf5bb49647be8b2eb022e8d75a7d78eab5 /usr/src/uts/common/vm/seg_vn.c | |
parent | 03c76a6ef5c04e818b6badeeb6155961505af45c (diff) | |
download | illumos-joyent-cb15d5d96b3b2730714c28bfe06cfe7421758b8c.tar.gz |
6778289 vm locks need to scale with the size of system (strands/memory size)
Diffstat (limited to 'usr/src/uts/common/vm/seg_vn.c')
-rw-r--r-- | usr/src/uts/common/vm/seg_vn.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/usr/src/uts/common/vm/seg_vn.c b/usr/src/uts/common/vm/seg_vn.c index 666b98f389..31c293d416 100644 --- a/usr/src/uts/common/vm/seg_vn.c +++ b/usr/src/uts/common/vm/seg_vn.c @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 1986, 2010, Oracle and/or its affiliates. All rights reserved. */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ @@ -6483,10 +6482,26 @@ segvn_claim_pages( ASSERT(pg_idx <= pgcnt); ppa[pg_idx] = NULL; - if (prot & PROT_WRITE) - err = page_addclaim_pages(ppa); - else - err = page_subclaim_pages(ppa); + + /* Find each large page within ppa, and adjust its claim */ + + /* Does ppa cover a single large page? */ + if (ppa[0]->p_szc == seg->s_szc) { + if (prot & PROT_WRITE) + err = page_addclaim_pages(ppa); + else + err = page_subclaim_pages(ppa); + } else { + for (i = 0; ppa[i]; i += pgcnt) { + ASSERT(IS_P2ALIGNED(page_pptonum(ppa[i]), pgcnt)); + if (prot & PROT_WRITE) + err = page_addclaim_pages(&ppa[i]); + else + err = page_subclaim_pages(&ppa[i]); + if (err == 0) + break; + } + } for (i = 0; i < pg_idx; i++) { ASSERT(ppa[i] != NULL); |