1.1 --- a/src/share/vm/runtime/virtualspace.cpp Mon Aug 01 10:04:28 2011 -0700 1.2 +++ b/src/share/vm/runtime/virtualspace.cpp Tue Aug 02 12:13:13 2011 -0700 1.3 @@ -1,5 +1,5 @@ 1.4 /* 1.5 - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 1.6 + * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. 1.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.8 * 1.9 * This code is free software; you can redistribute it and/or modify it 1.10 @@ -68,7 +68,7 @@ 1.11 assert(len >= required_size, "len too small"); 1.12 1.13 const size_t s = size_t(addr); 1.14 - const size_t beg_ofs = s + prefix_size & suffix_align - 1; 1.15 + const size_t beg_ofs = (s + prefix_size) & (suffix_align - 1); 1.16 const size_t beg_delta = beg_ofs == 0 ? 0 : suffix_align - beg_ofs; 1.17 1.18 if (len < beg_delta + required_size) { 1.19 @@ -113,8 +113,8 @@ 1.20 assert(res >= raw, "alignment decreased start addr"); 1.21 assert(res + prefix_size + suffix_size <= raw + reserve_size, 1.22 "alignment increased end addr"); 1.23 - assert((res & prefix_align - 1) == 0, "bad alignment of prefix"); 1.24 - assert((res + prefix_size & suffix_align - 1) == 0, 1.25 + assert((res & (prefix_align - 1)) == 0, "bad alignment of prefix"); 1.26 + assert(((res + prefix_size) & (suffix_align - 1)) == 0, 1.27 "bad alignment of suffix"); 1.28 } 1.29 #endif 1.30 @@ -135,7 +135,7 @@ 1.31 assert(UseCompressedOops, "currently requested address used only for compressed oops"); 1.32 if (PrintCompressedOopsMode) { 1.33 tty->cr(); 1.34 - tty->print_cr("Reserved memory at not requested address: " PTR_FORMAT " vs " PTR_FORMAT, base, requested_address); 1.35 + tty->print_cr("Reserved memory not at requested address: " PTR_FORMAT " vs " PTR_FORMAT, base, requested_address); 1.36 } 1.37 // OS ignored requested address. Try different address. 1.38 if (special) { 1.39 @@ -162,11 +162,11 @@ 1.40 assert(prefix_align != 0, "sanity"); 1.41 assert(suffix_size != 0, "sanity"); 1.42 assert(suffix_align != 0, "sanity"); 1.43 - assert((prefix_size & prefix_align - 1) == 0, 1.44 + assert((prefix_size & (prefix_align - 1)) == 0, 1.45 "prefix_size not divisible by prefix_align"); 1.46 - assert((suffix_size & suffix_align - 1) == 0, 1.47 + assert((suffix_size & (suffix_align - 1)) == 0, 1.48 "suffix_size not divisible by suffix_align"); 1.49 - assert((suffix_align & prefix_align - 1) == 0, 1.50 + assert((suffix_align & (prefix_align - 1)) == 0, 1.51 "suffix_align not divisible by prefix_align"); 1.52 1.53 // Assert that if noaccess_prefix is used, it is the same as prefix_align. 1.54 @@ -210,8 +210,8 @@ 1.55 if (addr == NULL) return; 1.56 1.57 // Check whether the result has the needed alignment (unlikely unless 1.58 - // prefix_align == suffix_align). 1.59 - const size_t ofs = size_t(addr) + adjusted_prefix_size & suffix_align - 1; 1.60 + // prefix_align < suffix_align). 1.61 + const size_t ofs = (size_t(addr) + adjusted_prefix_size) & (suffix_align - 1); 1.62 if (ofs != 0) { 1.63 // Wrong alignment. Release, allocate more space and do manual alignment. 1.64 // 1.65 @@ -232,6 +232,15 @@ 1.66 addr = reserve_and_align(size + suffix_align, adjusted_prefix_size, 1.67 prefix_align, suffix_size, suffix_align); 1.68 } 1.69 + 1.70 + if (requested_address != 0 && 1.71 + failed_to_reserve_as_requested(addr, requested_address, size, false)) { 1.72 + // As a result of the alignment constraints, the allocated addr differs 1.73 + // from the requested address. Return back to the caller who can 1.74 + // take remedial action (like try again without a requested address). 1.75 + assert(_base == NULL, "should be"); 1.76 + return; 1.77 + } 1.78 } 1.79 1.80 _base = addr; 1.81 @@ -245,13 +254,19 @@ 1.82 const size_t noaccess_prefix, 1.83 bool executable) { 1.84 const size_t granularity = os::vm_allocation_granularity(); 1.85 - assert((size & granularity - 1) == 0, 1.86 + assert((size & (granularity - 1)) == 0, 1.87 "size not aligned to os::vm_allocation_granularity()"); 1.88 - assert((alignment & granularity - 1) == 0, 1.89 + assert((alignment & (granularity - 1)) == 0, 1.90 "alignment not aligned to os::vm_allocation_granularity()"); 1.91 assert(alignment == 0 || is_power_of_2((intptr_t)alignment), 1.92 "not a power of 2"); 1.93 1.94 + alignment = MAX2(alignment, (size_t)os::vm_page_size()); 1.95 + 1.96 + // Assert that if noaccess_prefix is used, it is the same as alignment. 1.97 + assert(noaccess_prefix == 0 || 1.98 + noaccess_prefix == alignment, "noaccess prefix wrong"); 1.99 + 1.100 _base = NULL; 1.101 _size = 0; 1.102 _special = false; 1.103 @@ -282,10 +297,8 @@ 1.104 return; 1.105 } 1.106 // Check alignment constraints 1.107 - if (alignment > 0) { 1.108 - assert((uintptr_t) base % alignment == 0, 1.109 - "Large pages returned a non-aligned address"); 1.110 - } 1.111 + assert((uintptr_t) base % alignment == 0, 1.112 + "Large pages returned a non-aligned address"); 1.113 _special = true; 1.114 } else { 1.115 // failed; try to reserve regular memory below 1.116 @@ -321,7 +334,7 @@ 1.117 if (base == NULL) return; 1.118 1.119 // Check alignment constraints 1.120 - if (alignment > 0 && ((size_t)base & alignment - 1) != 0) { 1.121 + if ((((size_t)base + noaccess_prefix) & (alignment - 1)) != 0) { 1.122 // Base not aligned, retry 1.123 if (!os::release_memory(base, size)) fatal("os::release_memory failed"); 1.124 // Reserve size large enough to do manual alignment and 1.125 @@ -338,12 +351,21 @@ 1.126 os::release_memory(extra_base, extra_size); 1.127 base = os::reserve_memory(size, base); 1.128 } while (base == NULL); 1.129 + 1.130 + if (requested_address != 0 && 1.131 + failed_to_reserve_as_requested(base, requested_address, size, false)) { 1.132 + // As a result of the alignment constraints, the allocated base differs 1.133 + // from the requested address. Return back to the caller who can 1.134 + // take remedial action (like try again without a requested address). 1.135 + assert(_base == NULL, "should be"); 1.136 + return; 1.137 + } 1.138 } 1.139 } 1.140 // Done 1.141 _base = base; 1.142 _size = size; 1.143 - _alignment = MAX2(alignment, (size_t) os::vm_page_size()); 1.144 + _alignment = alignment; 1.145 _noaccess_prefix = noaccess_prefix; 1.146 1.147 // Assert that if noaccess_prefix is used, it is the same as alignment.