Skip to content

Commit

Permalink
virtio: make virtio device's structures public.
Browse files Browse the repository at this point in the history
These structures must be made public to avoid two memory allocations for
refactored virtio devices.

Signed-off-by: KONRAD Frederic <fred.konrad@greensocs.com>
Reviewed-by: Andreas Färber <afaerber@suse.de>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Andreas Färber <afaerber@suse.de>
Message-id: 1363624648-16906-2-git-send-email-fred.konrad@greensocs.com

Changes V4 <- V3:
   * Rebased on current git.

Changes V3 <- V2:
    * Style correction spotted by Andreas (virtio-scsi.h).
    * Style correction for virtio-net.h.

Changes V2 <- V1:
    * Move the dataplane include into the header (virtio-blk).
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
  • Loading branch information
konrad-fred authored and Anthony Liguori committed Mar 18, 2013
1 parent e531761 commit f1b24e8
Show file tree
Hide file tree
Showing 12 changed files with 159 additions and 160 deletions.
15 changes: 0 additions & 15 deletions hw/virtio-balloon.c
Expand Up @@ -29,21 +29,6 @@
#include <sys/mman.h>
#endif

typedef struct VirtIOBalloon
{
VirtIODevice vdev;
VirtQueue *ivq, *dvq, *svq;
uint32_t num_pages;
uint32_t actual;
uint64_t stats[VIRTIO_BALLOON_S_NR];
VirtQueueElement stats_vq_elem;
size_t stats_vq_offset;
QEMUTimer *stats_timer;
int64_t stats_last_update;
int64_t stats_poll_interval;
DeviceState *qdev;
} VirtIOBalloon;

static VirtIOBalloon *to_virtio_balloon(VirtIODevice *vdev)
{
return (VirtIOBalloon *)vdev;
Expand Down
14 changes: 14 additions & 0 deletions hw/virtio-balloon.h
Expand Up @@ -52,4 +52,18 @@ typedef struct VirtIOBalloonStat {
uint64_t val;
} QEMU_PACKED VirtIOBalloonStat;

typedef struct VirtIOBalloon {
VirtIODevice vdev;
VirtQueue *ivq, *dvq, *svq;
uint32_t num_pages;
uint32_t actual;
uint64_t stats[VIRTIO_BALLOON_S_NR];
VirtQueueElement stats_vq_elem;
size_t stats_vq_offset;
QEMUTimer *stats_timer;
int64_t stats_last_update;
int64_t stats_poll_interval;
DeviceState *qdev;
} VirtIOBalloon;

#endif
20 changes: 0 additions & 20 deletions hw/virtio-blk.c
Expand Up @@ -17,31 +17,11 @@
#include "hw/block-common.h"
#include "sysemu/blockdev.h"
#include "hw/virtio-blk.h"
#ifdef CONFIG_VIRTIO_BLK_DATA_PLANE
#include "dataplane/virtio-blk.h"
#endif
#include "hw/scsi-defs.h"
#ifdef __linux__
# include <scsi/sg.h>
#endif

typedef struct VirtIOBlock
{
VirtIODevice vdev;
BlockDriverState *bs;
VirtQueue *vq;
void *rq;
QEMUBH *bh;
BlockConf *conf;
VirtIOBlkConf *blk;
unsigned short sector_mask;
DeviceState *qdev;
VMChangeStateEntry *change;
#ifdef CONFIG_VIRTIO_BLK_DATA_PLANE
VirtIOBlockDataPlane *dataplane;
#endif
} VirtIOBlock;

static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev)
{
return (VirtIOBlock *)vdev;
Expand Down
19 changes: 19 additions & 0 deletions hw/virtio-blk.h
Expand Up @@ -16,6 +16,9 @@

#include "hw/virtio.h"
#include "hw/block-common.h"
#ifdef CONFIG_VIRTIO_BLK_DATA_PLANE
#include "dataplane/virtio-blk.h"
#endif

/* from Linux's linux/virtio_blk.h */

Expand Down Expand Up @@ -108,6 +111,22 @@ struct VirtIOBlkConf
uint32_t data_plane;
};

typedef struct VirtIOBlock {
VirtIODevice vdev;
BlockDriverState *bs;
VirtQueue *vq;
void *rq;
QEMUBH *bh;
BlockConf *conf;
VirtIOBlkConf *blk;
unsigned short sector_mask;
DeviceState *qdev;
VMChangeStateEntry *change;
#ifdef CONFIG_VIRTIO_BLK_DATA_PLANE
VirtIOBlockDataPlane *dataplane;
#endif
} VirtIOBlock;

