Hi,

I find a critical problem about pci devices migration 
when we configure a pci device not assign the devfn. Qemu will 
auto assign the devfn in function do_pci_register_device.

At the migration src end, When we hotplug two pci devices, such as virtio-net. 
Qemu will assign devfn 4 (assumed the previous 3 slots and the fifth have been 
assigned)
for the first nic, and assign devfn 6 for the second nic.
After that, I unplug the first nic. 

At the migrate dst end, I start the vm adding a virtio-net nic. 
Try to execute migration, qemu report "Unknown ramblock 
"0000:00:06.0/virtio-net-pci.rom", cannot accept migration.
qemu: warning: error while loading state for instance 0x0 of device 'ram'
load of migration failed "

How reproducible:
100%

Steps to Reproduce:
1. at src end, boot guset with:
/usr/bin/qemu-kvm -enable-kvm -m 512 -smp 2 -name suse11sp3 -boot c -drive 
file=/home/sles11sp3.img,if=none,id=drive-virtio-disk0,format=raw,\
cache=none,aio=native -device 
virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1
 -vnc 0.0.0.0:10 \
-monitor stdio -netdev type=tap,id=net0 -device 
virtio-net,id=nic0,netdev=net0,mac=52:54:00:12:34:57

(qemu) info pci
  Bus  0, device   0, function 0:
    Host bridge: PCI device 8086:1237
      id ""
  Bus  0, device   1, function 0:
    ISA bridge: PCI device 8086:7000
      id ""
  Bus  0, device   1, function 1:
    IDE controller: PCI device 8086:7010
      BAR4: I/O at 0xc060 [0xc06f].
      id ""
  Bus  0, device   1, function 3:
    Bridge: PCI device 8086:7113
      IRQ 9.
      id ""
  Bus  0, device   2, function 0:
    VGA controller: PCI device 1013:00b8
      BAR0: 32 bit prefetchable memory at 0xfc000000 [0xfdffffff].
      BAR1: 32 bit memory at 0xfebd0000 [0xfebd0fff].
      BAR6: 32 bit memory at 0xffffffffffffffff [0x0000fffe].
      id ""
  Bus  0, device   3, function 0:
    Ethernet controller: PCI device 1af4:1000
      IRQ 11.
      BAR0: I/O at 0xc040 [0xc05f].
      BAR1: 32 bit memory at 0xfebd1000 [0xfebd1fff].
      BAR6: 32 bit memory at 0xffffffffffffffff [0x0003fffe].
      id "nic0"
  Bus  0, device   5, function 0:
    SCSI controller: PCI device 1af4:1001
      IRQ 10.
      BAR0: I/O at 0xc000 [0xc03f].
      BAR1: 32 bit memory at 0xfebd2000 [0xfebd2fff].
      id "virtio-disk0"
(qemu) info network
nic0: index=0,type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:57
 \ net0: 
index=0,type=tap,ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown

2.hotplug two nics:
(qemu) netdev_add user,id=net1
(qemu) device_add virtio-net-pci,netdev=net1,id=nic1,mac=52:54:00:12:34:58
(qemu) netdev_add user,id=net2
(qemu) device_add virtio-net-pci,netdev=net2,id=nic2,mac=52:54:00:12:34:59
(qemu) info network
nic0: index=0,type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:57
 \ net0: 
index=0,type=tap,ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
nic1: index=0,type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:58
 \ net1: index=0,type=user,net=10.0.2.0,restrict=off
nic2: index=0,type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:59
 \ net2: index=0,type=user,net=10.0.2.0,restrict=off

