int main(int argc, char *argv[]) { int c, mps = 0; size_t *buf; int nelem, i; (void) setlocale(LC_ALL, ""); #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */ #define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */ #endif (void) textdomain(TEXT_DOMAIN); while ((c = getopt(argc, (char * const *)argv, "a")) != -1) { switch (c) { case 'a': mps = 1; break; case '?': (void) fprintf(stderr, gettext("usage: pagesize [-a]\n")); exit(1); } } if (!mps) { (void) printf("%d\n", getpagesize()); exit(0); } nelem = getpagesizes(NULL, 0); if (nelem < 2) { (void) printf("%d\n", getpagesize()); exit(0); } if ((buf = (size_t *)malloc(sizeof (*buf) * nelem)) == NULL) { (void) fprintf(stderr, gettext("Can't get memory\n")); exit(1); } nelem = getpagesizes(buf, nelem); for (i = 0; i < nelem; i++) { (void) fprintf(stdout, "%d\n", buf[i]); } free(buf); return (0); }
PLATAPI hi_page_info_t* hi_get_pageinfo(void) { int i, n; size_t default_pgsz; size_t pgsz[PAGEINFOLEN]; if(hi_sol_pageinfo_probed) return hi_sol_pageinfo; memset(hi_sol_pageinfo, '\0', PAGEINFOLEN * sizeof(hi_page_info_t)); default_pgsz = getpagesize(); n = getpagesizes(pgsz, PAGEINFOLEN - 1); for(i = 0; i < n; ++i) { hi_sol_pageinfo[i].pi_flags = HI_PIF_PAGEINFO; if(pgsz[i] == default_pgsz) { hi_sol_pageinfo[i].pi_flags |= HI_PIF_DEFAULT; } hi_sol_pageinfo[i].pi_size = pgsz[i]; } return hi_sol_pageinfo; }
static void bigheap(void) { size_t big, *size; int sizes; struct memcntl_mha mha; /* * First, get the available pagesizes. */ if ((sizes = getpagesizes(NULL, 0)) == -1) return; if (sizes == 1 || (size = alloca(sizeof (size_t) * sizes)) == NULL) return; if (getpagesizes(size, sizes) == -1) return; while (size[sizes - 1] > maxpgsize) sizes--; /* set big to the largest allowed page size */ big = size[sizes - 1]; if (big & (big - 1)) { /* * The largest page size is not a power of two for some * inexplicable reason; return. */ return; } /* * Now, align our break to the largest page size. */ if (brk((void *)((((uintptr_t)sbrk(0) - 1) & ~(big - 1)) + big)) != 0) return; /* * set the preferred page size for the heap */ mha.mha_cmd = MHA_MAPSIZE_BSSBRK; mha.mha_flags = 0; mha.mha_pagesize = big; (void) memcntl(NULL, 0, MC_HAT_ADVISE, (caddr_t)&mha, 0, 0); }
static void pgszinit() { nelem = getpagesizes(NULL, 0); if (!nelem) return; if (nelem > PGSZELEM) nelem = PGSZELEM; (void) getpagesizes(pgsz, nelem); #ifdef MPSSDEBUG pgsz[nelem] = 0x800000; nelem++; #endif }
long sthread_t::get_max_page_size(long system_page_size) { long max_page_size = 0; #ifdef HAVE_GETPAGESIZES { int nelem = getpagesizes(NULL, 0); if(nelem >= 0) { size_t *pagesize = new size_t[nelem]; int err = getpagesizes (pagesize, nelem); if(err >= 0) { for(int i=0; i < nelem; i++) { if ( pagesize[i] > max_page_size) { max_page_size = pagesize[i]; } } } else { std::cerr << "getpagesizes(pagesize, " << nelem << ") failed. " << " errno is " << errno << " " << strerror(errno) << std::endl; } delete[] pagesize; } else { std::cerr << "getpagesizes(NULL,0) failed. " << " errno is " << errno << " " << strerror(errno) << std::endl; } } #else max_page_size = system_page_size; #endif /* std::cerr << "Max page size is " << max_page_size << "( " << int(max_page_size/1024) << " KB) " << std::endl; std::cerr << "System page size is " << system_page_size << "( " << int(system_page_size/1024) << " KB) " << std::endl; */ return max_page_size; }
/* * On systems that supports multiple page sizes we may reduce the * number of TLB-misses by using the biggest available page size */ static int enable_large_pages ( void ) { #if defined(HAVE_GETPAGESIZES) && defined(HAVE_MEMCNTL) int ret = - 1; size_t sizes[32]; int avail = getpagesizes (sizes, 32); if ( avail != - 1 ) { size_t max = sizes[0]; struct memcntl_mha arg = { 0 }; int ii; for ( ii = 1; ii < avail; ++ ii ) { if ( max < sizes[ii] ) { max = sizes[ii]; } } arg.mha_flags = 0; arg.mha_pagesize = max; arg.mha_cmd = MHA_MAPSIZE_BSSBRK; if ( memcntl (0, 0, MC_HAT_ADVISE, ( caddr_t ) & arg, 0, 0) == - 1 ) { fprintf (stderr, "Failed to set large pages: %s\n", strerror (errno)); fprintf (stderr, "Will use default page size\n"); } else { ret = 0; } } else { fprintf (stderr, "Failed to get supported pagesizes: %s\n", strerror (errno)); fprintf (stderr, "Will use default page size\n"); } return ret; #else return - 1; #endif }