Skip to content

Commit 3b305d5

Browse files
Sonia Zaldana Calleststuefe
Sonia Zaldana Calles
authored andcommittedMar 19, 2024
8313306: More sensible memory reservation logging
Reviewed-by: dholmes, stuefe, coleenp
1 parent f140eb4 commit 3b305d5

File tree

8 files changed

+501
-61
lines changed

8 files changed

+501
-61
lines changed
 

‎src/hotspot/os/aix/os_aix.cpp

+75-33
Original file line numberDiff line numberDiff line change
@@ -312,15 +312,21 @@ static bool my_disclaim64(char* addr, size_t size) {
312312

313313
for (unsigned int i = 0; i < numFullDisclaimsNeeded; i ++) {
314314
if (::disclaim(p, maxDisclaimSize, DISCLAIM_ZEROMEM) != 0) {
315-
trcVerbose("Cannot disclaim %p - %p (errno %d)\n", p, p + maxDisclaimSize, errno);
315+
ErrnoPreserver ep;
316+
log_trace(os, map)("disclaim failed: " RANGEFMT " errno=(%s)",
317+
RANGEFMTARGS(p, maxDisclaimSize),
318+
os::strerror(ep.saved_errno()));
316319
return false;
317320
}
318321
p += maxDisclaimSize;
319322
}
320323

321324
if (lastDisclaimSize > 0) {
322325
if (::disclaim(p, lastDisclaimSize, DISCLAIM_ZEROMEM) != 0) {
323-
trcVerbose("Cannot disclaim %p - %p (errno %d)\n", p, p + lastDisclaimSize, errno);
326+
ErrnoPreserver ep;
327+
log_trace(os, map)("disclaim failed: " RANGEFMT " errno=(%s)",
328+
RANGEFMTARGS(p, lastDisclaimSize),
329+
os::strerror(ep.saved_errno()));
324330
return false;
325331
}
326332
}
@@ -1505,15 +1511,12 @@ struct vmembk_t {
15051511
// also check that range is fully page aligned to the page size if the block.
15061512
void assert_is_valid_subrange(char* p, size_t s) const {
15071513
if (!contains_range(p, s)) {
1508-
trcVerbose("[" PTR_FORMAT " - " PTR_FORMAT "] is not a sub "
1509-
"range of [" PTR_FORMAT " - " PTR_FORMAT "].",
1510-
p2i(p), p2i(p + s), p2i(addr), p2i(addr + size));
1511-
guarantee0(false);
1514+
fatal(RANGEFMT " is not a sub range of " RANGEFMT, RANGEFMTARGS(p, s),
1515+
RANGEFMTARGS(addr, size));
15121516
}
15131517
if (!is_aligned_to(p, pagesize) || !is_aligned_to(p + s, pagesize)) {
1514-
trcVerbose("range [" PTR_FORMAT " - " PTR_FORMAT "] is not"
1515-
" aligned to pagesize (%lu)", p2i(p), p2i(p + s), (unsigned long) pagesize);
1516-
guarantee0(false);
1518+
fatal("range " RANGEFMT " is not aligned to pagesize (%lu)",
1519+
RANGEFMTARGS(p, s), (unsigned long)pagesize);
15171520
}
15181521
}
15191522
};
@@ -1580,7 +1583,9 @@ static char* reserve_shmated_memory (size_t bytes, char* requested_addr) {
15801583
// We must prevent anyone from attaching too close to the
15811584
// BRK because that may cause malloc OOM.
15821585
if (requested_addr != nullptr && is_close_to_brk((address)requested_addr)) {
1583-
trcVerbose("Wish address " PTR_FORMAT " is too close to the BRK segment.", p2i(requested_addr));
1586+
log_info(os, map)("Wish address " PTR_FORMAT
1587+
" is too close to the BRK segment.",
1588+
p2i(requested_addr));
15841589
// Since we treat an attach to the wrong address as an error later anyway,
15851590
// we return null here
15861591
return nullptr;
@@ -1598,7 +1603,9 @@ static char* reserve_shmated_memory (size_t bytes, char* requested_addr) {
15981603
// Reserve the shared segment.
15991604
int shmid = shmget(IPC_PRIVATE, size, IPC_CREAT | S_IRUSR | S_IWUSR);
16001605
if (shmid == -1) {
1601-
trcVerbose("shmget(.., " UINTX_FORMAT ", ..) failed (errno: %d).", size, errno);
1606+
ErrnoPreserver ep;
1607+
log_trace(os, map)("shmget(.., " UINTX_FORMAT ", ..) failed (errno=%s).",
1608+
size, os::strerror(ep.saved_errno()));
16021609
return nullptr;
16031610
}
16041611

@@ -1612,10 +1619,10 @@ static char* reserve_shmated_memory (size_t bytes, char* requested_addr) {
16121619
memset(&shmbuf, 0, sizeof(shmbuf));
16131620
shmbuf.shm_pagesize = 64*K;
16141621
if (shmctl(shmid, SHM_PAGESIZE, &shmbuf) != 0) {
1615-
trcVerbose("Failed to set page size (need " UINTX_FORMAT " 64K pages) - shmctl failed with %d.",
1616-
size / (64*K), errno);
1617-
// I want to know if this ever happens.
1618-
assert(false, "failed to set page size for shmat");
1622+
assert(false,
1623+
"Failed to set page size (need " UINTX_FORMAT
1624+
" 64K pages) - shmctl failed. (errno=%s).",
1625+
size / (64 * K), os::strerror(os::get_last_error()));
16191626
}
16201627

16211628
// Now attach the shared segment.
@@ -1630,31 +1637,44 @@ static char* reserve_shmated_memory (size_t bytes, char* requested_addr) {
16301637

16311638
// (A) Right after shmat and before handing shmat errors delete the shm segment.
16321639
if (::shmctl(shmid, IPC_RMID, nullptr) == -1) {
1633-
trcVerbose("shmctl(%u, IPC_RMID) failed (%d)\n", shmid, errno);
1640+
ErrnoPreserver ep;
1641+
log_trace(os, map)("shmctl(%u, IPC_RMID) failed (errno=%s)\n",
1642+
shmid,
1643+
os::strerror(ep.saved_errno()));
16341644
assert(false, "failed to remove shared memory segment!");
16351645
}
16361646

16371647
// Handle shmat error. If we failed to attach, just return.
16381648
if (addr == (char*)-1) {
1639-
trcVerbose("Failed to attach segment at " PTR_FORMAT " (%d).", p2i(requested_addr), errno_shmat);
1649+
ErrnoPreserver ep;
1650+
log_trace(os, map)("Failed to attach segment at " PTR_FORMAT " (errno=%s).",
1651+
p2i(requested_addr),
1652+
os::strerror(ep.saved_errno()));
16401653
return nullptr;
16411654
}
16421655

16431656
// Just for info: query the real page size. In case setting the page size did not
16441657
// work (see above), the system may have given us something other then 4K (LDR_CNTRL).
16451658
const size_t real_pagesize = os::Aix::query_pagesize(addr);
16461659
if (real_pagesize != (size_t)shmbuf.shm_pagesize) {
1647-
trcVerbose("pagesize is, surprisingly, " SIZE_FORMAT, real_pagesize);
1660+
log_trace(os, map)("pagesize is, surprisingly, " SIZE_FORMAT,
1661+
real_pagesize);
16481662
}
16491663

16501664
if (addr) {
1651-
trcVerbose("shm-allocated " PTR_FORMAT " .. " PTR_FORMAT " (" UINTX_FORMAT " bytes, " UINTX_FORMAT " %s pages)",
1652-
p2i(addr), p2i(addr + size - 1), size, size/real_pagesize, describe_pagesize(real_pagesize));
1665+
log_trace(os, map)("shm-allocated succeeded: " RANGEFMT
1666+
" (" UINTX_FORMAT " %s pages)",
1667+
RANGEFMTARGS(addr, size),
1668+
size / real_pagesize,
1669+
describe_pagesize(real_pagesize));
16531670
} else {
16541671
if (requested_addr != nullptr) {
1655-
trcVerbose("failed to shm-allocate " UINTX_FORMAT " bytes at with address " PTR_FORMAT ".", size, p2i(requested_addr));
1672+
log_trace(os, map)("shm-allocate failed: " RANGEFMT,
1673+
RANGEFMTARGS(requested_addr, size));
16561674
} else {
1657-
trcVerbose("failed to shm-allocate " UINTX_FORMAT " bytes at any address.", size);
1675+
log_trace(os, map)("failed to shm-allocate " UINTX_FORMAT
1676+
" bytes at any address.",
1677+
size);
16581678
}
16591679
}
16601680

@@ -1674,9 +1694,13 @@ static bool release_shmated_memory(char* addr, size_t size) {
16741694

16751695
// TODO: is there a way to verify shm size without doing bookkeeping?
16761696
if (::shmdt(addr) != 0) {
1677-
trcVerbose("error (%d).", errno);
1697+
ErrnoPreserver ep;
1698+
log_trace(os, map)("shmdt failed: " RANGEFMT " errno=(%s)",
1699+
RANGEFMTARGS(addr, size),
1700+
os::strerror(ep.saved_errno()));
16781701
} else {
1679-
trcVerbose("ok.");
1702+
log_trace(os, map)("shmdt succeded: " RANGEFMT,
1703+
RANGEFMTARGS(addr, size));
16801704
rc = true;
16811705
}
16821706
return rc;
@@ -1705,14 +1729,18 @@ static char* reserve_mmaped_memory(size_t bytes, char* requested_addr) {
17051729
bytes, p2i(requested_addr));
17061730

17071731
if (requested_addr && !is_aligned_to(requested_addr, os::vm_page_size()) != 0) {
1708-
trcVerbose("Wish address " PTR_FORMAT " not aligned to page boundary.", p2i(requested_addr));
1732+
log_trace(os, map)("Wish address " PTR_FORMAT
1733+
" not aligned to page boundary.",
1734+
p2i(requested_addr));
17091735
return nullptr;
17101736
}
17111737

17121738
// We must prevent anyone from attaching too close to the
17131739
// BRK because that may cause malloc OOM.
17141740
if (requested_addr != nullptr && is_close_to_brk((address)requested_addr)) {
1715-
trcVerbose("Wish address " PTR_FORMAT " is too close to the BRK segment.", p2i(requested_addr));
1741+
log_trace(os, map)("Wish address " PTR_FORMAT
1742+
" is too close to the BRK segment.",
1743+
p2i(requested_addr));
17161744
// Since we treat an attach to the wrong address as an error later anyway,
17171745
// we return null here
17181746
return nullptr;
@@ -1755,11 +1783,17 @@ static char* reserve_mmaped_memory(size_t bytes, char* requested_addr) {
17551783
PROT_READ|PROT_WRITE|PROT_EXEC, flags, -1, 0);
17561784

17571785
if (addr == MAP_FAILED) {
1758-
trcVerbose("mmap(" PTR_FORMAT ", " UINTX_FORMAT ", ..) failed (%d)", p2i(requested_addr), size, errno);
1786+
ErrnoPreserver ep;
1787+
log_trace(os, map)("mmap failed: " RANGEFMT " errno=(%s)",
1788+
RANGEFMTARGS(requested_addr, size),
1789+
os::strerror(ep.saved_errno()));
17591790
return nullptr;
17601791
} else if (requested_addr != nullptr && addr != requested_addr) {
1761-
trcVerbose("mmap(" PTR_FORMAT ", " UINTX_FORMAT ", ..) succeeded, but at a different address than requested (" PTR_FORMAT "), will unmap",
1762-
p2i(requested_addr), size, p2i(addr));
1792+
log_trace(os, map)("mmap succeeded: " RANGEFMT
1793+
", but at a different address than"
1794+
"requested (" PTR_FORMAT "), will unmap",
1795+
RANGEFMTARGS(requested_addr, size),
1796+
p2i(addr));
17631797
::munmap(addr, extra_size);
17641798
return nullptr;
17651799
}
@@ -1798,10 +1832,14 @@ static bool release_mmaped_memory(char* addr, size_t size) {
17981832
bool rc = false;
17991833

18001834
if (::munmap(addr, size) != 0) {
1801-
trcVerbose("failed (%d)\n", errno);
1835+
ErrnoPreserver ep;
1836+
log_trace(os, map)("munmap failed: " RANGEFMT " errno=(%s)",
1837+
RANGEFMTARGS(addr, size),
1838+
os::strerror(ep.saved_errno()));
18021839
rc = false;
18031840
} else {
1804-
trcVerbose("ok.");
1841+
log_trace(os, map)("munmap succeeded: " RANGEFMT,
1842+
RANGEFMTARGS(addr, size));
18051843
rc = true;
18061844
}
18071845

@@ -1819,10 +1857,14 @@ static bool uncommit_mmaped_memory(char* addr, size_t size) {
18191857

18201858
// Uncommit mmap memory with msync MS_INVALIDATE.
18211859
if (::msync(addr, size, MS_INVALIDATE) != 0) {
1822-
trcVerbose("failed (%d)\n", errno);
1860+
ErrnoPreserver ep;
1861+
log_trace(os, map)("msync failed: " RANGEFMT " errno=(%s)",
1862+
RANGEFMTARGS(addr, size),
1863+
os::strerror(ep.saved_errno()));
18231864
rc = false;
18241865
} else {
1825-
trcVerbose("ok.");
1866+
log_trace(os, map)("msync succeeded: " RANGEFMT,
1867+
RANGEFMTARGS(addr, size));
18261868
rc = true;
18271869
}
18281870

‎src/hotspot/os/bsd/os_bsd.cpp

+75-7
Original file line numberDiff line numberDiff line change
@@ -1604,25 +1604,45 @@ bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
16041604
Events::log(nullptr, "Protecting memory [" INTPTR_FORMAT "," INTPTR_FORMAT "] with protection modes %x", p2i(addr), p2i(addr+size), prot);
16051605
if (::mprotect(addr, size, prot) == 0) {
16061606
return true;
1607+
} else {
1608+
ErrnoPreserver ep;
1609+
log_trace(os, map)("mprotect failed: " RANGEFMT " errno=(%s)",
1610+
RANGEFMTARGS(addr, size),
1611+
os::strerror(ep.saved_errno()));
16071612
}
16081613
#elif defined(__APPLE__)
16091614
if (exec) {
16101615
// Do not replace MAP_JIT mappings, see JDK-8234930
16111616
if (::mprotect(addr, size, prot) == 0) {
16121617
return true;
1618+
} else {
1619+
ErrnoPreserver ep;
1620+
log_trace(os, map)("mprotect failed: " RANGEFMT " errno=(%s)",
1621+
RANGEFMTARGS(addr, size),
1622+
os::strerror(ep.saved_errno()));
16131623
}
16141624
} else {
16151625
uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
16161626
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
16171627
if (res != (uintptr_t) MAP_FAILED) {
16181628
return true;
1629+
} else {
1630+
ErrnoPreserver ep;
1631+
log_trace(os, map)("mmap failed: " RANGEFMT " errno=(%s)",
1632+
RANGEFMTARGS(addr, size),
1633+
os::strerror(ep.saved_errno()));
16191634
}
16201635
}
16211636
#else
16221637
uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
16231638
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
16241639
if (res != (uintptr_t) MAP_FAILED) {
16251640
return true;
1641+
} else {
1642+
ErrnoPreserver ep;
1643+
log_trace(os, map)("mmap failed: " RANGEFMT " errno=(%s)",
1644+
RANGEFMTARGS(addr, size),
1645+
os::strerror(ep.saved_errno()));
16261646
}
16271647
#endif
16281648

@@ -1703,22 +1723,56 @@ bool os::pd_uncommit_memory(char* addr, size_t size, bool exec) {
17031723
#if defined(__OpenBSD__)
17041724
// XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
17051725
Events::log(nullptr, "Protecting memory [" INTPTR_FORMAT "," INTPTR_FORMAT "] with PROT_NONE", p2i(addr), p2i(addr+size));
1706-
return ::mprotect(addr, size, PROT_NONE) == 0;
1726+
if (::mprotect(addr, size, PROT_NONE) == 0) {
1727+
return true;
1728+
} else {
1729+
ErrnoPreserver ep;
1730+
log_trace(os, map)("mprotect failed: " RANGEFMT " errno=(%s)",
1731+
RANGEFMTARGS(addr, size),
1732+
os::strerror(ep.saved_errno()));
1733+
return false;
1734+
}
17071735
#elif defined(__APPLE__)
17081736
if (exec) {
17091737
if (::madvise(addr, size, MADV_FREE) != 0) {
1738+
ErrnoPreserver ep;
1739+
log_trace(os, map)("madvise failed: " RANGEFMT " errno=(%s)",
1740+
RANGEFMTARGS(addr, size),
1741+
os::strerror(ep.saved_errno()));
1742+
return false;
1743+
}
1744+
if (::mprotect(addr, size, PROT_NONE) == 0) {
1745+
return true;
1746+
} else {
1747+
ErrnoPreserver ep;
1748+
log_trace(os, map)("mprotect failed: " RANGEFMT " errno=(%s)",
1749+
RANGEFMTARGS(addr, size),
1750+
os::strerror(ep.saved_errno()));
17101751
return false;
17111752
}
1712-
return ::mprotect(addr, size, PROT_NONE) == 0;
17131753
} else {
17141754
uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
17151755
MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
1716-
return res != (uintptr_t) MAP_FAILED;
1756+
if (res == (uintptr_t) MAP_FAILED) {
1757+
ErrnoPreserver ep;
1758+
log_trace(os, map)("mmap failed: " RANGEFMT " errno=(%s)",
1759+
RANGEFMTARGS(addr, size),
1760+
os::strerror(ep.saved_errno()));
1761+
return false;
1762+
}
1763+
return true;
17171764
}
17181765
#else
17191766
uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
17201767
MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
1721-
return res != (uintptr_t) MAP_FAILED;
1768+
if (res == (uintptr_t) MAP_FAILED) {
1769+
ErrnoPreserver ep;
1770+
log_trace(os, map)("mmap failed: " RANGEFMT " errno=(%s)",
1771+
RANGEFMTARGS(addr, size),
1772+
os::strerror(ep.saved_errno()));
1773+
return false;
1774+
}
1775+
return true;
17221776
#endif
17231777
}
17241778

@@ -1744,12 +1798,26 @@ static char* anon_mmap(char* requested_addr, size_t bytes, bool exec) {
17441798
// touch an uncommitted page. Otherwise, the read/write might
17451799
// succeed if we have enough swap space to back the physical page.
17461800
char* addr = (char*)::mmap(requested_addr, bytes, PROT_NONE, flags, -1, 0);
1747-
1748-
return addr == MAP_FAILED ? nullptr : addr;
1801+
if (addr == MAP_FAILED) {
1802+
ErrnoPreserver ep;
1803+
log_trace(os, map)("mmap failed: " RANGEFMT " errno=(%s)",
1804+
RANGEFMTARGS(requested_addr, bytes),
1805+
os::strerror(ep.saved_errno()));
1806+
return nullptr;
1807+
}
1808+
return addr;
17491809
}
17501810

17511811
static int anon_munmap(char * addr, size_t size) {
1752-
return ::munmap(addr, size) == 0;
1812+
if (::munmap(addr, size) == 0) {
1813+
return 1;
1814+
} else {
1815+
ErrnoPreserver ep;
1816+
log_trace(os, map)("munmap failed: " RANGEFMT " errno=(%s)",
1817+
RANGEFMTARGS(addr, size),
1818+
os::strerror(ep.saved_errno()));
1819+
return 0;
1820+
}
17531821
}
17541822

17551823
char* os::pd_reserve_memory(size_t bytes, bool exec) {

0 commit comments

Comments
 (0)
Please sign in to comment.