You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

full-jdk7u60-deopt-cp.patch 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. diff --git a/src/share/vm/classfile/classFileParser.cpp b/src/share/vm/classfile/classFileParser.cpp
  2. index 6e362d9..2947c33 100644
  3. --- a/src/share/vm/classfile/classFileParser.cpp
  4. +++ b/src/share/vm/classfile/classFileParser.cpp
  5. @@ -3942,6 +3942,11 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
  6. }
  7. }
  8. + if (cfs->source() != NULL && HotswapDeoptClassPath != NULL) {
  9. + if (strstr(cfs->source(), HotswapDeoptClassPath) != NULL)
  10. + this_klass->set_deoptimization_incl(true);
  11. + }
  12. +
  13. if (TraceClassResolution) {
  14. // print out the superclass.
  15. const char * from = Klass::cast(this_klass())->external_name();
  16. diff --git a/src/share/vm/classfile/systemDictionary.cpp b/src/share/vm/classfile/systemDictionary.cpp
  17. index 365aeda..dedc043 100644
  18. --- a/src/share/vm/classfile/systemDictionary.cpp
  19. +++ b/src/share/vm/classfile/systemDictionary.cpp
  20. @@ -1255,6 +1255,11 @@ instanceKlassHandle SystemDictionary::load_shared_class(
  21. }
  22. }
  23. + if (HotswapDeoptClassPath != NULL) {
  24. + if (strstr(HotswapDeoptClassPath, ik->external_name()) != NULL)
  25. + ik->set_deoptimization_incl(true);
  26. + }
  27. +
  28. if (TraceClassLoading) {
  29. ResourceMark rm;
  30. tty->print("[Loaded %s", ik->external_name());
  31. diff --git a/src/share/vm/code/codeCache.cpp b/src/share/vm/code/codeCache.cpp
  32. index 70574bc..b28cb02 100644
  33. --- a/src/share/vm/code/codeCache.cpp
  34. +++ b/src/share/vm/code/codeCache.cpp
  35. @@ -715,6 +715,14 @@ int CodeCache::mark_for_evol_deoptimization(instanceKlassHandle dependee) {
  36. // Deoptimize all methods
  37. +void CodeCache::mark_all_incl_nmethods_for_deoptimization() {
  38. + MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
  39. + FOR_ALL_ALIVE_NMETHODS(nm) {
  40. + nm->mark_for_deoptimization_incl();
  41. + }
  42. +}
  43. +
  44. +// Deoptimize all methods
  45. void CodeCache::mark_all_nmethods_for_deoptimization() {
  46. MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
  47. FOR_ALL_ALIVE_NMETHODS(nm) {
  48. diff --git a/src/share/vm/code/codeCache.hpp b/src/share/vm/code/codeCache.hpp
  49. index a670805..0206b48 100644
  50. --- a/src/share/vm/code/codeCache.hpp
  51. +++ b/src/share/vm/code/codeCache.hpp
  52. @@ -186,6 +186,7 @@ class CodeCache : AllStatic {
  53. #endif // HOTSWAP
  54. static void mark_all_nmethods_for_deoptimization();
  55. + static void mark_all_incl_nmethods_for_deoptimization();
  56. static int mark_for_deoptimization(methodOop dependee);
  57. static void make_marked_nmethods_zombies();
  58. static void make_marked_nmethods_not_entrant();
  59. diff --git a/src/share/vm/code/nmethod.cpp b/src/share/vm/code/nmethod.cpp
  60. index dddbea2..b7c6a79 100644
  61. --- a/src/share/vm/code/nmethod.cpp
  62. +++ b/src/share/vm/code/nmethod.cpp
  63. @@ -465,6 +465,7 @@ void nmethod::init_defaults() {
  64. _lazy_critical_native = 0;
  65. _has_wide_vectors = 0;
  66. _marked_for_deoptimization = 0;
  67. + _deoptimization_incl = false;
  68. _lock_count = 0;
  69. _stack_traversal_mark = 0;
  70. _unload_reported = false; // jvmti state
  71. @@ -673,6 +674,9 @@ nmethod::nmethod(
  72. _exception_cache = NULL;
  73. _pc_desc_cache.reset_to(NULL);
  74. + if (method != NULL)
  75. + _deoptimization_incl = Klass::cast(method->method_holder())->is_deoptimization_incl();
  76. +
  77. code_buffer->copy_oops_to(this);
  78. if (ScavengeRootsInCode && detect_scavenge_root_oops()) {
  79. CodeCache::add_scavenge_root_nmethod(this);
  80. @@ -756,6 +760,9 @@ nmethod::nmethod(
  81. _exception_cache = NULL;
  82. _pc_desc_cache.reset_to(NULL);
  83. + if (method != NULL)
  84. + _deoptimization_incl = Klass::cast(method->method_holder())->is_deoptimization_incl();
  85. +
  86. code_buffer->copy_oops_to(this);
  87. debug_only(verify_scavenge_root_oops());
  88. CodeCache::commit(this);
  89. @@ -864,6 +871,9 @@ nmethod::nmethod(
  90. _exception_cache = NULL;
  91. _pc_desc_cache.reset_to(scopes_pcs_begin());
  92. + if (method != NULL)
  93. + _deoptimization_incl = Klass::cast(method->method_holder())->is_deoptimization_incl();
  94. +
  95. // Copy contents of ScopeDescRecorder to nmethod
  96. code_buffer->copy_oops_to(this);
  97. debug_info->copy_to(this);
  98. diff --git a/src/share/vm/code/nmethod.hpp b/src/share/vm/code/nmethod.hpp
  99. index 1a4ad9e..70d220c 100644
  100. --- a/src/share/vm/code/nmethod.hpp
  101. +++ b/src/share/vm/code/nmethod.hpp
  102. @@ -169,6 +169,8 @@ class nmethod : public CodeBlob {
  103. bool _marked_for_reclamation; // Used by NMethodSweeper (set only by sweeper)
  104. bool _marked_for_deoptimization; // Used for stack deoptimization
  105. + bool _deoptimization_incl;
  106. +
  107. // used by jvmti to track if an unload event has been posted for this nmethod.
  108. bool _unload_reported;
  109. @@ -412,6 +414,11 @@ class nmethod : public CodeBlob {
  110. bool is_marked_for_deoptimization() const { return _marked_for_deoptimization; }
  111. void mark_for_deoptimization() { _marked_for_deoptimization = true; }
  112. + bool is_deoptimization_incl() const { return _deoptimization_incl; }
  113. + void set_deoptimization_incl(bool z) { _deoptimization_incl = z; }
  114. +
  115. + void mark_for_deoptimization_incl() { if (_deoptimization_incl) _marked_for_deoptimization = true; }
  116. +
  117. void make_unloaded(BoolObjectClosure* is_alive, oop cause);
  118. bool has_dependencies() { return dependencies_size() != 0; }
  119. diff --git a/src/share/vm/oops/klass.cpp b/src/share/vm/oops/klass.cpp
  120. index 767588c..59d9448 100644
  121. --- a/src/share/vm/oops/klass.cpp
  122. +++ b/src/share/vm/oops/klass.cpp
  123. @@ -57,7 +57,11 @@ bool Klass::is_subclass_of(klassOop k) const {
  124. void Klass::update_supers_to_newest_version() {
  125. - if (super() != NULL) set_super(super()->klass_part()->newest_version());
  126. + if (super() != NULL) {
  127. + set_super(super()->klass_part()->newest_version());
  128. + if (super()->klass_part()->is_deoptimization_incl())
  129. + set_deoptimization_incl(true);
  130. + }
  131. for (uint i=0; i<primary_super_limit(); i++) {
  132. klassOop cur = _primary_supers[i];
  133. @@ -183,6 +187,7 @@ klassOop Klass::base_create_klass_oop(KlassHandle& klass, int size,
  134. kl->set_redefinition_flags(Klass::NoRedefinition);
  135. kl->set_redefining(false);
  136. + kl->set_deoptimization_incl(false);
  137. kl->set_new_version(NULL);
  138. kl->set_old_version(NULL);
  139. kl->set_redefinition_index(-1);
  140. @@ -256,6 +261,8 @@ void Klass::initialize_supers(klassOop k, TRAPS) {
  141. if (FastSuperclassLimit == 0) {
  142. // None of the other machinery matters.
  143. set_super(k);
  144. + if (k != NULL && k->klass_part()->is_deoptimization_incl())
  145. + set_deoptimization_incl(true);
  146. return;
  147. }
  148. if (k == NULL) {
  149. @@ -267,6 +274,8 @@ void Klass::initialize_supers(klassOop k, TRAPS) {
  150. "initialize this only once to a non-trivial value");
  151. set_super(k);
  152. Klass* sup = k->klass_part();
  153. + if (sup->is_deoptimization_incl())
  154. + set_deoptimization_incl(true);
  155. int sup_depth = sup->super_depth();
  156. juint my_depth = MIN2(sup_depth + 1, (int)primary_super_limit());
  157. if (!can_be_primary_super_slow())
  158. diff --git a/src/share/vm/oops/klass.hpp b/src/share/vm/oops/klass.hpp
  159. index d086b5d..0719b90 100644
  160. --- a/src/share/vm/oops/klass.hpp
  161. +++ b/src/share/vm/oops/klass.hpp
  162. @@ -303,6 +303,7 @@ class Klass : public Klass_vtbl {
  163. char _field_redefinition_policy;
  164. char _static_field_redefinition_policy;
  165. bool _is_redefining;
  166. + bool _deoptimization_incl; // True if class methods are included in deoptimization
  167. #ifndef PRODUCT
  168. int _verify_count; // to avoid redundant verifies
  169. @@ -387,6 +388,9 @@ class Klass : public Klass_vtbl {
  170. else { return _old_version->klass_part()->is_same_or_older_version(klass); }
  171. }
  172. + bool is_deoptimization_incl() const { return _deoptimization_incl; }
  173. + void set_deoptimization_incl(bool z) { _deoptimization_incl = z; }
  174. +
  175. // Revision number for redefined classes, -1 for originally loaded classes
  176. jint revision_number() const {
  177. return _revision_number;
  178. diff --git a/src/share/vm/prims/jvmtiRedefineClasses.cpp b/src/share/vm/prims/jvmtiRedefineClasses.cpp
  179. index ef4f380..5d2382c 100644
  180. --- a/src/share/vm/prims/jvmtiRedefineClasses.cpp
  181. +++ b/src/share/vm/prims/jvmtiRedefineClasses.cpp
  182. @@ -435,6 +435,8 @@ jvmtiError VM_RedefineClasses::load_new_class_versions(TRAPS) {
  183. new_class->set_redefinition_flags(redefinition_flags);
  184. + new_class->set_deoptimization_incl(true);
  185. +
  186. _max_redefinition_flags = _max_redefinition_flags | redefinition_flags;
  187. if ((redefinition_flags & Klass::ModifyInstances) != 0) {
  188. @@ -2580,7 +2582,8 @@ void VM_RedefineClasses::adjust_cpool_cache(klassOop k_oop_latest, oop initiatin
  189. }*/
  190. Klass *k = k_oop->klass_part();
  191. - if (k->oop_is_instance()) {
  192. +
  193. + if (k->oop_is_instance() && (HotswapDeoptClassPath == NULL || k->is_deoptimization_incl())) {
  194. HandleMark hm(THREAD);
  195. instanceKlass *ik = (instanceKlass *) k;
  196. @@ -2683,7 +2686,11 @@ void VM_RedefineClasses::flush_dependent_code(instanceKlassHandle k_h, TRAPS) {
  197. if (0 && JvmtiExport::all_dependencies_are_recorded()) {
  198. Universe::flush_evol_dependents_on(k_h);
  199. } else {
  200. - CodeCache::mark_all_nmethods_for_deoptimization();
  201. +
  202. + if (HotswapDeoptClassPath == NULL)
  203. + CodeCache::mark_all_nmethods_for_deoptimization();
  204. + else
  205. + CodeCache::mark_all_incl_nmethods_for_deoptimization();
  206. ResourceMark rm(THREAD);
  207. DeoptimizationMarker dm;
  208. diff --git a/src/share/vm/runtime/globals.hpp b/src/share/vm/runtime/globals.hpp
  209. index 4775f3d..1141540 100644
  210. --- a/src/share/vm/runtime/globals.hpp
  211. +++ b/src/share/vm/runtime/globals.hpp
  212. @@ -3680,7 +3680,13 @@ class CommandLineFlags {
  213. product(bool, EnableTracing, false, \
  214. "Enable event-based tracing") \
  215. product(bool, UseLockedTracing, false, \
  216. - "Use locked-tracing when doing event-based tracing")
  217. + "Use locked-tracing when doing event-based tracing") \
  218. + product(ccstr, HotswapDeoptClassPath, NULL, \
  219. + "Class path or fragment of the class path to a folder with " \
  220. + "classes allowed to be deoptimized on hotswap. If is not " \
  221. + "defined then all classes will be deoptimized on hotswap. " \
  222. + "That's default behaviour. Using this option the performance " \
  223. + "of hotswap can be considerably increased. ")
  224. /*
  225. * Macros for factoring of globals