25 |
25 |
26 # include "incls/_precompiled.incl" |
26 # include "incls/_precompiled.incl" |
27 # include "incls/_mutableNUMASpace.cpp.incl" |
27 # include "incls/_mutableNUMASpace.cpp.incl" |
28 |
28 |
29 |
29 |
30 MutableNUMASpace::MutableNUMASpace() { |
30 MutableNUMASpace::MutableNUMASpace(size_t alignment) : MutableSpace(alignment) { |
31 _lgrp_spaces = new (ResourceObj::C_HEAP) GrowableArray<LGRPSpace*>(0, true); |
31 _lgrp_spaces = new (ResourceObj::C_HEAP) GrowableArray<LGRPSpace*>(0, true); |
32 _page_size = os::vm_page_size(); |
32 _page_size = os::vm_page_size(); |
33 _adaptation_cycles = 0; |
33 _adaptation_cycles = 0; |
34 _samples_count = 0; |
34 _samples_count = 0; |
35 update_layout(true); |
35 update_layout(true); |
441 void MutableNUMASpace::select_tails(MemRegion new_region, MemRegion intersection, |
441 void MutableNUMASpace::select_tails(MemRegion new_region, MemRegion intersection, |
442 MemRegion* bottom_region, MemRegion *top_region) { |
442 MemRegion* bottom_region, MemRegion *top_region) { |
443 // Is there bottom? |
443 // Is there bottom? |
444 if (new_region.start() < intersection.start()) { // Yes |
444 if (new_region.start() < intersection.start()) { // Yes |
445 // Try to coalesce small pages into a large one. |
445 // Try to coalesce small pages into a large one. |
446 if (UseLargePages && page_size() >= os::large_page_size()) { |
446 if (UseLargePages && page_size() >= alignment()) { |
447 HeapWord* p = (HeapWord*)round_to((intptr_t) intersection.start(), os::large_page_size()); |
447 HeapWord* p = (HeapWord*)round_to((intptr_t) intersection.start(), alignment()); |
448 if (new_region.contains(p) |
448 if (new_region.contains(p) |
449 && pointer_delta(p, new_region.start(), sizeof(char)) >= os::large_page_size()) { |
449 && pointer_delta(p, new_region.start(), sizeof(char)) >= alignment()) { |
450 if (intersection.contains(p)) { |
450 if (intersection.contains(p)) { |
451 intersection = MemRegion(p, intersection.end()); |
451 intersection = MemRegion(p, intersection.end()); |
452 } else { |
452 } else { |
453 intersection = MemRegion(p, p); |
453 intersection = MemRegion(p, p); |
454 } |
454 } |
460 } |
460 } |
461 |
461 |
462 // Is there top? |
462 // Is there top? |
463 if (intersection.end() < new_region.end()) { // Yes |
463 if (intersection.end() < new_region.end()) { // Yes |
464 // Try to coalesce small pages into a large one. |
464 // Try to coalesce small pages into a large one. |
465 if (UseLargePages && page_size() >= os::large_page_size()) { |
465 if (UseLargePages && page_size() >= alignment()) { |
466 HeapWord* p = (HeapWord*)round_down((intptr_t) intersection.end(), os::large_page_size()); |
466 HeapWord* p = (HeapWord*)round_down((intptr_t) intersection.end(), alignment()); |
467 if (new_region.contains(p) |
467 if (new_region.contains(p) |
468 && pointer_delta(new_region.end(), p, sizeof(char)) >= os::large_page_size()) { |
468 && pointer_delta(new_region.end(), p, sizeof(char)) >= alignment()) { |
469 if (intersection.contains(p)) { |
469 if (intersection.contains(p)) { |
470 intersection = MemRegion(intersection.start(), p); |
470 intersection = MemRegion(intersection.start(), p); |
471 } else { |
471 } else { |
472 intersection = MemRegion(p, p); |
472 intersection = MemRegion(p, p); |
473 } |
473 } |
502 } else |
502 } else |
503 if (intersection->contains(invalid_region)) { |
503 if (intersection->contains(invalid_region)) { |
504 // That's the only case we have to make an additional bias_region() call. |
504 // That's the only case we have to make an additional bias_region() call. |
505 HeapWord* start = invalid_region->start(); |
505 HeapWord* start = invalid_region->start(); |
506 HeapWord* end = invalid_region->end(); |
506 HeapWord* end = invalid_region->end(); |
507 if (UseLargePages && page_size() >= os::large_page_size()) { |
507 if (UseLargePages && page_size() >= alignment()) { |
508 HeapWord *p = (HeapWord*)round_down((intptr_t) start, os::large_page_size()); |
508 HeapWord *p = (HeapWord*)round_down((intptr_t) start, alignment()); |
509 if (new_region.contains(p)) { |
509 if (new_region.contains(p)) { |
510 start = p; |
510 start = p; |
511 } |
511 } |
512 p = (HeapWord*)round_to((intptr_t) end, os::large_page_size()); |
512 p = (HeapWord*)round_to((intptr_t) end, alignment()); |
513 if (new_region.contains(end)) { |
513 if (new_region.contains(end)) { |
514 end = p; |
514 end = p; |
515 } |
515 } |
516 } |
516 } |
517 if (intersection->start() > start) { |
517 if (intersection->start() > start) { |
524 } |
524 } |
525 } |
525 } |
526 |
526 |
527 void MutableNUMASpace::initialize(MemRegion mr, |
527 void MutableNUMASpace::initialize(MemRegion mr, |
528 bool clear_space, |
528 bool clear_space, |
529 bool mangle_space) { |
529 bool mangle_space, |
|
530 bool setup_pages) { |
530 assert(clear_space, "Reallocation will destory data!"); |
531 assert(clear_space, "Reallocation will destory data!"); |
531 assert(lgrp_spaces()->length() > 0, "There should be at least one space"); |
532 assert(lgrp_spaces()->length() > 0, "There should be at least one space"); |
532 |
533 |
533 MemRegion old_region = region(), new_region; |
534 MemRegion old_region = region(), new_region; |
534 set_bottom(mr.start()); |
535 set_bottom(mr.start()); |
536 // Must always clear the space |
537 // Must always clear the space |
537 clear(SpaceDecorator::DontMangle); |
538 clear(SpaceDecorator::DontMangle); |
538 |
539 |
539 // Compute chunk sizes |
540 // Compute chunk sizes |
540 size_t prev_page_size = page_size(); |
541 size_t prev_page_size = page_size(); |
541 set_page_size(UseLargePages ? os::large_page_size() : os::vm_page_size()); |
542 set_page_size(UseLargePages ? alignment() : os::vm_page_size()); |
542 HeapWord* rounded_bottom = (HeapWord*)round_to((intptr_t) bottom(), page_size()); |
543 HeapWord* rounded_bottom = (HeapWord*)round_to((intptr_t) bottom(), page_size()); |
543 HeapWord* rounded_end = (HeapWord*)round_down((intptr_t) end(), page_size()); |
544 HeapWord* rounded_end = (HeapWord*)round_down((intptr_t) end(), page_size()); |
544 size_t base_space_size_pages = pointer_delta(rounded_end, rounded_bottom, sizeof(char)) / page_size(); |
545 size_t base_space_size_pages = pointer_delta(rounded_end, rounded_bottom, sizeof(char)) / page_size(); |
545 |
546 |
546 // Try small pages if the chunk size is too small |
547 // Try small pages if the chunk size is too small |
664 bias_region(bottom_region, ls->lgrp_id()); |
665 bias_region(bottom_region, ls->lgrp_id()); |
665 bias_region(top_region, ls->lgrp_id()); |
666 bias_region(top_region, ls->lgrp_id()); |
666 } |
667 } |
667 |
668 |
668 // Clear space (set top = bottom) but never mangle. |
669 // Clear space (set top = bottom) but never mangle. |
669 s->initialize(new_region, SpaceDecorator::Clear, SpaceDecorator::DontMangle); |
670 s->initialize(new_region, SpaceDecorator::Clear, SpaceDecorator::DontMangle, MutableSpace::DontSetupPages); |
670 |
671 |
671 set_adaptation_cycles(samples_count()); |
672 set_adaptation_cycles(samples_count()); |
672 } |
673 } |
673 } |
674 } |
674 |
675 |