Re: [Xen-devel] [PATCH v5 1/2] Differentiate IO/mem resources tracked by ioreq server
On 8/18/2015 9:25 PM, Paul Durrant wrote: -Original Message- From: Yu, Zhang [mailto:yu.c.zh...@linux.intel.com] Sent: 17 August 2015 22:34 To: Paul Durrant; xen-devel@lists.xen.org; Ian Jackson; Stefano Stabellini; Ian Campbell; Wei Liu; Keir (Xen.org); jbeul...@suse.com; Andrew Cooper Cc: Kevin Tian; zhiyuan...@intel.com Subject: Re: [Xen-devel] [PATCH v5 1/2] Differentiate IO/mem resources tracked by ioreq server On 8/14/2015 9:51 PM, Paul Durrant wrote: -Original Message- From: Yu Zhang [mailto:yu.c.zh...@linux.intel.com] Sent: 14 August 2015 13:03 To: xen-devel@lists.xen.org; Paul Durrant; Ian Jackson; Stefano Stabellini; Ian Campbell; Wei Liu; Keir (Xen.org); jbeul...@suse.com; Andrew Cooper Cc: Kevin Tian; zhiyuan...@intel.com Subject: [PATCH v5 1/2] Differentiate IO/mem resources tracked by ioreq server Currently in ioreq server, guest write-protected ram pages are tracked in the same rangeset with device mmio resources. Yet unlike device mmio, which can be in big chunks, the guest write- protected pages may be discrete ranges with 4K bytes each. This patch uses a seperate rangeset for the guest ram pages. And a new ioreq type, IOREQ_TYPE_WP_MEM, is defined. Note: Previously, a new hypercall or subop was suggested to map write-protected pages into ioreq server. However, it turned out handler of this new hypercall would be almost the same with the existing pair - HVMOP_[un]map_io_range_to_ioreq_server, and there's already a type parameter in this hypercall. So no new hypercall defined, only a new type is introduced. Signed-off-by: Yu Zhang yu.c.zh...@linux.intel.com --- tools/libxc/include/xenctrl.h| 31 ++ tools/libxc/xc_domain.c | 55 xen/arch/x86/hvm/hvm.c | 25 +- xen/include/asm-x86/hvm/domain.h | 4 +-- xen/include/public/hvm/hvm_op.h | 1 + xen/include/public/hvm/ioreq.h | 1 + 6 files changed, 114 insertions(+), 3 deletions(-) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index de3c0ad..3c276b7 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2010,6 +2010,37 @@ int xc_hvm_unmap_io_range_from_ioreq_server(xc_interface *xch, int is_mmio, uint64_t start, uint64_t end); +/** + * This function registers a range of write-protected memory for emulation. + * + * @parm xch a handle to an open hypervisor interface. + * @parm domid the domain id to be serviced + * @parm id the IOREQ Server id. + * @parm start start of range + * @parm end end of range (inclusive). + * @return 0 on success, -1 on failure. + */ +int xc_hvm_map_mem_range_to_ioreq_server(xc_interface *xch, +domid_t domid, +ioservid_t id, +xen_pfn_t start, +xen_pfn_t end); + +/** + * This function deregisters a range of write-protected memory for emulation. + * + * @parm xch a handle to an open hypervisor interface. + * @parm domid the domain id to be serviced + * @parm id the IOREQ Server id. + * @parm start start of range + * @parm end end of range (inclusive). + * @return 0 on success, -1 on failure. + */ +int xc_hvm_unmap_mem_range_from_ioreq_server(xc_interface *xch, +domid_t domid, +ioservid_t id, +xen_pfn_t start, +xen_pfn_t end); /** * This function registers a PCI device for config space emulation. diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index 2ee26fb..9db05b3 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -1552,6 +1552,61 @@ int xc_hvm_unmap_io_range_from_ioreq_server(xc_interface *xch, domid_t domid, return rc; } +int xc_hvm_map_mem_range_to_ioreq_server(xc_interface *xch, domid_t domid, +ioservid_t id, xen_pfn_t start, xen_pfn_t end) +{ +DECLARE_HYPERCALL; +DECLARE_HYPERCALL_BUFFER(xen_hvm_io_range_t, arg); +int rc; + +arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg)); +if ( arg == NULL ) +return -1; + +hypercall.op = __HYPERVISOR_hvm_op; +hypercall.arg[0] = HVMOP_map_io_range_to_ioreq_server; +hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + +arg-domid = domid; +arg-id = id; +arg-type = HVMOP_IO_RANGE_WP_MEM; +arg-start = start; +arg-end = end; + +rc = do_xen_hypercall(xch, hypercall); + +xc_hypercall_buffer_free(xch, arg); +return rc; +} + +int xc_hvm_unmap_mem_range_from_ioreq_server(xc_interface *xch, domid_t domid
Re: [Xen-devel] [PATCH v5 1/2] Differentiate IO/mem resources tracked by ioreq server
On 8/14/2015 9:51 PM, Paul Durrant wrote: -Original Message- From: Yu Zhang [mailto:yu.c.zh...@linux.intel.com] Sent: 14 August 2015 13:03 To: xen-devel@lists.xen.org; Paul Durrant; Ian Jackson; Stefano Stabellini; Ian Campbell; Wei Liu; Keir (Xen.org); jbeul...@suse.com; Andrew Cooper Cc: Kevin Tian; zhiyuan...@intel.com Subject: [PATCH v5 1/2] Differentiate IO/mem resources tracked by ioreq server Currently in ioreq server, guest write-protected ram pages are tracked in the same rangeset with device mmio resources. Yet unlike device mmio, which can be in big chunks, the guest write- protected pages may be discrete ranges with 4K bytes each. This patch uses a seperate rangeset for the guest ram pages. And a new ioreq type, IOREQ_TYPE_WP_MEM, is defined. Note: Previously, a new hypercall or subop was suggested to map write-protected pages into ioreq server. However, it turned out handler of this new hypercall would be almost the same with the existing pair - HVMOP_[un]map_io_range_to_ioreq_server, and there's already a type parameter in this hypercall. So no new hypercall defined, only a new type is introduced. Signed-off-by: Yu Zhang yu.c.zh...@linux.intel.com --- tools/libxc/include/xenctrl.h| 31 ++ tools/libxc/xc_domain.c | 55 xen/arch/x86/hvm/hvm.c | 25 +- xen/include/asm-x86/hvm/domain.h | 4 +-- xen/include/public/hvm/hvm_op.h | 1 + xen/include/public/hvm/ioreq.h | 1 + 6 files changed, 114 insertions(+), 3 deletions(-) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index de3c0ad..3c276b7 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2010,6 +2010,37 @@ int xc_hvm_unmap_io_range_from_ioreq_server(xc_interface *xch, int is_mmio, uint64_t start, uint64_t end); +/** + * This function registers a range of write-protected memory for emulation. + * + * @parm xch a handle to an open hypervisor interface. + * @parm domid the domain id to be serviced + * @parm id the IOREQ Server id. + * @parm start start of range + * @parm end end of range (inclusive). + * @return 0 on success, -1 on failure. + */ +int xc_hvm_map_mem_range_to_ioreq_server(xc_interface *xch, +domid_t domid, +ioservid_t id, +xen_pfn_t start, +xen_pfn_t end); + +/** + * This function deregisters a range of write-protected memory for emulation. + * + * @parm xch a handle to an open hypervisor interface. + * @parm domid the domain id to be serviced + * @parm id the IOREQ Server id. + * @parm start start of range + * @parm end end of range (inclusive). + * @return 0 on success, -1 on failure. + */ +int xc_hvm_unmap_mem_range_from_ioreq_server(xc_interface *xch, +domid_t domid, +ioservid_t id, +xen_pfn_t start, +xen_pfn_t end); /** * This function registers a PCI device for config space emulation. diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index 2ee26fb..9db05b3 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -1552,6 +1552,61 @@ int xc_hvm_unmap_io_range_from_ioreq_server(xc_interface *xch, domid_t domid, return rc; } +int xc_hvm_map_mem_range_to_ioreq_server(xc_interface *xch, domid_t domid, +ioservid_t id, xen_pfn_t start, xen_pfn_t end) +{ +DECLARE_HYPERCALL; +DECLARE_HYPERCALL_BUFFER(xen_hvm_io_range_t, arg); +int rc; + +arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg)); +if ( arg == NULL ) +return -1; + +hypercall.op = __HYPERVISOR_hvm_op; +hypercall.arg[0] = HVMOP_map_io_range_to_ioreq_server; +hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + +arg-domid = domid; +arg-id = id; +arg-type = HVMOP_IO_RANGE_WP_MEM; +arg-start = start; +arg-end = end; + +rc = do_xen_hypercall(xch, hypercall); + +xc_hypercall_buffer_free(xch, arg); +return rc; +} + +int xc_hvm_unmap_mem_range_from_ioreq_server(xc_interface *xch, domid_t domid, +ioservid_t id, xen_pfn_t start, xen_pfn_t end) +{ +DECLARE_HYPERCALL; +DECLARE_HYPERCALL_BUFFER(xen_hvm_io_range_t, arg); +int rc; + +arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg)); +if ( arg == NULL ) +return -1; + +hypercall.op = __HYPERVISOR_hvm_op; +hypercall.arg[0] = HVMOP_unmap_io_range_from_ioreq_server; +hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + +arg-domid = domid; +
[Xen-devel] [PATCH v5 1/2] Differentiate IO/mem resources tracked by ioreq server
Currently in ioreq server, guest write-protected ram pages are tracked in the same rangeset with device mmio resources. Yet unlike device mmio, which can be in big chunks, the guest write- protected pages may be discrete ranges with 4K bytes each. This patch uses a seperate rangeset for the guest ram pages. And a new ioreq type, IOREQ_TYPE_WP_MEM, is defined. Note: Previously, a new hypercall or subop was suggested to map write-protected pages into ioreq server. However, it turned out handler of this new hypercall would be almost the same with the existing pair - HVMOP_[un]map_io_range_to_ioreq_server, and there's already a type parameter in this hypercall. So no new hypercall defined, only a new type is introduced. Signed-off-by: Yu Zhang yu.c.zh...@linux.intel.com --- tools/libxc/include/xenctrl.h| 31 ++ tools/libxc/xc_domain.c | 55 xen/arch/x86/hvm/hvm.c | 25 +- xen/include/asm-x86/hvm/domain.h | 4 +-- xen/include/public/hvm/hvm_op.h | 1 + xen/include/public/hvm/ioreq.h | 1 + 6 files changed, 114 insertions(+), 3 deletions(-) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index de3c0ad..3c276b7 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2010,6 +2010,37 @@ int xc_hvm_unmap_io_range_from_ioreq_server(xc_interface *xch, int is_mmio, uint64_t start, uint64_t end); +/** + * This function registers a range of write-protected memory for emulation. + * + * @parm xch a handle to an open hypervisor interface. + * @parm domid the domain id to be serviced + * @parm id the IOREQ Server id. + * @parm start start of range + * @parm end end of range (inclusive). + * @return 0 on success, -1 on failure. + */ +int xc_hvm_map_mem_range_to_ioreq_server(xc_interface *xch, +domid_t domid, +ioservid_t id, +xen_pfn_t start, +xen_pfn_t end); + +/** + * This function deregisters a range of write-protected memory for emulation. + * + * @parm xch a handle to an open hypervisor interface. + * @parm domid the domain id to be serviced + * @parm id the IOREQ Server id. + * @parm start start of range + * @parm end end of range (inclusive). + * @return 0 on success, -1 on failure. + */ +int xc_hvm_unmap_mem_range_from_ioreq_server(xc_interface *xch, +domid_t domid, +ioservid_t id, +xen_pfn_t start, +xen_pfn_t end); /** * This function registers a PCI device for config space emulation. diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index 2ee26fb..9db05b3 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -1552,6 +1552,61 @@ int xc_hvm_unmap_io_range_from_ioreq_server(xc_interface *xch, domid_t domid, return rc; } +int xc_hvm_map_mem_range_to_ioreq_server(xc_interface *xch, domid_t domid, +ioservid_t id, xen_pfn_t start, xen_pfn_t end) +{ +DECLARE_HYPERCALL; +DECLARE_HYPERCALL_BUFFER(xen_hvm_io_range_t, arg); +int rc; + +arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg)); +if ( arg == NULL ) +return -1; + +hypercall.op = __HYPERVISOR_hvm_op; +hypercall.arg[0] = HVMOP_map_io_range_to_ioreq_server; +hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + +arg-domid = domid; +arg-id = id; +arg-type = HVMOP_IO_RANGE_WP_MEM; +arg-start = start; +arg-end = end; + +rc = do_xen_hypercall(xch, hypercall); + +xc_hypercall_buffer_free(xch, arg); +return rc; +} + +int xc_hvm_unmap_mem_range_from_ioreq_server(xc_interface *xch, domid_t domid, +ioservid_t id, xen_pfn_t start, xen_pfn_t end) +{ +DECLARE_HYPERCALL; +DECLARE_HYPERCALL_BUFFER(xen_hvm_io_range_t, arg); +int rc; + +arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg)); +if ( arg == NULL ) +return -1; + +hypercall.op = __HYPERVISOR_hvm_op; +hypercall.arg[0] = HVMOP_unmap_io_range_from_ioreq_server; +hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + +arg-domid = domid; +arg-id = id; +arg-type = HVMOP_IO_RANGE_WP_MEM; +arg-start = start; +arg-end = end; + +rc = do_xen_hypercall(xch, hypercall); + +xc_hypercall_buffer_free(xch, arg); +return rc; + +} + int xc_hvm_map_pcidev_to_ioreq_server(xc_interface *xch, domid_t domid, ioservid_t id, uint16_t segment, uint8_t bus, uint8_t device, diff