#define DEFINE_VIRTIO_BLK_FEATURES(_state, _field) \
DEFINE_VIRTIO_COMMON_FEATURES(_state, _field)

Expand Down
50 changes: 0 additions & 50 deletions hw/virtio-net.c
Expand Up @@ -26,56 +26,6 @@
#define MAC_TABLE_ENTRIES 64
#define MAX_VLAN (1 << 12) /* Per 802.1Q definition */

typedef struct VirtIONetQueue {
VirtQueue *rx_vq;
VirtQueue *tx_vq;
QEMUTimer *tx_timer;
QEMUBH *tx_bh;
int tx_waiting;
struct {
VirtQueueElement elem;
ssize_t len;
} async_tx;
struct VirtIONet *n;
} VirtIONetQueue;

typedef struct VirtIONet
{
VirtIODevice vdev;
uint8_t mac[ETH_ALEN];
uint16_t status;
VirtIONetQueue *vqs;
VirtQueue *ctrl_vq;
NICState *nic;
uint32_t tx_timeout;
int32_t tx_burst;
uint32_t has_vnet_hdr;
size_t host_hdr_len;
size_t guest_hdr_len;
uint8_t has_ufo;
int mergeable_rx_bufs;
uint8_t promisc;
uint8_t allmulti;
uint8_t alluni;
uint8_t nomulti;
uint8_t nouni;
uint8_t nobcast;
uint8_t vhost_started;
struct {
int in_use;
int first_multi;
uint8_t multi_overflow;
uint8_t uni_overflow;
uint8_t *macs;
} mac_table;
uint32_t *vlans;
DeviceState *qdev;
int multiqueue;
uint16_t max_queues;
uint16_t curr_queues;
size_t config_size;
} VirtIONet;

/*
* Calculate the number of bytes up to and including the given 'field' of
* 'container'.
Expand Down
50 changes: 50 additions & 0 deletions hw/virtio-net.h
Expand Up @@ -134,6 +134,56 @@ struct virtio_net_ctrl_mac {
uint32_t entries;
uint8_t macs[][ETH_ALEN];
};

typedef struct VirtIONetQueue {
VirtQueue *rx_vq;
VirtQueue *tx_vq;
QEMUTimer *tx_timer;
QEMUBH *tx_bh;
int tx_waiting;
struct {
VirtQueueElement elem;
ssize_t len;
} async_tx;
struct VirtIONet *n;
} VirtIONetQueue;

typedef struct VirtIONet {
VirtIODevice vdev;
uint8_t mac[ETH_ALEN];
uint16_t status;
VirtIONetQueue *vqs;
VirtQueue *ctrl_vq;
NICState *nic;
uint32_t tx_timeout;
int32_t tx_burst;
uint32_t has_vnet_hdr;
size_t host_hdr_len;
size_t guest_hdr_len;
uint8_t has_ufo;
int mergeable_rx_bufs;
uint8_t promisc;
uint8_t allmulti;
uint8_t alluni;
uint8_t nomulti;
uint8_t nouni;
uint8_t nobcast;
uint8_t vhost_started;
struct {
int in_use;
int first_multi;
uint8_t multi_overflow;
uint8_t uni_overflow;
uint8_t *macs;
} mac_table;
uint32_t *vlans;
DeviceState *qdev;
int multiqueue;
uint16_t max_queues;
uint16_t curr_queues;
size_t config_size;
} VirtIONet;

#define VIRTIO_NET_CTRL_MAC 1
#define VIRTIO_NET_CTRL_MAC_TABLE_SET 0
#define VIRTIO_NET_CTRL_MAC_ADDR_SET 1
Expand Down
19 changes: 0 additions & 19 deletions hw/virtio-rng.c
Expand Up @@ -16,25 +16,6 @@
#include "hw/virtio-rng.h"
#include "qemu/rng.h"

typedef struct VirtIORNG {
VirtIODevice vdev;

DeviceState *qdev;

/* Only one vq - guest puts buffer(s) on it when it needs entropy */
VirtQueue *vq;

VirtIORNGConf *conf;

RngBackend *rng;

