6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
Summary: Test minimal stack sizes given (also fixed linux compilation error)
Reviewed-by: never, phh, coleenp
--- a/hotspot/src/share/vm/memory/allocation.cpp Fri Aug 13 07:33:20 2010 -0700
+++ b/hotspot/src/share/vm/memory/allocation.cpp Thu Aug 19 14:23:59 2010 -0400
@@ -58,7 +58,7 @@
void ResourceObj::operator delete(void* p) {
assert(((ResourceObj *)p)->allocated_on_C_heap(),
"delete only allowed for C_HEAP objects");
- DEBUG_ONLY(((ResourceObj *)p)->_allocation = badHeapOopVal;)
+ DEBUG_ONLY(((ResourceObj *)p)->_allocation = (uintptr_t)badHeapOopVal;)
FreeHeap(p);
}
@@ -104,7 +104,7 @@
ResourceObj::~ResourceObj() {
// allocated_on_C_heap() also checks that encoded (in _allocation) address == this.
if (!allocated_on_C_heap()) { // ResourceObj::delete() zaps _allocation for C_heap.
- _allocation = badHeapOopVal; // zap type
+ _allocation = (uintptr_t)badHeapOopVal; // zap type
}
}
#endif // ASSERT
--- a/hotspot/src/share/vm/runtime/arguments.cpp Fri Aug 13 07:33:20 2010 -0700
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Thu Aug 19 14:23:59 2010 -0400
@@ -1559,6 +1559,18 @@
return false;
}
+bool Arguments::verify_min_value(intx val, intx min, const char* name) {
+ // Returns true if given value is greater than specified min threshold
+ // false, otherwise.
+ if (val >= min ) {
+ return true;
+ }
+ jio_fprintf(defaultStream::error_stream(),
+ "%s of " INTX_FORMAT " is invalid; must be greater than " INTX_FORMAT "\n",
+ name, val, min);
+ return false;
+}
+
bool Arguments::verify_percentage(uintx value, const char* name) {
if (value <= 100) {
return true;
@@ -1611,6 +1623,16 @@
return status;
}
+// Check stack pages settings
+bool Arguments::check_stack_pages()
+{
+ bool status = true;
+ status = status && verify_min_value(StackYellowPages, 1, "StackYellowPages");
+ status = status && verify_min_value(StackRedPages, 1, "StackRedPages");
+ status = status && verify_min_value(StackShadowPages, 1, "StackShadowPages");
+ return status;
+}
+
// Check the consistency of vm_init_args
bool Arguments::check_vm_args_consistency() {
// Method for adding checks for flag consistency.
@@ -1723,6 +1745,7 @@
}
status = status && check_gc_consistency();
+ status = status && check_stack_pages();
if (_has_alloc_profile) {
if (UseParallelGC || UseParallelOldGC) {
--- a/hotspot/src/share/vm/runtime/arguments.hpp Fri Aug 13 07:33:20 2010 -0700
+++ b/hotspot/src/share/vm/runtime/arguments.hpp Thu Aug 19 14:23:59 2010 -0400
@@ -338,6 +338,7 @@
}
static bool verify_interval(uintx val, uintx min,
uintx max, const char* name);
+ static bool verify_min_value(intx val, intx min, const char* name);
static bool verify_percentage(uintx value, const char* name);
static void describe_range_error(ArgsRange errcode);
static ArgsRange check_memory_size(julong size, julong min_size);
@@ -400,6 +401,8 @@
static bool check_gc_consistency();
// Check consistecy or otherwise of VM argument settings
static bool check_vm_args_consistency();
+ // Check stack pages settings
+ static bool check_stack_pages();
// Used by os_solaris
static bool process_settings_file(const char* file_name, bool should_exist, jboolean ignore_unrecognized);