changeset 50538:3a5aafb12ae6

8204557: NMT: Linux os::committed_in_range() does not break out outer loop when contiguous region is found Summary: Fixed bug that did not break out outer loop when region was found Reviewed-by: stuefe, adinn
author zgu
date Tue, 12 Jun 2018 11:21:07 -0400
parents 767cdb97f103
children 83fd54252ee4
files src/hotspot/os/linux/os_linux.cpp
diffstat 1 files changed, 9 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/hotspot/os/linux/os_linux.cpp	Tue Jun 12 17:40:28 2018 +0200
+++ b/src/hotspot/os/linux/os_linux.cpp	Tue Jun 12 11:21:07 2018 -0400
@@ -3126,7 +3126,10 @@
 bool os::committed_in_range(address start, size_t size, address& committed_start, size_t& committed_size) {
   int mincore_return_value;
   const size_t stripe = 1024;  // query this many pages each time
-  unsigned char vec[stripe];
+  unsigned char vec[stripe + 1];
+  // set a guard
+  vec[stripe] = 'X';
+
   const size_t page_sz = os::vm_page_size();
   size_t pages = size / page_sz;
 
@@ -3138,7 +3141,9 @@
   int loops = (pages + stripe - 1) / stripe;
   int committed_pages = 0;
   address loop_base = start;
-  for (int index = 0; index < loops; index ++) {
+  bool found_range = false;
+
+  for (int index = 0; index < loops && !found_range; index ++) {
     assert(pages > 0, "Nothing to do");
     int pages_to_query = (pages >= stripe) ? stripe : pages;
     pages -= pages_to_query;
@@ -3153,12 +3158,14 @@
       return false;
     }
 
+    assert(vec[stripe] == 'X', "overflow guard");
     assert(mincore_return_value == 0, "Range must be valid");
     // Process this stripe
     for (int vecIdx = 0; vecIdx < pages_to_query; vecIdx ++) {
       if ((vec[vecIdx] & 0x01) == 0) { // not committed
         // End of current contiguous region
         if (committed_start != NULL) {
+          found_range = true;
           break;
         }
       } else { // committed