@@ -158,6 +158,11 @@ run_migration ()
mkfifo ${src_outfifo}
mkfifo ${dst_outfifo}
+ # Holding both ends of the input fifo open prevents opens from
+ # blocking and readers getting EOF when a writer closes it.
+ mkfifo ${dst_infifo}
+ exec {dst_infifo_fd}<>${dst_infifo}
+
eval "$migcmdline" \
-chardev socket,id=mon,path=${src_qmp},server=on,wait=off \
-mon chardev=mon,mode=control > ${src_outfifo} &
@@ -191,14 +196,10 @@ run_migration ()
do_migration ()
{
- # We have to use cat to open the named FIFO, because named FIFO's,
- # unlike pipes, will block on open() until the other end is also
- # opened, and that totally breaks QEMU...
- mkfifo ${dst_infifo}
eval "$migcmdline" \
-chardev socket,id=mon,path=${dst_qmp},server=on,wait=off \
-mon chardev=mon,mode=control -incoming unix:${dst_incoming} \
- < <(cat ${dst_infifo}) > ${dst_outfifo} &
+ < ${dst_infifo} > ${dst_outfifo} &
incoming_pid=$!
cat ${dst_outfifo} | tee ${dst_out} | filter_quiet_msgs &
@@ -245,7 +246,6 @@ do_migration ()
# keypress to dst so getchar completes and test continues
echo > ${dst_infifo}
- rm ${dst_infifo}
# Wait for the incoming socket being removed, ready for next destination
while [ -S ${dst_incoming} ] ; do sleep 0.1 ; done