virtio-serial: Drop redundant VirtIOSerialPort member info

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Amit Shah <amit.shah@redhat.com>
master
Markus Armbruster 2011-05-25 14:21:13 +02:00 committed by Amit Shah
parent 31d0f80f17
commit a15bb0d6a9
3 changed files with 32 additions and 20 deletions

View File

@ -76,12 +76,15 @@ static void chr_event(void *opaque, int event)
static int generic_port_init(VirtConsole *vcon, VirtIOSerialPort *port) static int generic_port_init(VirtConsole *vcon, VirtIOSerialPort *port)
{ {
VirtIOSerialPortInfo *info = DO_UPCAST(VirtIOSerialPortInfo, qdev,
vcon->port.dev.info);
if (vcon->chr) { if (vcon->chr) {
qemu_chr_add_handlers(vcon->chr, chr_can_read, chr_read, chr_event, qemu_chr_add_handlers(vcon->chr, chr_can_read, chr_read, chr_event,
vcon); vcon);
vcon->port.info->have_data = flush_buf; info->have_data = flush_buf;
vcon->port.info->guest_open = guest_open; info->guest_open = guest_open;
vcon->port.info->guest_close = guest_close; info->guest_close = guest_close;
} }
return 0; return 0;
} }

View File

@ -129,9 +129,13 @@ static void discard_vq_data(VirtQueue *vq, VirtIODevice *vdev)
static void do_flush_queued_data(VirtIOSerialPort *port, VirtQueue *vq, static void do_flush_queued_data(VirtIOSerialPort *port, VirtQueue *vq,
VirtIODevice *vdev) VirtIODevice *vdev)
{ {
VirtIOSerialPortInfo *info;
assert(port); assert(port);
assert(virtio_queue_ready(vq)); assert(virtio_queue_ready(vq));
info = DO_UPCAST(VirtIOSerialPortInfo, qdev, port->dev.info);
while (!port->throttled) { while (!port->throttled) {
unsigned int i; unsigned int i;
@ -149,10 +153,10 @@ static void do_flush_queued_data(VirtIOSerialPort *port, VirtQueue *vq,
ssize_t ret; ssize_t ret;
buf_size = port->elem.out_sg[i].iov_len - port->iov_offset; buf_size = port->elem.out_sg[i].iov_len - port->iov_offset;
ret = port->info->have_data(port, ret = info->have_data(port,
port->elem.out_sg[i].iov_base port->elem.out_sg[i].iov_base
+ port->iov_offset, + port->iov_offset,
buf_size); buf_size);
if (ret < 0 && ret != -EAGAIN) { if (ret < 0 && ret != -EAGAIN) {
/* We don't handle any other type of errors here */ /* We don't handle any other type of errors here */
abort(); abort();
@ -309,6 +313,7 @@ void virtio_serial_throttle_port(VirtIOSerialPort *port, bool throttle)
static void handle_control_message(VirtIOSerial *vser, void *buf, size_t len) static void handle_control_message(VirtIOSerial *vser, void *buf, size_t len)
{ {
struct VirtIOSerialPort *port; struct VirtIOSerialPort *port;
struct VirtIOSerialPortInfo *info;
struct virtio_console_control cpkt, *gcpkt; struct virtio_console_control cpkt, *gcpkt;
uint8_t *buffer; uint8_t *buffer;
size_t buffer_len; size_t buffer_len;
@ -327,6 +332,8 @@ static void handle_control_message(VirtIOSerial *vser, void *buf, size_t len)
if (!port && cpkt.event != VIRTIO_CONSOLE_DEVICE_READY) if (!port && cpkt.event != VIRTIO_CONSOLE_DEVICE_READY)
return; return;
info = DO_UPCAST(VirtIOSerialPortInfo, qdev, port->dev.info);
switch(cpkt.event) { switch(cpkt.event) {
case VIRTIO_CONSOLE_DEVICE_READY: case VIRTIO_CONSOLE_DEVICE_READY:
if (!cpkt.value) { if (!cpkt.value) {
@ -356,7 +363,7 @@ static void handle_control_message(VirtIOSerial *vser, void *buf, size_t len)
* this port is a console port so that the guest can hook it * this port is a console port so that the guest can hook it
* up to hvc. * up to hvc.
*/ */
if (port->info->is_console) { if (info->is_console) {
send_control_event(port, VIRTIO_CONSOLE_CONSOLE_PORT, 1); send_control_event(port, VIRTIO_CONSOLE_CONSOLE_PORT, 1);
} }
@ -385,21 +392,21 @@ static void handle_control_message(VirtIOSerial *vser, void *buf, size_t len)
* initialised. If some app is interested in knowing about * initialised. If some app is interested in knowing about
* this event, let it know. * this event, let it know.
*/ */
if (port->info->guest_ready) { if (info->guest_ready) {
port->info->guest_ready(port); info->guest_ready(port);
} }
break; break;
case VIRTIO_CONSOLE_PORT_OPEN: case VIRTIO_CONSOLE_PORT_OPEN:
port->guest_connected = cpkt.value; port->guest_connected = cpkt.value;
if (cpkt.value && port->info->guest_open) { if (cpkt.value && info->guest_open) {
/* Send the guest opened notification if an app is interested */ /* Send the guest opened notification if an app is interested */
port->info->guest_open(port); info->guest_open(port);
} }
if (!cpkt.value && port->info->guest_close) { if (!cpkt.value && info->guest_close) {
/* Send the guest closed notification if an app is interested */ /* Send the guest closed notification if an app is interested */
port->info->guest_close(port); info->guest_close(port);
} }
break; break;
} }
@ -448,11 +455,13 @@ static void handle_output(VirtIODevice *vdev, VirtQueue *vq)
{ {
VirtIOSerial *vser; VirtIOSerial *vser;
VirtIOSerialPort *port; VirtIOSerialPort *port;
VirtIOSerialPortInfo *info;
vser = DO_UPCAST(VirtIOSerial, vdev, vdev); vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
port = find_port_by_vq(vser, vq); port = find_port_by_vq(vser, vq);
info = port ? DO_UPCAST(VirtIOSerialPortInfo, qdev, port->dev.info) : NULL;
if (!port || !port->host_connected || !port->info->have_data) { if (!port || !port->host_connected || !info->have_data) {
discard_vq_data(vq, vdev); discard_vq_data(vq, vdev);
return; return;
} }
@ -756,7 +765,6 @@ static int virtser_port_qdev_init(DeviceState *qdev, DeviceInfo *base)
return -1; return -1;
} }
port->info = info;
ret = info->init(port); ret = info->init(port);
if (ret) { if (ret) {
return ret; return ret;
@ -787,6 +795,8 @@ static int virtser_port_qdev_init(DeviceState *qdev, DeviceInfo *base)
static int virtser_port_qdev_exit(DeviceState *qdev) static int virtser_port_qdev_exit(DeviceState *qdev)
{ {
VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, qdev); VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, qdev);
VirtIOSerialPortInfo *info = DO_UPCAST(VirtIOSerialPortInfo, qdev,
port->dev.info);
VirtIOSerial *vser = port->vser; VirtIOSerial *vser = port->vser;
qemu_bh_delete(port->bh); qemu_bh_delete(port->bh);
@ -794,9 +804,9 @@ static int virtser_port_qdev_exit(DeviceState *qdev)
QTAILQ_REMOVE(&vser->ports, port, next); QTAILQ_REMOVE(&vser->ports, port, next);
if (port->info->exit) if (info->exit) {
port->info->exit(port); info->exit(port);
}
return 0; return 0;
} }

View File

@ -75,7 +75,6 @@ typedef struct VirtIOSerialPortInfo VirtIOSerialPortInfo;
*/ */
struct VirtIOSerialPort { struct VirtIOSerialPort {
DeviceState dev; DeviceState dev;
VirtIOSerialPortInfo *info;
QTAILQ_ENTRY(VirtIOSerialPort) next; QTAILQ_ENTRY(VirtIOSerialPort) next;