提交 b27e37d4 编写于 作者: P Peter Maydell

Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging

pci, pc fixes, features

A bunch of bugfixes - these will make sense for 2.1.1

Initial Intel IOMMU support.
Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>

# gpg: Signature made Wed 03 Sep 2014 14:41:23 BST using RSA key ID D28D5469
# gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>"
# gpg:                 aka "Michael S. Tsirkin <mst@redhat.com>"

* remotes/mst/tags/for_upstream:
  acpi-build: Set FORCE_APIC_CLUSTER_MODEL bit for FADT flags
  vhost-scsi: init backend features earlier
  vhost_net: init acked_features to backend_features
  vhost_net: start/stop guest notifiers properly
Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
...@@ -551,6 +551,12 @@ static void fadt_setup(AcpiFadtDescriptorRev1 *fadt, AcpiPmInfo *pm) ...@@ -551,6 +551,12 @@ static void fadt_setup(AcpiFadtDescriptorRev1 *fadt, AcpiPmInfo *pm)
(1 << ACPI_FADT_F_SLP_BUTTON) | (1 << ACPI_FADT_F_SLP_BUTTON) |
(1 << ACPI_FADT_F_RTC_S4)); (1 << ACPI_FADT_F_RTC_S4));
fadt->flags |= cpu_to_le32(1 << ACPI_FADT_F_USE_PLATFORM_CLOCK); fadt->flags |= cpu_to_le32(1 << ACPI_FADT_F_USE_PLATFORM_CLOCK);
/* APIC destination mode ("Flat Logical") has an upper limit of 8 CPUs
* For more than 8 CPUs, "Clustered Logical" mode has to be used
*/
if (max_cpus > 8) {
fadt->flags |= cpu_to_le32(1 << ACPI_FADT_F_FORCE_APIC_CLUSTER_MODEL);
}
} }
......
...@@ -115,6 +115,7 @@ unsigned vhost_net_get_features(struct vhost_net *net, unsigned features) ...@@ -115,6 +115,7 @@ unsigned vhost_net_get_features(struct vhost_net *net, unsigned features)
void vhost_net_ack_features(struct vhost_net *net, unsigned features) void vhost_net_ack_features(struct vhost_net *net, unsigned features)
{ {
net->dev.acked_features = net->dev.backend_features;
vhost_ack_features(&net->dev, vhost_net_get_feature_bits(net), features); vhost_ack_features(&net->dev, vhost_net_get_feature_bits(net), features);
} }
...@@ -188,16 +189,19 @@ bool vhost_net_query(VHostNetState *net, VirtIODevice *dev) ...@@ -188,16 +189,19 @@ bool vhost_net_query(VHostNetState *net, VirtIODevice *dev)
return vhost_dev_query(&net->dev, dev); return vhost_dev_query(&net->dev, dev);
} }
static void vhost_net_set_vq_index(struct vhost_net *net, int vq_index)
{
net->dev.vq_index = vq_index;
}
static int vhost_net_start_one(struct vhost_net *net, static int vhost_net_start_one(struct vhost_net *net,
VirtIODevice *dev, VirtIODevice *dev)
int vq_index)
{ {
struct vhost_vring_file file = { }; struct vhost_vring_file file = { };
int r; int r;
net->dev.nvqs = 2; net->dev.nvqs = 2;
net->dev.vqs = net->vqs; net->dev.vqs = net->vqs;
net->dev.vq_index = vq_index;
r = vhost_dev_enable_notifiers(&net->dev, dev); r = vhost_dev_enable_notifiers(&net->dev, dev);
if (r < 0) { if (r < 0) {
...@@ -286,7 +290,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs, ...@@ -286,7 +290,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev))); BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
VirtioBusState *vbus = VIRTIO_BUS(qbus); VirtioBusState *vbus = VIRTIO_BUS(qbus);
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
int r, i = 0; int r, e, i;
if (!vhost_net_device_endian_ok(dev)) { if (!vhost_net_device_endian_ok(dev)) {
error_report("vhost-net does not support cross-endian"); error_report("vhost-net does not support cross-endian");
...@@ -301,11 +305,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs, ...@@ -301,11 +305,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
} }
for (i = 0; i < total_queues; i++) { for (i = 0; i < total_queues; i++) {
r = vhost_net_start_one(get_vhost_net(ncs[i].peer), dev, i * 2); vhost_net_set_vq_index(get_vhost_net(ncs[i].peer), i * 2);
if (r < 0) {
goto err;
}
} }
r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true); r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true);
...@@ -314,12 +314,26 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs, ...@@ -314,12 +314,26 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
goto err; goto err;
} }
for (i = 0; i < total_queues; i++) {
r = vhost_net_start_one(get_vhost_net(ncs[i].peer), dev);
if (r < 0) {
goto err_start;
}
}
return 0; return 0;
err: err_start:
while (--i >= 0) { while (--i >= 0) {
vhost_net_stop_one(get_vhost_net(ncs[i].peer), dev); vhost_net_stop_one(get_vhost_net(ncs[i].peer), dev);
} }
e = k->set_guest_notifiers(qbus->parent, total_queues * 2, false);
if (e < 0) {
fprintf(stderr, "vhost guest notifier cleanup failed: %d\n", e);
fflush(stderr);
}
err:
return r; return r;
} }
...@@ -331,16 +345,16 @@ void vhost_net_stop(VirtIODevice *dev, NetClientState *ncs, ...@@ -331,16 +345,16 @@ void vhost_net_stop(VirtIODevice *dev, NetClientState *ncs,
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
int i, r; int i, r;
for (i = 0; i < total_queues; i++) {
vhost_net_stop_one(get_vhost_net(ncs[i].peer), dev);
}
r = k->set_guest_notifiers(qbus->parent, total_queues * 2, false); r = k->set_guest_notifiers(qbus->parent, total_queues * 2, false);
if (r < 0) { if (r < 0) {
fprintf(stderr, "vhost guest notifier cleanup failed: %d\n", r); fprintf(stderr, "vhost guest notifier cleanup failed: %d\n", r);
fflush(stderr); fflush(stderr);
} }
assert(r >= 0); assert(r >= 0);
for (i = 0; i < total_queues; i++) {
vhost_net_stop_one(get_vhost_net(ncs[i].peer), dev);
}
} }
void vhost_net_cleanup(struct vhost_net *net) void vhost_net_cleanup(struct vhost_net *net)
......
...@@ -238,6 +238,7 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp) ...@@ -238,6 +238,7 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
s->dev.nvqs = VHOST_SCSI_VQ_NUM_FIXED + vs->conf.num_queues; s->dev.nvqs = VHOST_SCSI_VQ_NUM_FIXED + vs->conf.num_queues;
s->dev.vqs = g_new(struct vhost_virtqueue, s->dev.nvqs); s->dev.vqs = g_new(struct vhost_virtqueue, s->dev.nvqs);
s->dev.vq_index = 0; s->dev.vq_index = 0;
s->dev.backend_features = 0;
ret = vhost_dev_init(&s->dev, (void *)(uintptr_t)vhostfd, ret = vhost_dev_init(&s->dev, (void *)(uintptr_t)vhostfd,
VHOST_BACKEND_TYPE_KERNEL, true); VHOST_BACKEND_TYPE_KERNEL, true);
...@@ -246,7 +247,6 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp) ...@@ -246,7 +247,6 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
strerror(-ret)); strerror(-ret));
return; return;
} }
s->dev.backend_features = 0;
error_setg(&s->migration_blocker, error_setg(&s->migration_blocker,
"vhost-scsi does not support migration"); "vhost-scsi does not support migration");
......
...@@ -976,7 +976,6 @@ void vhost_dev_disable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev) ...@@ -976,7 +976,6 @@ void vhost_dev_disable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev)
bool vhost_virtqueue_pending(struct vhost_dev *hdev, int n) bool vhost_virtqueue_pending(struct vhost_dev *hdev, int n)
{ {
struct vhost_virtqueue *vq = hdev->vqs + n - hdev->vq_index; struct vhost_virtqueue *vq = hdev->vqs + n - hdev->vq_index;
assert(hdev->started);
assert(n >= hdev->vq_index && n < hdev->vq_index + hdev->nvqs); assert(n >= hdev->vq_index && n < hdev->vq_index + hdev->nvqs);
return event_notifier_test_and_clear(&vq->masked_notifier); return event_notifier_test_and_clear(&vq->masked_notifier);
} }
...@@ -988,7 +987,6 @@ void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n, ...@@ -988,7 +987,6 @@ void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n,
struct VirtQueue *vvq = virtio_get_queue(vdev, n); struct VirtQueue *vvq = virtio_get_queue(vdev, n);
int r, index = n - hdev->vq_index; int r, index = n - hdev->vq_index;
assert(hdev->started);
assert(n >= hdev->vq_index && n < hdev->vq_index + hdev->nvqs); assert(n >= hdev->vq_index && n < hdev->vq_index + hdev->nvqs);
struct vhost_vring_file file = { struct vhost_vring_file file = {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册