1/*
2 * Copyright (c) 2006, 2016, 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 "gc/parallel/mutableNUMASpace.hpp"
27#include "gc/shared/collectedHeap.hpp"
28#include "gc/shared/spaceDecorator.hpp"
29#include "oops/oop.inline.hpp"
30#include "runtime/atomic.hpp"
31#include "runtime/thread.inline.hpp"
32
33MutableNUMASpace::MutableNUMASpace(size_t alignment) : MutableSpace(alignment) {
34  _lgrp_spaces = new (ResourceObj::C_HEAP, mtGC) GrowableArray<LGRPSpace*>(0, true);
35  _page_size = os::vm_page_size();
36  _adaptation_cycles = 0;
37  _samples_count = 0;
38  update_layout(true);
39}
40
41MutableNUMASpace::~MutableNUMASpace() {
42  for (int i = 0; i < lgrp_spaces()->length(); i++) {
43    delete lgrp_spaces()->at(i);
44  }
45  delete lgrp_spaces();
46}
47
48#ifndef PRODUCT
49void MutableNUMASpace::mangle_unused_area() {
50  // This method should do nothing.
51  // It can be called on a numa space during a full compaction.
52}
53void MutableNUMASpace::mangle_unused_area_complete() {
54  // This method should do nothing.
55  // It can be called on a numa space during a full compaction.
56}
57void MutableNUMASpace::mangle_region(MemRegion mr) {
58  // This method should do nothing because numa spaces are not mangled.
59}
60void MutableNUMASpace::set_top_for_allocations(HeapWord* v) {
61  assert(false, "Do not mangle MutableNUMASpace's");
62}
63void MutableNUMASpace::set_top_for_allocations() {
64  // This method should do nothing.
65}
66void MutableNUMASpace::check_mangled_unused_area(HeapWord* limit) {
67  // This method should do nothing.
68}
69void MutableNUMASpace::check_mangled_unused_area_complete() {
70  // This method should do nothing.
71}
72#endif  // NOT_PRODUCT
73
74// There may be unallocated holes in the middle chunks
75// that should be filled with dead objects to ensure parsability.
76void MutableNUMASpace::ensure_parsability() {
77  for (int i = 0; i < lgrp_spaces()->length(); i++) {
78    LGRPSpace *ls = lgrp_spaces()->at(i);
79    MutableSpace *s = ls->space();
80    if (s->top() < top()) { // For all spaces preceding the one containing top()
81      if (s->free_in_words() > 0) {
82        intptr_t cur_top = (intptr_t)s->top();
83        size_t words_left_to_fill = pointer_delta(s->end(), s->top());;
84        while (words_left_to_fill > 0) {
85          size_t words_to_fill = MIN2(words_left_to_fill, CollectedHeap::filler_array_max_size());
86          assert(words_to_fill >= CollectedHeap::min_fill_size(),
87                 "Remaining size (" SIZE_FORMAT ") is too small to fill (based on " SIZE_FORMAT " and " SIZE_FORMAT ")",
88                 words_to_fill, words_left_to_fill, CollectedHeap::filler_array_max_size());
89          CollectedHeap::fill_with_object((HeapWord*)cur_top, words_to_fill);
90          if (!os::numa_has_static_binding()) {
91            size_t touched_words = words_to_fill;
92#ifndef ASSERT
93            if (!ZapUnusedHeapArea) {
94              touched_words = MIN2((size_t)align_object_size(typeArrayOopDesc::header_size(T_INT)),
95                touched_words);
96            }
97#endif
98            MemRegion invalid;
99            HeapWord *crossing_start = (HeapWord*)round_to(cur_top, os::vm_page_size());
100            HeapWord *crossing_end = (HeapWord*)round_to(cur_top + touched_words, os::vm_page_size());
101            if (crossing_start != crossing_end) {
102              // If object header crossed a small page boundary we mark the area
103              // as invalid rounding it to a page_size().
104              HeapWord *start = MAX2((HeapWord*)round_down(cur_top, page_size()), s->bottom());
105              HeapWord *end = MIN2((HeapWord*)round_to(cur_top + touched_words, page_size()), s->end());
106              invalid = MemRegion(start, end);
107            }
108
109            ls->add_invalid_region(invalid);
110          }
111          cur_top = cur_top + (words_to_fill * HeapWordSize);
112          words_left_to_fill -= words_to_fill;
113        }
114      }
115    } else {
116      if (!os::numa_has_static_binding()) {
117#ifdef ASSERT
118        MemRegion invalid(s->top(), s->end());
119        ls->add_invalid_region(invalid);
120#else
121        if (ZapUnusedHeapArea) {
122          MemRegion invalid(s->top(), s->end());
123          ls->add_invalid_region(invalid);
124        } else {
125          return;
126        }
127#endif
128      } else {
129          return;
130      }
131    }
132  }
133}
134
135size_t MutableNUMASpace::used_in_words() const {
136  size_t s = 0;
137  for (int i = 0; i < lgrp_spaces()->length(); i++) {
138    s += lgrp_spaces()->at(i)->space()->used_in_words();
139  }
140  return s;
141}
142
143size_t MutableNUMASpace::free_in_words() const {
144  size_t s = 0;
145  for (int i = 0; i < lgrp_spaces()->length(); i++) {
146    s += lgrp_spaces()->at(i)->space()->free_in_words();
147  }
148  return s;
149}
150
151
152size_t MutableNUMASpace::tlab_capacity(Thread *thr) const {
153  guarantee(thr != NULL, "No thread");
154  int lgrp_id = thr->lgrp_id();
155  if (lgrp_id == -1) {
156    // This case can occur after the topology of the system has
157    // changed. Thread can change their location, the new home
158    // group will be determined during the first allocation
159    // attempt. For now we can safely assume that all spaces
160    // have equal size because the whole space will be reinitialized.
161    if (lgrp_spaces()->length() > 0) {
162      return capacity_in_bytes() / lgrp_spaces()->length();
163    } else {
164      assert(false, "There should be at least one locality group");
165      return 0;
166    }
167  }
168  // That's the normal case, where we know the locality group of the thread.
169  int i = lgrp_spaces()->find(&lgrp_id, LGRPSpace::equals);
170  if (i == -1) {
171    return 0;
172  }
173  return lgrp_spaces()->at(i)->space()->capacity_in_bytes();
174}
175
176size_t MutableNUMASpace::tlab_used(Thread *thr) const {
177  // Please see the comments for tlab_capacity().
178  guarantee(thr != NULL, "No thread");
179  int lgrp_id = thr->lgrp_id();
180  if (lgrp_id == -1) {
181    if (lgrp_spaces()->length() > 0) {
182      return (used_in_bytes()) / lgrp_spaces()->length();
183    } else {
184      assert(false, "There should be at least one locality group");
185      return 0;
186    }
187  }
188  int i = lgrp_spaces()->find(&lgrp_id, LGRPSpace::equals);
189  if (i == -1) {
190    return 0;
191  }
192  return lgrp_spaces()->at(i)->space()->used_in_bytes();
193}
194
195
196size_t MutableNUMASpace::unsafe_max_tlab_alloc(Thread *thr) const {
197  // Please see the comments for tlab_capacity().
198  guarantee(thr != NULL, "No thread");
199  int lgrp_id = thr->lgrp_id();
200  if (lgrp_id == -1) {
201    if (lgrp_spaces()->length() > 0) {
202      return free_in_bytes() / lgrp_spaces()->length();
203    } else {
204      assert(false, "There should be at least one locality group");
205      return 0;
206    }
207  }
208  int i = lgrp_spaces()->find(&lgrp_id, LGRPSpace::equals);
209  if (i == -1) {
210    return 0;
211  }
212  return lgrp_spaces()->at(i)->space()->free_in_bytes();
213}
214
215
216size_t MutableNUMASpace::capacity_in_words(Thread* thr) const {
217  guarantee(thr != NULL, "No thread");
218  int lgrp_id = thr->lgrp_id();
219  if (lgrp_id == -1) {
220    if (lgrp_spaces()->length() > 0) {
221      return capacity_in_words() / lgrp_spaces()->length();
222    } else {
223      assert(false, "There should be at least one locality group");
224      return 0;
225    }
226  }
227  int i = lgrp_spaces()->find(&lgrp_id, LGRPSpace::equals);
228  if (i == -1) {
229    return 0;
230  }
231  return lgrp_spaces()->at(i)->space()->capacity_in_words();
232}
233
234// Check if the NUMA topology has changed. Add and remove spaces if needed.
235// The update can be forced by setting the force parameter equal to true.
236bool MutableNUMASpace::update_layout(bool force) {
237  // Check if the topology had changed.
238  bool changed = os::numa_topology_changed();
239  if (force || changed) {
240    // Compute lgrp intersection. Add/remove spaces.
241    int lgrp_limit = (int)os::numa_get_groups_num();
242    int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit, mtGC);
243    int lgrp_num = (int)os::numa_get_leaf_groups(lgrp_ids, lgrp_limit);
244    assert(lgrp_num > 0, "There should be at least one locality group");
245    // Add new spaces for the new nodes
246    for (int i = 0; i < lgrp_num; i++) {
247      bool found = false;
248      for (int j = 0; j < lgrp_spaces()->length(); j++) {
249        if (lgrp_spaces()->at(j)->lgrp_id() == lgrp_ids[i]) {
250          found = true;
251          break;
252        }
253      }
254      if (!found) {
255        lgrp_spaces()->append(new LGRPSpace(lgrp_ids[i], alignment()));
256      }
257    }
258
259    // Remove spaces for the removed nodes.
260    for (int i = 0; i < lgrp_spaces()->length();) {
261      bool found = false;
262      for (int j = 0; j < lgrp_num; j++) {
263        if (lgrp_spaces()->at(i)->lgrp_id() == lgrp_ids[j]) {
264          found = true;
265          break;
266        }
267      }
268      if (!found) {
269        delete lgrp_spaces()->at(i);
270        lgrp_spaces()->remove_at(i);
271      } else {
272        i++;
273      }
274    }
275
276    FREE_C_HEAP_ARRAY(int, lgrp_ids);
277
278    if (changed) {
279      for (JavaThread *thread = Threads::first(); thread; thread = thread->next()) {
280        thread->set_lgrp_id(-1);
281      }
282    }
283    return true;
284  }
285  return false;
286}
287
288// Bias region towards the first-touching lgrp. Set the right page sizes.
289void MutableNUMASpace::bias_region(MemRegion mr, int lgrp_id) {
290  HeapWord *start = (HeapWord*)round_to((intptr_t)mr.start(), page_size());
291  HeapWord *end = (HeapWord*)round_down((intptr_t)mr.end(), page_size());
292  if (end > start) {
293    MemRegion aligned_region(start, end);
294    assert((intptr_t)aligned_region.start()     % page_size() == 0 &&
295           (intptr_t)aligned_region.byte_size() % page_size() == 0, "Bad alignment");
296    assert(region().contains(aligned_region), "Sanity");
297    // First we tell the OS which page size we want in the given range. The underlying
298    // large page can be broken down if we require small pages.
299    os::realign_memory((char*)aligned_region.start(), aligned_region.byte_size(), page_size());
300    // Then we uncommit the pages in the range.
301    os::free_memory((char*)aligned_region.start(), aligned_region.byte_size(), page_size());
302    // And make them local/first-touch biased.
303    os::numa_make_local((char*)aligned_region.start(), aligned_region.byte_size(), lgrp_id);
304  }
305}
306
307// Free all pages in the region.
308void MutableNUMASpace::free_region(MemRegion mr) {
309  HeapWord *start = (HeapWord*)round_to((intptr_t)mr.start(), page_size());
310  HeapWord *end = (HeapWord*)round_down((intptr_t)mr.end(), page_size());
311  if (end > start) {
312    MemRegion aligned_region(start, end);
313    assert((intptr_t)aligned_region.start()     % page_size() == 0 &&
314           (intptr_t)aligned_region.byte_size() % page_size() == 0, "Bad alignment");
315    assert(region().contains(aligned_region), "Sanity");
316    os::free_memory((char*)aligned_region.start(), aligned_region.byte_size(), page_size());
317  }
318}
319
320// Update space layout. Perform adaptation.
321void MutableNUMASpace::update() {
322  if (update_layout(false)) {
323    // If the topology has changed, make all chunks zero-sized.
324    // And clear the alloc-rate statistics.
325    // In future we may want to handle this more gracefully in order
326    // to avoid the reallocation of the pages as much as possible.
327    for (int i = 0; i < lgrp_spaces()->length(); i++) {
328      LGRPSpace *ls = lgrp_spaces()->at(i);
329      MutableSpace *s = ls->space();
330      s->set_end(s->bottom());
331      s->set_top(s->bottom());
332      ls->clear_alloc_rate();
333    }
334    // A NUMA space is never mangled
335    initialize(region(),
336               SpaceDecorator::Clear,
337               SpaceDecorator::DontMangle);
338  } else {
339    bool should_initialize = false;
340    if (!os::numa_has_static_binding()) {
341      for (int i = 0; i < lgrp_spaces()->length(); i++) {
342        if (!lgrp_spaces()->at(i)->invalid_region().is_empty()) {
343          should_initialize = true;
344          break;
345        }
346      }
347    }
348
349    if (should_initialize ||
350        (UseAdaptiveNUMAChunkSizing && adaptation_cycles() < samples_count())) {
351      // A NUMA space is never mangled
352      initialize(region(),
353                 SpaceDecorator::Clear,
354                 SpaceDecorator::DontMangle);
355    }
356  }
357
358  if (NUMAStats) {
359    for (int i = 0; i < lgrp_spaces()->length(); i++) {
360      lgrp_spaces()->at(i)->accumulate_statistics(page_size());
361    }
362  }
363
364  scan_pages(NUMAPageScanRate);
365}
366
367// Scan pages. Free pages that have smaller size or wrong placement.
368void MutableNUMASpace::scan_pages(size_t page_count)
369{
370  size_t pages_per_chunk = page_count / lgrp_spaces()->length();
371  if (pages_per_chunk > 0) {
372    for (int i = 0; i < lgrp_spaces()->length(); i++) {
373      LGRPSpace *ls = lgrp_spaces()->at(i);
374      ls->scan_pages(page_size(), pages_per_chunk);
375    }
376  }
377}
378
379// Accumulate statistics about the allocation rate of each lgrp.
380void MutableNUMASpace::accumulate_statistics() {
381  if (UseAdaptiveNUMAChunkSizing) {
382    for (int i = 0; i < lgrp_spaces()->length(); i++) {
383      lgrp_spaces()->at(i)->sample();
384    }
385    increment_samples_count();
386  }
387
388  if (NUMAStats) {
389    for (int i = 0; i < lgrp_spaces()->length(); i++) {
390      lgrp_spaces()->at(i)->accumulate_statistics(page_size());
391    }
392  }
393}
394
395// Get the current size of a chunk.
396// This function computes the size of the chunk based on the
397// difference between chunk ends. This allows it to work correctly in
398// case the whole space is resized and during the process of adaptive
399// chunk resizing.
400size_t MutableNUMASpace::current_chunk_size(int i) {
401  HeapWord *cur_end, *prev_end;
402  if (i == 0) {
403    prev_end = bottom();
404  } else {
405    prev_end = lgrp_spaces()->at(i - 1)->space()->end();
406  }
407  if (i == lgrp_spaces()->length() - 1) {
408    cur_end = end();
409  } else {
410    cur_end = lgrp_spaces()->at(i)->space()->end();
411  }
412  if (cur_end > prev_end) {
413    return pointer_delta(cur_end, prev_end, sizeof(char));
414  }
415  return 0;
416}
417
418// Return the default chunk size by equally diving the space.
419// page_size() aligned.
420size_t MutableNUMASpace::default_chunk_size() {
421  return base_space_size() / lgrp_spaces()->length() * page_size();
422}
423
424// Produce a new chunk size. page_size() aligned.
425// This function is expected to be called on sequence of i's from 0 to
426// lgrp_spaces()->length().
427size_t MutableNUMASpace::adaptive_chunk_size(int i, size_t limit) {
428  size_t pages_available = base_space_size();
429  for (int j = 0; j < i; j++) {
430    pages_available -= round_down(current_chunk_size(j), page_size()) / page_size();
431  }
432  pages_available -= lgrp_spaces()->length() - i - 1;
433  assert(pages_available > 0, "No pages left");
434  float alloc_rate = 0;
435  for (int j = i; j < lgrp_spaces()->length(); j++) {
436    alloc_rate += lgrp_spaces()->at(j)->alloc_rate()->average();
437  }
438  size_t chunk_size = 0;
439  if (alloc_rate > 0) {
440    LGRPSpace *ls = lgrp_spaces()->at(i);
441    chunk_size = (size_t)(ls->alloc_rate()->average() / alloc_rate * pages_available) * page_size();
442  }
443  chunk_size = MAX2(chunk_size, page_size());
444
445  if (limit > 0) {
446    limit = round_down(limit, page_size());
447    if (chunk_size > current_chunk_size(i)) {
448      size_t upper_bound = pages_available * page_size();
449      if (upper_bound > limit &&
450          current_chunk_size(i) < upper_bound - limit) {
451        // The resulting upper bound should not exceed the available
452        // amount of memory (pages_available * page_size()).
453        upper_bound = current_chunk_size(i) + limit;
454      }
455      chunk_size = MIN2(chunk_size, upper_bound);
456    } else {
457      size_t lower_bound = page_size();
458      if (current_chunk_size(i) > limit) { // lower_bound shouldn't underflow.
459        lower_bound = current_chunk_size(i) - limit;
460      }
461      chunk_size = MAX2(chunk_size, lower_bound);
462    }
463  }
464  assert(chunk_size <= pages_available * page_size(), "Chunk size out of range");
465  return chunk_size;
466}
467
468
469// Return the bottom_region and the top_region. Align them to page_size() boundary.
470// |------------------new_region---------------------------------|
471// |----bottom_region--|---intersection---|------top_region------|
472void MutableNUMASpace::select_tails(MemRegion new_region, MemRegion intersection,
473                                    MemRegion* bottom_region, MemRegion *top_region) {
474  // Is there bottom?
475  if (new_region.start() < intersection.start()) { // Yes
476    // Try to coalesce small pages into a large one.
477    if (UseLargePages && page_size() >= alignment()) {
478      HeapWord* p = (HeapWord*)round_to((intptr_t) intersection.start(), alignment());
479      if (new_region.contains(p)
480          && pointer_delta(p, new_region.start(), sizeof(char)) >= alignment()) {
481        if (intersection.contains(p)) {
482          intersection = MemRegion(p, intersection.end());
483        } else {
484          intersection = MemRegion(p, p);
485        }
486      }
487    }
488    *bottom_region = MemRegion(new_region.start(), intersection.start());
489  } else {
490    *bottom_region = MemRegion();
491  }
492
493  // Is there top?
494  if (intersection.end() < new_region.end()) { // Yes
495    // Try to coalesce small pages into a large one.
496    if (UseLargePages && page_size() >= alignment()) {
497      HeapWord* p = (HeapWord*)round_down((intptr_t) intersection.end(), alignment());
498      if (new_region.contains(p)
499          && pointer_delta(new_region.end(), p, sizeof(char)) >= alignment()) {
500        if (intersection.contains(p)) {
501          intersection = MemRegion(intersection.start(), p);
502        } else {
503          intersection = MemRegion(p, p);
504        }
505      }
506    }
507    *top_region = MemRegion(intersection.end(), new_region.end());
508  } else {
509    *top_region = MemRegion();
510  }
511}
512
513// Try to merge the invalid region with the bottom or top region by decreasing
514// the intersection area. Return the invalid_region aligned to the page_size()
515// boundary if it's inside the intersection. Return non-empty invalid_region
516// if it lies inside the intersection (also page-aligned).
517// |------------------new_region---------------------------------|
518// |----------------|-------invalid---|--------------------------|
519// |----bottom_region--|---intersection---|------top_region------|
520void MutableNUMASpace::merge_regions(MemRegion new_region, MemRegion* intersection,
521                                     MemRegion *invalid_region) {
522  if (intersection->start() >= invalid_region->start() && intersection->contains(invalid_region->end())) {
523    *intersection = MemRegion(invalid_region->end(), intersection->end());
524    *invalid_region = MemRegion();
525  } else
526    if (intersection->end() <= invalid_region->end() && intersection->contains(invalid_region->start())) {
527      *intersection = MemRegion(intersection->start(), invalid_region->start());
528      *invalid_region = MemRegion();
529    } else
530      if (intersection->equals(*invalid_region) || invalid_region->contains(*intersection)) {
531        *intersection = MemRegion(new_region.start(), new_region.start());
532        *invalid_region = MemRegion();
533      } else
534        if (intersection->contains(invalid_region)) {
535            // That's the only case we have to make an additional bias_region() call.
536            HeapWord* start = invalid_region->start();
537            HeapWord* end = invalid_region->end();
538            if (UseLargePages && page_size() >= alignment()) {
539              HeapWord *p = (HeapWord*)round_down((intptr_t) start, alignment());
540              if (new_region.contains(p)) {
541                start = p;
542              }
543              p = (HeapWord*)round_to((intptr_t) end, alignment());
544              if (new_region.contains(end)) {
545                end = p;
546              }
547            }
548            if (intersection->start() > start) {
549              *intersection = MemRegion(start, intersection->end());
550            }
551            if (intersection->end() < end) {
552              *intersection = MemRegion(intersection->start(), end);
553            }
554            *invalid_region = MemRegion(start, end);
555        }
556}
557
558void MutableNUMASpace::initialize(MemRegion mr,
559                                  bool clear_space,
560                                  bool mangle_space,
561                                  bool setup_pages) {
562  assert(clear_space, "Reallocation will destroy data!");
563  assert(lgrp_spaces()->length() > 0, "There should be at least one space");
564
565  MemRegion old_region = region(), new_region;
566  set_bottom(mr.start());
567  set_end(mr.end());
568  // Must always clear the space
569  clear(SpaceDecorator::DontMangle);
570
571  // Compute chunk sizes
572  size_t prev_page_size = page_size();
573  set_page_size(UseLargePages ? alignment() : os::vm_page_size());
574  HeapWord* rounded_bottom = (HeapWord*)round_to((intptr_t) bottom(), page_size());
575  HeapWord* rounded_end = (HeapWord*)round_down((intptr_t) end(), page_size());
576  size_t base_space_size_pages = pointer_delta(rounded_end, rounded_bottom, sizeof(char)) / page_size();
577
578  // Try small pages if the chunk size is too small
579  if (base_space_size_pages / lgrp_spaces()->length() == 0
580      && page_size() > (size_t)os::vm_page_size()) {
581    set_page_size(os::vm_page_size());
582    rounded_bottom = (HeapWord*)round_to((intptr_t) bottom(), page_size());
583    rounded_end = (HeapWord*)round_down((intptr_t) end(), page_size());
584    base_space_size_pages = pointer_delta(rounded_end, rounded_bottom, sizeof(char)) / page_size();
585  }
586  guarantee(base_space_size_pages / lgrp_spaces()->length() > 0, "Space too small");
587  set_base_space_size(base_space_size_pages);
588
589  // Handle space resize
590  MemRegion top_region, bottom_region;
591  if (!old_region.equals(region())) {
592    new_region = MemRegion(rounded_bottom, rounded_end);
593    MemRegion intersection = new_region.intersection(old_region);
594    if (intersection.start() == NULL ||
595        intersection.end() == NULL   ||
596        prev_page_size > page_size()) { // If the page size got smaller we have to change
597                                        // the page size preference for the whole space.
598      intersection = MemRegion(new_region.start(), new_region.start());
599    }
600    select_tails(new_region, intersection, &bottom_region, &top_region);
601    bias_region(bottom_region, lgrp_spaces()->at(0)->lgrp_id());
602    bias_region(top_region, lgrp_spaces()->at(lgrp_spaces()->length() - 1)->lgrp_id());
603  }
604
605  // Check if the space layout has changed significantly?
606  // This happens when the space has been resized so that either head or tail
607  // chunk became less than a page.
608  bool layout_valid = UseAdaptiveNUMAChunkSizing          &&
609                      current_chunk_size(0) > page_size() &&
610                      current_chunk_size(lgrp_spaces()->length() - 1) > page_size();
611
612
613  for (int i = 0; i < lgrp_spaces()->length(); i++) {
614    LGRPSpace *ls = lgrp_spaces()->at(i);
615    MutableSpace *s = ls->space();
616    old_region = s->region();
617
618    size_t chunk_byte_size = 0, old_chunk_byte_size = 0;
619    if (i < lgrp_spaces()->length() - 1) {
620      if (!UseAdaptiveNUMAChunkSizing                                ||
621          (UseAdaptiveNUMAChunkSizing && NUMAChunkResizeWeight == 0) ||
622           samples_count() < AdaptiveSizePolicyReadyThreshold) {
623        // No adaptation. Divide the space equally.
624        chunk_byte_size = default_chunk_size();
625      } else
626        if (!layout_valid || NUMASpaceResizeRate == 0) {
627          // Fast adaptation. If no space resize rate is set, resize
628          // the chunks instantly.
629          chunk_byte_size = adaptive_chunk_size(i, 0);
630        } else {
631          // Slow adaptation. Resize the chunks moving no more than
632          // NUMASpaceResizeRate bytes per collection.
633          size_t limit = NUMASpaceResizeRate /
634                         (lgrp_spaces()->length() * (lgrp_spaces()->length() + 1) / 2);
635          chunk_byte_size = adaptive_chunk_size(i, MAX2(limit * (i + 1), page_size()));
636        }
637
638      assert(chunk_byte_size >= page_size(), "Chunk size too small");
639      assert(chunk_byte_size <= capacity_in_bytes(), "Sanity check");
640    }
641
642    if (i == 0) { // Bottom chunk
643      if (i != lgrp_spaces()->length() - 1) {
644        new_region = MemRegion(bottom(), rounded_bottom + (chunk_byte_size >> LogHeapWordSize));
645      } else {
646        new_region = MemRegion(bottom(), end());
647      }
648    } else
649      if (i < lgrp_spaces()->length() - 1) { // Middle chunks
650        MutableSpace *ps = lgrp_spaces()->at(i - 1)->space();
651        new_region = MemRegion(ps->end(),
652                               ps->end() + (chunk_byte_size >> LogHeapWordSize));
653      } else { // Top chunk
654        MutableSpace *ps = lgrp_spaces()->at(i - 1)->space();
655        new_region = MemRegion(ps->end(), end());
656      }
657    guarantee(region().contains(new_region), "Region invariant");
658
659
660    // The general case:
661    // |---------------------|--invalid---|--------------------------|
662    // |------------------new_region---------------------------------|
663    // |----bottom_region--|---intersection---|------top_region------|
664    //                     |----old_region----|
665    // The intersection part has all pages in place we don't need to migrate them.
666    // Pages for the top and bottom part should be freed and then reallocated.
667
668    MemRegion intersection = old_region.intersection(new_region);
669
670    if (intersection.start() == NULL || intersection.end() == NULL) {
671      intersection = MemRegion(new_region.start(), new_region.start());
672    }
673
674    if (!os::numa_has_static_binding()) {
675      MemRegion invalid_region = ls->invalid_region().intersection(new_region);
676      // Invalid region is a range of memory that could've possibly
677      // been allocated on the other node. That's relevant only on Solaris where
678      // there is no static memory binding.
679      if (!invalid_region.is_empty()) {
680        merge_regions(new_region, &intersection, &invalid_region);
681        free_region(invalid_region);
682        ls->set_invalid_region(MemRegion());
683      }
684    }
685
686    select_tails(new_region, intersection, &bottom_region, &top_region);
687
688    if (!os::numa_has_static_binding()) {
689      // If that's a system with the first-touch policy then it's enough
690      // to free the pages.
691      free_region(bottom_region);
692      free_region(top_region);
693    } else {
694      // In a system with static binding we have to change the bias whenever
695      // we reshape the heap.
696      bias_region(bottom_region, ls->lgrp_id());
697      bias_region(top_region, ls->lgrp_id());
698    }
699
700    // Clear space (set top = bottom) but never mangle.
701    s->initialize(new_region, SpaceDecorator::Clear, SpaceDecorator::DontMangle, MutableSpace::DontSetupPages);
702
703    set_adaptation_cycles(samples_count());
704  }
705}
706
707// Set the top of the whole space.
708// Mark the the holes in chunks below the top() as invalid.
709void MutableNUMASpace::set_top(HeapWord* value) {
710  bool found_top = false;
711  for (int i = 0; i < lgrp_spaces()->length();) {
712    LGRPSpace *ls = lgrp_spaces()->at(i);
713    MutableSpace *s = ls->space();
714    HeapWord *top = MAX2((HeapWord*)round_down((intptr_t)s->top(), page_size()), s->bottom());
715
716    if (s->contains(value)) {
717      // Check if setting the chunk's top to a given value would create a hole less than
718      // a minimal object; assuming that's not the last chunk in which case we don't care.
719      if (i < lgrp_spaces()->length() - 1) {
720        size_t remainder = pointer_delta(s->end(), value);
721        const size_t min_fill_size = CollectedHeap::min_fill_size();
722        if (remainder < min_fill_size && remainder > 0) {
723          // Add a minimum size filler object; it will cross the chunk boundary.
724          CollectedHeap::fill_with_object(value, min_fill_size);
725          value += min_fill_size;
726          assert(!s->contains(value), "Should be in the next chunk");
727          // Restart the loop from the same chunk, since the value has moved
728          // to the next one.
729          continue;
730        }
731      }
732
733      if (!os::numa_has_static_binding() && top < value && top < s->end()) {
734        ls->add_invalid_region(MemRegion(top, value));
735      }
736      s->set_top(value);
737      found_top = true;
738    } else {
739        if (found_top) {
740            s->set_top(s->bottom());
741        } else {
742          if (!os::numa_has_static_binding() && top < s->end()) {
743            ls->add_invalid_region(MemRegion(top, s->end()));
744          }
745          s->set_top(s->end());
746        }
747    }
748    i++;
749  }
750  MutableSpace::set_top(value);
751}
752
753void MutableNUMASpace::clear(bool mangle_space) {
754  MutableSpace::set_top(bottom());
755  for (int i = 0; i < lgrp_spaces()->length(); i++) {
756    // Never mangle NUMA spaces because the mangling will
757    // bind the memory to a possibly unwanted lgroup.
758    lgrp_spaces()->at(i)->space()->clear(SpaceDecorator::DontMangle);
759  }
760}
761
762/*
763   Linux supports static memory binding, therefore the most part of the
764   logic dealing with the possible invalid page allocation is effectively
765   disabled. Besides there is no notion of the home node in Linux. A
766   thread is allowed to migrate freely. Although the scheduler is rather
767   reluctant to move threads between the nodes. We check for the current
768   node every allocation. And with a high probability a thread stays on
769   the same node for some time allowing local access to recently allocated
770   objects.
771 */
772
773HeapWord* MutableNUMASpace::allocate(size_t size) {
774  Thread* thr = Thread::current();
775  int lgrp_id = thr->lgrp_id();
776  if (lgrp_id == -1 || !os::numa_has_group_homing()) {
777    lgrp_id = os::numa_get_group_id();
778    thr->set_lgrp_id(lgrp_id);
779  }
780
781  int i = lgrp_spaces()->find(&lgrp_id, LGRPSpace::equals);
782
783  // It is possible that a new CPU has been hotplugged and
784  // we haven't reshaped the space accordingly.
785  if (i == -1) {
786    i = os::random() % lgrp_spaces()->length();
787  }
788
789  LGRPSpace* ls = lgrp_spaces()->at(i);
790  MutableSpace *s = ls->space();
791  HeapWord *p = s->allocate(size);
792
793  if (p != NULL) {
794    size_t remainder = s->free_in_words();
795    if (remainder < CollectedHeap::min_fill_size() && remainder > 0) {
796      s->set_top(s->top() - size);
797      p = NULL;
798    }
799  }
800  if (p != NULL) {
801    if (top() < s->top()) { // Keep _top updated.
802      MutableSpace::set_top(s->top());
803    }
804  }
805  // Make the page allocation happen here if there is no static binding..
806  if (p != NULL && !os::numa_has_static_binding()) {
807    for (HeapWord *i = p; i < p + size; i += os::vm_page_size() >> LogHeapWordSize) {
808      *(int*)i = 0;
809    }
810  }
811  if (p == NULL) {
812    ls->set_allocation_failed();
813  }
814  return p;
815}
816
817// This version is lock-free.
818HeapWord* MutableNUMASpace::cas_allocate(size_t size) {
819  Thread* thr = Thread::current();
820  int lgrp_id = thr->lgrp_id();
821  if (lgrp_id == -1 || !os::numa_has_group_homing()) {
822    lgrp_id = os::numa_get_group_id();
823    thr->set_lgrp_id(lgrp_id);
824  }
825
826  int i = lgrp_spaces()->find(&lgrp_id, LGRPSpace::equals);
827  // It is possible that a new CPU has been hotplugged and
828  // we haven't reshaped the space accordingly.
829  if (i == -1) {
830    i = os::random() % lgrp_spaces()->length();
831  }
832  LGRPSpace *ls = lgrp_spaces()->at(i);
833  MutableSpace *s = ls->space();
834  HeapWord *p = s->cas_allocate(size);
835  if (p != NULL) {
836    size_t remainder = pointer_delta(s->end(), p + size);
837    if (remainder < CollectedHeap::min_fill_size() && remainder > 0) {
838      if (s->cas_deallocate(p, size)) {
839        // We were the last to allocate and created a fragment less than
840        // a minimal object.
841        p = NULL;
842      } else {
843        guarantee(false, "Deallocation should always succeed");
844      }
845    }
846  }
847  if (p != NULL) {
848    HeapWord* cur_top, *cur_chunk_top = p + size;
849    while ((cur_top = top()) < cur_chunk_top) { // Keep _top updated.
850      if (Atomic::cmpxchg_ptr(cur_chunk_top, top_addr(), cur_top) == cur_top) {
851        break;
852      }
853    }
854  }
855
856  // Make the page allocation happen here if there is no static binding.
857  if (p != NULL && !os::numa_has_static_binding() ) {
858    for (HeapWord *i = p; i < p + size; i += os::vm_page_size() >> LogHeapWordSize) {
859      *(int*)i = 0;
860    }
861  }
862  if (p == NULL) {
863    ls->set_allocation_failed();
864  }
865  return p;
866}
867
868void MutableNUMASpace::print_short_on(outputStream* st) const {
869  MutableSpace::print_short_on(st);
870  st->print(" (");
871  for (int i = 0; i < lgrp_spaces()->length(); i++) {
872    st->print("lgrp %d: ", lgrp_spaces()->at(i)->lgrp_id());
873    lgrp_spaces()->at(i)->space()->print_short_on(st);
874    if (i < lgrp_spaces()->length() - 1) {
875      st->print(", ");
876    }
877  }
878  st->print(")");
879}
880
881void MutableNUMASpace::print_on(outputStream* st) const {
882  MutableSpace::print_on(st);
883  for (int i = 0; i < lgrp_spaces()->length(); i++) {
884    LGRPSpace *ls = lgrp_spaces()->at(i);
885    st->print("    lgrp %d", ls->lgrp_id());
886    ls->space()->print_on(st);
887    if (NUMAStats) {
888      for (int i = 0; i < lgrp_spaces()->length(); i++) {
889        lgrp_spaces()->at(i)->accumulate_statistics(page_size());
890      }
891      st->print("    local/remote/unbiased/uncommitted: " SIZE_FORMAT "K/"
892                SIZE_FORMAT "K/" SIZE_FORMAT "K/" SIZE_FORMAT
893                "K, large/small pages: " SIZE_FORMAT "/" SIZE_FORMAT "\n",
894                ls->space_stats()->_local_space / K,
895                ls->space_stats()->_remote_space / K,
896                ls->space_stats()->_unbiased_space / K,
897                ls->space_stats()->_uncommited_space / K,
898                ls->space_stats()->_large_pages,
899                ls->space_stats()->_small_pages);
900    }
901  }
902}
903
904void MutableNUMASpace::verify() {
905  // This can be called after setting an arbitrary value to the space's top,
906  // so an object can cross the chunk boundary. We ensure the parsability
907  // of the space and just walk the objects in linear fashion.
908  ensure_parsability();
909  MutableSpace::verify();
910}
911
912// Scan pages and gather stats about page placement and size.
913void MutableNUMASpace::LGRPSpace::accumulate_statistics(size_t page_size) {
914  clear_space_stats();
915  char *start = (char*)round_to((intptr_t) space()->bottom(), page_size);
916  char* end = (char*)round_down((intptr_t) space()->end(), page_size);
917  if (start < end) {
918    for (char *p = start; p < end;) {
919      os::page_info info;
920      if (os::get_page_info(p, &info)) {
921        if (info.size > 0) {
922          if (info.size > (size_t)os::vm_page_size()) {
923            space_stats()->_large_pages++;
924          } else {
925            space_stats()->_small_pages++;
926          }
927          if (info.lgrp_id == lgrp_id()) {
928            space_stats()->_local_space += info.size;
929          } else {
930            space_stats()->_remote_space += info.size;
931          }
932          p += info.size;
933        } else {
934          p += os::vm_page_size();
935          space_stats()->_uncommited_space += os::vm_page_size();
936        }
937      } else {
938        return;
939      }
940    }
941  }
942  space_stats()->_unbiased_space = pointer_delta(start, space()->bottom(), sizeof(char)) +
943                                   pointer_delta(space()->end(), end, sizeof(char));
944
945}
946
947// Scan page_count pages and verify if they have the right size and right placement.
948// If invalid pages are found they are freed in hope that subsequent reallocation
949// will be more successful.
950void MutableNUMASpace::LGRPSpace::scan_pages(size_t page_size, size_t page_count)
951{
952  char* range_start = (char*)round_to((intptr_t) space()->bottom(), page_size);
953  char* range_end = (char*)round_down((intptr_t) space()->end(), page_size);
954
955  if (range_start > last_page_scanned() || last_page_scanned() >= range_end) {
956    set_last_page_scanned(range_start);
957  }
958
959  char *scan_start = last_page_scanned();
960  char* scan_end = MIN2(scan_start + page_size * page_count, range_end);
961
962  os::page_info page_expected, page_found;
963  page_expected.size = page_size;
964  page_expected.lgrp_id = lgrp_id();
965
966  char *s = scan_start;
967  while (s < scan_end) {
968    char *e = os::scan_pages(s, (char*)scan_end, &page_expected, &page_found);
969    if (e == NULL) {
970      break;
971    }
972    if (e != scan_end) {
973      assert(e < scan_end, "e: " PTR_FORMAT " scan_end: " PTR_FORMAT, p2i(e), p2i(scan_end));
974
975      if ((page_expected.size != page_size || page_expected.lgrp_id != lgrp_id())
976          && page_expected.size != 0) {
977        os::free_memory(s, pointer_delta(e, s, sizeof(char)), page_size);
978      }
979      page_expected = page_found;
980    }
981    s = e;
982  }
983
984  set_last_page_scanned(scan_end);
985}
986