1 /*
   2  * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "memory/allocation.inline.hpp"
  27 #include "memory/cardTableModRefBS.hpp"
  28 #include "memory/cardTableRS.hpp"
  29 #include "memory/sharedHeap.hpp"
  30 #include "memory/space.hpp"
  31 #include "memory/space.inline.hpp"
  32 #include "memory/universe.hpp"
  33 #include "runtime/java.hpp"
  34 #include "runtime/mutexLocker.hpp"
  35 #include "runtime/virtualspace.hpp"
  36 #include "services/memTracker.hpp"
  37 #include "utilities/macros.hpp"
  38 #ifdef COMPILER1
  39 #include "c1/c1_LIR.hpp"
  40 #include "c1/c1_LIRGenerator.hpp"
  41 #endif
  42 
  43 // This kind of "BarrierSet" allows a "CollectedHeap" to detect and
  44 // enumerate ref fields that have been modified (since the last
  45 // enumeration.)
  46 
  47 size_t CardTableModRefBS::cards_required(size_t covered_words)
  48 {
  49   // Add one for a guard card, used to detect errors.
  50   const size_t words = align_size_up(covered_words, card_size_in_words);
  51   return words / card_size_in_words + 1;
  52 }
  53 
  54 size_t CardTableModRefBS::compute_byte_map_size()
  55 {
  56   assert(_guard_index == cards_required(_whole_heap.word_size()) - 1,
  57                                         "unitialized, check declaration order");
  58   assert(_page_size != 0, "unitialized, check declaration order");
  59   const size_t granularity = os::vm_allocation_granularity();
  60   return align_size_up(_guard_index + 1, MAX2(_page_size, granularity));
  61 }
  62 
  63 CardTableModRefBS::CardTableModRefBS(MemRegion whole_heap,
  64                                      int max_covered_regions):
  65   ModRefBarrierSet(max_covered_regions),
  66   _whole_heap(whole_heap),
  67   _guard_index(cards_required(whole_heap.word_size()) - 1),
  68   _last_valid_index(_guard_index - 1),
  69   _page_size(os::vm_page_size()),
  70   _byte_map_size(compute_byte_map_size())
  71 {
  72   _kind = BarrierSet::CardTableModRef;
  73 
  74   HeapWord* low_bound  = _whole_heap.start();
  75   HeapWord* high_bound = _whole_heap.end();
  76   assert((uintptr_t(low_bound)  & (card_size - 1))  == 0, "heap must start at card boundary");
  77   assert((uintptr_t(high_bound) & (card_size - 1))  == 0, "heap must end at card boundary");
  78 
  79   assert(card_size <= 512, "card_size must be less than 512"); // why?
  80 
  81   _covered   = new MemRegion[max_covered_regions];
  82   _committed = new MemRegion[max_covered_regions];
  83   if (_covered == NULL || _committed == NULL) {
  84     vm_exit_during_initialization("couldn't alloc card table covered region set.");
  85   }
  86 
  87   _cur_covered_regions = 0;
  88   const size_t rs_align = _page_size == (size_t) os::vm_page_size() ? 0 :
  89     MAX2(_page_size, (size_t) os::vm_allocation_granularity());
  90   ReservedSpace heap_rs(_byte_map_size, rs_align, false);
  91 
  92   MemTracker::record_virtual_memory_type((address)heap_rs.base(), mtGC);
  93 
  94   os::trace_page_sizes("card table", _guard_index + 1, _guard_index + 1,
  95                        _page_size, heap_rs.base(), heap_rs.size());
  96   if (!heap_rs.is_reserved()) {
  97     vm_exit_during_initialization("Could not reserve enough space for the "
  98                                   "card marking array");
  99   }
 100 
 101   // The assember store_check code will do an unsigned shift of the oop,
 102   // then add it to byte_map_base, i.e.
 103   //
 104   //   _byte_map = byte_map_base + (uintptr_t(low_bound) >> card_shift)
 105   _byte_map = (jbyte*) heap_rs.base();
 106   byte_map_base = _byte_map - (uintptr_t(low_bound) >> card_shift);
 107   assert(byte_for(low_bound) == &_byte_map[0], "Checking start of map");
 108   assert(byte_for(high_bound-1) <= &_byte_map[_last_valid_index], "Checking end of map");
 109 
 110   jbyte* guard_card = &_byte_map[_guard_index];
 111   uintptr_t guard_page = align_size_down((uintptr_t)guard_card, _page_size);
 112   _guard_region = MemRegion((HeapWord*)guard_page, _page_size);
 113   os::commit_memory_or_exit((char*)guard_page, _page_size, _page_size,
 114                             !ExecMem, "card table last card");
 115   *guard_card = last_card;
 116 
 117    _lowest_non_clean =
 118     NEW_C_HEAP_ARRAY(CardArr, max_covered_regions, mtGC);
 119   _lowest_non_clean_chunk_size =
 120     NEW_C_HEAP_ARRAY(size_t, max_covered_regions, mtGC);
 121   _lowest_non_clean_base_chunk_index =
 122     NEW_C_HEAP_ARRAY(uintptr_t, max_covered_regions, mtGC);
 123   _last_LNC_resizing_collection =
 124     NEW_C_HEAP_ARRAY(int, max_covered_regions, mtGC);
 125   if (_lowest_non_clean == NULL
 126       || _lowest_non_clean_chunk_size == NULL
 127       || _lowest_non_clean_base_chunk_index == NULL
 128       || _last_LNC_resizing_collection == NULL)
 129     vm_exit_during_initialization("couldn't allocate an LNC array.");
 130   for (int i = 0; i < max_covered_regions; i++) {
 131     _lowest_non_clean[i] = NULL;
 132     _lowest_non_clean_chunk_size[i] = 0;
 133     _last_LNC_resizing_collection[i] = -1;
 134   }
 135 
 136   if (TraceCardTableModRefBS) {
 137     gclog_or_tty->print_cr("CardTableModRefBS::CardTableModRefBS: ");
 138     gclog_or_tty->print_cr("  "
 139                   "  &_byte_map[0]: " INTPTR_FORMAT
 140                   "  &_byte_map[_last_valid_index]: " INTPTR_FORMAT,
 141                   &_byte_map[0],
 142                   &_byte_map[_last_valid_index]);
 143     gclog_or_tty->print_cr("  "
 144                   "  byte_map_base: " INTPTR_FORMAT,
 145                   byte_map_base);
 146   }
 147 }
 148 
 149 CardTableModRefBS::~CardTableModRefBS() {
 150   if (_covered) {
 151     delete[] _covered;
 152     _covered = NULL;
 153   }
 154   if (_committed) {
 155     delete[] _committed;
 156     _committed = NULL;
 157   }
 158   if (_lowest_non_clean) {
 159     FREE_C_HEAP_ARRAY(CardArr, _lowest_non_clean, mtGC);
 160     _lowest_non_clean = NULL;
 161   }
 162   if (_lowest_non_clean_chunk_size) {
 163     FREE_C_HEAP_ARRAY(size_t, _lowest_non_clean_chunk_size, mtGC);
 164     _lowest_non_clean_chunk_size = NULL;
 165   }
 166   if (_lowest_non_clean_base_chunk_index) {
 167     FREE_C_HEAP_ARRAY(uintptr_t, _lowest_non_clean_base_chunk_index, mtGC);
 168     _lowest_non_clean_base_chunk_index = NULL;
 169   }
 170   if (_last_LNC_resizing_collection) {
 171     FREE_C_HEAP_ARRAY(int, _last_LNC_resizing_collection, mtGC);
 172     _last_LNC_resizing_collection = NULL;
 173   }
 174 }
 175 
 176 int CardTableModRefBS::find_covering_region_by_base(HeapWord* base) {
 177   int i;
 178   for (i = 0; i < _cur_covered_regions; i++) {
 179     if (_covered[i].start() == base) return i;
 180     if (_covered[i].start() > base) break;
 181   }
 182   // If we didn't find it, create a new one.
 183   assert(_cur_covered_regions < _max_covered_regions,
 184          "too many covered regions");
 185   // Move the ones above up, to maintain sorted order.
 186   for (int j = _cur_covered_regions; j > i; j--) {
 187     _covered[j] = _covered[j-1];
 188     _committed[j] = _committed[j-1];
 189   }
 190   int res = i;
 191   _cur_covered_regions++;
 192   _covered[res].set_start(base);
 193   _covered[res].set_word_size(0);
 194   jbyte* ct_start = byte_for(base);
 195   uintptr_t ct_start_aligned = align_size_down((uintptr_t)ct_start, _page_size);
 196   _committed[res].set_start((HeapWord*)ct_start_aligned);
 197   _committed[res].set_word_size(0);
 198   return res;
 199 }
 200 
 201 int CardTableModRefBS::find_covering_region_containing(HeapWord* addr) {
 202   for (int i = 0; i < _cur_covered_regions; i++) {
 203     if (_covered[i].contains(addr)) {
 204       return i;
 205     }
 206   }
 207   assert(0, "address outside of heap?");
 208   return -1;
 209 }
 210 
 211 HeapWord* CardTableModRefBS::largest_prev_committed_end(int ind) const {
 212   HeapWord* max_end = NULL;
 213   for (int j = 0; j < ind; j++) {
 214     HeapWord* this_end = _committed[j].end();
 215     if (this_end > max_end) max_end = this_end;
 216   }
 217   return max_end;
 218 }
 219 
 220 MemRegion CardTableModRefBS::committed_unique_to_self(int self,
 221                                                       MemRegion mr) const {
 222   MemRegion result = mr;
 223   for (int r = 0; r < _cur_covered_regions; r += 1) {
 224     if (r != self) {
 225       result = result.minus(_committed[r]);
 226     }
 227   }
 228   // Never include the guard page.
 229   result = result.minus(_guard_region);
 230   return result;
 231 }
 232 
 233 void CardTableModRefBS::resize_covered_region(MemRegion new_region) {
 234   // We don't change the start of a region, only the end.
 235   assert(_whole_heap.contains(new_region),
 236            "attempt to cover area not in reserved area");
 237   debug_only(verify_guard();)
 238   // collided is true if the expansion would push into another committed region
 239   debug_only(bool collided = false;)
 240   int const ind = find_covering_region_by_base(new_region.start());
 241   MemRegion const old_region = _covered[ind];
 242   assert(old_region.start() == new_region.start(), "just checking");
 243   if (new_region.word_size() != old_region.word_size()) {
 244     // Commit new or uncommit old pages, if necessary.
 245     MemRegion cur_committed = _committed[ind];
 246     // Extend the end of this _commited region
 247     // to cover the end of any lower _committed regions.
 248     // This forms overlapping regions, but never interior regions.
 249     HeapWord* const max_prev_end = largest_prev_committed_end(ind);
 250     if (max_prev_end > cur_committed.end()) {
 251       cur_committed.set_end(max_prev_end);
 252     }
 253     // Align the end up to a page size (starts are already aligned).
 254     jbyte* const new_end = byte_after(new_region.last());
 255     HeapWord* new_end_aligned =
 256       (HeapWord*) align_size_up((uintptr_t)new_end, _page_size);
 257     assert(new_end_aligned >= (HeapWord*) new_end,
 258            "align up, but less");
 259     // Check the other regions (excludes "ind") to ensure that
 260     // the new_end_aligned does not intrude onto the committed
 261     // space of another region.
 262     int ri = 0;
 263     for (ri = 0; ri < _cur_covered_regions; ri++) {
 264       if (ri != ind) {
 265         if (_committed[ri].contains(new_end_aligned)) {
 266           // The prior check included in the assert
 267           // (new_end_aligned >= _committed[ri].start())
 268           // is redundant with the "contains" test.
 269           // Any region containing the new end
 270           // should start at or beyond the region found (ind)
 271           // for the new end (committed regions are not expected to
 272           // be proper subsets of other committed regions).
 273           assert(_committed[ri].start() >= _committed[ind].start(),
 274                  "New end of committed region is inconsistent");
 275           new_end_aligned = _committed[ri].start();
 276           // new_end_aligned can be equal to the start of its
 277           // committed region (i.e., of "ind") if a second
 278           // region following "ind" also start at the same location
 279           // as "ind".
 280           assert(new_end_aligned >= _committed[ind].start(),
 281             "New end of committed region is before start");
 282           debug_only(collided = true;)
 283           // Should only collide with 1 region
 284           break;
 285         }
 286       }
 287     }
 288 #ifdef ASSERT
 289     for (++ri; ri < _cur_covered_regions; ri++) {
 290       assert(!_committed[ri].contains(new_end_aligned),
 291         "New end of committed region is in a second committed region");
 292     }
 293 #endif
 294     // The guard page is always committed and should not be committed over.
 295     // "guarded" is used for assertion checking below and recalls the fact
 296     // that the would-be end of the new committed region would have
 297     // penetrated the guard page.
 298     HeapWord* new_end_for_commit = new_end_aligned;
 299 
 300     DEBUG_ONLY(bool guarded = false;)
 301     if (new_end_for_commit > _guard_region.start()) {
 302       new_end_for_commit = _guard_region.start();
 303       DEBUG_ONLY(guarded = true;)
 304     }
 305 
 306     if (new_end_for_commit > cur_committed.end()) {
 307       // Must commit new pages.
 308       MemRegion const new_committed =
 309         MemRegion(cur_committed.end(), new_end_for_commit);
 310 
 311       assert(!new_committed.is_empty(), "Region should not be empty here");
 312       os::commit_memory_or_exit((char*)new_committed.start(),
 313                                 new_committed.byte_size(), _page_size,
 314                                 !ExecMem, "card table expansion");
 315     // Use new_end_aligned (as opposed to new_end_for_commit) because
 316     // the cur_committed region may include the guard region.
 317     } else if (new_end_aligned < cur_committed.end()) {
 318       // Must uncommit pages.
 319       MemRegion const uncommit_region =
 320         committed_unique_to_self(ind, MemRegion(new_end_aligned,
 321                                                 cur_committed.end()));
 322       if (!uncommit_region.is_empty()) {
 323         // It is not safe to uncommit cards if the boundary between
 324         // the generations is moving.  A shrink can uncommit cards
 325         // owned by generation A but being used by generation B.
 326         if (!UseAdaptiveGCBoundary) {
 327           if (!os::uncommit_memory((char*)uncommit_region.start(),
 328                                    uncommit_region.byte_size())) {
 329             assert(false, "Card table contraction failed");
 330             // The call failed so don't change the end of the
 331             // committed region.  This is better than taking the
 332             // VM down.
 333             new_end_aligned = _committed[ind].end();
 334           }
 335         } else {
 336           new_end_aligned = _committed[ind].end();
 337         }
 338       }
 339     }
 340     // In any case, we can reset the end of the current committed entry.
 341     _committed[ind].set_end(new_end_aligned);
 342 
 343 #ifdef ASSERT
 344     // Check that the last card in the new region is committed according
 345     // to the tables.
 346     bool covered = false;
 347     for (int cr = 0; cr < _cur_covered_regions; cr++) {
 348       if (_committed[cr].contains(new_end - 1)) {
 349         covered = true;
 350         break;
 351       }
 352     }
 353     assert(covered, "Card for end of new region not committed");
 354 #endif
 355 
 356     // The default of 0 is not necessarily clean cards.
 357     jbyte* entry;
 358     if (old_region.last() < _whole_heap.start()) {
 359       entry = byte_for(_whole_heap.start());
 360     } else {
 361       entry = byte_after(old_region.last());
 362     }
 363     assert(index_for(new_region.last()) <  _guard_index,
 364       "The guard card will be overwritten");
 365     // This line commented out cleans the newly expanded region and
 366     // not the aligned up expanded region.
 367     // jbyte* const end = byte_after(new_region.last());
 368     jbyte* const end = (jbyte*) new_end_for_commit;
 369     assert((end >= byte_after(new_region.last())) || collided || guarded,
 370       "Expect to be beyond new region unless impacting another region");
 371     // do nothing if we resized downward.
 372 #ifdef ASSERT
 373     for (int ri = 0; ri < _cur_covered_regions; ri++) {
 374       if (ri != ind) {
 375         // The end of the new committed region should not
 376         // be in any existing region unless it matches
 377         // the start of the next region.
 378         assert(!_committed[ri].contains(end) ||
 379                (_committed[ri].start() == (HeapWord*) end),
 380                "Overlapping committed regions");
 381       }
 382     }
 383 #endif
 384     if (entry < end) {
 385       memset(entry, clean_card, pointer_delta(end, entry, sizeof(jbyte)));
 386     }
 387   }
 388   // In any case, the covered size changes.
 389   _covered[ind].set_word_size(new_region.word_size());
 390   if (TraceCardTableModRefBS) {
 391     gclog_or_tty->print_cr("CardTableModRefBS::resize_covered_region: ");
 392     gclog_or_tty->print_cr("  "
 393                   "  _covered[%d].start(): " INTPTR_FORMAT
 394                   "  _covered[%d].last(): " INTPTR_FORMAT,
 395                   ind, _covered[ind].start(),
 396                   ind, _covered[ind].last());
 397     gclog_or_tty->print_cr("  "
 398                   "  _committed[%d].start(): " INTPTR_FORMAT
 399                   "  _committed[%d].last(): " INTPTR_FORMAT,
 400                   ind, _committed[ind].start(),
 401                   ind, _committed[ind].last());
 402     gclog_or_tty->print_cr("  "
 403                   "  byte_for(start): " INTPTR_FORMAT
 404                   "  byte_for(last): " INTPTR_FORMAT,
 405                   byte_for(_covered[ind].start()),
 406                   byte_for(_covered[ind].last()));
 407     gclog_or_tty->print_cr("  "
 408                   "  addr_for(start): " INTPTR_FORMAT
 409                   "  addr_for(last): " INTPTR_FORMAT,
 410                   addr_for((jbyte*) _committed[ind].start()),
 411                   addr_for((jbyte*) _committed[ind].last()));
 412   }
 413   // Touch the last card of the covered region to show that it
 414   // is committed (or SEGV).
 415   debug_only(*byte_for(_covered[ind].last());)
 416   debug_only(verify_guard();)
 417 }
 418 
 419 // Note that these versions are precise!  The scanning code has to handle the
 420 // fact that the write barrier may be either precise or imprecise.
 421 
 422 void CardTableModRefBS::write_ref_field_work(void* field, oop newVal) {
 423   inline_write_ref_field(field, newVal);
 424 }
 425 
 426 /*
 427    Claimed and deferred bits are used together in G1 during the evacuation
 428    pause. These bits can have the following state transitions:
 429    1. The claimed bit can be put over any other card state. Except that
 430       the "dirty -> dirty and claimed" transition is checked for in
 431       G1 code and is not used.
 432    2. Deferred bit can be set only if the previous state of the card
 433       was either clean or claimed. mark_card_deferred() is wait-free.
 434       We do not care if the operation is be successful because if
 435       it does not it will only result in duplicate entry in the update
 436       buffer because of the "cache-miss". So it's not worth spinning.
 437  */
 438 
 439 
 440 bool CardTableModRefBS::claim_card(size_t card_index) {
 441   jbyte val = _byte_map[card_index];
 442   assert(val != dirty_card_val(), "Shouldn't claim a dirty card");
 443   while (val == clean_card_val() ||
 444          (val & (clean_card_mask_val() | claimed_card_val())) != claimed_card_val()) {
 445     jbyte new_val = val;
 446     if (val == clean_card_val()) {
 447       new_val = (jbyte)claimed_card_val();
 448     } else {
 449       new_val = val | (jbyte)claimed_card_val();
 450     }
 451     jbyte res = Atomic::cmpxchg(new_val, &_byte_map[card_index], val);
 452     if (res == val) {
 453       return true;
 454     }
 455     val = res;
 456   }
 457   return false;
 458 }
 459 
 460 bool CardTableModRefBS::mark_card_deferred(size_t card_index) {
 461   jbyte val = _byte_map[card_index];
 462   // It's already processed
 463   if ((val & (clean_card_mask_val() | deferred_card_val())) == deferred_card_val()) {
 464     return false;
 465   }
 466   // Cached bit can be installed either on a clean card or on a claimed card.
 467   jbyte new_val = val;
 468   if (val == clean_card_val()) {
 469     new_val = (jbyte)deferred_card_val();
 470   } else {
 471     if (val & claimed_card_val()) {
 472       new_val = val | (jbyte)deferred_card_val();
 473     }
 474   }
 475   if (new_val != val) {
 476     Atomic::cmpxchg(new_val, &_byte_map[card_index], val);
 477   }
 478   return true;
 479 }
 480 
 481 void CardTableModRefBS::non_clean_card_iterate_possibly_parallel(Space* sp,
 482                                                                  MemRegion mr,
 483                                                                  OopsInGenClosure* cl,
 484                                                                  CardTableRS* ct) {
 485   if (!mr.is_empty()) {
 486     // Caller (process_strong_roots()) claims that all GC threads
 487     // execute this call.  With UseDynamicNumberOfGCThreads now all
 488     // active GC threads execute this call.  The number of active GC
 489     // threads needs to be passed to par_non_clean_card_iterate_work()
 490     // to get proper partitioning and termination.
 491     //
 492     // This is an example of where n_par_threads() is used instead
 493     // of workers()->active_workers().  n_par_threads can be set to 0 to
 494     // turn off parallelism.  For example when this code is called as
 495     // part of verification and SharedHeap::process_strong_roots() is being
 496     // used, then n_par_threads() may have been set to 0.  active_workers
 497     // is not overloaded with the meaning that it is a switch to disable
 498     // parallelism and so keeps the meaning of the number of
 499     // active gc workers.  If parallelism has not been shut off by
 500     // setting n_par_threads to 0, then n_par_threads should be
 501     // equal to active_workers.  When a different mechanism for shutting
 502     // off parallelism is used, then active_workers can be used in
 503     // place of n_par_threads.
 504     //  This is an example of a path where n_par_threads is
 505     // set to 0 to turn off parallism.
 506     //  [7] CardTableModRefBS::non_clean_card_iterate()
 507     //  [8] CardTableRS::younger_refs_in_space_iterate()
 508     //  [9] Generation::younger_refs_in_space_iterate()
 509     //  [10] OneContigSpaceCardGeneration::younger_refs_iterate()
 510     //  [11] CompactingPermGenGen::younger_refs_iterate()
 511     //  [12] CardTableRS::younger_refs_iterate()
 512     //  [13] SharedHeap::process_strong_roots()
 513     //  [14] G1CollectedHeap::verify()
 514     //  [15] Universe::verify()
 515     //  [16] G1CollectedHeap::do_collection_pause_at_safepoint()
 516     //
 517     int n_threads =  SharedHeap::heap()->n_par_threads();
 518     bool is_par = n_threads > 0;
 519     if (is_par) {
 520 #if INCLUDE_ALL_GCS
 521       assert(SharedHeap::heap()->n_par_threads() ==
 522              SharedHeap::heap()->workers()->active_workers(), "Mismatch");
 523       non_clean_card_iterate_parallel_work(sp, mr, cl, ct, n_threads);
 524 #else  // INCLUDE_ALL_GCS
 525       fatal("Parallel gc not supported here.");
 526 #endif // INCLUDE_ALL_GCS
 527     } else {
 528       // We do not call the non_clean_card_iterate_serial() version below because
 529       // we want to clear the cards (which non_clean_card_iterate_serial() does not
 530       // do for us): clear_cl here does the work of finding contiguous dirty ranges
 531       // of cards to process and clear.
 532 
 533       DirtyCardToOopClosure* dcto_cl = sp->new_dcto_cl(cl, precision(),
 534                                                        cl->gen_boundary());
 535       ClearNoncleanCardWrapper clear_cl(dcto_cl, ct);
 536 
 537       clear_cl.do_MemRegion(mr);
 538     }
 539   }
 540 }
 541 
 542 // The iterator itself is not MT-aware, but
 543 // MT-aware callers and closures can use this to
 544 // accomplish dirty card iteration in parallel. The
 545 // iterator itself does not clear the dirty cards, or
 546 // change their values in any manner.
 547 void CardTableModRefBS::non_clean_card_iterate_serial(MemRegion mr,
 548                                                       MemRegionClosure* cl) {
 549   bool is_par = (SharedHeap::heap()->n_par_threads() > 0);
 550   assert(!is_par ||
 551           (SharedHeap::heap()->n_par_threads() ==
 552           SharedHeap::heap()->workers()->active_workers()), "Mismatch");
 553   for (int i = 0; i < _cur_covered_regions; i++) {
 554     MemRegion mri = mr.intersection(_covered[i]);
 555     if (mri.word_size() > 0) {
 556       jbyte* cur_entry = byte_for(mri.last());
 557       jbyte* limit = byte_for(mri.start());
 558       while (cur_entry >= limit) {
 559         jbyte* next_entry = cur_entry - 1;
 560         if (*cur_entry != clean_card) {
 561           size_t non_clean_cards = 1;
 562           // Should the next card be included in this range of dirty cards.
 563           while (next_entry >= limit && *next_entry != clean_card) {
 564             non_clean_cards++;
 565             cur_entry = next_entry;
 566             next_entry--;
 567           }
 568           // The memory region may not be on a card boundary.  So that
 569           // objects beyond the end of the region are not processed, make
 570           // cur_cards precise with regard to the end of the memory region.
 571           MemRegion cur_cards(addr_for(cur_entry),
 572                               non_clean_cards * card_size_in_words);
 573           MemRegion dirty_region = cur_cards.intersection(mri);
 574           cl->do_MemRegion(dirty_region);
 575         }
 576         cur_entry = next_entry;
 577       }
 578     }
 579   }
 580 }
 581 
 582 void CardTableModRefBS::dirty_MemRegion(MemRegion mr) {
 583   assert((HeapWord*)align_size_down((uintptr_t)mr.start(), HeapWordSize) == mr.start(), "Unaligned start");
 584   assert((HeapWord*)align_size_up  ((uintptr_t)mr.end(),   HeapWordSize) == mr.end(),   "Unaligned end"  );
 585   jbyte* cur  = byte_for(mr.start());
 586   jbyte* last = byte_after(mr.last());
 587   while (cur < last) {
 588     *cur = dirty_card;
 589     cur++;
 590   }
 591 }
 592 
 593 void CardTableModRefBS::invalidate(MemRegion mr, bool whole_heap) {
 594   assert((HeapWord*)align_size_down((uintptr_t)mr.start(), HeapWordSize) == mr.start(), "Unaligned start");
 595   assert((HeapWord*)align_size_up  ((uintptr_t)mr.end(),   HeapWordSize) == mr.end(),   "Unaligned end"  );
 596   for (int i = 0; i < _cur_covered_regions; i++) {
 597     MemRegion mri = mr.intersection(_covered[i]);
 598     if (!mri.is_empty()) dirty_MemRegion(mri);
 599   }
 600 }
 601 
 602 void CardTableModRefBS::clear_MemRegion(MemRegion mr) {
 603   // Be conservative: only clean cards entirely contained within the
 604   // region.
 605   jbyte* cur;
 606   if (mr.start() == _whole_heap.start()) {
 607     cur = byte_for(mr.start());
 608   } else {
 609     assert(mr.start() > _whole_heap.start(), "mr is not covered.");
 610     cur = byte_after(mr.start() - 1);
 611   }
 612   jbyte* last = byte_after(mr.last());
 613   memset(cur, clean_card, pointer_delta(last, cur, sizeof(jbyte)));
 614 }
 615 
 616 void CardTableModRefBS::clear(MemRegion mr) {
 617   for (int i = 0; i < _cur_covered_regions; i++) {
 618     MemRegion mri = mr.intersection(_covered[i]);
 619     if (!mri.is_empty()) clear_MemRegion(mri);
 620   }
 621 }
 622 
 623 void CardTableModRefBS::dirty(MemRegion mr) {
 624   jbyte* first = byte_for(mr.start());
 625   jbyte* last  = byte_after(mr.last());
 626   memset(first, dirty_card, last-first);
 627 }
 628 
 629 // Unlike several other card table methods, dirty_card_iterate()
 630 // iterates over dirty cards ranges in increasing address order.
 631 void CardTableModRefBS::dirty_card_iterate(MemRegion mr,
 632                                            MemRegionClosure* cl) {
 633   for (int i = 0; i < _cur_covered_regions; i++) {
 634     MemRegion mri = mr.intersection(_covered[i]);
 635     if (!mri.is_empty()) {
 636       jbyte *cur_entry, *next_entry, *limit;
 637       for (cur_entry = byte_for(mri.start()), limit = byte_for(mri.last());
 638            cur_entry <= limit;
 639            cur_entry  = next_entry) {
 640         next_entry = cur_entry + 1;
 641         if (*cur_entry == dirty_card) {
 642           size_t dirty_cards;
 643           // Accumulate maximal dirty card range, starting at cur_entry
 644           for (dirty_cards = 1;
 645                next_entry <= limit && *next_entry == dirty_card;
 646                dirty_cards++, next_entry++);
 647           MemRegion cur_cards(addr_for(cur_entry),
 648                               dirty_cards*card_size_in_words);
 649           cl->do_MemRegion(cur_cards);
 650         }
 651       }
 652     }
 653   }
 654 }
 655 
 656 MemRegion CardTableModRefBS::dirty_card_range_after_reset(MemRegion mr,
 657                                                           bool reset,
 658                                                           int reset_val) {
 659   for (int i = 0; i < _cur_covered_regions; i++) {
 660     MemRegion mri = mr.intersection(_covered[i]);
 661     if (!mri.is_empty()) {
 662       jbyte* cur_entry, *next_entry, *limit;
 663       for (cur_entry = byte_for(mri.start()), limit = byte_for(mri.last());
 664            cur_entry <= limit;
 665            cur_entry  = next_entry) {
 666         next_entry = cur_entry + 1;
 667         if (*cur_entry == dirty_card) {
 668           size_t dirty_cards;
 669           // Accumulate maximal dirty card range, starting at cur_entry
 670           for (dirty_cards = 1;
 671                next_entry <= limit && *next_entry == dirty_card;
 672                dirty_cards++, next_entry++);
 673           MemRegion cur_cards(addr_for(cur_entry),
 674                               dirty_cards*card_size_in_words);
 675           if (reset) {
 676             for (size_t i = 0; i < dirty_cards; i++) {
 677               cur_entry[i] = reset_val;
 678             }
 679           }
 680           return cur_cards;
 681         }
 682       }
 683     }
 684   }
 685   return MemRegion(mr.end(), mr.end());
 686 }
 687 
 688 uintx CardTableModRefBS::ct_max_alignment_constraint() {
 689   return card_size * os::vm_page_size();
 690 }
 691 
 692 void CardTableModRefBS::verify_guard() {
 693   // For product build verification
 694   guarantee(_byte_map[_guard_index] == last_card,
 695             "card table guard has been modified");
 696 }
 697 
 698 void CardTableModRefBS::verify() {
 699   verify_guard();
 700 }
 701 
 702 #ifndef PRODUCT
 703 void CardTableModRefBS::verify_region(MemRegion mr,
 704                                       jbyte val, bool val_equals) {
 705   jbyte* start    = byte_for(mr.start());
 706   jbyte* end      = byte_for(mr.last());
 707   bool   failures = false;
 708   for (jbyte* curr = start; curr <= end; ++curr) {
 709     jbyte curr_val = *curr;
 710     bool failed = (val_equals) ? (curr_val != val) : (curr_val == val);
 711     if (failed) {
 712       if (!failures) {
 713         tty->cr();
 714         tty->print_cr("== CT verification failed: ["PTR_FORMAT","PTR_FORMAT"]", start, end);
 715         tty->print_cr("==   %sexpecting value: %d",
 716                       (val_equals) ? "" : "not ", val);
 717         failures = true;
 718       }
 719       tty->print_cr("==   card "PTR_FORMAT" ["PTR_FORMAT","PTR_FORMAT"], "
 720                     "val: %d", curr, addr_for(curr),
 721                     (HeapWord*) (((size_t) addr_for(curr)) + card_size),
 722                     (int) curr_val);
 723     }
 724   }
 725   guarantee(!failures, "there should not have been any failures");
 726 }
 727 
 728 void CardTableModRefBS::verify_not_dirty_region(MemRegion mr) {
 729   verify_region(mr, dirty_card, false /* val_equals */);
 730 }
 731 
 732 void CardTableModRefBS::verify_dirty_region(MemRegion mr) {
 733   verify_region(mr, dirty_card, true /* val_equals */);
 734 }
 735 #endif
 736 
 737 void CardTableModRefBS::print_on(outputStream* st) const {
 738   st->print_cr("Card table byte_map: [" INTPTR_FORMAT "," INTPTR_FORMAT "] byte_map_base: " INTPTR_FORMAT,
 739                _byte_map, _byte_map + _byte_map_size, byte_map_base);
 740 }
 741 
 742 bool CardTableModRefBSForCTRS::card_will_be_scanned(jbyte cv) {
 743   return
 744     CardTableModRefBS::card_will_be_scanned(cv) ||
 745     _rs->is_prev_nonclean_card_val(cv);
 746 };
 747 
 748 bool CardTableModRefBSForCTRS::card_may_have_been_dirty(jbyte cv) {
 749   return
 750     cv != clean_card &&
 751     (CardTableModRefBS::card_may_have_been_dirty(cv) ||
 752      CardTableRS::youngergen_may_have_been_dirty(cv));
 753 };