virtio: make virtio device's structures public.
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>
This commit is contained in:
parent
e531761d63
commit
f1b24e840f
|
@ -29,21 +29,6 @@
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#endif
|
#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)
|
static VirtIOBalloon *to_virtio_balloon(VirtIODevice *vdev)
|
||||||
{
|
{
|
||||||
return (VirtIOBalloon *)vdev;
|
return (VirtIOBalloon *)vdev;
|
||||||
|
|
|
@ -52,4 +52,18 @@ typedef struct VirtIOBalloonStat {
|
||||||
uint64_t val;
|
uint64_t val;
|
||||||
} QEMU_PACKED VirtIOBalloonStat;
|
} 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
|
#endif
|
||||||
|
|
|
@ -17,31 +17,11 @@
|
||||||
#include "hw/block-common.h"
|
#include "hw/block-common.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/blockdev.h"
|
||||||
#include "hw/virtio-blk.h"
|
#include "hw/virtio-blk.h"
|
||||||
#ifdef CONFIG_VIRTIO_BLK_DATA_PLANE
|
|
||||||
#include "dataplane/virtio-blk.h"
|
|
||||||
#endif
|
|
||||||
#include "hw/scsi-defs.h"
|
#include "hw/scsi-defs.h"
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
# include <scsi/sg.h>
|
# include <scsi/sg.h>
|
||||||
#endif
|
#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)
|
static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev)
|
||||||
{
|
{
|
||||||
return (VirtIOBlock *)vdev;
|
return (VirtIOBlock *)vdev;
|
||||||
|
|
|
@ -16,6 +16,9 @@
|
||||||
|
|
||||||
#include "hw/virtio.h"
|
#include "hw/virtio.h"
|
||||||
#include "hw/block-common.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 */
|
/* from Linux's linux/virtio_blk.h */
|
||||||
|
|
||||||
|
@ -108,6 +111,22 @@ struct VirtIOBlkConf
|
||||||
uint32_t data_plane;
|
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 DEFINE_VIRTIO_BLK_FEATURES(_state, _field) \
|
||||||
DEFINE_VIRTIO_COMMON_FEATURES(_state, _field)
|
DEFINE_VIRTIO_COMMON_FEATURES(_state, _field)
|
||||||
|
|
||||||
|
|
|
@ -26,56 +26,6 @@
|
||||||
#define MAC_TABLE_ENTRIES 64
|
#define MAC_TABLE_ENTRIES 64
|
||||||
#define MAX_VLAN (1 << 12) /* Per 802.1Q definition */
|
#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
|
* Calculate the number of bytes up to and including the given 'field' of
|
||||||
* 'container'.
|
* 'container'.
|
||||||
|
|
|
@ -134,6 +134,56 @@ struct virtio_net_ctrl_mac {
|
||||||
uint32_t entries;
|
uint32_t entries;
|
||||||
uint8_t macs[][ETH_ALEN];
|
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 1
|
||||||
#define VIRTIO_NET_CTRL_MAC_TABLE_SET 0
|
#define VIRTIO_NET_CTRL_MAC_TABLE_SET 0
|
||||||
#define VIRTIO_NET_CTRL_MAC_ADDR_SET 1
|
#define VIRTIO_NET_CTRL_MAC_ADDR_SET 1
|
||||||
|
|
|
@ -16,25 +16,6 @@
|
||||||
#include "hw/virtio-rng.h"
|
#include "hw/virtio-rng.h"
|
||||||
#include "qemu/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)
|
static bool is_guest_ready(VirtIORNG *vrng)
|
||||||
{
|
{
|
||||||
if (virtio_queue_ready(vrng->vq)
|
if (virtio_queue_ready(vrng->vq)
|
||||||
|
|
|
@ -25,4 +25,23 @@ struct VirtIORNGConf {
|
||||||
RndRandom *default_backend;
|
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
|
#endif
|
||||||
|
|
|
@ -130,21 +130,6 @@ typedef struct {
|
||||||
uint32_t max_lun;
|
uint32_t max_lun;
|
||||||
} QEMU_PACKED VirtIOSCSIConfig;
|
} 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 {
|
typedef struct VirtIOSCSIReq {
|
||||||
VirtIOSCSI *dev;
|
VirtIOSCSI *dev;
|
||||||
VirtQueue *vq;
|
VirtQueue *vq;
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#include "hw/virtio.h"
|
#include "hw/virtio.h"
|
||||||
#include "hw/pci/pci.h"
|
#include "hw/pci/pci.h"
|
||||||
|
#include "hw/scsi.h"
|
||||||
|
|
||||||
/* The ID for virtio_scsi */
|
/* The ID for virtio_scsi */
|
||||||
#define VIRTIO_ID_SCSI 8
|
#define VIRTIO_ID_SCSI 8
|
||||||
|
@ -31,6 +32,21 @@ struct VirtIOSCSIConf {
|
||||||
uint32_t cmd_per_lun;
|
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 DEFINE_VIRTIO_SCSI_PROPERTIES(_state, _features_field, _conf_field) \
|
||||||
DEFINE_VIRTIO_COMMON_FEATURES(_state, _features_field), \
|
DEFINE_VIRTIO_COMMON_FEATURES(_state, _features_field), \
|
||||||
DEFINE_PROP_UINT32("num_queues", _state, _conf_field.num_queues, 1), \
|
DEFINE_PROP_UINT32("num_queues", _state, _conf_field.num_queues, 1), \
|
||||||
|
|
|
@ -25,47 +25,6 @@
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include "hw/virtio-serial.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)
|
static VirtIOSerialPort *find_port_by_id(VirtIOSerial *vser, uint32_t id)
|
||||||
{
|
{
|
||||||
VirtIOSerialPort *port;
|
VirtIOSerialPort *port;
|
||||||
|
|
|
@ -173,6 +173,47 @@ struct VirtIOSerialPort {
|
||||||
bool throttled;
|
bool throttled;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
};
|
||||||
|
|
||||||
/* Interface to the virtio-serial bus */
|
/* Interface to the virtio-serial bus */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue