Path: blob/master/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.cpp
40957 views
/*1* Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#include "precompiled.hpp"25#include "runtime/flags/jvmFlag.hpp"26#include "runtime/flags/jvmFlagLimit.hpp"27#include "runtime/flags/jvmFlagConstraintsRuntime.hpp"28#include "runtime/globals.hpp"29#include "runtime/os.hpp"30#include "runtime/safepointMechanism.hpp"31#include "runtime/task.hpp"32#include "utilities/powerOfTwo.hpp"3334JVMFlag::Error ObjectAlignmentInBytesConstraintFunc(intx value, bool verbose) {35if (!is_power_of_2(value)) {36JVMFlag::printError(verbose,37"ObjectAlignmentInBytes (" INTX_FORMAT ") must be "38"power of 2\n",39value);40return JVMFlag::VIOLATES_CONSTRAINT;41}42// In case page size is very small.43if (value >= (intx)os::vm_page_size()) {44JVMFlag::printError(verbose,45"ObjectAlignmentInBytes (" INTX_FORMAT ") must be "46"less than page size (%d)\n",47value, os::vm_page_size());48return JVMFlag::VIOLATES_CONSTRAINT;49}50return JVMFlag::SUCCESS;51}5253// Need to enforce the padding not to break the existing field alignments.54// It is sufficient to check against the largest type size.55JVMFlag::Error ContendedPaddingWidthConstraintFunc(intx value, bool verbose) {56if ((value % BytesPerLong) != 0) {57JVMFlag::printError(verbose,58"ContendedPaddingWidth (" INTX_FORMAT ") must be "59"a multiple of %d\n",60value, BytesPerLong);61return JVMFlag::VIOLATES_CONSTRAINT;62} else {63return JVMFlag::SUCCESS;64}65}6667JVMFlag::Error BiasedLockingBulkRebiasThresholdFunc(intx value, bool verbose) {68if (value > BiasedLockingBulkRevokeThreshold) {69JVMFlag::printError(verbose,70"BiasedLockingBulkRebiasThreshold (" INTX_FORMAT ") must be "71"less than or equal to BiasedLockingBulkRevokeThreshold (" INTX_FORMAT ")\n",72value, BiasedLockingBulkRevokeThreshold);73return JVMFlag::VIOLATES_CONSTRAINT;74} else {75return JVMFlag::SUCCESS;76}77}7879JVMFlag::Error BiasedLockingStartupDelayFunc(intx value, bool verbose) {80if ((value % PeriodicTask::interval_gran) != 0) {81JVMFlag::printError(verbose,82"BiasedLockingStartupDelay (" INTX_FORMAT ") must be "83"evenly divisible by PeriodicTask::interval_gran (%d)\n",84value, PeriodicTask::interval_gran);85return JVMFlag::VIOLATES_CONSTRAINT;86} else {87return JVMFlag::SUCCESS;88}89}9091JVMFlag::Error BiasedLockingBulkRevokeThresholdFunc(intx value, bool verbose) {92if (value < BiasedLockingBulkRebiasThreshold) {93JVMFlag::printError(verbose,94"BiasedLockingBulkRevokeThreshold (" INTX_FORMAT ") must be "95"greater than or equal to BiasedLockingBulkRebiasThreshold (" INTX_FORMAT ")\n",96value, BiasedLockingBulkRebiasThreshold);97return JVMFlag::VIOLATES_CONSTRAINT;98} else if ((double)value/(double)BiasedLockingDecayTime > 0.1) {99JVMFlag::printError(verbose,100"The ratio of BiasedLockingBulkRevokeThreshold (" INTX_FORMAT ")"101" to BiasedLockingDecayTime (" INTX_FORMAT ") must be "102"less than or equal to 0.1\n",103value, BiasedLockingBulkRebiasThreshold);104return JVMFlag::VIOLATES_CONSTRAINT;105} else {106return JVMFlag::SUCCESS;107}108}109110JVMFlag::Error BiasedLockingDecayTimeFunc(intx value, bool verbose) {111if (BiasedLockingBulkRebiasThreshold/(double)value > 0.1) {112JVMFlag::printError(verbose,113"The ratio of BiasedLockingBulkRebiasThreshold (" INTX_FORMAT ")"114" to BiasedLockingDecayTime (" INTX_FORMAT ") must be "115"less than or equal to 0.1\n",116BiasedLockingBulkRebiasThreshold, value);117return JVMFlag::VIOLATES_CONSTRAINT;118} else {119return JVMFlag::SUCCESS;120}121}122123JVMFlag::Error PerfDataSamplingIntervalFunc(intx value, bool verbose) {124if ((value % PeriodicTask::interval_gran != 0)) {125JVMFlag::printError(verbose,126"PerfDataSamplingInterval (" INTX_FORMAT ") must be "127"evenly divisible by PeriodicTask::interval_gran (%d)\n",128value, PeriodicTask::interval_gran);129return JVMFlag::VIOLATES_CONSTRAINT;130} else {131return JVMFlag::SUCCESS;132}133}134135JVMFlag::Error VMPageSizeConstraintFunc(uintx value, bool verbose) {136uintx min = (uintx)os::vm_page_size();137if (value < min) {138JVMFlag::printError(verbose,139"%s %s=" UINTX_FORMAT " is outside the allowed range [ " UINTX_FORMAT140" ... " UINTX_FORMAT " ]\n",141JVMFlagLimit::last_checked_flag()->type_string(),142JVMFlagLimit::last_checked_flag()->name(),143value, min, max_uintx);144return JVMFlag::VIOLATES_CONSTRAINT;145}146147return JVMFlag::SUCCESS;148}149150JVMFlag::Error NUMAInterleaveGranularityConstraintFunc(size_t value, bool verbose) {151size_t min = os::vm_allocation_granularity();152size_t max = NOT_LP64(2*G) LP64_ONLY(8192*G);153154if (value < min || value > max) {155JVMFlag::printError(verbose,156"size_t NUMAInterleaveGranularity=" UINTX_FORMAT " is outside the allowed range [ " UINTX_FORMAT157" ... " UINTX_FORMAT " ]\n", value, min, max);158return JVMFlag::VIOLATES_CONSTRAINT;159}160161return JVMFlag::SUCCESS;162}163164165