commit a41b4231ccfc83fb99271507a8e98f84a348e71d Author: Rei Odaira Date: Fri May 22 15:34:50 2015 -0400 Filter out zero-sized mapping to avoid opjitconv running indefinitely I found opjitconv ran indefinitely when profiling a Java application running on OpenJDK/ppc64le. This is because OpenJDK sometimes reports generation of zero-size jitted code via JVMTI, but scan_overlaps() in opjitconv does not assume the existence of jitted code with size zero. (1) scan_overlaps() finds overlap between a normal jitted code and a zero-size jitted code. (2) eliminate_overlaps() tries to split the zero-size jitted code but cannot. (3) resolve_overlaps() incorrectly thinks the split has happened and invokes scan_overlaps() again. (4) Back to (1) One solution is to remove all the zero-size entries before resolving overlaps which is implemented by this patch. Signed-off-by: William Cohen diff --git a/opjitconv/jitsymbol.c b/opjitconv/jitsymbol.c index e2b1e66..1b980af 100644 --- a/opjitconv/jitsymbol.c +++ b/opjitconv/jitsymbol.c @@ -201,6 +201,26 @@ static void invalidate_earlybirds(unsigned long long start_time) } } +static void invalidate_zero_size_entries(void) +{ + u32 i; + int flag; + struct jitentry * a; + + flag = 0; + for (i = 0; i < entry_count; i++) { + a = entries_address_ascending[i]; + if (a->code_size == 0) { + invalidate_entry(a); + flag = 1; + } + } + if (flag) { + resort_address(); + resort_symbol(); + } +} + /* select the symbol with the longest life time in the index range */ static int select_one(int start_idx, int end_idx) @@ -505,6 +525,7 @@ int resolve_overlaps(unsigned long long start_time) int cnt = 0; invalidate_earlybirds(start_time); + invalidate_zero_size_entries(); while ((rc = scan_overlaps()) && rc != OP_JIT_CONV_FAIL) { resort_address(); if (cnt == 0) {