- arm/virt: Fix vcpu hotplug idx_from_topo_ids - Revert patches related to the vSVA - sync some bugfix patches from upstream - add generic vDPA device support Signed-off-by: yezengruan <yezengruan@huawei.com> (cherry picked from commit b99dbfd9847104300672fb4f559f1c2abba8aa33)
195 lines
6.9 KiB
Diff
195 lines
6.9 KiB
Diff
From 50e365a162cb7dd39d724fa1c5823e82d184af3a Mon Sep 17 00:00:00 2001
|
|
From: Kunkun Jiang <jiangkunkun@huawei.com>
|
|
Date: Fri, 18 Nov 2022 15:22:26 +0800
|
|
Subject: [PATCH 09/36] Revert "vfio/pci: Implement return_page_response page
|
|
response callback"
|
|
|
|
This reverts commit 6bbf810edebdb89a6958519ee3adfb1888520231.
|
|
|
|
Signed-off-by: Kunkun Jiang <jiangkunkun@huawei.com>
|
|
---
|
|
hw/vfio/pci.c | 123 --------------------------------------------------
|
|
hw/vfio/pci.h | 2 -
|
|
2 files changed, 125 deletions(-)
|
|
|
|
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
|
|
index 8e24f9c7d1..c54e62fe8f 100644
|
|
--- a/hw/vfio/pci.c
|
|
+++ b/hw/vfio/pci.c
|
|
@@ -2693,61 +2693,6 @@ out:
|
|
g_free(fault_region_info);
|
|
}
|
|
|
|
-static void vfio_init_fault_response_regions(VFIOPCIDevice *vdev, Error **errp)
|
|
-{
|
|
- struct vfio_region_info *fault_region_info = NULL;
|
|
- struct vfio_region_info_cap_fault *cap_fault;
|
|
- VFIODevice *vbasedev = &vdev->vbasedev;
|
|
- struct vfio_info_cap_header *hdr;
|
|
- char *fault_region_name;
|
|
- int ret;
|
|
-
|
|
- ret = vfio_get_dev_region_info(&vdev->vbasedev,
|
|
- VFIO_REGION_TYPE_NESTED,
|
|
- VFIO_REGION_SUBTYPE_NESTED_DMA_FAULT_RESPONSE,
|
|
- &fault_region_info);
|
|
- if (ret) {
|
|
- goto out;
|
|
- }
|
|
-
|
|
- hdr = vfio_get_region_info_cap(fault_region_info,
|
|
- VFIO_REGION_INFO_CAP_DMA_FAULT_RESPONSE);
|
|
- if (!hdr) {
|
|
- error_setg(errp, "failed to retrieve DMA FAULT RESPONSE capability");
|
|
- goto out;
|
|
- }
|
|
- cap_fault = container_of(hdr, struct vfio_region_info_cap_fault,
|
|
- header);
|
|
- if (cap_fault->version != 1) {
|
|
- error_setg(errp, "Unsupported DMA FAULT RESPONSE API version %d",
|
|
- cap_fault->version);
|
|
- goto out;
|
|
- }
|
|
-
|
|
- fault_region_name = g_strdup_printf("%s DMA FAULT RESPONSE %d",
|
|
- vbasedev->name,
|
|
- fault_region_info->index);
|
|
-
|
|
- ret = vfio_region_setup(OBJECT(vdev), vbasedev,
|
|
- &vdev->dma_fault_response_region,
|
|
- fault_region_info->index,
|
|
- fault_region_name);
|
|
- g_free(fault_region_name);
|
|
- if (ret) {
|
|
- error_setg_errno(errp, -ret,
|
|
- "failed to set up the DMA FAULT RESPONSE region %d",
|
|
- fault_region_info->index);
|
|
- goto out;
|
|
- }
|
|
-
|
|
- ret = vfio_region_mmap(&vdev->dma_fault_response_region);
|
|
- if (ret) {
|
|
- error_setg_errno(errp, -ret, "Failed to mmap the DMA FAULT RESPONSE queue");
|
|
- }
|
|
-out:
|
|
- g_free(fault_region_info);
|
|
-}
|
|
-
|
|
static void vfio_populate_device(VFIOPCIDevice *vdev, Error **errp)
|
|
{
|
|
VFIODevice *vbasedev = &vdev->vbasedev;
|
|
@@ -2823,12 +2768,6 @@ static void vfio_populate_device(VFIOPCIDevice *vdev, Error **errp)
|
|
return;
|
|
}
|
|
|
|
- vfio_init_fault_response_regions(vdev, &err);
|
|
- if (err) {
|
|
- error_propagate(errp, err);
|
|
- return;
|
|
- }
|
|
-
|
|
irq_info.index = VFIO_PCI_ERR_IRQ_INDEX;
|
|
|
|
ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_GET_IRQ_INFO, &irq_info);
|
|
@@ -3007,68 +2946,8 @@ static int vfio_iommu_set_pasid_table(PCIBus *bus, int32_t devfn,
|
|
return ioctl(container->fd, VFIO_IOMMU_SET_PASID_TABLE, &info);
|
|
}
|
|
|
|
-static int vfio_iommu_return_page_response(PCIBus *bus, int32_t devfn,
|
|
- IOMMUPageResponse *resp)
|
|
-{
|
|
- PCIDevice *pdev = bus->devices[devfn];
|
|
- VFIOPCIDevice *vdev = DO_UPCAST(VFIOPCIDevice, pdev, pdev);
|
|
- struct iommu_page_response *response = &resp->resp;
|
|
- struct vfio_region_dma_fault_response header;
|
|
- struct iommu_page_response *queue;
|
|
- char *queue_buffer = NULL;
|
|
- ssize_t bytes;
|
|
-
|
|
- if (!vdev->dma_fault_response_region.mem) {
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
- /* read the header */
|
|
- bytes = pread(vdev->vbasedev.fd, &header, sizeof(header),
|
|
- vdev->dma_fault_response_region.fd_offset);
|
|
- if (bytes != sizeof(header)) {
|
|
- error_report("%s unable to read the fault region header (0x%lx)",
|
|
- __func__, bytes);
|
|
- return -1;
|
|
- }
|
|
-
|
|
- /* Normally the fault queue is mmapped */
|
|
- queue = (struct iommu_page_response *)vdev->dma_fault_response_region.mmaps[0].mmap;
|
|
- if (!queue) {
|
|
- size_t queue_size = header.nb_entries * header.entry_size;
|
|
-
|
|
- error_report("%s: fault queue not mmapped: slower fault handling",
|
|
- vdev->vbasedev.name);
|
|
-
|
|
- queue_buffer = g_malloc(queue_size);
|
|
- bytes = pread(vdev->vbasedev.fd, queue_buffer, queue_size,
|
|
- vdev->dma_fault_response_region.fd_offset + header.offset);
|
|
- if (bytes != queue_size) {
|
|
- error_report("%s unable to read the fault queue (0x%lx)",
|
|
- __func__, bytes);
|
|
- return -1;
|
|
- }
|
|
-
|
|
- queue = (struct iommu_page_response *)queue_buffer;
|
|
- }
|
|
- /* deposit the new response in the queue and increment the head */
|
|
- memcpy(queue + header.head, response, header.entry_size);
|
|
-
|
|
- vdev->fault_response_head_index =
|
|
- (vdev->fault_response_head_index + 1) % header.nb_entries;
|
|
- bytes = pwrite(vdev->vbasedev.fd, &vdev->fault_response_head_index, 4,
|
|
- vdev->dma_fault_response_region.fd_offset);
|
|
- if (bytes != 4) {
|
|
- error_report("%s unable to write the fault response region head index (0x%lx)",
|
|
- __func__, bytes);
|
|
- }
|
|
- g_free(queue_buffer);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
static PCIPASIDOps vfio_pci_pasid_ops = {
|
|
.set_pasid_table = vfio_iommu_set_pasid_table,
|
|
- .return_page_response = vfio_iommu_return_page_response,
|
|
};
|
|
|
|
static void vfio_dma_fault_notifier_handler(void *opaque)
|
|
@@ -3532,7 +3411,6 @@ static void vfio_instance_finalize(Object *obj)
|
|
vfio_display_finalize(vdev);
|
|
vfio_bars_finalize(vdev);
|
|
vfio_region_finalize(&vdev->dma_fault_region);
|
|
- vfio_region_finalize(&vdev->dma_fault_response_region);
|
|
g_free(vdev->emulated_config_bits);
|
|
g_free(vdev->rom);
|
|
/*
|
|
@@ -3554,7 +3432,6 @@ static void vfio_exitfn(PCIDevice *pdev)
|
|
vfio_unregister_err_notifier(vdev);
|
|
vfio_unregister_ext_irq_notifiers(vdev);
|
|
vfio_region_exit(&vdev->dma_fault_region);
|
|
- vfio_region_exit(&vdev->dma_fault_response_region);
|
|
pci_device_set_intx_routing_notifier(&vdev->pdev, NULL);
|
|
if (vdev->irqchip_change_notifier.notify) {
|
|
kvm_irqchip_remove_change_notifier(&vdev->irqchip_change_notifier);
|
|
diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h
|
|
index 61b3bf1303..03ac8919ef 100644
|
|
--- a/hw/vfio/pci.h
|
|
+++ b/hw/vfio/pci.h
|
|
@@ -147,8 +147,6 @@ struct VFIOPCIDevice {
|
|
VFIOPCIExtIRQ *ext_irqs;
|
|
VFIORegion dma_fault_region;
|
|
uint32_t fault_tail_index;
|
|
- VFIORegion dma_fault_response_region;
|
|
- uint32_t fault_response_head_index;
|
|
int (*resetfn)(struct VFIOPCIDevice *);
|
|
uint32_t vendor_id;
|
|
uint32_t device_id;
|
|
--
|
|
2.27.0
|
|
|