コード例 #1
0
ファイル: pagesize.c プロジェクト: andreiw/polaris
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);
}
コード例 #2
0
ファイル: pageinfo.c プロジェクト: myaut/tsload
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;
}
コード例 #3
0
ファイル: ctfmerge.c プロジェクト: bahamas10/openzfs
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);
}
コード例 #4
0
ファイル: mpss.c プロジェクト: andreiw/polaris
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
}
コード例 #5
0
ファイル: io.cpp プロジェクト: yaochang/shore-mt
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;
}
コード例 #6
0
ファイル: memcached.c プロジェクト: Qihoo360/huststore
/*
 * 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
}