< prev index next >

src/os/aix/vm/os_aix.cpp

Print this page


   1 /*
   2  * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * Copyright 2012, 2014 SAP AG. All rights reserved.
   4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5  *
   6  * This code is free software; you can redistribute it and/or modify it
   7  * under the terms of the GNU General Public License version 2 only, as
   8  * published by the Free Software Foundation.
   9  *
  10  * This code is distributed in the hope that it will be useful, but WITHOUT
  11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  13  * version 2 for more details (a copy is included in the LICENSE file that
  14  * accompanied this code).
  15  *
  16  * You should have received a copy of the GNU General Public License version
  17  * 2 along with this work; if not, write to the Free Software Foundation,
  18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  19  *
  20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  21  * or visit www.oracle.com if you need additional information or have any
  22  * questions.


 393     guarantee(p != NULL, "malloc failed");
 394     data_page_size = os::Aix::query_pagesize(p);
 395     ::free(p);
 396   }
 397 
 398   // query default shm page size (LDR_CNTRL SHMPSIZE)
 399   {
 400     const int shmid = ::shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR | S_IWUSR);
 401     guarantee(shmid != -1, "shmget failed");
 402     void* p = ::shmat(shmid, NULL, 0);
 403     ::shmctl(shmid, IPC_RMID, NULL);
 404     guarantee(p != (void*) -1, "shmat failed");
 405     _shm_default_page_size = os::Aix::query_pagesize(p);
 406     ::shmdt(p);
 407   }
 408 
 409   // before querying the stack page size, make sure we are not running as primordial
 410   // thread (because primordial thread's stack may have different page size than
 411   // pthread thread stacks). Running a VM on the primordial thread won't work for a
 412   // number of reasons so we may just as well guarantee it here
 413   guarantee(!os::Aix::is_primordial_thread(), "Must not be called for primordial thread");
 414 
 415   // query stack page size
 416   {
 417     int dummy = 0;
 418     _stack_page_size = os::Aix::query_pagesize(&dummy);
 419     // everything else would surprise me and should be looked into
 420     guarantee(_stack_page_size == SIZE_4K || _stack_page_size == SIZE_64K, "Wrong page size");
 421     // also, just for completeness: pthread stacks are allocated from C heap, so
 422     // stack page size should be the same as data page size
 423     guarantee(_stack_page_size == data_page_size, "stack page size should be the same as data page size");
 424   }
 425 
 426   // EXTSHM is bad: among other things, it prevents setting pagesize dynamically
 427   // for system V shm.
 428   if (Aix::extshm()) {
 429     if (Verbose) {
 430       fprintf(stderr, "EXTSHM is active - will disable large page support.\n"
 431                       "Please make sure EXTSHM is OFF for large page support.\n");
 432     }
 433     g_multipage_error = ERROR_MP_EXTSHM_ACTIVE;


3818 
3819   // debug trace
3820   if (Verbose) {
3821     fprintf(stderr, "os::vm_page_size 0x%llX\n", os::vm_page_size());
3822     fprintf(stderr, "os::large_page_size 0x%llX\n", os::large_page_size());
3823     fprintf(stderr, "os::_page_sizes = ( ");
3824     for (int i = 0; _page_sizes[i]; i ++) {
3825       fprintf(stderr, " %s ", describe_pagesize(_page_sizes[i]));
3826     }
3827     fprintf(stderr, ")\n");
3828   }
3829 
3830   _initial_pid = getpid();
3831 
3832   clock_tics_per_sec = sysconf(_SC_CLK_TCK);
3833 
3834   init_random(1234567);
3835 
3836   ThreadCritical::initialize();
3837 
3838   // Main_thread points to the aboriginal thread.
3839   Aix::_main_thread = pthread_self();
3840 
3841   initial_time_count = os::elapsed_counter();
3842   pthread_mutex_init(&dl_mutex, NULL);
3843 }
3844 
3845 // This is called _after_ the global arguments have been parsed.
3846 jint os::init_2(void) {
3847 
3848   trcVerbose("processor count: %d", os::_processor_count);
3849   trcVerbose("physical memory: %lu", Aix::_physical_memory);
3850 
3851   // Initially build up the loaded dll map.
3852   LoadedLibraries::reload();
3853 
3854   const int page_size = Aix::page_size();
3855   const int map_size = page_size;
3856 
3857   address map_address = (address) MAP_FAILED;
3858   const int prot  = PROT_READ;


4494   char filename[MAX_PATH];
4495   if (PauseAtStartupFile && PauseAtStartupFile[0]) {
4496     jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
4497   } else {
4498     jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
4499   }
4500 
4501   int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
4502   if (fd != -1) {
4503     struct stat buf;
4504     ::close(fd);
4505     while (::stat(filename, &buf) == 0) {
4506       (void)::poll(NULL, 0, 100);
4507     }
4508   } else {
4509     jio_fprintf(stderr,
4510       "Could not open pause file '%s', continuing immediately.\n", filename);
4511   }
4512 }
4513 
4514 bool os::Aix::is_primordial_thread() {
4515   if (pthread_self() == (pthread_t)1) {
4516     return true;
4517   } else {
4518     return false;
4519   }
4520 }
4521 
4522 // OS recognitions (PASE/AIX, OS level) call this before calling any
4523 // one of Aix::on_pase(), Aix::os_version() static
4524 void os::Aix::initialize_os_info() {
4525 
4526   assert(_on_pase == -1 && _os_version == -1, "already called.");
4527 
4528   struct utsname uts;
4529   memset(&uts, 0, sizeof(uts));
4530   strcpy(uts.sysname, "?");
4531   if (::uname(&uts) == -1) {
4532     trc("uname failed (%d)", errno);
4533     guarantee(0, "Could not determine whether we run on AIX or PASE");
4534   } else {


4629   if (!libperfstat::init()) {
4630     trc("libperfstat initialization failed.");
4631     assert(false, "libperfstat initialization failed");
4632   } else {
4633     if (Verbose) {
4634       fprintf(stderr, "libperfstat initialized.\n");
4635     }
4636   }
4637 } // end: os::Aix::initialize_libperfstat
4638 
4639 /////////////////////////////////////////////////////////////////////////////
4640 // thread stack
4641 
4642 // function to query the current stack size using pthread_getthrds_np
4643 //
4644 // ! do not change anything here unless you know what you are doing !
4645 static void query_stack_dimensions(address* p_stack_base, size_t* p_stack_size) {
4646 
4647   // This only works when invoked on a pthread. As we agreed not to use
4648   // primordial threads anyway, I assert here
4649   guarantee(!os::Aix::is_primordial_thread(), "not allowed on the primordial thread");
4650 
4651   // information about this api can be found (a) in the pthread.h header and
4652   // (b) in http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_getthrds_np.htm
4653   //
4654   // The use of this API to find out the current stack is kind of undefined.
4655   // But after a lot of tries and asking IBM about it, I concluded that it is safe
4656   // enough for cases where I let the pthread library create its stacks. For cases
4657   // where I create an own stack and pass this to pthread_create, it seems not to
4658   // work (the returned stack size in that case is 0).
4659 
4660   pthread_t tid = pthread_self();
4661   struct __pthrdsinfo pinfo;
4662   char dummy[1]; // we only need this to satisfy the api and to not get E
4663   int dummy_size = sizeof(dummy);
4664 
4665   memset(&pinfo, 0, sizeof(pinfo));
4666 
4667   const int rc = pthread_getthrds_np (&tid, PTHRDSINFO_QUERY_ALL, &pinfo,
4668                                       sizeof(pinfo), dummy, &dummy_size);
4669 


   1 /*
   2  * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * Copyright 2012, 2014 SAP AG. All rights reserved.
   4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5  *
   6  * This code is free software; you can redistribute it and/or modify it
   7  * under the terms of the GNU General Public License version 2 only, as
   8  * published by the Free Software Foundation.
   9  *
  10  * This code is distributed in the hope that it will be useful, but WITHOUT
  11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  13  * version 2 for more details (a copy is included in the LICENSE file that
  14  * accompanied this code).
  15  *
  16  * You should have received a copy of the GNU General Public License version
  17  * 2 along with this work; if not, write to the Free Software Foundation,
  18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  19  *
  20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  21  * or visit www.oracle.com if you need additional information or have any
  22  * questions.


 393     guarantee(p != NULL, "malloc failed");
 394     data_page_size = os::Aix::query_pagesize(p);
 395     ::free(p);
 396   }
 397 
 398   // query default shm page size (LDR_CNTRL SHMPSIZE)
 399   {
 400     const int shmid = ::shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR | S_IWUSR);
 401     guarantee(shmid != -1, "shmget failed");
 402     void* p = ::shmat(shmid, NULL, 0);
 403     ::shmctl(shmid, IPC_RMID, NULL);
 404     guarantee(p != (void*) -1, "shmat failed");
 405     _shm_default_page_size = os::Aix::query_pagesize(p);
 406     ::shmdt(p);
 407   }
 408 
 409   // before querying the stack page size, make sure we are not running as primordial
 410   // thread (because primordial thread's stack may have different page size than
 411   // pthread thread stacks). Running a VM on the primordial thread won't work for a
 412   // number of reasons so we may just as well guarantee it here
 413   guarantee(!os::is_primordial_thread(), "Must not be called for primordial thread");
 414 
 415   // query stack page size
 416   {
 417     int dummy = 0;
 418     _stack_page_size = os::Aix::query_pagesize(&dummy);
 419     // everything else would surprise me and should be looked into
 420     guarantee(_stack_page_size == SIZE_4K || _stack_page_size == SIZE_64K, "Wrong page size");
 421     // also, just for completeness: pthread stacks are allocated from C heap, so
 422     // stack page size should be the same as data page size
 423     guarantee(_stack_page_size == data_page_size, "stack page size should be the same as data page size");
 424   }
 425 
 426   // EXTSHM is bad: among other things, it prevents setting pagesize dynamically
 427   // for system V shm.
 428   if (Aix::extshm()) {
 429     if (Verbose) {
 430       fprintf(stderr, "EXTSHM is active - will disable large page support.\n"
 431                       "Please make sure EXTSHM is OFF for large page support.\n");
 432     }
 433     g_multipage_error = ERROR_MP_EXTSHM_ACTIVE;


3818 
3819   // debug trace
3820   if (Verbose) {
3821     fprintf(stderr, "os::vm_page_size 0x%llX\n", os::vm_page_size());
3822     fprintf(stderr, "os::large_page_size 0x%llX\n", os::large_page_size());
3823     fprintf(stderr, "os::_page_sizes = ( ");
3824     for (int i = 0; _page_sizes[i]; i ++) {
3825       fprintf(stderr, " %s ", describe_pagesize(_page_sizes[i]));
3826     }
3827     fprintf(stderr, ")\n");
3828   }
3829 
3830   _initial_pid = getpid();
3831 
3832   clock_tics_per_sec = sysconf(_SC_CLK_TCK);
3833 
3834   init_random(1234567);
3835 
3836   ThreadCritical::initialize();
3837 
3838   // _main_thread points to the thread that created/loaded the JVM.
3839   Aix::_main_thread = pthread_self();
3840 
3841   initial_time_count = os::elapsed_counter();
3842   pthread_mutex_init(&dl_mutex, NULL);
3843 }
3844 
3845 // This is called _after_ the global arguments have been parsed.
3846 jint os::init_2(void) {
3847 
3848   trcVerbose("processor count: %d", os::_processor_count);
3849   trcVerbose("physical memory: %lu", Aix::_physical_memory);
3850 
3851   // Initially build up the loaded dll map.
3852   LoadedLibraries::reload();
3853 
3854   const int page_size = Aix::page_size();
3855   const int map_size = page_size;
3856 
3857   address map_address = (address) MAP_FAILED;
3858   const int prot  = PROT_READ;


4494   char filename[MAX_PATH];
4495   if (PauseAtStartupFile && PauseAtStartupFile[0]) {
4496     jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
4497   } else {
4498     jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
4499   }
4500 
4501   int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
4502   if (fd != -1) {
4503     struct stat buf;
4504     ::close(fd);
4505     while (::stat(filename, &buf) == 0) {
4506       (void)::poll(NULL, 0, 100);
4507     }
4508   } else {
4509     jio_fprintf(stderr,
4510       "Could not open pause file '%s', continuing immediately.\n", filename);
4511   }
4512 }
4513 
4514 bool os::is_primordial_thread(void) {
4515   if (pthread_self() == (pthread_t)1) {
4516     return true;
4517   } else {
4518     return false;
4519   }
4520 }
4521 
4522 // OS recognitions (PASE/AIX, OS level) call this before calling any
4523 // one of Aix::on_pase(), Aix::os_version() static
4524 void os::Aix::initialize_os_info() {
4525 
4526   assert(_on_pase == -1 && _os_version == -1, "already called.");
4527 
4528   struct utsname uts;
4529   memset(&uts, 0, sizeof(uts));
4530   strcpy(uts.sysname, "?");
4531   if (::uname(&uts) == -1) {
4532     trc("uname failed (%d)", errno);
4533     guarantee(0, "Could not determine whether we run on AIX or PASE");
4534   } else {


4629   if (!libperfstat::init()) {
4630     trc("libperfstat initialization failed.");
4631     assert(false, "libperfstat initialization failed");
4632   } else {
4633     if (Verbose) {
4634       fprintf(stderr, "libperfstat initialized.\n");
4635     }
4636   }
4637 } // end: os::Aix::initialize_libperfstat
4638 
4639 /////////////////////////////////////////////////////////////////////////////
4640 // thread stack
4641 
4642 // function to query the current stack size using pthread_getthrds_np
4643 //
4644 // ! do not change anything here unless you know what you are doing !
4645 static void query_stack_dimensions(address* p_stack_base, size_t* p_stack_size) {
4646 
4647   // This only works when invoked on a pthread. As we agreed not to use
4648   // primordial threads anyway, I assert here
4649   guarantee(!os::is_primordial_thread(), "not allowed on the primordial thread");
4650 
4651   // information about this api can be found (a) in the pthread.h header and
4652   // (b) in http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_getthrds_np.htm
4653   //
4654   // The use of this API to find out the current stack is kind of undefined.
4655   // But after a lot of tries and asking IBM about it, I concluded that it is safe
4656   // enough for cases where I let the pthread library create its stacks. For cases
4657   // where I create an own stack and pass this to pthread_create, it seems not to
4658   // work (the returned stack size in that case is 0).
4659 
4660   pthread_t tid = pthread_self();
4661   struct __pthrdsinfo pinfo;
4662   char dummy[1]; // we only need this to satisfy the api and to not get E
4663   int dummy_size = sizeof(dummy);
4664 
4665   memset(&pinfo, 0, sizeof(pinfo));
4666 
4667   const int rc = pthread_getthrds_np (&tid, PTHRDSINFO_QUERY_ALL, &pinfo,
4668                                       sizeof(pinfo), dummy, &dummy_size);
4669 


< prev index next >