summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/vm/seg_vn.c
diff options
context:
space:
mode:
authorPeter Rival <Frank.Rival@oracle.com>2010-04-23 13:26:05 -0400
committerPeter Rival <Frank.Rival@oracle.com>2010-04-23 13:26:05 -0400
commitcb15d5d96b3b2730714c28bfe06cfe7421758b8c (patch)
tree7fd5c3cf5bb49647be8b2eb022e8d75a7d78eab5 /usr/src/uts/common/vm/seg_vn.c
parent03c76a6ef5c04e818b6badeeb6155961505af45c (diff)
downloadillumos-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.c27
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);