1.1 --- a/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp Fri Mar 23 10:53:19 2012 -0400 1.2 +++ b/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp Fri Mar 23 15:28:24 2012 +0100 1.3 @@ -1,6 +1,6 @@ 1.4 1.5 /* 1.6 - * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. 1.7 + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. 1.8 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.9 * 1.10 * This code is free software; you can redistribute it and/or modify it 1.11 @@ -91,29 +91,37 @@ 1.12 MutableSpace *s = ls->space(); 1.13 if (s->top() < top()) { // For all spaces preceding the one containing top() 1.14 if (s->free_in_words() > 0) { 1.15 - size_t area_touched_words = pointer_delta(s->end(), s->top()); 1.16 - CollectedHeap::fill_with_object(s->top(), area_touched_words); 1.17 + intptr_t cur_top = (intptr_t)s->top(); 1.18 + size_t words_left_to_fill = pointer_delta(s->end(), s->top());; 1.19 + while (words_left_to_fill > 0) { 1.20 + size_t words_to_fill = MIN2(words_left_to_fill, CollectedHeap::filler_array_max_size()); 1.21 + assert(words_to_fill >= CollectedHeap::min_fill_size(), 1.22 + err_msg("Remaining size ("SIZE_FORMAT ") is too small to fill (based on " SIZE_FORMAT " and " SIZE_FORMAT ")", 1.23 + words_to_fill, words_left_to_fill, CollectedHeap::filler_array_max_size())); 1.24 + CollectedHeap::fill_with_object((HeapWord*)cur_top, words_to_fill); 1.25 + if (!os::numa_has_static_binding()) { 1.26 + size_t touched_words = words_to_fill; 1.27 #ifndef ASSERT 1.28 - if (!ZapUnusedHeapArea) { 1.29 - area_touched_words = MIN2((size_t)align_object_size(typeArrayOopDesc::header_size(T_INT)), 1.30 - area_touched_words); 1.31 - } 1.32 + if (!ZapUnusedHeapArea) { 1.33 + touched_words = MIN2((size_t)align_object_size(typeArrayOopDesc::header_size(T_INT)), 1.34 + touched_words); 1.35 + } 1.36 #endif 1.37 - if (!os::numa_has_static_binding()) { 1.38 - MemRegion invalid; 1.39 - HeapWord *crossing_start = (HeapWord*)round_to((intptr_t)s->top(), os::vm_page_size()); 1.40 - HeapWord *crossing_end = (HeapWord*)round_to((intptr_t)(s->top() + area_touched_words), 1.41 - os::vm_page_size()); 1.42 - if (crossing_start != crossing_end) { 1.43 - // If object header crossed a small page boundary we mark the area 1.44 - // as invalid rounding it to a page_size(). 1.45 - HeapWord *start = MAX2((HeapWord*)round_down((intptr_t)s->top(), page_size()), s->bottom()); 1.46 - HeapWord *end = MIN2((HeapWord*)round_to((intptr_t)(s->top() + area_touched_words), page_size()), 1.47 - s->end()); 1.48 - invalid = MemRegion(start, end); 1.49 + MemRegion invalid; 1.50 + HeapWord *crossing_start = (HeapWord*)round_to(cur_top, os::vm_page_size()); 1.51 + HeapWord *crossing_end = (HeapWord*)round_to(cur_top + touched_words, os::vm_page_size()); 1.52 + if (crossing_start != crossing_end) { 1.53 + // If object header crossed a small page boundary we mark the area 1.54 + // as invalid rounding it to a page_size(). 1.55 + HeapWord *start = MAX2((HeapWord*)round_down(cur_top, page_size()), s->bottom()); 1.56 + HeapWord *end = MIN2((HeapWord*)round_to(cur_top + touched_words, page_size()), s->end()); 1.57 + invalid = MemRegion(start, end); 1.58 + } 1.59 + 1.60 + ls->add_invalid_region(invalid); 1.61 } 1.62 - 1.63 - ls->add_invalid_region(invalid); 1.64 + cur_top = cur_top + (words_to_fill * HeapWordSize); 1.65 + words_left_to_fill -= words_to_fill; 1.66 } 1.67 } 1.68 } else {