From: Ian Campbell Date: Fri, 29 Jan 2016 15:20:44 +0000 (+0000) Subject: xen: use libxendevicemodel for ioreq handling X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=61a33de8f47fbbadfe0d9f6cd10a60865e110253;p=people%2Fliuw%2Flibxenctrl-split%2Fqemu-xen.git xen: use libxendevicemodel for ioreq handling As usual switch things to use the new API and add the necessary compat defines (gated on Xen>=4.5 in this case). Many of the wrappers (xen_map_io_section et al) could be inlined into their single caller now since the compat shim is effectively a layer further down now. The only practical difference would be that trace_xen_* would then be called even for Xen < 4.5 which has no ioreq servers, which is the only reason I didn't just go ahead and do this. It could be argued that this tracing is useful even with Xen 4.5 since it shows what is explicitly known about (whether it is registered with Xen or not). It is no longer necessary to check for the presence of xc_hvm_create_ioreq_server in the xen_ctrl_version=471 case in configure. Any Xen which has e.g. xenforeignmemory_open certainly has the ioreq interfaces, but checking for them would break if and when they are removed from libxc in favour of the libxendevicemodel interfaces. The check in the -lxendevicemodel case suffices to do thr right thing here. Signed-off-by: Ian Campbell --- --- diff --git a/configure b/configure index 672bea68f..4908dab9b 100755 --- a/configure +++ b/configure @@ -1997,7 +1997,6 @@ int main(void) { xc = xc_interface_open(0, 0, 0); xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0); - xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL); xc_domain_create(xc, 0, handle, 0, NULL, NULL); xfmem = xenforeignmemory_open(0, 0); @@ -2184,6 +2183,7 @@ int main(void) { xendevicemodel_shutdown(dm); xendevicemodel_set_pci_intx_level(dm, 0, 0, 0, 0, 0); xendevicemodel_populate_ram(dm, 0, 0); + xendevicemodel_create_ioreq_server(dm, 1, NULL); return 0; } EOF diff --git a/include/hw/xen/xen_common.h b/include/hw/xen/xen_common.h index 5210eccb4..86749467a 100644 --- a/include/hw/xen/xen_common.h +++ b/include/hw/xen/xen_common.h @@ -152,6 +152,28 @@ static inline int xendevicemodel_populate_ram(xendevicemodel_handle *h, #define xendevicemodel_inject_msi(h, a, d) \ xc_hvm_inject_msi(h, xen_domid, a, d) +#if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 450 + +#define xendevicemodel_create_ioreq_server(h, b, i) \ + xc_hvm_create_ioreq_server(h, xen_domid, \ + b ? HVM_IOREQSRV_BUFIOREQ_ATOMIC : HVM_IOREQSRV_BUFIOREQ_OFF, i) +#define xendevicemodel_get_ioreq_server_info(h, i, ipfn, bpfn, bprt) \ + xc_hvm_get_ioreq_server_info(h, xen_domid, i, ipfn, bpfn, bprt) +#define xendevicemodel_set_ioreq_server_state(h, i, e) \ + xc_hvm_set_ioreq_server_state(h, xen_domid, i, e) +#define xendevicemodel_map_io_range_to_ioreq_server(h, i, m, s, e) \ + xc_hvm_map_io_range_to_ioreq_server(h, xen_domid, i, m, s, e) +#define xendevicemodel_unmap_io_range_from_ioreq_server(h, i, m, s, e) \ + xc_hvm_unmap_io_range_from_ioreq_server(h, xen_domid, i, m, s, e) +#define xendevicemodel_map_pcidev_to_ioreq_server(h, i, s, b, d, f) \ + xc_hvm_map_pcidev_to_ioreq_server(h, xen_domid, i, s, b, d, f) +#define xendevicemodel_unmap_pcidev_from_ioreq_server(h, i, s, b, d, f) \ + xc_hvm_unmap_pcidev_from_ioreq_server(h, xen_domid, i, s, b, d, f) +#define xendevicemodel_destroy_ioreq_server(h, i) \ + xc_hvm_destroy_ioreq_server(h, xen_domid, i) + +#endif + #endif /* Xen before 4.6 */ @@ -174,54 +196,54 @@ static inline int xendevicemodel_populate_ram(xendevicemodel_handle *h, typedef uint16_t ioservid_t; -static inline void xen_map_memory_section(xc_interface *xc, domid_t dom, +static inline void xen_map_memory_section(xendevicemodel_handle *dm, ioservid_t ioservid, MemoryRegionSection *section) { } -static inline void xen_unmap_memory_section(xc_interface *xc, domid_t dom, +static inline void xen_unmap_memory_section(xendevicemodel_handle *dm, ioservid_t ioservid, MemoryRegionSection *section) { } -static inline void xen_map_io_section(xc_interface *xc, domid_t dom, +static inline void xen_map_io_section(xendevicemodel_handle *dm, ioservid_t ioservid, MemoryRegionSection *section) { } -static inline void xen_unmap_io_section(xc_interface *xc, domid_t dom, +static inline void xen_unmap_io_section(xendevicemodel_handle *dm, ioservid_t ioservid, MemoryRegionSection *section) { } -static inline void xen_map_pcidev(xc_interface *xc, domid_t dom, +static inline void xen_map_pcidev(xendevicemodel_handle *dm, ioservid_t ioservid, PCIDevice *pci_dev) { } -static inline void xen_unmap_pcidev(xc_interface *xc, domid_t dom, +static inline void xen_unmap_pcidev(xendevicemodel_handle *dm, ioservid_t ioservid, PCIDevice *pci_dev) { } -static inline int xen_create_ioreq_server(xc_interface *xc, domid_t dom, +static inline int xen_create_ioreq_server(xendevicemodel_handle *dm, ioservid_t *ioservid) { return 0; } -static inline void xen_destroy_ioreq_server(xc_interface *xc, domid_t dom, +static inline void xen_destroy_ioreq_server(xendevicemodel_handle *dm, ioservid_t ioservid) { } -static inline int xen_get_ioreq_server_info(xc_interface *xc, domid_t dom, +static inline int xen_get_ioreq_server_info(xendevicemodel_handle *h, ioservid_t ioservid, xen_pfn_t *ioreq_pfn, xen_pfn_t *bufioreq_pfn, @@ -230,7 +252,7 @@ static inline int xen_get_ioreq_server_info(xc_interface *xc, domid_t dom, unsigned long param; int rc; - rc = xc_get_hvm_param(xc, dom, HVM_PARAM_IOREQ_PFN, ¶m); + rc = xc_get_hvm_param(h, xen_domid, HVM_PARAM_IOREQ_PFN, ¶m); if (rc < 0) { fprintf(stderr, "failed to get HVM_PARAM_IOREQ_PFN\n"); return -1; @@ -238,7 +260,7 @@ static inline int xen_get_ioreq_server_info(xc_interface *xc, domid_t dom, *ioreq_pfn = param; - rc = xc_get_hvm_param(xc, dom, HVM_PARAM_BUFIOREQ_PFN, ¶m); + rc = xc_get_hvm_param(h, xen_domid, HVM_PARAM_BUFIOREQ_PFN, ¶m); if (rc < 0) { fprintf(stderr, "failed to get HVM_PARAM_BUFIOREQ_PFN\n"); return -1; @@ -246,7 +268,7 @@ static inline int xen_get_ioreq_server_info(xc_interface *xc, domid_t dom, *bufioreq_pfn = param; - rc = xc_get_hvm_param(xc, dom, HVM_PARAM_BUFIOREQ_EVTCHN, + rc = xc_get_hvm_param(h, xen_domid, HVM_PARAM_BUFIOREQ_EVTCHN, ¶m); if (rc < 0) { fprintf(stderr, "failed to get HVM_PARAM_BUFIOREQ_EVTCHN\n"); @@ -258,7 +280,7 @@ static inline int xen_get_ioreq_server_info(xc_interface *xc, domid_t dom, return 0; } -static inline int xen_set_ioreq_server_state(xc_interface *xc, domid_t dom, +static inline int xen_set_ioreq_server_state(xendevicemodel_handle *h, ioservid_t ioservid, bool enable) { @@ -268,7 +290,7 @@ static inline int xen_set_ioreq_server_state(xc_interface *xc, domid_t dom, /* Xen 4.5 */ #else -static inline void xen_map_memory_section(xc_interface *xc, domid_t dom, +static inline void xen_map_memory_section(xendevicemodel_handle *dm, ioservid_t ioservid, MemoryRegionSection *section) { @@ -277,11 +299,11 @@ static inline void xen_map_memory_section(xc_interface *xc, domid_t dom, hwaddr end_addr = start_addr + size - 1; trace_xen_map_mmio_range(ioservid, start_addr, end_addr); - xc_hvm_map_io_range_to_ioreq_server(xc, dom, ioservid, 1, - start_addr, end_addr); + xendevicemodel_map_io_range_to_ioreq_server(dm, ioservid, true, + start_addr, end_addr); } -static inline void xen_unmap_memory_section(xc_interface *xc, domid_t dom, +static inline void xen_unmap_memory_section(xendevicemodel_handle *dm, ioservid_t ioservid, MemoryRegionSection *section) { @@ -290,11 +312,11 @@ static inline void xen_unmap_memory_section(xc_interface *xc, domid_t dom, hwaddr end_addr = start_addr + size - 1; trace_xen_unmap_mmio_range(ioservid, start_addr, end_addr); - xc_hvm_unmap_io_range_from_ioreq_server(xc, dom, ioservid, 1, - start_addr, end_addr); + xendevicemodel_unmap_io_range_from_ioreq_server(dm, ioservid, true, + start_addr, end_addr); } -static inline void xen_map_io_section(xc_interface *xc, domid_t dom, +static inline void xen_map_io_section(xendevicemodel_handle *dm, ioservid_t ioservid, MemoryRegionSection *section) { @@ -303,11 +325,11 @@ static inline void xen_map_io_section(xc_interface *xc, domid_t dom, hwaddr end_addr = start_addr + size - 1; trace_xen_map_portio_range(ioservid, start_addr, end_addr); - xc_hvm_map_io_range_to_ioreq_server(xc, dom, ioservid, 0, - start_addr, end_addr); + xendevicemodel_map_io_range_to_ioreq_server(dm, ioservid, false, + start_addr, end_addr); } -static inline void xen_unmap_io_section(xc_interface *xc, domid_t dom, +static inline void xen_unmap_io_section(xendevicemodel_handle *dm, ioservid_t ioservid, MemoryRegionSection *section) { @@ -316,39 +338,38 @@ static inline void xen_unmap_io_section(xc_interface *xc, domid_t dom, hwaddr end_addr = start_addr + size - 1; trace_xen_unmap_portio_range(ioservid, start_addr, end_addr); - xc_hvm_unmap_io_range_from_ioreq_server(xc, dom, ioservid, 0, - start_addr, end_addr); + xendevicemodel_unmap_io_range_from_ioreq_server(dm, ioservid, false, + start_addr, end_addr); } -static inline void xen_map_pcidev(xc_interface *xc, domid_t dom, +static inline void xen_map_pcidev(xendevicemodel_handle *dm, ioservid_t ioservid, PCIDevice *pci_dev) { trace_xen_map_pcidev(ioservid, pci_bus_num(pci_dev->bus), PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn)); - xc_hvm_map_pcidev_to_ioreq_server(xc, dom, ioservid, + xendevicemodel_map_pcidev_to_ioreq_server(dm, ioservid, 0, pci_bus_num(pci_dev->bus), PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn)); } -static inline void xen_unmap_pcidev(xc_interface *xc, domid_t dom, +static inline void xen_unmap_pcidev(xendevicemodel_handle *dm, ioservid_t ioservid, PCIDevice *pci_dev) { trace_xen_unmap_pcidev(ioservid, pci_bus_num(pci_dev->bus), PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn)); - xc_hvm_unmap_pcidev_from_ioreq_server(xc, dom, ioservid, - 0, pci_bus_num(pci_dev->bus), - PCI_SLOT(pci_dev->devfn), - PCI_FUNC(pci_dev->devfn)); + xendevicemodel_unmap_pcidev_from_ioreq_server(dm, ioservid, + 0, pci_bus_num(pci_dev->bus), + PCI_SLOT(pci_dev->devfn), + PCI_FUNC(pci_dev->devfn)); } -static inline int xen_create_ioreq_server(xc_interface *xc, domid_t dom, +static inline int xen_create_ioreq_server(xendevicemodel_handle *dm, ioservid_t *ioservid) { - int rc = xc_hvm_create_ioreq_server(xc, dom, HVM_IOREQSRV_BUFIOREQ_ATOMIC, - ioservid); + int rc = xendevicemodel_create_ioreq_server(dm, true, ioservid); if (rc == 0) { trace_xen_ioreq_server_create(*ioservid); @@ -357,30 +378,30 @@ static inline int xen_create_ioreq_server(xc_interface *xc, domid_t dom, return rc; } -static inline void xen_destroy_ioreq_server(xc_interface *xc, domid_t dom, +static inline void xen_destroy_ioreq_server(xendevicemodel_handle *dm, ioservid_t ioservid) { trace_xen_ioreq_server_destroy(ioservid); - xc_hvm_destroy_ioreq_server(xc, dom, ioservid); + xendevicemodel_destroy_ioreq_server(dm, ioservid); } -static inline int xen_get_ioreq_server_info(xc_interface *xc, domid_t dom, +static inline int xen_get_ioreq_server_info(xendevicemodel_handle *dm, ioservid_t ioservid, xen_pfn_t *ioreq_pfn, xen_pfn_t *bufioreq_pfn, evtchn_port_t *bufioreq_evtchn) { - return xc_hvm_get_ioreq_server_info(xc, dom, ioservid, + return xendevicemodel_get_ioreq_server_info(dm, ioservid, ioreq_pfn, bufioreq_pfn, bufioreq_evtchn); } -static inline int xen_set_ioreq_server_state(xc_interface *xc, domid_t dom, +static inline int xen_set_ioreq_server_state(xendevicemodel_handle *dm, ioservid_t ioservid, bool enable) { trace_xen_ioreq_server_state(ioservid, enable); - return xc_hvm_set_ioreq_server_state(xc, dom, ioservid, enable); + return xendevicemodel_set_ioreq_server_state(dm, ioservid, enable); } #endif diff --git a/xen-hvm.c b/xen-hvm.c index 8c23b1608..91fb3e3ae 100644 --- a/xen-hvm.c +++ b/xen-hvm.c @@ -443,11 +443,9 @@ static void xen_set_memory(struct MemoryListener *listener, return; } else { if (add) { - xen_map_memory_section(xen_xc, xen_domid, state->ioservid, - section); + xen_map_memory_section(xen_dm, state->ioservid, section); } else { - xen_unmap_memory_section(xen_xc, xen_domid, state->ioservid, - section); + xen_unmap_memory_section(xen_dm, state->ioservid, section); } } @@ -505,7 +503,7 @@ static void xen_io_add(MemoryListener *listener, memory_region_ref(section->mr); - xen_map_io_section(xen_xc, xen_domid, state->ioservid, section); + xen_map_io_section(xen_dm, state->ioservid, section); } static void xen_io_del(MemoryListener *listener, @@ -513,7 +511,7 @@ static void xen_io_del(MemoryListener *listener, { XenIOState *state = container_of(listener, XenIOState, io_listener); - xen_unmap_io_section(xen_xc, xen_domid, state->ioservid, section); + xen_unmap_io_section(xen_dm, state->ioservid, section); memory_region_unref(section->mr); } @@ -526,7 +524,7 @@ static void xen_device_realize(DeviceListener *listener, if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) { PCIDevice *pci_dev = PCI_DEVICE(dev); - xen_map_pcidev(xen_xc, xen_domid, state->ioservid, pci_dev); + xen_map_pcidev(xen_dm, state->ioservid, pci_dev); } } @@ -538,7 +536,7 @@ static void xen_device_unrealize(DeviceListener *listener, if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) { PCIDevice *pci_dev = PCI_DEVICE(dev); - xen_unmap_pcidev(xen_xc, xen_domid, state->ioservid, pci_dev); + xen_unmap_pcidev(xen_dm, state->ioservid, pci_dev); } } @@ -1111,8 +1109,7 @@ static void xen_hvm_change_state_handler(void *opaque, int running, xen_main_loop_prepare(state); } - xen_set_ioreq_server_state(xen_xc, xen_domid, - state->ioservid, + xen_set_ioreq_server_state(xen_dm, state->ioservid, (rstate == RUN_STATE_RUNNING)); } @@ -1247,7 +1244,7 @@ void xen_hvm_init(PCMachineState *pcms, MemoryRegion **ram_memory) xen_restrict_target_failure_is_fatal("xendevicemodel", dm_restrict_errno)) goto err; - rc = xen_create_ioreq_server(xen_xc, xen_domid, &state->ioservid); + rc = xen_create_ioreq_server(xen_dm, &state->ioservid); if (rc < 0) { perror("xen: ioreq server create"); goto err; @@ -1262,7 +1259,7 @@ void xen_hvm_init(PCMachineState *pcms, MemoryRegion **ram_memory) state->wakeup.notify = xen_wakeup_notifier; qemu_register_wakeup_notifier(&state->wakeup); - rc = xen_get_ioreq_server_info(xen_xc, xen_domid, state->ioservid, + rc = xen_get_ioreq_server_info(xen_dm, state->ioservid, &ioreq_pfn, &bufioreq_pfn, &bufioreq_evtchn); if (rc < 0) { @@ -1312,7 +1309,7 @@ void xen_hvm_init(PCMachineState *pcms, MemoryRegion **ram_memory) /* Note: cpus is empty at this point in init */ state->cpu_by_vcpu_id = g_malloc0(max_cpus * sizeof(CPUState *)); - rc = xen_set_ioreq_server_state(xen_xc, xen_domid, state->ioservid, true); + rc = xen_set_ioreq_server_state(xen_dm, state->ioservid, true); if (rc < 0) { error_report("failed to enable ioreq server info: error %d handle=%p", errno, xen_xc);