[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v1 34/37] vhost-pci-slave: add "peer_reset"
From: |
Wei Wang |
Subject: |
[Qemu-devel] [PATCH v1 34/37] vhost-pci-slave: add "peer_reset" |
Date: |
Sat, 17 Dec 2016 18:43:44 +0800 |
Setting "peer_reset" flags that the peer device is about to be reset.
This happens when the slave side device driver only accepts a subset
of the feature bits offered by the peer device.
The peer device is expected to have a second run of the vhost-user
protocol for the re-setup.
Signed-off-by: Wei Wang <address@hidden>
---
hw/net/vhost-pci-net.c | 4 ++++
hw/virtio/vhost-pci-slave.c | 17 +++++++++++++++--
include/hw/virtio/vhost-pci-slave.h | 1 +
3 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/hw/net/vhost-pci-net.c b/hw/net/vhost-pci-net.c
index 567fb86..6d4db6c 100644
--- a/hw/net/vhost-pci-net.c
+++ b/hw/net/vhost-pci-net.c
@@ -141,6 +141,10 @@ static void vpnet_set_features(VirtIODevice *vdev,
uint64_t features)
int ret;
if (need_send) {
+ if (vp_slave->feature_bits != features) {
+ vp_slave->feature_bits = features;
+ vp_slave->peer_reset = 1;
+ }
need_send = 0;
ret = vp_slave_send_feature_bits(features);
if (ret < 0)
diff --git a/hw/virtio/vhost-pci-slave.c b/hw/virtio/vhost-pci-slave.c
index d3c3443..5cfa335 100644
--- a/hw/virtio/vhost-pci-slave.c
+++ b/hw/virtio/vhost-pci-slave.c
@@ -37,6 +37,14 @@ static void vp_slave_cleanup(void)
if (!vp_slave->vdev)
return;
+ /*
+ * if this cleanup is not invoked due to peer reset, re-initialize
+ * the feature bits, so that the slave can work with a new master
+ */
+ if (!vp_slave->peer_reset)
+ vp_slave->feature_bits =
+ 1ULL << VHOST_USER_F_PROTOCOL_FEATURES;
+
nregions = vp_slave->pmem_msg.nregions;
for (i = 0; i < nregions; i++) {
ret = munmap(vp_slave->mr_map_base[i], vp_slave->mr_map_size[i]);
@@ -163,8 +171,10 @@ static void vp_slave_set_device_type(VhostUserMsg *msg)
switch (vp_slave->dev_type) {
case VIRTIO_ID_NET:
- vp_slave->feature_bits |= (VHOST_PCI_FEATURE_BITS
- | VHOST_PCI_NET_FEATURE_BITS);
+ /* Don't initialize the feature bits if they have been negotiated */
+ if (!vp_slave->peer_reset)
+ vp_slave->feature_bits |= (VHOST_PCI_FEATURE_BITS
+ | VHOST_PCI_NET_FEATURE_BITS);
break;
default:
error_report("device type %d is not supported", vp_slave->dev_type);
@@ -351,6 +361,8 @@ static int vp_slave_set_vhost_pci(CharBackend *chr_be,
VhostUserMsg *msg)
switch (cmd) {
case VHOST_USER_SET_VHOST_PCI_start:
+ if (vp_slave->peer_reset)
+ vp_slave->peer_reset = 0;
ret = vp_slave_device_create(vp_slave->dev_type);
if (ret < 0)
return ret;
@@ -519,6 +531,7 @@ int vhost_pci_slave_init(QemuOpts *opts)
vp_slave->sub_mr = NULL;
QLIST_INIT(&vp_slave->pvq_list);
vp_slave->pvq_num = 0;
+ vp_slave->peer_reset = 0;
qemu_chr_fe_init(&vp_slave->chr_be, chr, &error_abort);
qemu_chr_fe_set_handlers(&vp_slave->chr_be, vp_slave_can_read,
vp_slave_read, vp_slave_event,
diff --git a/include/hw/virtio/vhost-pci-slave.h
b/include/hw/virtio/vhost-pci-slave.h
index e60580a..dd78ed4 100644
--- a/include/hw/virtio/vhost-pci-slave.h
+++ b/include/hw/virtio/vhost-pci-slave.h
@@ -21,6 +21,7 @@ typedef struct VhostPCISlave {
CharBackend chr_be;
/* Ponnter to the slave device */
VirtIODevice *vdev;
+ bool peer_reset;
uint16_t dev_type;
uint64_t feature_bits;
/* hotplugged memory should be mapped following the offset */
--
2.7.4
- [Qemu-devel] [PATCH v1 23/37] vhost-pci-slave/msg: VHOST_USER_SET_LOG_BASE, (continued)
- [Qemu-devel] [PATCH v1 23/37] vhost-pci-slave/msg: VHOST_USER_SET_LOG_BASE, Wei Wang, 2016/12/17
- [Qemu-devel] [PATCH v1 25/37] vhost-pci-slave/msg: VHOST_USER_SEND_RARP, Wei Wang, 2016/12/17
- [Qemu-devel] [PATCH v1 26/37] vhost-pci-slave/msg: VHOST_USER_GET_VRING_BASE, Wei Wang, 2016/12/17
- [Qemu-devel] [PATCH v1 27/37] vhost-pci-net: pass the info collected by vp_slave to the device, Wei Wang, 2016/12/17
- [Qemu-devel] [PATCH v1 30/37] vhost-pci-slave/msg: VHOST_USER_SET_VHOST_PCI (stop), Wei Wang, 2016/12/17
- [Qemu-devel] [PATCH v1 28/37] vhost-pci-net: pass the mem and vring info to the driver, Wei Wang, 2016/12/17
- [Qemu-devel] [PATCH v1 29/37] vhost-pci-slave/msg: VHOST_USER_SET_VHOST_PCI (start), Wei Wang, 2016/12/17
- [Qemu-devel] [PATCH v1 31/37] vhost-user/msg: send VHOST_USER_SET_VHOST_PCI (start/stop), Wei Wang, 2016/12/17
- [Qemu-devel] [PATCH v1 33/37] vhost-pci-net: send the negotiated feature bits to the master, Wei Wang, 2016/12/17
- [Qemu-devel] [PATCH v1 32/37] vhost-user: add asynchronous read for the vhost-user master, Wei Wang, 2016/12/17
- [Qemu-devel] [PATCH v1 34/37] vhost-pci-slave: add "peer_reset",
Wei Wang <=
- [Qemu-devel] [PATCH v1 35/37] vhost-pci-net: start the vhost-pci-net device, Wei Wang, 2016/12/17
- [Qemu-devel] [PATCH v1 37/37] vl: enable vhost-pci-slave, Wei Wang, 2016/12/17
- [Qemu-devel] [PATCH v1 36/37] vhost-user/msg: handling VHOST_USER_SET_FEATURES, Wei Wang, 2016/12/17
- Re: [Qemu-devel] [PATCH v1 00/37] Implementation of vhost-pci for inter-vm commucation, no-reply, 2016/12/17
- Re: [Qemu-devel] [PATCH v1 00/37] Implementation of vhost-pci for inter-vm commucation, no-reply, 2016/12/17