On Mon, Jul 29, 2013 at 04:46:22PM +0200, Vincenzo Maffione wrote: > Actually it's not always zero because > > - presave() calls e1000_mit_timer(), which sets mit_timer_on to 0 and > calls set_interrupt_cause(ICR); > > - if there are pending events, set_interrupt_cause(ICR) detects a > raising edge, and doesn't filter out the interrupt since mit_timer_on > == 0. Therefore, the timer is reloaded and mit_timer_on is set to 1. > > However, I've just realized that this is a mistake, since it would > need the post_load() to call qemu_mod_timer() when > mit_timer_on is migrated as "1", otherwise the interrupt delivery > would deadlock on the migrated system. > > I think it's way better not to migrate mit_timer_on, so that the > migrated system sees mit_timer_on==0 and doesn't need to call > qemu_mod_timer() in post_load(). The first interrupt request > (set_interrupt_cause()) will cause an immediate interrupt.
Thanks for explaining. I agree that it's simpler to avoid migrating mit_timer_on. Stefan