virtio-console: chardev hotswap support
In case of a backend change, the handler functions and the watch have to be reset. Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Message-Id: <1499342940-56739-12-git-send-email-anton.nefedov@virtuozzo.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									75b601602b
								
							
						
					
					
						commit
						af50855c25
					
				| 
						 | 
				
			
			@ -163,6 +163,30 @@ static void chr_event(void *opaque, int event)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int chr_be_change(void *opaque)
 | 
			
		||||
{
 | 
			
		||||
    VirtConsole *vcon = opaque;
 | 
			
		||||
    VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(vcon);
 | 
			
		||||
    VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_GET_CLASS(port);
 | 
			
		||||
 | 
			
		||||
    if (k->is_console) {
 | 
			
		||||
        qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read,
 | 
			
		||||
                                 NULL, chr_be_change, vcon, NULL, true);
 | 
			
		||||
    } else {
 | 
			
		||||
        qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read,
 | 
			
		||||
                                 chr_event, chr_be_change, vcon, NULL, false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (vcon->watch) {
 | 
			
		||||
        g_source_remove(vcon->watch);
 | 
			
		||||
        vcon->watch = qemu_chr_fe_add_watch(&vcon->chr,
 | 
			
		||||
                                            G_IO_OUT | G_IO_HUP,
 | 
			
		||||
                                            chr_write_unblocked, vcon);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void virtconsole_realize(DeviceState *dev, Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
 | 
			
		||||
| 
						 | 
				
			
			@ -187,11 +211,13 @@ static void virtconsole_realize(DeviceState *dev, Error **errp)
 | 
			
		|||
         */
 | 
			
		||||
        if (k->is_console) {
 | 
			
		||||
            qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read,
 | 
			
		||||
                                     NULL, NULL, vcon, NULL, true);
 | 
			
		||||
                                     NULL, chr_be_change,
 | 
			
		||||
                                     vcon, NULL, true);
 | 
			
		||||
            virtio_serial_open(port);
 | 
			
		||||
        } else {
 | 
			
		||||
            qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read,
 | 
			
		||||
                                     chr_event, NULL, vcon, NULL, false);
 | 
			
		||||
                                     chr_event, chr_be_change,
 | 
			
		||||
                                     vcon, NULL, false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue