On 2/26/25 06:29, Alex Bennée wrote:
I guess we want something like:
/* tlb_reset() - reset the TLB when the CPU is not running
* cs: the cpu
*
* Only to be used when the CPU is definitely not running
*/
void tlb_reset(CPUState *cs) {
g_assert(cs->cpu_stopped);
for (i = 0; i < NB_MMU_MODES; i++) {
tlb_mmu_flush_locked(&cpu->neg.tlb.d[i], &cpu->neg.tlb.f[i]);
}
}
?
I like the name, and the separate assert.
I'm not convinced skipping the tlb resize and (especially) accounting is a good
idea.
I suspect that the tlb_flush_by_mmuidx_async_work should be split vs its
assert_cpu_is_self, and you just should use that. I'll note that tcg_cpu_reset_hold and
tlb_flush_by_mmuidx_async_work both call tcg_flush_jmp_cache, so we've got a double-flush
in there.
If you don't want to use tlb_flush_by_mmuidx_async_work, I think you need at
minimum
- take the lock
- tlb_window_reset()
- honor and update cpu->neg.tlb.c.dirty
r~