With the previous cleanups in place, it is easy to trigger
restart when the state machine goes from the COMPLETING to the
COMPLETED state. Besides this, the patch is just simple
scaffolding for the monitor command and to migrate to a file
rather than a pipe (which is a bit simpler because we do not
need non-blocking I/O).

Then this isn't live migration.

Sorry, I cannot understand this remark.

This is functionally equivalent to migrate "exec:dd of=filename", no?

Yes, except for restarting at the end.

If you were truly dumping an actual core file and things remained
"live", that would be compelling, but it would be a lot easier to just
implement that as an external process. If you just used a table that
mapped section names and versions to length, you only really need to
understand the format of ram and cpu save sections.

I already have the code to read ram and cpu save sections. I don't need
the "core file" to be ELF; I just need the live state to be dumped with
as small downtime as possible, and the live migration support provides that.