summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun4/vm/vm_dep.c
diff options
context:
space:
mode:
authoraguzovsk <none@none>2006-07-21 21:13:27 -0700
committeraguzovsk <none@none>2006-07-21 21:13:27 -0700
commit07b65a646252c0f0ec200acf82c256c5bf6883b1 (patch)
tree376eab52fa782b1e9b5fc1ef1ce725a0a7e10fe2 /usr/src/uts/sun4/vm/vm_dep.c
parent33bc63788dbca06354c73b744c41d4781504e89b (diff)
downloadillumos-gate-07b65a646252c0f0ec200acf82c256c5bf6883b1.tar.gz
4614772 MPSS to be extended to shared memory
6413095 madvise() freeing up whole pages even when passed sizes smaller than a page 6416714 anon_map_getpages panic during stress test 6428347 multilple pagelocks/softlocks on the same large page should decrement availrmem just once
Diffstat (limited to 'usr/src/uts/sun4/vm/vm_dep.c')
-rw-r--r--usr/src/uts/sun4/vm/vm_dep.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/usr/src/uts/sun4/vm/vm_dep.c b/usr/src/uts/sun4/vm/vm_dep.c
index 6109ed7054..9f2eebc551 100644
--- a/usr/src/uts/sun4/vm/vm_dep.c
+++ b/usr/src/uts/sun4/vm/vm_dep.c
@@ -657,6 +657,10 @@ extern size_t initdata_pgsz64k_minsize;
*/
pgcnt_t execseg_lpg_min_physmem = 131072; /* 1GB */
+extern int disable_shm_large_pages;
+pgcnt_t shm_lpg_min_physmem = 131072; /* 1GB */
+extern size_t max_shm_lpsize;
+
/* assumes TTE8K...TTE4M == szc */
@@ -767,6 +771,48 @@ map_execseg_pgszcvec(int text, caddr_t addr, size_t len)
return (ret);
}
+uint_t
+map_shm_pgszcvec(caddr_t addr, size_t size, uintptr_t off)
+{
+ caddr_t eaddr = addr + size;
+ uint_t szcvec = 0;
+ int i;
+ caddr_t raddr;
+ caddr_t readdr;
+ size_t pgsz;
+
+ if (physmem < shm_lpg_min_physmem || mmu_page_sizes <= 1 ||
+ max_shm_lpsize <= MMU_PAGESIZE) {
+ return (0);
+ }
+
+ for (i = mmu_page_sizes - 1; i > 0; i--) {
+ if (disable_shm_large_pages & (1 << i)) {
+ continue;
+ }
+ pgsz = page_get_pagesize(i);
+ if (pgsz > max_shm_lpsize) {
+ continue;
+ }
+ raddr = (caddr_t)P2ROUNDUP((uintptr_t)addr, pgsz);
+ readdr = (caddr_t)P2ALIGN((uintptr_t)eaddr, pgsz);
+ if (raddr < addr || raddr >= readdr) {
+ continue;
+ }
+ if (P2PHASE((uintptr_t)addr ^ off, pgsz)) {
+ continue;
+ }
+ szcvec |= (1 << i);
+ /*
+ * And or in the remaining enabled page sizes.
+ */
+ szcvec |= P2PHASE(~disable_shm_large_pages, (1 << i));
+ szcvec &= ~1; /* no need to return 8K pagesize */
+ break;
+ }
+ return (szcvec);
+}
+
#define PNUM_SIZE(size_code) \
(hw_page_array[size_code].hp_size >> hw_page_array[0].hp_shift)