Bug 923599
| Summary: | Virtio serial chardev will be still in use even failed to hot plug a serial port on it | ||
|---|---|---|---|
| Product: | Red Hat Enterprise Linux 7 | Reporter: | Qian Guo <qiguo> |
| Component: | qemu-kvm-rhev | Assignee: | Amit Shah <amit.shah> |
| Status: | CLOSED ERRATA | QA Contact: | Virtualization Bugs <virt-bugs> |
| Severity: | medium | Docs Contact: | |
| Priority: | medium | ||
| Version: | 7.0 | CC: | amit.shah, bcao, bsarathy, chayang, flang, hhuang, huding, juzhang, knoel, michen, mkenneth, mrezanin, qiguo, qzhang, rbalakri, tburke, virt-bugs, virt-maint, wdai |
| Target Milestone: | rc | ||
| Target Release: | --- | ||
| Hardware: | Unspecified | ||
| OS: | Unspecified | ||
| Whiteboard: | |||
| Fixed In Version: | qemu 2.1 | Doc Type: | Bug Fix |
| Doc Text: | Story Points: | --- | |
| Clone Of: | 770512 | Environment: | |
| Last Closed: | 2015-03-05 09:42:15 UTC | Type: | --- |
| Regression: | --- | Mount Type: | --- |
| Documentation: | --- | CRM: | |
| Verified Versions: | Category: | --- | |
| oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |
| Cloudforms Team: | --- | Target Upstream Version: | |
| Embargoed: | |||
| Bug Depends On: | 770512 | ||
| Bug Blocks: | |||
|
Comment 3
langfang
2013-12-11 07:56:30 UTC
I hit the similiar issue (In reply to langfang from comment #3) > Test the old and the latest version,hit the same problem > > Host: > # uname -r > 3.10.0-57.el7.x86_64 > # rpm -q qemu-kvm > qemu-kvm-1.5.2-4.el7.x86_64/qemu-kvm-1.5.3-21.el7.x86_64 > > Guest: > 3.10.0-55.el7.x86_64 > > Steps: > 1. Boot a guest with virtio serial bus and chardev but no serial port, for > example: > /usr/libexec/qemu-kvm ....... -device > virtio-serial-pci,id=virtio-serial0,max_ports=3,vectors=4 -chardev > socket,id=channel0,path=/tmp/port0,server,nowait -chardev > socket,id=channel1,path=/tmp/port1,server,nowait ... > > 2. Hot plug a virtio serial port on the first chardev "channel0". > qemu) device_add > virtserialport,bus=virtio-serial0.0,chardev=channel0,name=org.linux-kvm.port. > 0,id=port0,nr=1 > > > 3. Hot plug another serial port on the second chardev "channel1" but with a > wrong "nr" value to let it failed to plug. > > (qemu) device_add > virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port. > 1,id=port1,nr=1 > virtio-serial-bus: A port already exists at id 1 > Device 'virtserialport' could not be initialized > > > 4. Hot plug the serial port again with correct "nr" value. > (qemu) device_add > virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port. > 1,id=port1,nr=2 > Property 'virtserialport.chardev' can't take value 'channel1', it's in use > I hit the similiar issue on qemu-kvm-rhev-1.5.3-19.el7.x86_64, after step 4 try (qemu)info qtree bus: serial0.0 type virtio-serial-bus dev: virtserialport, id "ice, id "" " chardev = <null> nr = 4294967295 name = "com.redhat.rhevm.vdsm2" port -1, guest off, host off, throttle off dev: virtserialport, id "�" chardev = <null> nr = 4294967295 name = "com.redhat.rhevm.vdsm2" port -1, guest off, host off, throttle off dev: virtserialport, id "GIOChannel (Unix)" chardev = <null> nr = 4294967295 name = "com.redhat.rhevm.vdsm2" port -1, guest off, host off, throttle off dev: virtserialport, id "port0" chardev = chardev0 nr = 2 name = "com.redhat.rhevm.vdsm" port 2, guest off, host off, throttle off dev: virtserialport, id "port1" chardev = chardev1 nr = 1 name = "com.redhat.rhevm.vdsm1" port 1, guest on, host on, throttle on step 5 ,try to use virtserialport named com.redhat.rhevm.vdsm1 # nc -U /tmp/socket1 Ncat: Invalid argument. Might be a dup of bug 1038914. Hi Huding, Could you handle this issue? Best Regards, Junyi (In reply to juzhang from comment #13) > Hi Huding, > > Could you handle this issue? > > Best Regards, > Junyi I test the following version and not hit this problem Host: qemu-kvm-rhev-2.1.0-2.el7ev.preview.x86_64 kernel-3.10.0-123.6.2.el7.x86_64 Guest: kernel-3.10.0-123.el7.x86_64 Steps to Test: 1. Boot a guest with virtio serial bus and chardev but no serial port, for example: /usr/libexec/qemu-kvm ....... -device virtio-serial-pci,id=virtio-serial0,max_ports=3,vectors=4 -chardev socket,id=channel0,path=/tmp/port0,server,nowait -chardev socket,id=channel1,path=/tmp/port1,server,nowait ... 2. Hot plug a virtio serial port on the first chardev "channel0". qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel0,name=org.linux-kvm.port.0,id=port0,nr=1 3. Hot plug another serial port on the second chardev "channel1" but with a wrong "nr" value to let it failed to plug. (qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port.1,id=port1,nr=1 virtio-serial-bus: A port already exists at id 1 Device 'virtserialport' could not be initialized 4. Hot plug the serial port again with correct "nr" value. (qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port.1,id=port1,nr=2 Actual results: after step3, use "info qtree" to check, the virtserialport "port0" is added: bus: virtio-bus type virtio-pci-bus dev: virtio-serial-device, id "" max_ports = 3 (0x3) bus: virtio-serial0.0 type virtio-serial-bus dev: virtserialport, id "port0" chardev = "channel0" nr = 1 (0x1) name = "org.linux-kvm.port.0" port 1, guest off, host off, throttle off after step4, no error info and use "info qtree" to check, the virtserial port "port1" is added: bus: virtio-bus type virtio-pci-bus dev: virtio-serial-device, id "" max_ports = 3 (0x3) bus: virtio-serial0.0 type virtio-serial-bus dev: virtserialport, id "port1" chardev = "channel1" nr = 2 (0x2) name = "org.linux-kvm.port.1" port 2, guest off, host off, throttle off dev: virtserialport, id "port0" chardev = "channel0" nr = 1 (0x1) name = "org.linux-kvm.port.0" port 1, guest off, host off, throttle off Reproduce this bug using the following version: kernel-3.10.0-140.el7.x86_64 qemu-kvm-1.5.3-21.el7.x86_64 Steps to Reproduce: 1. Boot a guest with virtio serial bus and chardev but no serial port, for example: # /usr/libexec/qemu-kvm -cpu SandyBridge -enable-kvm -m 4G -smp 4,sockets=1,cores=4,threads=1 -name test -rtc base=localtime,clock=host,driftfix=slew -k en-us -boot menu=on -vnc :3 -vga cirrus -usb -device usb-tablet -monitor stdio -drive file=/home/RHEL-Server-7.0-64-virtio.qcow2,if=none,id=drive-system-disk,media=disk,format=qcow2,aio=native,werror=stop,rerror=stop -device virtio-blk-pci,drive=drive-system-disk,id=system-disk,addr=0x3 -netdev tap,id=hostnet0,vhost=on,script=/etc/qemu-ifup -device virtio-net-pci,netdev=hostnet0,id=virtio-net-pci0,mac=00:22:15:27:54:8d,bus=pci.0,addr=0x8 -device virtio-serial-pci,id=virtio-serial0,max_ports=3,vectors=4 -chardev socket,id=channel0,path=/tmp/port0,server,nowait -chardev socket,id=channel1,path=/tmp/port1,server,nowait -qmp tcp:0:4445,server,nowait 2. Hot plug a virtio serial port on the first chardev "channel0". (qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel0,name=org.linux-kvm.port.0,id=port0,nr=1 3. Hot plug another serial port on the second chardev "channel1" but with a wrong "nr" value to let it failed to plug. (qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port.1,id=port1,nr=1 virtio-serial-bus: A port already exists at id 1 Device 'virtserialport' could not be initialized 4. Hot plug the serial port again with correct "nr" value. (qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port.1,id=port1,nr=2 Property 'virtserialport.chardev' can't take value 'channel1', it's in use Results: After step4, can not hot plug the second serial port to the chardev Reproduce this bug using the following version:
kernel-3.10.0-140.el7.x86_64
qemu-kvm-rhev-2.1.0-3.el7ev.preview.x86_64
Steps to Reproduce:
1. Boot a guest with virtio serial bus and chardev but no serial port, for example:
# /usr/libexec/qemu-kvm -cpu SandyBridge -enable-kvm -m 4G -smp 4,sockets=1,cores=4,threads=1 -name test -rtc base=localtime,clock=host,driftfix=slew -k en-us -boot menu=on -vnc :3 -vga cirrus -usb -device usb-tablet -monitor stdio -drive file=/home/RHEL-Server-7.0-64-virtio.qcow2,if=none,id=drive-system-disk,media=disk,format=qcow2,aio=native,werror=stop,rerror=stop -device virtio-blk-pci,drive=drive-system-disk,id=system-disk,addr=0x3 -netdev tap,id=hostnet0,vhost=on,script=/etc/qemu-ifup -device virtio-net-pci,netdev=hostnet0,id=virtio-net-pci0,mac=00:22:15:27:54:8d,bus=pci.0,addr=0x8 -device virtio-serial-pci,id=virtio-serial0,max_ports=3,vectors=4 -chardev socket,id=channel0,path=/tmp/port0,server,nowait -chardev socket,id=channel1,path=/tmp/port1,server,nowait -qmp tcp:0:4445,server,nowait
2. Hot plug a virtio serial port on the first chardev "channel0".
(qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel0,name=org.linux-kvm.port.0,id=port0,nr=1
3. Hot plug another serial port on the second chardev "channel1" but with a wrong "nr" value to let it failed to plug.
(qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port.1,id=port1,nr=1
virtio-serial-bus: A port already exists at id 1
Device 'virtserialport' could not be initialized
4. Hot plug the serial port again with correct "nr" value.
(qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port.1,id=port1,nr=2
Results:
After step4, the second serial port can be added to the chardev, use "info qtree" to check there are two ports:
bus: virtio-bus
type virtio-pci-bus
dev: virtio-serial-device, id ""
max_ports = 3 (0x3)
bus: virtio-serial0.0
type virtio-serial-bus
dev: virtserialport, id "port1"
chardev = "channel1"
nr = 2 (0x2)
name = "org.linux-kvm.port.1"
port 2, guest off, host off, throttle off
dev: virtserialport, id "port0"
chardev = "channel0"
nr = 1 (0x1)
name = "org.linux-kvm.port.0"
port 1, guest off, host off, throttle off
inside guest, there are two ports:
# ls /dev/vport1p*
/dev/vport1p1 /dev/vport1p2
Addtional test:
I also test QMP command, the results are same as above.
{"execute":"device_add","arguments":{"driver":"virtserialport","bus":"virtio-serial0.0","chardev":"channel0","name":"org.linux-kvm.port.0","id":"port0","nr":1}}
{"return": {}}
{"execute":"device_add","arguments":{"driver":"virtserialport","bus":"virtio-serial0.0","chardev":"channel1","name":"org.linux-kvm.port.2","id":"port2","nr":1}}
{"error": {"class": "GenericError", "desc": "virtio-serial-bus: A port already exists at id 1"}}
{"execute":"device_add","arguments":{"driver":"virtserialport","bus":"virtio-serial0.0","chardev":"channel1","name":"org.linux-kvm.port.2","id":"port2","nr":2}}
{"return": {}}
(In reply to huiqingding from comment #17) > Reproduce this bug using the following version: Correction: Test this bug on an intel host using the following version: > kernel-3.10.0-140.el7.x86_64 > qemu-kvm-rhev-2.1.0-3.el7ev.preview.x86_64 > > Steps to Reproduce: > 1. Boot a guest with virtio serial bus and chardev but no serial port, for > example: > # /usr/libexec/qemu-kvm -cpu SandyBridge -enable-kvm -m 4G -smp > 4,sockets=1,cores=4,threads=1 -name test -rtc > base=localtime,clock=host,driftfix=slew -k en-us -boot menu=on -vnc :3 > -vga cirrus -usb -device usb-tablet -monitor stdio -drive > file=/home/RHEL-Server-7.0-64-virtio.qcow2,if=none,id=drive-system-disk, > media=disk,format=qcow2,aio=native,werror=stop,rerror=stop -device > virtio-blk-pci,drive=drive-system-disk,id=system-disk,addr=0x3 -netdev > tap,id=hostnet0,vhost=on,script=/etc/qemu-ifup -device > virtio-net-pci,netdev=hostnet0,id=virtio-net-pci0,mac=00:22:15:27:54:8d, > bus=pci.0,addr=0x8 -device > virtio-serial-pci,id=virtio-serial0,max_ports=3,vectors=4 -chardev > socket,id=channel0,path=/tmp/port0,server,nowait -chardev > socket,id=channel1,path=/tmp/port1,server,nowait -qmp > tcp:0:4445,server,nowait > > 2. Hot plug a virtio serial port on the first chardev "channel0". > (qemu) device_add > virtserialport,bus=virtio-serial0.0,chardev=channel0,name=org.linux-kvm.port. > 0,id=port0,nr=1 > > 3. Hot plug another serial port on the second chardev "channel1" but with a > wrong "nr" value to let it failed to plug. > > (qemu) device_add > virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port. > 1,id=port1,nr=1 > virtio-serial-bus: A port already exists at id 1 > Device 'virtserialport' could not be initialized > > 4. Hot plug the serial port again with correct "nr" value. > (qemu) device_add > virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port. > 1,id=port1,nr=2 > > > Results: > After step4, the second serial port can be added to the chardev, use "info > qtree" to check there are two ports: > bus: virtio-bus > type virtio-pci-bus > dev: virtio-serial-device, id "" > max_ports = 3 (0x3) > bus: virtio-serial0.0 > type virtio-serial-bus > dev: virtserialport, id "port1" > chardev = "channel1" > nr = 2 (0x2) > name = "org.linux-kvm.port.1" > port 2, guest off, host off, throttle off > dev: virtserialport, id "port0" > chardev = "channel0" > nr = 1 (0x1) > name = "org.linux-kvm.port.0" > port 1, guest off, host off, throttle off > > inside guest, there are two ports: > # ls /dev/vport1p* > /dev/vport1p1 /dev/vport1p2 > > Addtional test: > I also test QMP command, the results are same as above. > {"execute":"device_add","arguments":{"driver":"virtserialport","bus":"virtio- > serial0.0","chardev":"channel0","name":"org.linux-kvm.port.0","id":"port0", > "nr":1}} > {"return": {}} > {"execute":"device_add","arguments":{"driver":"virtserialport","bus":"virtio- > serial0.0","chardev":"channel1","name":"org.linux-kvm.port.2","id":"port2", > "nr":1}} > {"error": {"class": "GenericError", "desc": "virtio-serial-bus: A port > already exists at id 1"}} > {"execute":"device_add","arguments":{"driver":"virtserialport","bus":"virtio- > serial0.0","chardev":"channel1","name":"org.linux-kvm.port.2","id":"port2", > "nr":2}} > {"return": {}} Test this bug on an amd host using the following version:
kernel-3.10.0-140.el7.x86_64
qemu-kvm-rhev-2.1.0-3.el7ev.preview.x86_64
Steps to Test:
1. Boot a win2012r2 guest with virtio serial bus and chardev but no serial port, for example:
# /usr/libexec/qemu-kvm -cpu SandyBridge -enable-kvm -m 4G -smp 4,sockets=1,cores=4,threads=1 -name test -rtc base=localtime,clock=host,driftfix=slew -k en-us -boot menu=on -vnc :3 -vga cirrus -usb -device usb-tablet -monitor stdio -drive file=/home/win2012r2.qcow2,if=none,id=drive-system-disk,media=disk,format=qcow2,aio=native,werror=stop,rerror=stop -device virtio-blk-pci,drive=drive-system-disk,id=system-disk,addr=0x3 -netdev tap,id=hostnet0,vhost=on,script=/etc/qemu-ifup -device virtio-net-pci,netdev=hostnet0,id=virtio-net-pci0,mac=00:22:15:27:54:8d,bus=pci.0,addr=0x8 -device virtio-serial-pci,id=virtio-serial0,max_ports=3,vectors=4 -chardev socket,id=channel0,path=/tmp/port0,server,nowait -chardev socket,id=channel1,path=/tmp/port1,server,nowait -qmp tcp:0:4445,server,nowait
2. Hot plug a virtio serial port on the first chardev "channel0".
(qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel0,name=org.linux-kvm.port.0,id=port0,nr=1
3. Hot plug another serial port on the second chardev "channel1" but with a wrong "nr" value to let it failed to plug.
(qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port.1,id=port1,nr=1
virtio-serial-bus: A port already exists at id 1
Device 'virtserialport' could not be initialized
4. Hot plug the serial port again with correct "nr" value.
(qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port.1,id=port1,nr=2
Results:
After step4, the second serial port can be added to the chardev, use "info qtree" to check there are two ports:
dev: virtio-serial-device, id ""
max_ports = 3 (0x3)
bus: virtio-serial0.0
type virtio-serial-bus
dev: virtserialport, id "port1"
chardev = "channel1"
nr = 2 (0x2)
name = "org.linux-kvm.port.1"
port 2, guest off, host off, throttle off
dev: virtserialport, id "port0"
chardev = "channel0"
nr = 1 (0x1)
name = "org.linux-kvm.port.0"
port 1, guest off, host off, throttle off
inside guest, check Control Panel -> Hardware -> Devices and Printers, there are two ports: vport0p1 and vport0p2
I also test QMP command, the results are same as above.
{"execute":"device_add","arguments":{"driver":"virtserialport","bus":"virtio-serial0.0","chardev":"channel0","name":"org.linux-kvm.port.0","id":"port0","nr":1}}
{"return": {}}
{"execute":"device_add","arguments":{"driver":"virtserialport","bus":"virtio-serial0.0","chardev":"channel1","name":"org.linux-kvm.port.2","id":"port2","nr":1}}
{"error": {"class": "GenericError", "desc": "virtio-serial-bus: A port already exists at id 1"}}
{"execute":"device_add","arguments":{"driver":"virtserialport","bus":"virtio-serial0.0","chardev":"channel1","name":"org.linux-kvm.port.2","id":"port2","nr":2}}
{"return": {}}
Reproduced by qemu-kvm-1.5.3-21.el7.x86_64
Steps
1.Boot a guest with virtio serial bus and chardev but no serial port.
# /usr/libexec/qemu-kvm -cpu SandyBridge -enable-kvm -m 4G -smp 4,sockets=1,cores=4,threads=1 -name test -rtc base=localtime,clock=host,driftfix=slew -k en-us -boot menu=on -vnc :3 -vga cirrus -usb -device usb-tablet -monitor stdio -drive file=/home/rhel7/sn1.qcow2,if=none,id=drive-system-disk,media=disk,format=qcow2,aio=native,werror=stop,rerror=stop -device virtio-blk-pci,drive=drive-system-disk,id=system-disk,addr=0x3 -netdev tap,id=hostnet0,vhost=on,script=/etc/qemu-ifup -device virtio-net-pci,netdev=hostnet0,id=virtio-net-pci0,mac=00:22:15:27:54:8d,bus=pci.0,addr=0x8 -device virtio-serial-pci,id=virtio-serial0,max_ports=3,vectors=4 -chardev socket,id=channel0,path=/tmp/port0,server,nowait -chardev socket,id=channel1,path=/tmp/port1,server,nowait -qmp tcp:0:4445,server,nowait
2. Hot plug a virtio serial port on the first chardev "channel0".
(qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel0,name=org.linux-kvm.port.0,id=port0,nr=1
3. Hot plug another serial port on the second chardev "channel1" but with a wrong "nr" value to let it failed to plug.
(qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port.1,id=port1,nr=1
virtio-serial-bus: A port already exists at id 1
Device initialization failed.
Device 'virtserialport' could not be initialized
4. Hot plug the serial port again with correct "nr" value.
qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port.1,id=port1,nr=2
Result, failed to hotplug the correct serial port
"Property 'virtserialport.chardev' can't take value 'channel1', it's in use
"
So this bug is reproduced
Verify this bug with qemu-kvm-rhev-2.1.0-2.el7.x86_64
Steps as above
Result:
(qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel0,name=org.linux-kvm.port.0,id=port0,nr=1
(qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port.1,id=port1,nr=1
virtio-serial-bus: A port already exists at id 1
Device 'virtserialport' could not be initialized
(qemu) device_add virtserialport,bus=virtio-serial0.0,chardev=channel1,name=org.linux-kvm.port.1,id=port1,nr=2
(qemu) info qtree
...
dev: i440FX-pcihost, id ""
pci-hole64-size = 18446744073709551615 (16 EiB)
short_root_bus = 0 (0x0)
irq 0
bus: pci.0
type PCI
dev: virtio-serial-pci, id "virtio-serial0"
ioeventfd = true
vectors = 4 (0x4)
class = 1920 (0x780)
max_ports = 3 (0x3)
indirect_desc = true
event_idx = true
addr = 04.0
romfile = ""
rombar = 1 (0x1)
multifunction = false
command_serr_enable = true
class Class 0780, addr 00:04.0, pci id 1af4:1003 (sub 1af4:0003)
bar 0: i/o at 0xc060 [0xc07f]
bar 1: mem at 0xfebd2000 [0xfebd2fff]
bus: virtio-bus
type virtio-pci-bus
dev: virtio-serial-device, id ""
max_ports = 3 (0x3)
bus: virtio-serial0.0
type virtio-serial-bus
dev: virtserialport, id "port1"
chardev = "channel1"
nr = 2 (0x2)
name = "org.linux-kvm.port.1"
port 2, guest off, host off, throttle off
dev: virtserialport, id "port0"
chardev = "channel0"
nr = 1 (0x1)
name = "org.linux-kvm.port.0"
port 1, guest off, host off, throttle off
....
Hotplug succeed
So this bug is fixed by qemu-kvm-rhev-2.1.0-2.el7.x86_64
Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. https://rhn.redhat.com/errata/RHSA-2015-0624.html |