| IRC logs at
Set by AlexDaniel on 12 June 2018.
00:29 lucasb left 00:32 cinch joined 01:28 ggoebel left 03:02 evalable6 left 03:07 evalable6 joined 04:10 cinch_ joined 04:12 cinch left 05:20 robertle left 05:38 sena_kun joined, domidumont joined 06:02 domidumont left 06:20 domidumont joined 06:36 Kaiepi left 06:54 domidumont left 06:58 domidumont joined
nine timotimo: 2 observations about MVM_profile_instrumented_mark_data: * it will never use slot 0 in nodelist.items * start can never become > 0, so the code for handling that will never be used 07:03
07:52 zakharyas joined 07:58 sena_kun left 07:59 sena_kun joined 08:10 brrt joined 09:17 zakharyas left 09:19 zakharyas joined 09:45 brrt left 10:08 anatofuz joined 10:09 domidumont left 10:20 ggoebel joined 10:57 anatofuz left, anatofuz joined 11:01 anatofuz_ joined 11:04 Kaiepi joined, anatofuz left 11:15 Kaiepi left 11:19 Kaiepi joined 11:36 domidumont joined 11:37 zakharyas left 12:06 lizmat left 12:08 domidumont left, domidumont joined 12:14 squashable6 left, squashable6 joined, squashable6 left 12:16 squashable6 joined, mtj_ left 12:22 anatofuz_ left 12:31 domidumont left 13:04 anatofuz joined 13:05 domidumont joined 13:08 zakharyas joined 13:22 anatofuz left 13:40 anatofuz joined 13:50 anatofuz left 13:52 anatofuz joined 13:56 anatofuz left 13:57 lucasb joined 14:03 zakharyas left
Guest23744 where is everyone? 14:04
14:05 zakharyas joined
nine here! 14:09
timotimo right, the "start" thing was probably a premature optimization 14:12
14:21 brrt joined
brrt \o 14:21
14:25 Kaiepi left 14:28 Kaiepi joined
Guest23744 oh, suddenly everyone is here :) 14:39
timotimo: I though premature optimization was the root of all evil :)
14:49 squashable6 left
MasterDuke while everybody is here, any objections to merging ? 14:53
14:53 squashable6 joined
brrt idk, timotimo should judge that I think 14:55
15:03 MasterDuke left 15:05 brrt left 15:09 MasterDuke joined
nine Preliminary report: we definitely end up with a fromspace object in node->alloc[i].type. The only place that sets this is log_one_allocation which explicitly checks the value with MVM_ASSERT_NOT_FROMSPACE. So it's safe to assume that the object gets moved after the pointer is assigned. 15:25
However, the node in question is part of the profile thread data and AFAICT this gets marked just fine by MVM_profile_instrumented_mark_data as part of every GC run
Indeed, the stack trace I get with GC torture turned on is from adding this broken object to the worklist 15:26
MasterDuke i don't really understand all the details, but it sounds like you're saying it's impossible 15:28
nine Well, I'm saying that I'm missing something :) Reading the source has not yet revealed any obvious error to me 15:29
jnthn nine: I spent a little time looking into it and couldn't see anything obvious either, alas 15:32
Guest23744 a real mystery then 15:34
MasterDuke is this something rr would help with? 15:40
nine yes 15:51
16:06 brrt joined
nine Wait a minute...the object has a valid forwarder 16:08
timotimo oh? so things get double-marked? 16:09
or is the flags section not properly changed?
or something completely different and there's one & too few?
nine p node->alloc[i].type.header.flags & MVM_CF_FORWARDER_VALID
$9 = 128
The fowarder looks legit 16:10
timotimo forgot to put a ( ) around an & ?
nine And this is in mark_call_graph_node (tc=0x48ef00, node=0x6471420, nodelist=0x7ffca2938810, worklist=0x6b127f0) at src/profiler/instrument.c:830
timotimo i mean, a valid forwarder just means gc_mark should update the pointer to the forwarder immediately? 16:11
16:12 domidumont left
nine How is this supposed to work exactly? process_worklist would just update the item pointer. But with GC_DEBUG on MVM_gc_worklist_add doesn't check if there's a forwarder. It will simply complain about the item being in the past fromspace 16:14
timotimo how exactly did you check if the forwarder is valid? 16:15
because if the object is in a past fromspace, then it could be that the forwarder points at fromspace, not tospace
16:16 lizmat joined 16:17 scovit_ left
nine p node->alloc[i].type.header.sc_forward_u.forwarder->flags & MVM_CF_SECOND_GEN 16:17
$23 = 16
(rr) p node->alloc[i].type.header.sc_forward_u.forwarder 16:18
$24 = (MVMCollectable *) 0x2e0b4b0
(rr) p tc->nursery_fromspace
$25 = (void *) 0x7f23d6658010
(rr) p tc->nursery_tospace
$26 = (void *) 0x7f23d9178010
The forwarder's st is correct, too
timotimo huh 16:20
nine Ah, I think this is just a red herring. The assertion fails for good reason. We're marking an object that's in the memory we move stuff to. So either the pointer already got updated during this GC run or it didn't get updated during a previous one. 16:26
Could we encounter a node multiple times when traversing the call graph?! 16:27
timotimo that would be very strange 16:28
but possible of course
nine OTOH if the item has a valid forwarder, the address in nursery_alloc is actually no longer correct either. If the pointer was already updated during this GC run, it would point to gen2 16:29
timotimo just printf every node's address when going through them
nine And according to rr the pointer only got written once - in the initial assignment 16:30
nine is afk for a couple hours 16:32
Kaiepi is jnthn around? 16:52
17:28 Ven`` joined 17:32 domidumont joined 17:45 zakharyas left 18:30 brrt left 18:44 domidumont left 18:45 domidumont joined 18:49 domidumont left 19:45 zakharyas joined 19:49 lizmat left 19:52 lizmat joined 19:59 lizmat left 20:49 zakharyas left 20:58 sena_kun left 21:22 squashable6 left 21:24 squashable6 joined 21:53 Kaiepi left 21:54 Kaiepi joined 22:30 anatofuz joined 22:31 Ven`` left 22:32 Ven`` joined, Ven`` left 22:33 lizmat joined 22:35 anatofuz left 22:36 lucasb left 22:40 anatofuz joined 22:42 anatofuz left 23:17 anatofuz joined 23:40 anatofuz left