3. unplug the first plugged nic:
(qemu) device_del nic1
(qemu) info pci
  Bus  0, device   0, function 0:
    Host bridge: PCI device 8086:1237
      id ""
  Bus  0, device   1, function 0:
    ISA bridge: PCI device 8086:7000
      id ""
  Bus  0, device   1, function 1:
    IDE controller: PCI device 8086:7010
      BAR4: I/O at 0xc060 [0xc06f].
      id ""
  Bus  0, device   1, function 3:
    Bridge: PCI device 8086:7113
      IRQ 9.
      id ""
  Bus  0, device   2, function 0:
    VGA controller: PCI device 1013:00b8
      BAR0: 32 bit prefetchable memory at 0xfc000000 [0xfdffffff].
      BAR1: 32 bit memory at 0xfebd0000 [0xfebd0fff].
      BAR6: 32 bit memory at 0xffffffffffffffff [0x0000fffe].
      id ""
  Bus  0, device   3, function 0:
    Ethernet controller: PCI device 1af4:1000
      IRQ 11.
      BAR0: I/O at 0xc040 [0xc05f].
      BAR1: 32 bit memory at 0xfebd1000 [0xfebd1fff].
      BAR6: 32 bit memory at 0xffffffffffffffff [0x0003fffe].
      id "nic0"
  Bus  0, device   5, function 0:
    SCSI controller: PCI device 1af4:1001
      IRQ 10.
      BAR0: I/O at 0xc000 [0xc03f].
      BAR1: 32 bit memory at 0xfebd2000 [0xfebd2fff].
      id "virtio-disk0"
  Bus  0, device   6, function 0:
    Ethernet controller: PCI device 1af4:1000
      IRQ 0.
      BAR0: I/O at 0x1020 [0x103f].
      BAR1: 32 bit memory at 0x80041000 [0x80041fff].
      BAR6: 32 bit memory at 0xffffffffffffffff [0x0003fffe].
      id "nic2"

4. at the dest end, boot guset with:
/usr/bin/qemu-kvm -enable-kvm -m 512 -smp 2 -name suse11sp3 -boot c -drive 
file=/home/sles11sp3.img,if=none,id=drive-virtio-disk0, \
format=raw,cache=none,aio=native -device 
virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0,\
bootindex=1 -vnc 0.0.0.0:10 -monitor stdio -netdev type=tap,id=net0 -device 
virtio-net,id=nic0,netdev=net0,mac=52:54:00:12:34:57 \
-netdev type=tap,id=net2 -device 
virtio-net,id=nic2,netdev=net2,mac=52:54:00:12:34:59 -incoming tcp:0:8888
(qemu) info pci
  Bus  0, device   0, function 0:
    Host bridge: PCI device 8086:1237
      id ""
  Bus  0, device   1, function 0:
    ISA bridge: PCI device 8086:7000
      id ""
  Bus  0, device   1, function 1:
    IDE controller: PCI device 8086:7010
      BAR4: I/O at 0xffffffffffffffff [0x000e].
      id ""
  Bus  0, device   1, function 3:
    Bridge: PCI device 8086:7113
      IRQ 0.
      id ""
  Bus  0, device   2, function 0:
    VGA controller: PCI device 1013:00b8
      BAR0: 32 bit prefetchable memory at 0xffffffffffffffff [0x01fffffe].
      BAR1: 32 bit memory at 0xffffffffffffffff [0x00000ffe].
      BAR6: 32 bit memory at 0xffffffffffffffff [0x0000fffe].
      id ""
  Bus  0, device   3, function 0:
    Ethernet controller: PCI device 1af4:1000
      IRQ 0.
      BAR0: I/O at 0xffffffffffffffff [0x003e].
      BAR1: 32 bit memory at 0xffffffffffffffff [0x00000ffe].
      BAR6: 32 bit memory at 0xffffffffffffffff [0x0003fffe].
      id "nic0"
  Bus  0, device   4, function 0:
    Ethernet controller: PCI device 1af4:1000
      IRQ 0.
      BAR0: I/O at 0xffffffffffffffff [0x003e].
      BAR1: 32 bit memory at 0xffffffffffffffff [0x00000ffe].
      BAR6: 32 bit memory at 0xffffffffffffffff [0x0003fffe].
      id "nic2"
  Bus  0, device   5, function 0:
    SCSI controller: PCI device 1af4:1001
      IRQ 0.
      BAR0: I/O at 0xffffffffffffffff [0x003e].
      BAR1: 32 bit memory at 0xffffffffffffffff [0x00000ffe].
      id "virtio-disk0"
(qemu) info network
nic0: index=0,type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:57
 \ net0: 
index=0,type=tap,ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
nic2: index=0,type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:59
 \ net2: 
index=0,type=tap,ifname=tap1,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown

5. migrate at the src end:
(qemu) migrate -d tcp:9.61.1.16:8888

Actual results:

At the dest end, qemu report "Unknown ramblock 
"0000:00:06.0/virtio-net-pci.rom", cannot accept migration
qemu: warning: error while loading state for instance 0x0 of device 'ram'
load of migration failed" and abort.


Best regards,
-Gonglei

Reply via email to