summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorJosef 'Jeff' Sipek <jeffpc@josefsipek.net>2015-07-23 13:38:16 -0400
committerRobert Mustacchi <rm@joyent.com>2015-09-08 08:41:12 -0700
commite7c874af0c35dbf6ef9d056e7be939b0b4e2b0d7 (patch)
tree81aa64b14b58dc53cc2fbdf9bf1b30447f426e72 /usr/src
parent2ed96329a073f74bd33f766ab982be14f3205bc9 (diff)
downloadillumos-joyent-e7c874af0c35dbf6ef9d056e7be939b0b4e2b0d7.tar.gz
6065 page hash: use a static inline instead of a macro
Reviewed by: Dan McDonald <danmcd@omniti.com> Approved by: Robert Mustacchi <rm@joyent.com>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/vm/vm_page.c73
1 files changed, 31 insertions, 42 deletions
diff --git a/usr/src/uts/common/vm/vm_page.c b/usr/src/uts/common/vm/vm_page.c
index 514d97edad..b5d78502f4 100644
--- a/usr/src/uts/common/vm/vm_page.c
+++ b/usr/src/uts/common/vm/vm_page.c
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 1986, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
*/
/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
@@ -267,39 +268,29 @@ uint_t alloc_pages[9];
uint_t page_exphcontg[19];
uint_t page_create_large_cnt[10];
-/*
- * Collects statistics.
- */
-#define PAGE_HASH_SEARCH(index, pp, vp, off) { \
- uint_t mylen = 0; \
- \
- for ((pp) = page_hash[(index)]; (pp); (pp) = (pp)->p_hash, mylen++) { \
- if ((pp)->p_vnode == (vp) && (pp)->p_offset == (off)) \
- break; \
- } \
- if ((pp) != NULL) \
- pagecnt.pc_find_hit++; \
- else \
- pagecnt.pc_find_miss++; \
- if (mylen > PC_HASH_CNT) \
- mylen = PC_HASH_CNT; \
- pagecnt.pc_find_hashlen[mylen]++; \
-}
+#endif
-#else /* VM_STATS */
+static inline page_t *
+page_hash_search(ulong_t index, vnode_t *vnode, u_offset_t off)
+{
+ uint_t mylen = 0;
+ page_t *page;
-/*
- * Don't collect statistics
- */
-#define PAGE_HASH_SEARCH(index, pp, vp, off) { \
- for ((pp) = page_hash[(index)]; (pp); (pp) = (pp)->p_hash) { \
- if ((pp)->p_vnode == (vp) && (pp)->p_offset == (off)) \
- break; \
- } \
-}
+ for (page = page_hash[index]; page; page = page->p_hash, mylen++)
+ if (page->p_vnode == vnode && page->p_offset == off)
+ break;
-#endif /* VM_STATS */
+#ifdef VM_STATS
+ if (page != NULL)
+ pagecnt.pc_find_hit++;
+ else
+ pagecnt.pc_find_miss++;
+ pagecnt.pc_find_hashlen[MIN(mylen, PC_HASH_CNT)]++;
+#endif
+
+ return (page);
+}
#ifdef DEBUG
@@ -750,7 +741,7 @@ page_lookup_create(
index = PAGE_HASH_FUNC(vp, off);
phm = NULL;
top:
- PAGE_HASH_SEARCH(index, pp, vp, off);
+ pp = page_hash_search(index, vp, off);
if (pp != NULL) {
VM_STAT_ADD(page_lookup_cnt[1]);
es = (newpp != NULL) ? 1 : 0;
@@ -784,8 +775,8 @@ top:
* Reconfirm we locked the correct page.
*
* Both the p_vnode and p_offset *must* be cast volatile
- * to force a reload of their values: The PAGE_HASH_SEARCH
- * macro will have stuffed p_vnode and p_offset into
+ * to force a reload of their values: The page_hash_search
+ * function will have stuffed p_vnode and p_offset into
* registers before calling page_trylock(); another thread,
* actually holding the hash lock, could have changed the
* page's identity in memory, but our registers would not
@@ -948,7 +939,7 @@ page_lookup_nowait(vnode_t *vp, u_offset_t off, se_t se)
VM_STAT_ADD(page_lookup_nowait_cnt[0]);
index = PAGE_HASH_FUNC(vp, off);
- PAGE_HASH_SEARCH(index, pp, vp, off);
+ pp = page_hash_search(index, vp, off);
locked = 0;
if (pp == NULL) {
top:
@@ -956,7 +947,7 @@ top:
locked = 1;
phm = PAGE_HASH_MUTEX(index);
mutex_enter(phm);
- PAGE_HASH_SEARCH(index, pp, vp, off);
+ pp = page_hash_search(index, vp, off);
}
if (pp == NULL || PP_ISFREE(pp)) {
@@ -1018,7 +1009,7 @@ page_find(vnode_t *vp, u_offset_t off)
phm = PAGE_HASH_MUTEX(index);
mutex_enter(phm);
- PAGE_HASH_SEARCH(index, pp, vp, off);
+ pp = page_hash_search(index, vp, off);
mutex_exit(phm);
ASSERT(pp == NULL || PAGE_LOCKED(pp) || panicstr);
@@ -1036,16 +1027,14 @@ page_find(vnode_t *vp, u_offset_t off)
page_t *
page_exists(vnode_t *vp, u_offset_t off)
{
- page_t *pp;
ulong_t index;
ASSERT(MUTEX_NOT_HELD(page_vnode_mutex(vp)));
VM_STAT_ADD(page_exists_cnt);
index = PAGE_HASH_FUNC(vp, off);
- PAGE_HASH_SEARCH(index, pp, vp, off);
- return (pp);
+ return (page_hash_search(index, vp, off));
}
/*
@@ -1092,7 +1081,7 @@ again:
phm = PAGE_HASH_MUTEX(index);
mutex_enter(phm);
- PAGE_HASH_SEARCH(index, pp, vp, off);
+ pp = page_hash_search(index, vp, off);
mutex_exit(phm);
VM_STAT_ADD(page_exphcontg[1]);
@@ -1319,7 +1308,7 @@ page_exists_forreal(vnode_t *vp, u_offset_t off, uint_t *szc)
phm = PAGE_HASH_MUTEX(index);
mutex_enter(phm);
- PAGE_HASH_SEARCH(index, pp, vp, off);
+ pp = page_hash_search(index, vp, off);
if (pp != NULL) {
*szc = pp->p_szc;
rc = 1;
@@ -2447,7 +2436,7 @@ top:
*/
phm = PAGE_HASH_MUTEX(index);
mutex_enter(phm);
- PAGE_HASH_SEARCH(index, pp, vp, off);
+ pp = page_hash_search(index, vp, off);
if (pp == NULL) {
VM_STAT_ADD(page_create_new);
pp = npp;
@@ -3277,7 +3266,7 @@ top:
* lock, again preventing another page from being created with
* this identity.
*/
- PAGE_HASH_SEARCH(index, pp, vp, off);
+ pp = page_hash_search(index, vp, off);
if (pp != NULL) {
VM_STAT_ADD(page_rename_exists);