diff options
author | aguzovsk <none@none> | 2006-07-21 21:13:27 -0700 |
---|---|---|
committer | aguzovsk <none@none> | 2006-07-21 21:13:27 -0700 |
commit | 07b65a646252c0f0ec200acf82c256c5bf6883b1 (patch) | |
tree | 376eab52fa782b1e9b5fc1ef1ce725a0a7e10fe2 /usr/src/uts/sun4/vm/vm_dep.c | |
parent | 33bc63788dbca06354c73b744c41d4781504e89b (diff) | |
download | illumos-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.c | 46 |
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) |