/* We purposefully don't migrate this state. The quota will reset on the
* destination as a result. Rate limiting is host state, not guest state.
*/
QEMUTimer *rate_limit_timer;
int64_t quota_remaining;
} VirtIORNG;

static bool is_guest_ready(VirtIORNG *vrng)
{
if (virtio_queue_ready(vrng->vq)
Expand Down
19 changes: 19 additions & 0 deletions hw/virtio-rng.h
Expand Up @@ -25,4 +25,23 @@ struct VirtIORNGConf {
RndRandom *default_backend;
};

typedef struct VirtIORNG {
VirtIODevice vdev;

DeviceState *qdev;

/* Only one vq - guest puts buffer(s) on it when it needs entropy */
VirtQueue *vq;

VirtIORNGConf *conf;

RngBackend *rng;

/* We purposefully don't migrate this state. The quota will reset on the
* destination as a result. Rate limiting is host state, not guest state.
*/
QEMUTimer *rate_limit_timer;
int64_t quota_remaining;
} VirtIORNG;

#endif
15 changes: 0 additions & 15 deletions hw/virtio-scsi.c
Expand Up @@ -130,21 +130,6 @@ typedef struct {
uint32_t max_lun;
} QEMU_PACKED VirtIOSCSIConfig;

typedef struct {
VirtIODevice vdev;
DeviceState *qdev;
VirtIOSCSIConf *conf;

SCSIBus bus;
uint32_t sense_size;
uint32_t cdb_size;
int resetting;
bool events_dropped;
VirtQueue *ctrl_vq;
VirtQueue *event_vq;
VirtQueue *cmd_vqs[0];
} VirtIOSCSI;

typedef struct VirtIOSCSIReq {
VirtIOSCSI *dev;
VirtQueue *vq;
Expand Down
16 changes: 16 additions & 0 deletions hw/virtio-scsi.h
Expand Up @@ -16,6 +16,7 @@

#include "hw/virtio.h"
#include "hw/pci/pci.h"
#include "hw/scsi.h"

/* The ID for virtio_scsi */
#define VIRTIO_ID_SCSI 8
Expand All @@ -31,6 +32,21 @@ struct VirtIOSCSIConf {
uint32_t cmd_per_lun;
};

typedef struct VirtIOSCSI {
VirtIODevice vdev;
DeviceState *qdev;
VirtIOSCSIConf *conf;

SCSIBus bus;
uint32_t sense_size;
uint32_t cdb_size;
int resetting;
bool events_dropped;
VirtQueue *ctrl_vq;
VirtQueue *event_vq;
VirtQueue *cmd_vqs[0];
} VirtIOSCSI;

#define DEFINE_VIRTIO_SCSI_PROPERTIES(_state, _features_field, _conf_field) \
DEFINE_VIRTIO_COMMON_FEATURES(_state, _features_field), \
DEFINE_PROP_UINT32("num_queues", _state, _conf_field.num_queues, 1), \
Expand Down
41 changes: 0 additions & 41 deletions hw/virtio-serial-bus.c
Expand Up @@ -25,47 +25,6 @@
#include "trace.h"
#include "hw/virtio-serial.h"

/* The virtio-serial bus on top of which the ports will ride as devices */
struct VirtIOSerialBus {
BusState qbus;

/* This is the parent device that provides the bus for ports. */
VirtIOSerial *vser;

/* The maximum number of ports that can ride on top of this bus */
uint32_t max_nr_ports;
};

typedef struct VirtIOSerialPostLoad {
QEMUTimer *timer;
uint32_t nr_active_ports;
struct {
VirtIOSerialPort *port;
uint8_t host_connected;
} *connected;
} VirtIOSerialPostLoad;

struct VirtIOSerial {
VirtIODevice vdev;

VirtQueue *c_ivq, *c_ovq;
/* Arrays of ivqs and ovqs: one per port */
VirtQueue **ivqs, **ovqs;

VirtIOSerialBus bus;

DeviceState *qdev;

QTAILQ_HEAD(, VirtIOSerialPort) ports;

/* bitmap for identifying active ports */
uint32_t *ports_map;

struct virtio_console_config config;

struct VirtIOSerialPostLoad *post_load;
};

static VirtIOSerialPort *find_port_by_id(VirtIOSerial *vser, uint32_t id)
{
VirtIOSerialPort *port;
Expand Down

0 comments on commit f1b24e8

Please sign in to comment.