* [Qemu-devel] [PATCHv2 0/5] virtio: cleanup layout assumptions
@ 2010-03-18 9:42 Michael S. Tsirkin
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 1/5] virtio: add type safe API Michael S. Tsirkin
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Michael S. Tsirkin @ 2010-03-18 9:42 UTC (permalink / raw)
To: quintela, qemu-devel
This patchset helps remove the assumption that vdev must be the 1st
member in any virtio device implementation. Other assumptions (made by
qdev) can be removed in a similar way separately, this patchset does not
do this yet.
We also make it obvious that all of device structure is zero
initialized, which devices seem to rely on, by virtue of
calling mallocz directly in device code.
Note how code is simplified rather than made more complex.
Changes from v1:
Get rid of VIRTIO_COMMON_INIT macro:
simple function call, no magic now.
Michael S. Tsirkin (5):
virtio: add type safe API
virtio-net: remove layout assumptions
virtio-serial: remove struct layout assumptions
virtio-balloon: remove layout assumptions
virtio-blk: remove layout assumption
hw/virtio-balloon.c | 10 ++++------
hw/virtio-blk.c | 9 ++++-----
hw/virtio-net.c | 11 +++++------
hw/virtio-serial-bus.c | 17 ++++++++---------
hw/virtio.c | 7 +++----
hw/virtio.h | 5 +++--
6 files changed, 27 insertions(+), 32 deletions(-)
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCHv2 1/5] virtio: add type safe API
2010-03-18 9:42 [Qemu-devel] [PATCHv2 0/5] virtio: cleanup layout assumptions Michael S. Tsirkin
@ 2010-03-18 9:42 ` Michael S. Tsirkin
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 2/5] virtio-net: remove layout assumptions Michael S. Tsirkin
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Michael S. Tsirkin @ 2010-03-18 9:42 UTC (permalink / raw)
To: quintela, qemu-devel
This makes virtio_common_init typesafe in a way that will also let us
get rid of struct layout assumptions and of zero initialization
assumptions.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
hw/virtio-balloon.c | 6 ++----
hw/virtio-blk.c | 7 +++----
hw/virtio-net.c | 7 +++----
hw/virtio-serial-bus.c | 9 ++++-----
hw/virtio.c | 7 +++----
hw/virtio.h | 5 +++--
6 files changed, 18 insertions(+), 23 deletions(-)
diff --git a/hw/virtio-balloon.c b/hw/virtio-balloon.c
index 6d12024..f8ccc00 100644
--- a/hw/virtio-balloon.c
+++ b/hw/virtio-balloon.c
@@ -279,11 +279,9 @@ static int virtio_balloon_load(QEMUFile *f, void *opaque, int version_id)
VirtIODevice *virtio_balloon_init(DeviceState *dev)
{
- VirtIOBalloon *s;
+ VirtIOBalloon *s = qemu_mallocz(sizeof(*s));
- s = (VirtIOBalloon *)virtio_common_init("virtio-balloon",
- VIRTIO_ID_BALLOON,
- 8, sizeof(VirtIOBalloon));
+ virtio_common_init(&s->vdev, "virtio-balloon", VIRTIO_ID_BALLOON, 8);
s->vdev.get_config = virtio_balloon_get_config;
s->vdev.set_config = virtio_balloon_set_config;
diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
index 9915840..5f61469 100644
--- a/hw/virtio-blk.c
+++ b/hw/virtio-blk.c
@@ -478,13 +478,12 @@ static int virtio_blk_load(QEMUFile *f, void *opaque, int version_id)
VirtIODevice *virtio_blk_init(DeviceState *dev, BlockConf *conf)
{
- VirtIOBlock *s;
+ VirtIOBlock *s = qemu_mallocz(sizeof(*s));
int cylinders, heads, secs;
static int virtio_blk_id;
- s = (VirtIOBlock *)virtio_common_init("virtio-blk", VIRTIO_ID_BLOCK,
- sizeof(struct virtio_blk_config),
- sizeof(VirtIOBlock));
+ virtio_common_init(&s->vdev, "virtio-blk", VIRTIO_ID_BLOCK,
+ sizeof(struct virtio_blk_config));
s->vdev.get_config = virtio_blk_update_config;
s->vdev.get_features = virtio_blk_get_features;
diff --git a/hw/virtio-net.c b/hw/virtio-net.c
index be33c68..d962a75 100644
--- a/hw/virtio-net.c
+++ b/hw/virtio-net.c
@@ -833,12 +833,11 @@ static NetClientInfo net_virtio_info = {
VirtIODevice *virtio_net_init(DeviceState *dev, NICConf *conf)
{
- VirtIONet *n;
+ VirtIONet *n = qemu_mallocz(sizeof(*n));
static int virtio_net_id;
- n = (VirtIONet *)virtio_common_init("virtio-net", VIRTIO_ID_NET,
- sizeof(struct virtio_net_config),
- sizeof(VirtIONet));
+ virtio_common_init(&n->vdev, "virtio-net", VIRTIO_ID_NET,
+ sizeof(struct virtio_net_config))
n->vdev.get_config = virtio_net_get_config;
n->vdev.set_config = virtio_net_set_config;
diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c
index 17c1ec1..cf6f979 100644
--- a/hw/virtio-serial-bus.c
+++ b/hw/virtio-serial-bus.c
@@ -560,18 +560,17 @@ void virtio_serial_port_qdev_register(VirtIOSerialPortInfo *info)
VirtIODevice *virtio_serial_init(DeviceState *dev, uint32_t max_nr_ports)
{
- VirtIOSerial *vser;
+ VirtIOSerial *vser = qemu_mallocz(sizeof(*vser));
VirtIODevice *vdev;
uint32_t i;
if (!max_nr_ports)
return NULL;
- vdev = virtio_common_init("virtio-serial", VIRTIO_ID_CONSOLE,
- sizeof(struct virtio_console_config),
- sizeof(VirtIOSerial));
+ vdev = &vser->vdev;
- vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
+ virtio_common_init(vdev, "virtio-serial", VIRTIO_ID_CONSOLE,
+ sizeof(struct virtio_console_config))
/* Spawn a new virtio-serial bus on which the ports will ride as devices */
vser->bus = virtser_bus_new(dev);
diff --git a/hw/virtio.c b/hw/virtio.c
index 7c020a3..2e56b39 100644
--- a/hw/virtio.c
+++ b/hw/virtio.c
@@ -700,13 +700,12 @@ void virtio_cleanup(VirtIODevice *vdev)
qemu_free(vdev->vq);
}
-VirtIODevice *virtio_common_init(const char *name, uint16_t device_id,
- size_t config_size, size_t struct_size)
+void virtio_common_init(VirtIODevice *vdev, const char *name,
+ uint16_t device_id, size_t config_size)
{
- VirtIODevice *vdev;
int i;
- vdev = qemu_mallocz(struct_size);
+ memset(vdev, 0, sizeof(*vdev));
vdev->device_id = device_id;
vdev->status = 0;
diff --git a/hw/virtio.h b/hw/virtio.h
index 3baa2a3..51ff421 100644
--- a/hw/virtio.h
+++ b/hw/virtio.h
@@ -149,8 +149,9 @@ int virtio_queue_empty(VirtQueue *vq);
/* Host binding interface. */
-VirtIODevice *virtio_common_init(const char *name, uint16_t device_id,
- size_t config_size, size_t struct_size);
+void virtio_common_init(VirtIODevice *dev, const char *name,
+ uint16_t device_id, size_t config_size);
+
uint32_t virtio_config_readb(VirtIODevice *vdev, uint32_t addr);
uint32_t virtio_config_readw(VirtIODevice *vdev, uint32_t addr);
uint32_t virtio_config_readl(VirtIODevice *vdev, uint32_t addr);
--
1.7.0.2.280.gc6f05
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCHv2 2/5] virtio-net: remove layout assumptions
2010-03-18 9:42 [Qemu-devel] [PATCHv2 0/5] virtio: cleanup layout assumptions Michael S. Tsirkin
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 1/5] virtio: add type safe API Michael S. Tsirkin
@ 2010-03-18 9:42 ` Michael S. Tsirkin
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 3/5] virtio-serial: remove struct " Michael S. Tsirkin
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Michael S. Tsirkin @ 2010-03-18 9:42 UTC (permalink / raw)
To: quintela, qemu-devel
Use container_of so we do not depend on vdev being first member.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
hw/virtio-net.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/hw/virtio-net.c b/hw/virtio-net.c
index d962a75..ca843f8 100644
--- a/hw/virtio-net.c
+++ b/hw/virtio-net.c
@@ -64,7 +64,7 @@ typedef struct VirtIONet
static VirtIONet *to_virtio_net(VirtIODevice *vdev)
{
- return (VirtIONet *)vdev;
+ return container_of(vdev, VirtIONet, vdev);
}
static void virtio_net_get_config(VirtIODevice *vdev, uint8_t *config)
@@ -873,7 +873,7 @@ VirtIODevice *virtio_net_init(DeviceState *dev, NICConf *conf)
void virtio_net_exit(VirtIODevice *vdev)
{
- VirtIONet *n = DO_UPCAST(VirtIONet, vdev, vdev);
+ VirtIONet *n = to_virtio_net(vdev);
qemu_purge_queued_packets(&n->nic->nc);
--
1.7.0.2.280.gc6f05
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCHv2 3/5] virtio-serial: remove struct layout assumptions
2010-03-18 9:42 [Qemu-devel] [PATCHv2 0/5] virtio: cleanup layout assumptions Michael S. Tsirkin
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 1/5] virtio: add type safe API Michael S. Tsirkin
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 2/5] virtio-net: remove layout assumptions Michael S. Tsirkin
@ 2010-03-18 9:42 ` Michael S. Tsirkin
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 4/5] virtio-balloon: remove " Michael S. Tsirkin
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 5/5] virtio-blk: remove layout assumption Michael S. Tsirkin
4 siblings, 0 replies; 6+ messages in thread
From: Michael S. Tsirkin @ 2010-03-18 9:42 UTC (permalink / raw)
To: quintela, qemu-devel
Use container_of and remove assumption that vdev
is 1st member of structure.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
hw/virtio-serial-bus.c | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c
index cf6f979..cba60f1 100644
--- a/hw/virtio-serial-bus.c
+++ b/hw/virtio-serial-bus.c
@@ -282,7 +282,7 @@ static void control_out(VirtIODevice *vdev, VirtQueue *vq)
VirtQueueElement elem;
VirtIOSerial *vser;
- vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
+ vser = container_of(vdev, VirtIOSerial, vdev);
while (virtqueue_pop(vq, &elem)) {
handle_control_message(vser, elem.out_sg[0].iov_base);
@@ -297,7 +297,7 @@ static void handle_output(VirtIODevice *vdev, VirtQueue *vq)
VirtIOSerial *vser;
VirtQueueElement elem;
- vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
+ vser = container_of(vdev, VirtIOSerial, vdev);
while (virtqueue_pop(vq, &elem)) {
VirtIOSerialPort *port;
@@ -335,7 +335,7 @@ static void handle_input(VirtIODevice *vdev, VirtQueue *vq)
static uint32_t get_features(VirtIODevice *vdev, uint32_t features)
{
- VirtIOSerial *vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
+ VirtIOSerial *vser = container_of(vdev, VirtIOSerial, vdev);
if (vser->bus->max_nr_ports > 1) {
features |= (1 << VIRTIO_CONSOLE_F_MULTIPORT);
}
@@ -347,7 +347,7 @@ static void get_config(VirtIODevice *vdev, uint8_t *config_data)
{
VirtIOSerial *vser;
- vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
+ vser = container_of(vdev, VirtIOSerial, vdev);
memcpy(config_data, &vser->config, sizeof(struct virtio_console_config));
}
--
1.7.0.2.280.gc6f05
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCHv2 4/5] virtio-balloon: remove layout assumptions
2010-03-18 9:42 [Qemu-devel] [PATCHv2 0/5] virtio: cleanup layout assumptions Michael S. Tsirkin
` (2 preceding siblings ...)
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 3/5] virtio-serial: remove struct " Michael S. Tsirkin
@ 2010-03-18 9:42 ` Michael S. Tsirkin
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 5/5] virtio-blk: remove layout assumption Michael S. Tsirkin
4 siblings, 0 replies; 6+ messages in thread
From: Michael S. Tsirkin @ 2010-03-18 9:42 UTC (permalink / raw)
To: quintela, qemu-devel
use container_of to remove assumption that vdev
is 1st member of structure.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
hw/virtio-balloon.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/hw/virtio-balloon.c b/hw/virtio-balloon.c
index f8ccc00..21687e3 100644
--- a/hw/virtio-balloon.c
+++ b/hw/virtio-balloon.c
@@ -43,7 +43,7 @@ typedef struct VirtIOBalloon
static VirtIOBalloon *to_virtio_balloon(VirtIODevice *vdev)
{
- return (VirtIOBalloon *)vdev;
+ return container_of(vdev, VirtIOBalloon, vdev);
}
static void balloon_page(void *addr, int deflate)
@@ -165,7 +165,7 @@ static void complete_stats_request(VirtIOBalloon *vb)
static void virtio_balloon_receive_stats(VirtIODevice *vdev, VirtQueue *vq)
{
- VirtIOBalloon *s = DO_UPCAST(VirtIOBalloon, vdev, vdev);
+ VirtIOBalloon *s = to_virtio_balloon(vdev);
VirtQueueElement *elem = &s->stats_vq_elem;
VirtIOBalloonStat stat;
size_t offset = 0;
--
1.7.0.2.280.gc6f05
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCHv2 5/5] virtio-blk: remove layout assumption
2010-03-18 9:42 [Qemu-devel] [PATCHv2 0/5] virtio: cleanup layout assumptions Michael S. Tsirkin
` (3 preceding siblings ...)
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 4/5] virtio-balloon: remove " Michael S. Tsirkin
@ 2010-03-18 9:42 ` Michael S. Tsirkin
4 siblings, 0 replies; 6+ messages in thread
From: Michael S. Tsirkin @ 2010-03-18 9:42 UTC (permalink / raw)
To: quintela, qemu-devel
Use container_of to remove assumption that vdev
is 1st member of device state.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
hw/virtio-blk.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
index 5f61469..ab52d1d 100644
--- a/hw/virtio-blk.c
+++ b/hw/virtio-blk.c
@@ -32,7 +32,7 @@ typedef struct VirtIOBlock
static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev)
{
- return (VirtIOBlock *)vdev;
+ return container_of(vdev, VirtIOBlock, vdev);
}
typedef struct VirtIOBlockReq
--
1.7.0.2.280.gc6f05
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2010-03-18 9:46 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-03-18 9:42 [Qemu-devel] [PATCHv2 0/5] virtio: cleanup layout assumptions Michael S. Tsirkin
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 1/5] virtio: add type safe API Michael S. Tsirkin
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 2/5] virtio-net: remove layout assumptions Michael S. Tsirkin
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 3/5] virtio-serial: remove struct " Michael S. Tsirkin
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 4/5] virtio-balloon: remove " Michael S. Tsirkin
2010-03-18 9:42 ` [Qemu-devel] [PATCHv2 5/5] virtio-blk: remove layout assumption Michael S. Tsirkin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).