Begin to disentangle libxenctrl and provide some stable libraries
Subsystems (2)
PATCH v4 1/1 Begin to disentangle libxenctrl and provide some stable libraries
In <[email protected]> I proposed stabilising some parts of the libxenctrl API/ABI by disaggregating into separate libraries.
This is v5 of that set of series against:
xen
qemu-xen
qemu-xen-traditional
mini-os
NB: Samuel+minios-devel will only get the mini-os side and Stefano+qemu -devel the qemu-xen side.
The code for all repos can be found in:
git://xenbits.xen.org/people/ianc/libxenctrl-split/xen.git v5git://xenbits.xen.org/people/ianc/libxenctrl-split/qemu-xen.git v5git://xenbits.xen.org/people/ianc/libxenctrl-split/qemu-xen-traditional.git v5git://xenbits.xen.org/people/ianc/libxenctrl-split/mini-os.git v5
The tip of the xen.git branch contains an extra patch hacking Config.mk to point to all the others above, which should get the correct things for the HEAD of the branch, but not further back in time.
The new libraries here are:
* libxentoollog: Common logging infrastructure
* libxenevtchn: Userspace access to evtchns (via /dev/xen/evtchn etc)
* libxengnttab: Userspace access to grant tables (via /dev/xen/gnt??? etc)
* libxencall: Making hypercalls (i.e. the IOCTL_PRIVCMD_HYPERCALL type functionality)
* libxenforeignmemory: Privileged mappings of foreign memory (IOCTL_PRIVCMD_MMAP et al)
The first three were actually pretty distinct within libxenctrl already and have not changed in quite some time.
Although the other two are somewhat new they are based on top of long standing stable ioctls, which gives me some confidence.
Nonetheless I would appreciate extra review of at least the interface headers of all of these with a particular eye to the suitability of these interfaces being maintained in an ABI (_B_, not _P_) stable way going forward.
Still to come would be libraries for specific out of tree purposes (device model, kexec), which would be adding new library at the same level as libxc I think, rather than underneath, i.e. also using the libraries split out here, but hopefully not libxenctrl itself.
The new libraries use linker version-scripts to hopefully make future ABI changes be possible in a compatible way.
Since last time:
* xen.git now has a substantial number of acks
* mini-os side is now completely acked
* qemu-xen is little over half acked/reviewed, and the rest are updated based on feedback.
* qemu-xen-traditional one patch acked
The whole thing has been build tested on Linux (incl stubdoms), and on FreeBSD. I have runtime on Linux with qemu-xen, qemu-xen-trad and stubdoms.
Neither NetBSD nor Solaris have been tested at all. It's certainly not impossible that I've not got the #includes in the new files quite right.
http://xenbits.xen.org/people/ianc/libxenctrl-split/v5.html is the document I've been using to try and track what I'm doing. It may not be all that useful. The history of it is in the v5-with-doc branch of the xen.git linked to above.
I propose that these precursors (and the corresponding qemu-xen-traditional
+ mini-os patches) should go in now:
tools/Rules.mk: Properly handle libraries with recursive dependencies.
tools: Refactor "xentoollog" into its own library
I believe all the relevant/related patches are acked and this would make a (small) dent in the set of things to keep in the air.
Ian.
_______________________________________________
Minios-devel mailing list
[email protected]
http://lists.xenproject.org/cgi-bin/mailman/listinfo/minios-devel
_______________________________________________
Minios-devel mailing list
[email protected]
http://lists.xenproject.org/cgi-bin/mailman/listinfo/minios-devel
v5 cover Begin to disentangle libxenctrl and provide some stable libraries
We intend to stabilise some parts of the libxenctrl interface by splitting out some functionality into separate stable libraries.
This is the xen part of the first phase of that change.
This mail is (or is intended to be) a reply to a "0/<VARIOUS>" super-intro mail covering all of the related patch series and which contains more details.
Ian Campbell (23):
tools/Rules.mk: Properly handle libraries with recursive dependencies.
tools: Refactor "xentoollog" into its own library tools/libxc: Remove osdep indirection for xc_evtchn
tools: Refactor /dev/xen/evtchn wrappers into libxenevtchn.
tools: Arrange to check public headers for ANSI compatiblity tools/libxc: Remove osdep indirection for xc_gnt{shr,tab}
tools: Refactor /dev/xen/gnt{dev,shr} wrappers into libxengnttab. tools/libxc: Remove osdep indirection for privcmd
tools: Refactor hypercall calling wrappers into libxencall. tools/libxc: drop xc_map_foreign_bulk_compat wrappers
tools: Remove xc_map_foreign_batch
tools: Implement xc_map_foreign_range(s) in terms of common helper
tools: Refactor foreign memory mapping into libxenforeignmemory
tools: foreignmemory: provide xenforeignmemory_unmap.
foreignmemory: use size_t for size arguments. tools/libs/evtchn: Review and update doc comments. tools/libs: Clean up hard tabs.
tools/libs/gnttab: Review and update doc comments. tools/libs/call: Update some log messages to not refer to xc. tools/libs/call: Avoid xc_memalign in netbsd and solaris backends tools/libs/foreignmemory: Mention restrictions on fork in docs.
tools: Update CFLAGS for qemu-xen to allow it to use new libraries
HACK: Update Config.mk to pull all the right bits from my xenbits
trees
.gitignore | 10 +
Config.mk | 20 +-
config/FreeBSD.mk | 2 -
config/NetBSD.mk | 3 -
config/NetBSDRump.mk | 1 -
config/StdGNU.mk | 1 -
config/SunOS.mk | 1 -
stubdom/Makefile | 92 ++-
stubdom/grub/Makefile | 1 +
tools/Makefile | 18 +-
tools/Rules.mk | 124 ++-
tools/console/Makefile | 3 +-
tools/console/daemon/io.c | 64 +-
tools/console/daemon/utils.c | 1 -
tools/console/daemon/utils.h | 1 +
tools/libs/Makefile | 11 +
tools/libs/call/Makefile | 67 ++
tools/libs/call/buffer.c | 192 +++++
tools/libs/call/core.c | 147 ++++
tools/libs/call/freebsd.c | 140 ++++
tools/libs/call/include/xencall.h | 84 ++
tools/libs/call/libxencall.map | 19 +
tools/libs/call/linux.c | 132 +++
tools/libs/call/minios.c | 81 ++
tools/libs/call/netbsd.c | 121 +++
tools/libs/call/private.h | 68 ++
tools/libs/call/solaris.c | 97 +++
tools/libs/evtchn/Makefile | 67 ++
tools/libs/evtchn/core.c | 72 ++
tools/libs/evtchn/freebsd.c | 138 ++++
tools/libs/evtchn/include/xenevtchn.h | 148 ++++
tools/libs/evtchn/libxenevtchn.map | 14 +
tools/libs/evtchn/linux.c | 136 ++++
tools/libs/evtchn/minios.c | 266 ++++++
tools/libs/evtchn/netbsd.c | 147 ++++
tools/libs/evtchn/private.h | 25 +
tools/libs/evtchn/solaris.c | 135 ++++
tools/libs/foreignmemory/Makefile | 67 ++
tools/libs/foreignmemory/compat.c | 72 ++
tools/libs/foreignmemory/core.c | 71 ++
tools/libs/foreignmemory/freebsd.c | 135 ++++
.../libs/foreignmemory/include/xenforeignmemory.h | 79 ++
tools/libs/foreignmemory/libxenforeignmemory.map | 8 +
tools/libs/foreignmemory/linux.c | 294 +++++++
tools/libs/foreignmemory/minios.c | 68 ++
tools/libs/foreignmemory/netbsd.c | 111 +++
tools/libs/foreignmemory/private.h | 47 ++
tools/libs/foreignmemory/solaris.c | 109 +++
tools/libs/gnttab/Makefile | 69 ++
tools/libs/gnttab/gntshr_core.c | 95 +++
tools/libs/gnttab/gntshr_unimp.c | 62 ++
tools/libs/gnttab/gnttab_core.c | 124 +++
tools/libs/gnttab/gnttab_unimp.c | 89 ++
tools/libs/gnttab/include/xengnttab.h | 219 +++++
tools/libs/gnttab/libxengnttab.map | 23 +
tools/libs/gnttab/linux.c | 329 ++++++++
tools/libs/gnttab/minios.c | 117 +++
tools/libs/gnttab/private.h | 47 ++
tools/libs/toollog/Makefile | 62 ++
tools/{libxc => libs/toollog}/include/xentoollog.h | 10 +
tools/libs/toollog/libxentoollog.map | 12 +
tools/{libxc => libs/toollog}/xtl_core.c | 10 +
tools/{libxc => libs/toollog}/xtl_logger_stdio.c | 12 +-
tools/libvchan/Makefile | 8 +-
tools/libvchan/init.c | 44 +-
tools/libvchan/io.c | 20 +-
tools/libvchan/libxenvchan.h | 9 +-
tools/libxc/Makefile | 44 +-
tools/libxc/include/xenctrl.h | 312 +------
tools/libxc/include/xenctrl_compat.h | 132 +++
tools/libxc/include/xenctrlosdep.h | 172 ----
tools/libxc/include/xenguest.h | 14 +-
tools/libxc/xc_altp2m.c | 64 +-
tools/libxc/xc_domain.c | 105 +--
tools/libxc/xc_evtchn.c | 54 +-
tools/libxc/xc_evtchn_compat.c | 75 ++
tools/libxc/xc_flask.c | 8 +-
tools/libxc/xc_foreign_memory.c | 99 +--
tools/libxc/xc_freebsd_osdep.c | 407 ----------
tools/libxc/xc_gnttab.c | 93 +--
tools/libxc/xc_gnttab_compat.c | 111 +++
tools/libxc/xc_hcall_buf.c | 138 +---
tools/libxc/xc_kexec.c | 36 +-
tools/libxc/xc_linux_osdep.c | 898 ---------------------
tools/libxc/xc_minios.c | 482 -----------
tools/libxc/xc_misc.c | 79 +-
tools/libxc/xc_netbsd.c | 345 --------
tools/libxc/xc_private.c | 277 +------
tools/libxc/xc_private.h | 105 +--
tools/libxc/xc_solaris.c | 305 -------
tools/libxc/xc_sr_restore.c | 6 +-
tools/libxc/xc_sr_save.c | 6 +-
tools/libxc/xc_suspend.c | 18 +-
tools/libxc/xc_tmem.c | 7 +-
tools/libxc/xc_vm_event.c | 29 +-
tools/libxc/xenctrl_osdep_ENOSYS.c | 210 -----
tools/libxc/xg_private.h | 3 +-
tools/libxl/Makefile | 18 +-
tools/libxl/libxl.c | 2 +-
tools/libxl/libxl_dom_suspend.c | 4 +-
tools/libxl/libxl_event.c | 14 +-
tools/libxl/libxl_internal.h | 6 +-
tools/misc/Makefile | 11 +-
tools/misc/xen-hptool.c | 13 +-
tools/misc/xen-lowmemd.c | 15 +-
tools/misc/xen-mfndump.c | 1 +
tools/ocaml/Makefile.rules | 26 +-
tools/ocaml/libs/eventchn/Makefile | 4 +-
tools/ocaml/libs/eventchn/xeneventchn_stubs.c | 20 +-
tools/ocaml/libs/xc/xenctrl.ml | 2 -
tools/ocaml/libs/xc/xenctrl.mli | 1 -
tools/ocaml/libs/xc/xenctrl_stubs.c | 8 +-
tools/ocaml/libs/xentoollog/Makefile | 6 +-
tools/ocaml/libs/xentoollog/genlevels.py | 2 +-
tools/ocaml/xenstored/domains.ml | 6 +-
tools/ocaml/xenstored/xenstored.ml | 5 +-
tools/python/setup.py | 10 +-
tools/python/xen/lowlevel/xc/xc.c | 2 +-
tools/tests/xen-access/xen-access.c | 2 +-
tools/xcutils/Makefile | 4 +-
tools/xenmon/Makefile | 2 +
tools/xenmon/xenbaked.c | 33 +-
tools/xenpaging/Makefile | 4 +-
tools/xenpaging/pagein.c | 5 +-
tools/xenpaging/xenpaging.c | 31 +-
tools/xenpaging/xenpaging.h | 5 +-
tools/xenstore/Makefile | 7 +-
tools/xenstore/xenstored_core.c | 7 +-
tools/xenstore/xenstored_core.h | 5 +-
tools/xenstore/xenstored_domain.c | 49 +-
tools/xenstore/xenstored_minios.c | 5 +-
tools/xentrace/Makefile | 5 +-
tools/xentrace/xenctx.c | 3 +-
tools/xentrace/xentrace.c | 24 +-
134 files changed, 5777 insertions(+), 4295 deletions(-)
create mode 100644 tools/libs/Makefile
create mode 100644 tools/libs/call/Makefile
create mode 100644 tools/libs/call/buffer.c
create mode 100644 tools/libs/call/core.c
create mode 100644 tools/libs/call/freebsd.c
create mode 100644 tools/libs/call/include/xencall.h
create mode 100644 tools/libs/call/libxencall.map
create mode 100644 tools/libs/call/linux.c
create mode 100644 tools/libs/call/minios.c
create mode 100644 tools/libs/call/netbsd.c
create mode 100644 tools/libs/call/private.h
create mode 100644 tools/libs/call/solaris.c
create mode 100644 tools/libs/evtchn/Makefile
create mode 100644 tools/libs/evtchn/core.c
create mode 100644 tools/libs/evtchn/freebsd.c
create mode 100644 tools/libs/evtchn/include/xenevtchn.h
create mode 100644 tools/libs/evtchn/libxenevtchn.map
create mode 100644 tools/libs/evtchn/linux.c
create mode 100644 tools/libs/evtchn/minios.c
create mode 100644 tools/libs/evtchn/netbsd.c
create mode 100644 tools/libs/evtchn/private.h
create mode 100644 tools/libs/evtchn/solaris.c
create mode 100644 tools/libs/foreignmemory/Makefile
create mode 100644 tools/libs/foreignmemory/compat.c
create mode 100644 tools/libs/foreignmemory/core.c
create mode 100644 tools/libs/foreignmemory/freebsd.c
create mode 100644 tools/libs/foreignmemory/include/xenforeignmemory.h
create mode 100644 tools/libs/foreignmemory/libxenforeignmemory.map
create mode 100644 tools/libs/foreignmemory/linux.c
create mode 100644 tools/libs/foreignmemory/minios.c
create mode 100644 tools/libs/foreignmemory/netbsd.c
create mode 100644 tools/libs/foreignmemory/private.h
create mode 100644 tools/libs/foreignmemory/solaris.c
create mode 100644 tools/libs/gnttab/Makefile
create mode 100644 tools/libs/gnttab/gntshr_core.c
create mode 100644 tools/libs/gnttab/gntshr_unimp.c
create mode 100644 tools/libs/gnttab/gnttab_core.c
create mode 100644 tools/libs/gnttab/gnttab_unimp.c
create mode 100644 tools/libs/gnttab/include/xengnttab.h
create mode 100644 tools/libs/gnttab/libxengnttab.map
create mode 100644 tools/libs/gnttab/linux.c
create mode 100644 tools/libs/gnttab/minios.c
create mode 100644 tools/libs/gnttab/private.h
create mode 100644 tools/libs/toollog/Makefile
rename tools/{libxc => libs/toollog}/include/xentoollog.h (97%)
create mode 100644 tools/libs/toollog/libxentoollog.map
rename tools/{libxc => libs/toollog}/xtl_core.c (95%)
rename tools/{libxc => libs/toollog}/xtl_logger_stdio.c (97%)
create mode 100644 tools/libxc/include/xenctrl_compat.h
delete mode 100644 tools/libxc/include/xenctrlosdep.h
create mode 100644 tools/libxc/xc_evtchn_compat.c
delete mode 100644 tools/libxc/xc_freebsd_osdep.c
create mode 100644 tools/libxc/xc_gnttab_compat.c
delete mode 100644 tools/libxc/xc_linux_osdep.c
delete mode 100644 tools/libxc/xenctrl_osdep_ENOSYS.cSignature · 1 line
2.1.4
PATCH v5 1/23 tools/Rules.mk: Properly handle libraries with recursive dependencies.
In tree libraries which link against other in tree libraries in a way which is opaque to their callers need special handling, specifically correct use of -Wl,-rpath-link for the recusively used libraries.
Currently this is rather simple, but up coming changes are going to introduce transitive dependencies more than 1 step deep.
Introduce a SHDEPS idiom to contain all the recursive deps for a library and include those in both LDLIBS (for linking) and SHLIB (for recursive uses).
Try and document the whole thing.
---
v5: Handled rebase over removal of stray L in rpath-link.
v4: Unmanged description of libbaz.
--- tools/Rules.mk | 74 ++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 12 deletions(-)
tools/Rules.mk +62 -12
@@ -34,25 +34,72 @@ INSTALL_SHLIB = : install-shlib-unsupported-fail SYMLINK_SHLIB = : symlink-shlib-unsupported-fail endif +# Compiling and linking against in tree libraries. +# +# In order to compile and link against an in-tree library various +# cpp/compiler/linker options are required. +# +# For example consider a library "libfoo" which itself uses two other +# libraries: +# libbar - whose use is entirely internal to libfoo and not exposed +# to users of libfoo at all. +# libbaz - whose use is entirely internal to libfoo but libfoo's +# public headers include one or more of libbaz's +# public headers. Users of libfoo are therefore transitively +# using libbaz's header but not linking against libbaz. +# +# SHDEPS_libfoo: Flags for linking recursive dependencies of +# libfoo. Must contain SHLIB for every library which +# libfoo links against. So must contain both +# $(SHLIB_libbar) and $(SHLIB_libbaz). +# +# SHLIB_libfoo: Flags for recursively linking against libfoo. Must +# contains SHDEPS_libfoo and: +# -Wl,-rpath-link=<directory containing libfoo.so> +# +# CFLAGS_libfoo: Flags for compiling against libfoo. Must add the +# directories containing libfoo's headers to the +# include path. Must recursively include +# $(CFLAGS_libbaz), to satisfy the transitive inclusion +# of the headers but not $(CFLAGS_libbar) since none of +# libbar's headers are required to build against +# libfoo. +# +# LDLIBS_libfoo: Flags for linking against libfoo. Must contain +# $(SHDEPS_libfoo) and the path to libfoo.so +# +# Consumers of libfoo should include $(CFLAGS_libfoo) and +# $(LDLIBS_libfoo) in their appropriate directories. They should not +# include any CFLAGS or LDLIBS relating to libbar or libbaz unless +# they use those libraries directly (not via libfoo) too. +# +# Consumers of libfoo should not directly use $(SHDEPS_libfoo) or +# $(SHLIB_libfoo) + CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_xeninclude) +SHDEPS_libxenctrl = LDLIBS_libxenctrl = $(XEN_LIBXC)/libxenctrl$(libextension) SHLIB_libxenctrl = -Wl,-rpath-link=$(XEN_LIBXC) CFLAGS_libxenguest = -I$(XEN_LIBXC)/include $(CFLAGS_xeninclude) -LDLIBS_libxenguest = $(XEN_LIBXC)/libxenguest$(libextension) -SHLIB_libxenguest = -Wl,-rpath-link=$(XEN_LIBXC) +SHDEPS_libxenguest = +LDLIBS_libxenguest = $(SHDEPS_libxenguest) $(XEN_LIBXC)/libxenguest$(libextension) +SHLIB_libxenguest = $(SHDEPS_libxenguest) -Wl,-rpath-link=$(XEN_LIBXC) CFLAGS_libxenstore = -I$(XEN_XENSTORE)/include $(CFLAGS_xeninclude) -LDLIBS_libxenstore = $(XEN_XENSTORE)/libxenstore$(libextension) -SHLIB_libxenstore = -Wl,-rpath-link=$(XEN_XENSTORE) +SHDEPS_libxenstore = +LDLIBS_libxenstore = $(SHDEPS_libxenguest) $(XEN_XENSTORE)/libxenstore$(libextension) +SHLIB_libxenstore = $(SHDEPS_libxenguest) -Wl,-rpath-link=$(XEN_XENSTORE) CFLAGS_libxenstat = -I$(XEN_LIBXENSTAT) -LDLIBS_libxenstat = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBXENSTAT)/libxenstat$(libextension) -SHLIB_libxenstat = -Wl,-rpath-link=$(XEN_LIBXENSTAT) +SHDEPS_libxenstat = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) +LDLIBS_libxenstat = $(SHDEPS_libxenstat) $(XEN_LIBXENSTAT)/libxenstat$(libextension) +SHLIB_libxenstat = $(SHDEPS_libxenstat) -Wl,-rpath-link=$(XEN_LIBXENSTAT) CFLAGS_libxenvchan = -I$(XEN_LIBVCHAN) -LDLIBS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBVCHAN)/libxenvchan$(libextension) -SHLIB_libxenvchan = -Wl,-rpath-link=$(XEN_LIBVCHAN) +SHDEPS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) +LDLIBS_libxenvchan = $(SHDEPS_libxenvchan) $(XEN_LIBVCHAN)/libxenvchan$(libextension) +SHLIB_libxenvchan = $(SHDEPS_libxenvchan) -Wl,-rpath-link=$(XEN_LIBVCHAN) ifeq ($(debug),y) # Disable optimizations and enable debugging information for macros
@@ -65,17 +112,20 @@ LIBXL_BLKTAP ?= $(CONFIG_BLKTAP2) ifeq ($(LIBXL_BLKTAP),y) CFLAGS_libblktapctl = -I$(XEN_BLKTAP2)/control -I$(XEN_BLKTAP2)/include $(CFLAGS_xeninclude) -LDLIBS_libblktapctl = $(XEN_BLKTAP2)/control/libblktapctl$(libextension) -SHLIB_libblktapctl = -Wl,-rpath-link=$(XEN_BLKTAP2)/control +SHDEPS_libblktapctl = +LDLIBS_libblktapctl = $(SHDEPS_libblktapctl) $(XEN_BLKTAP2)/control/libblktapctl$(libextension) +SHLIB_libblktapctl = $(SHDEPS_libblktapctl) -Wl,-rpath-link=$(XEN_BLKTAP2)/control else CFLAGS_libblktapctl = +SHDEPS_libblktapctl = LDLIBS_libblktapctl = SHLIB_libblktapctl = endif CFLAGS_libxenlight = -I$(XEN_XENLIGHT) $(CFLAGS_libxenctrl) $(CFLAGS_xeninclude) -LDLIBS_libxenlight = $(XEN_XENLIGHT)/libxenlight$(libextension) $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libblktapctl) -SHLIB_libxenlight = -Wl,-rpath-link=$(XEN_XENLIGHT) +SHDEPS_libxenlight = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libblktapctl) +LDLIBS_libxenlight = $(SHDEPS_libxenlight) $(XEN_XENLIGHT)/libxenlight$(libextension) +SHLIB_libxenlight = $(SHDEPS_libxenlight) -Wl,-rpath-link=$(XEN_XENLIGHT) CFLAGS += -D__XEN_TOOLS__
Signature · 1 line
2.1.4
PATCH v5 2/23 tools: Refactor "xentoollog" into its own library
In reply to Ian CampbellIn attempting to disaggregate libxenctrl I found that many of the pieces were going to want access to this library, so split it out (as it probably should always have been).
Various build adjustments are needed. In particular things which use xtl_* themselves now need to explicity link against the library.
This has a nice side effect which is that users of libxl no longer need to link against libxenctrl just to create a logger, which was counter to the principal that applications using libxl shouldn't be required to look behind the curtain. This means that xl no longer links against libxenctrl.
The new library uses a version script to ensure that only expected symbols are exported and to version them such that ABI guarantees can be kept in the future.
---
Must be applied with:
- "qemu-xen-traditional: Use xentoollog as a separate library" and a corresponding QEMU_TAG update folded here.
- "mini-os: Include libxentoollog with libxc" and a corresponding bump to MINIOS_UPSTREAM_REVISION folded in here.
v2: Update doc at same time
v3: Move into tools/libs/toollog.
---
.gitignore | 1 +
stubdom/Makefile | 24 ++++++++-
stubdom/grub/Makefile | 1 +
tools/Makefile | 3 ++
tools/Rules.mk | 14 +++--
tools/libs/Makefile | 7 +++
tools/libs/toollog/Makefile | 59 ++++++++++++++++++++++
tools/{libxc => libs/toollog}/include/xentoollog.h | 0
tools/libs/toollog/libxentoollog.map | 12 +++++
tools/{libxc => libs/toollog}/xtl_core.c | 0
tools/{libxc => libs/toollog}/xtl_logger_stdio.c | 0
tools/libxc/Makefile | 7 ++-
tools/libxl/Makefile | 15 +++---
tools/ocaml/Makefile.rules | 26 +++++-----
tools/ocaml/libs/xentoollog/Makefile | 6 +--
tools/ocaml/libs/xentoollog/genlevels.py | 2 +-
tools/python/setup.py | 5 +-
tools/xenpaging/Makefile | 2 +-
18 files changed, 148 insertions(+), 36 deletions(-)
create mode 100644 tools/libs/Makefile
create mode 100644 tools/libs/toollog/Makefile
rename tools/{libxc => libs/toollog}/include/xentoollog.h (100%)
create mode 100644 tools/libs/toollog/libxentoollog.map
rename tools/{libxc => libs/toollog}/xtl_core.c (100%)
rename tools/{libxc => libs/toollog}/xtl_logger_stdio.c (100%).gitignore +1 -0
@@ -58,6 +58,7 @@ stubdom/gcc-* stubdom/include stubdom/ioemu stubdom/xenstore +stubdom/libxentoollog-* stubdom/libxc-* stubdom/lwip-* stubdom/mini-os-*
stubdom/Makefile +23 -1
@@ -313,6 +313,11 @@ mk-headers-$(XEN_TARGET_ARCH): $(IOEMU_LINKFARM_TARGET) ln -sf $(wildcard $(XEN_ROOT)/tools/include/xen-foreign/*) include/xen-foreign/ && \ $(MAKE) DESTDIR= -C include/xen-foreign/ && \ ( [ -h include/xen/foreign ] || ln -sf ../xen-foreign include/xen/foreign ) + mkdir -p libs-$(XEN_TARGET_ARCH)/toollog + [ -h libs-$(XEN_TARGET_ARCH)/toollog/Makefile ] || ( cd libs-$(XEN_TARGET_ARCH)/toollog && \ + ln -sf $(XEN_ROOT)/tools/libs/toollog/include/*.h . && \ + ln -sf $(XEN_ROOT)/tools/libs/toollog/*.c . && \ + ln -sf $(XEN_ROOT)/tools/libs/toollog/Makefile . ) mkdir -p libxc-$(XEN_TARGET_ARCH) [ -h libxc-$(XEN_TARGET_ARCH)/Makefile ] || ( cd libxc-$(XEN_TARGET_ARCH) && \ ln -sf $(XEN_ROOT)/tools/libxc/*.h . && \
@@ -336,12 +341,23 @@ $(TARGETS_MINIOS): mini-os-%: done ####### +# libxentoollog +####### + +.PHONY: libxentoollog +libxentoollog: libs-$(XEN_TARGET_ARCH)/toollog/libxentoollog.a +libs-$(XEN_TARGET_ARCH)/toollog/libxentoollog.a: $(NEWLIB_STAMPFILE) + $(MAKE) -C $(XEN_ROOT)/tools/include + $(MAKE) DESTDIR= -C $(MINI_OS) links + CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= -C libs-$(XEN_TARGET_ARCH)/toollog + +####### # libxc ####### .PHONY: libxc libxc: libxc-$(XEN_TARGET_ARCH)/libxenctrl.a libxc-$(XEN_TARGET_ARCH)/libxenguest.a -libxc-$(XEN_TARGET_ARCH)/libxenctrl.a: cross-zlib +libxc-$(XEN_TARGET_ARCH)/libxenctrl.a: libxentoollog cross-zlib $(MAKE) -C $(XEN_ROOT)/tools/include $(MAKE) DESTDIR= -C $(MINI_OS) links CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= CONFIG_LIBXC_MINIOS=y -C libxc-$(XEN_TARGET_ARCH)
@@ -515,6 +531,11 @@ clean: $(MAKE) -C vtpmmgr clean rm -fr grub-$(XEN_TARGET_ARCH) rm -f $(STUBDOMPATH) + [ ! -e libs-$(XEN_TARGET_ARCH)/toollog/Makefile ] || $(MAKE) DESTDIR= -C libs-$(XEN_TARGET_ARCH)/toollog clean + [ ! -e libs-$(XEN_TARGET_ARCH)/evtchn/Makefile ] || $(MAKE) DESTDIR= -C libs-$(XEN_TARGET_ARCH)/evtchn clean + [ ! -e libs-$(XEN_TARGET_ARCH)/gnttab/Makefile ] || $(MAKE) DESTDIR= -C libs-$(XEN_TARGET_ARCH)/gnttab clean + [ ! -e libs-$(XEN_TARGET_ARCH)/call/Makefile ] || $(MAKE) DESTDIR= -C libs-$(XEN_TARGET_ARCH)/call clean + [ ! -e libs-$(XEN_TARGET_ARCH)/foreignmemory/Makefile ] || $(MAKE) DESTDIR= -C libs-$(XEN_TARGET_ARCH)/foreignmemory clean [ ! -e libxc-$(XEN_TARGET_ARCH)/Makefile ] || $(MAKE) DESTDIR= -C libxc-$(XEN_TARGET_ARCH) clean -[ ! -d ioemu ] || $(MAKE) DESTDIR= -C ioemu clean -[ ! -d xenstore ] || $(MAKE) DESTDIR= -C xenstore clean
@@ -525,6 +546,7 @@ crossclean: clean rm -fr $(CROSS_ROOT) rm -fr newlib-$(XEN_TARGET_ARCH) rm -fr zlib-$(XEN_TARGET_ARCH) pciutils-$(XEN_TARGET_ARCH) + rm -fr libs-$(XEN_TARGET_ARCH) rm -fr libxc-$(XEN_TARGET_ARCH) ioemu xenstore rm -fr gmp-$(XEN_TARGET_ARCH) rm -fr polarssl-$(XEN_TARGET_ARCH)
stubdom/grub/Makefile +1 -0
@@ -5,6 +5,7 @@ vpath %.c ../grub-upstream BOOT=$(OBJ_DIR)/boot-$(XEN_TARGET_ARCH).o +DEF_CPPFLAGS += -I$(XEN_ROOT)/tools/libs/toollog/include DEF_CPPFLAGS += -I$(XEN_ROOT)/tools/libxc/include -I$(XEN_ROOT)/tools/include -I. DEF_CPPFLAGS += -I../grub-upstream/stage1 DEF_CPPFLAGS += -I../grub-upstream/stage2
tools/Makefile +3 -0
@@ -3,6 +3,7 @@ include $(XEN_ROOT)/tools/Rules.mk SUBDIRS-y := SUBDIRS-y += include +SUBDIRS-y += libs SUBDIRS-y += libxc SUBDIRS-$(FLASK_ENABLE) += flask SUBDIRS-y += xenstore
@@ -248,12 +249,14 @@ subdir-all-qemu-xen-dir: qemu-xen-dir-find --includedir=$(LIBEXEC_INC) \ --source-path=$$source \ --extra-cflags="-I$(XEN_ROOT)/tools/include \ + -I$(XEN_ROOT)/tools/libs/toollog/include \ -I$(XEN_ROOT)/tools/libxc/include \ -I$(XEN_ROOT)/tools/xenstore/include \ -I$(XEN_ROOT)/tools/xenstore/compat/include \ $(EXTRA_CFLAGS_QEMU_XEN)" \ --extra-ldflags="-L$(XEN_ROOT)/tools/libxc \ -L$(XEN_ROOT)/tools/xenstore \ + -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/toollog \ $(QEMU_UPSTREAM_RPATH)" \ --bindir=$(LIBEXEC_BIN) \ --datadir=$(SHAREDIR)/qemu-xen \
tools/Rules.mk +10 -4
@@ -10,6 +10,7 @@ export _INSTALL := $(INSTALL) INSTALL = $(XEN_ROOT)/tools/cross-install XEN_INCLUDE = $(XEN_ROOT)/tools/include +XEN_LIBXENTOOLLOG = $(XEN_ROOT)/tools/libs/toollog XEN_LIBXC = $(XEN_ROOT)/tools/libxc XEN_XENLIGHT = $(XEN_ROOT)/tools/libxl XEN_XENSTORE = $(XEN_ROOT)/tools/xenstore
@@ -76,10 +77,15 @@ endif # Consumers of libfoo should not directly use $(SHDEPS_libfoo) or # $(SHLIB_libfoo) -CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_xeninclude) -SHDEPS_libxenctrl = -LDLIBS_libxenctrl = $(XEN_LIBXC)/libxenctrl$(libextension) -SHLIB_libxenctrl = -Wl,-rpath-link=$(XEN_LIBXC) +CFLAGS_libxentoollog = -I$(XEN_LIBXENTOOLLOG)/include $(CFLAGS_xeninclude) +SHDEPS_libxentoollog = +LDLIBS_libxentoollog = $(XEN_LIBXENTOOLLOG)/libxentoollog$(libextension) +SHLIB_libxentoollog = -Wl,-rpath-link=$(XEN_LIBXENTOOLLOG) + +CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_libxentoollog) $(CFLAGS_xeninclude) +SHDEPS_libxenctrl = $(SHLIB_libxentoollog) +LDLIBS_libxenctrl = $(SHDEPS_libxenctrl) $(XEN_LIBXC)/libxenctrl$(libextension) +SHLIB_libxenctrl = $(SHDEPS_libxenctrl) -Wl,-rpath-link=$(XEN_LIBXC) CFLAGS_libxenguest = -I$(XEN_LIBXC)/include $(CFLAGS_xeninclude) SHDEPS_libxenguest =
tools/libs/Makefile new file +7 -0
@@ -0,0 +1,7 @@ +XEN_ROOT = $(CURDIR)/../.. +include $(XEN_ROOT)/tools/Rules.mk + +SUBDIRS-y := +SUBDIRS-y += toollog + +all clean install distclean: %: subdirs-%
tools/libs/toollog/Makefile new file +59 -0
59 lines not on this page · raw message
tools/libs/toollog/include/xentoollog.h renamed from tools/libxc/include/xentoollog.h +0 -0
tools/libs/toollog/libxentoollog.map new file +12 -0
@@ -0,0 +1,12 @@ +VERS_1.0 { + global: + xtl_createlogger_stdiostream; + xtl_level_to_string; + xtl_log; + xtl_logger_destroy; + xtl_logv; + xtl_progress; + xtl_stdiostream_adjust_flags; + xtl_stdiostream_set_minlevel; + local: *; /* Do not expose anything by default */ +};
tools/libs/toollog/xtl_core.c renamed from tools/libxc/xtl_core.c +0 -0
tools/libs/toollog/xtl_logger_stdio.c renamed from tools/libxc/xtl_logger_stdio.c +0 -0
tools/libxc/Makefile +3 -4
@@ -39,8 +39,6 @@ CTRL_SRCS-y += xc_memshr.c CTRL_SRCS-y += xc_hcall_buf.c CTRL_SRCS-y += xc_foreign_memory.c CTRL_SRCS-y += xc_kexec.c -CTRL_SRCS-y += xtl_core.c -CTRL_SRCS-y += xtl_logger_stdio.c CTRL_SRCS-y += xc_resource.c CTRL_SRCS-$(CONFIG_X86) += xc_psr.c CTRL_SRCS-$(CONFIG_X86) += xc_pagetab.c
@@ -112,6 +110,7 @@ CFLAGS += -I. -I./include $(CFLAGS_xeninclude) CFLAGS-$(CONFIG_Linux) += -D_GNU_SOURCE CFLAGS += $(PTHREAD_CFLAGS) +CFLAGS += $(CFLAGS_libxentoollog) CTRL_LIB_OBJS := $(patsubst %.c,%.o,$(CTRL_SRCS-y)) CTRL_PIC_OBJS := $(patsubst %.c,%.opic,$(CTRL_SRCS-y))
@@ -165,7 +164,7 @@ install: build $(INSTALL_DATA) libxenctrl.a $(DESTDIR)$(libdir) $(SYMLINK_SHLIB) libxenctrl.so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir)/libxenctrl.so.$(MAJOR) $(SYMLINK_SHLIB) libxenctrl.so.$(MAJOR) $(DESTDIR)$(libdir)/libxenctrl.so - $(INSTALL_DATA) include/xenctrl.h include/xenctrlosdep.h include/xentoollog.h $(DESTDIR)$(includedir) + $(INSTALL_DATA) include/xenctrl.h include/xenctrlosdep.h $(DESTDIR)$(includedir) $(INSTALL_SHLIB) libxenguest.so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir) $(INSTALL_DATA) libxenguest.a $(DESTDIR)$(libdir) $(SYMLINK_SHLIB) libxenguest.so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir)/libxenguest.so.$(MAJOR)
@@ -208,7 +207,7 @@ libxenctrl.so.$(MAJOR): libxenctrl.so.$(MAJOR).$(MINOR) $(SYMLINK_SHLIB) $< $@ libxenctrl.so.$(MAJOR).$(MINOR): $(CTRL_PIC_OBJS) - $(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(DLOPEN_LIBS) $(PTHREAD_LIBS) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LDLIBS_libxentoollog) $(DLOPEN_LIBS) $(PTHREAD_LIBS) $(APPEND_LDFLAGS) # libxenguest
tools/libxl/Makefile +8 -7
@@ -20,11 +20,12 @@ LIBUUID_LIBS += -luuid endif LIBXL_LIBS = -LIBXL_LIBS = $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libblktapctl) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS) +LIBXL_LIBS = $(LDLIBS_libxentoollog) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libblktapctl) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS) ifeq ($(CONFIG_REMUS_NETBUF),y) LIBXL_LIBS += $(LIBNL3_LIBS) endif +CFLAGS_LIBXL += $(CFLAGS_libxentoollog) CFLAGS_LIBXL += $(CFLAGS_libxenctrl) CFLAGS_LIBXL += $(CFLAGS_libxenguest) CFLAGS_LIBXL += $(CFLAGS_libxenstore)
@@ -149,7 +150,7 @@ CFLAGS_XL += -Wshadow XL_OBJS = xl.o xl_cmdimpl.o xl_cmdtable.o xl_sxp.o $(XL_OBJS) $(TEST_PROG_OBJS) _libxl.api-for-check: \ - CFLAGS += $(CFLAGS_libxenctrl) # For xentoollog.h + CFLAGS += $(CFLAGS_libxentoollog) $(XL_OBJS): CFLAGS += $(CFLAGS_XL) $(XL_OBJS): CFLAGS += -include $(XEN_ROOT)/tools/config.h # libxl_json.h needs it.
@@ -253,19 +254,19 @@ libxlutil.a: $(LIBXLU_OBJS) $(AR) rcs libxlutil.a $^ xl: $(XL_OBJS) libxlutil.so libxenlight.so - $(CC) $(LDFLAGS) -o $@ $(XL_OBJS) libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl) -lyajl $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) -o $@ $(XL_OBJS) libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxentoollog) -lyajl $(APPEND_LDFLAGS) xen-init-dom0: $(XEN_INIT_DOM0_OBJS) libxenlight.so - $(CC) $(LDFLAGS) -o $@ $(XEN_INIT_DOM0_OBJS) $(LDLIBS_libxenstore) $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) -o $@ $(XEN_INIT_DOM0_OBJS) $(LDLIBS_libxenstore) $(LDLIBS_libxenlight) $(LDLIBS_libxentoollog) $(APPEND_LDFLAGS) test_%: test_%.o test_common.o libxlutil.so libxenlight_test.so - $(CC) $(LDFLAGS) -o $@ $^ $(filter-out %libxenlight.so, $(LDLIBS_libxenlight)) $(LDLIBS_libxenctrl) -lyajl $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) -o $@ $^ $(filter-out %libxenlight.so, $(LDLIBS_libxenlight)) $(LDLIBS_libxentoollog) -lyajl $(APPEND_LDFLAGS) libxl-save-helper: $(SAVE_HELPER_OBJS) libxenlight.so - $(CC) $(LDFLAGS) -o $@ $(SAVE_HELPER_OBJS) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) -o $@ $(SAVE_HELPER_OBJS) $(LDLIBS_libxentoollog) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(APPEND_LDFLAGS) testidl: testidl.o libxlutil.so libxenlight.so - $(CC) $(LDFLAGS) -o $@ testidl.o libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) -o $@ testidl.o libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxentoollog) $(APPEND_LDFLAGS) $(PKG_CONFIG): % : %.in Makefile @sed -e 's/@@version@@/$(MAJOR).$(MINOR)/g' < $< > [email protected]
tools/ocaml/Makefile.rules +13 -13
@@ -1,18 +1,18 @@ -ifdef V - ifeq ("$(origin V)", "command line") - BUILD_VERBOSE = $(V) - endif -endif -ifndef BUILD_VERBOSE - BUILD_VERBOSE = 0 -endif -ifeq ($(BUILD_VERBOSE),1) +#ifdef V +# ifeq ("$(origin V)", "command line") +# BUILD_VERBOSE = $(V) +# endif +#endif +#ifndef BUILD_VERBOSE +# BUILD_VERBOSE = 0 +#endif +#ifeq ($(BUILD_VERBOSE),1) E = @true Q = -else - E = @echo - Q = @ -endif +#else +# E = @echo +# Q = @ +#endif .NOTPARALLEL:
tools/ocaml/libs/xentoollog/Makefile +3 -3
@@ -5,7 +5,7 @@ include $(TOPLEVEL)/common.make # allow mixed declarations and code CFLAGS += -Wno-declaration-after-statement -CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest) +CFLAGS += $(CFLAGS_libxentoollog) CFLAGS += $(APPEND_CFLAGS) OCAMLINCLUDE +=
@@ -13,7 +13,7 @@ OBJS = xentoollog INTF = xentoollog.cmi LIBS = xentoollog.cma xentoollog.cmxa -LIBS_xentoollog = $(LDLIBS_libxenctrl) +LIBS_xentoollog = $(LDLIBS_libxentoollog) xentoollog_OBJS = $(OBJS) xentoollog_C_OBJS = xentoollog_stubs
@@ -49,7 +49,7 @@ xentoollog.mli: xentoollog.mli.in _xtl_levels.mli.in libs: $(LIBS) -_xtl_levels.ml.in _xtl_levels.mli.in _xtl_levels.inc: genlevels.py $(XEN_ROOT)/tools/libxc/include/xentoollog.h +_xtl_levels.ml.in _xtl_levels.mli.in _xtl_levels.inc: genlevels.py $(XEN_ROOT)/tools/libs/toollog/include/xentoollog.h $(PYTHON) genlevels.py _xtl_levels.mli.in _xtl_levels.ml.in _xtl_levels.inc .PHONY: install
tools/ocaml/libs/xentoollog/genlevels.py +1 -1
@@ -3,7 +3,7 @@ import sys def read_levels(): - f = open('../../../libxc/include/xentoollog.h', 'r') + f = open('../../../libs/toollog/include/xentoollog.h', 'r') levels = [] record = False
tools/python/setup.py +3 -2
@@ -7,16 +7,17 @@ XEN_ROOT = "../.." extra_compile_args = [ "-fno-strict-aliasing", "-Werror" ] PATH_XEN = XEN_ROOT + "/tools/include" +PATH_LIBXENTOOLLOG = XEN_ROOT + "/tools/libs/toollog" PATH_LIBXC = XEN_ROOT + "/tools/libxc" PATH_LIBXL = XEN_ROOT + "/tools/libxl" PATH_XENSTORE = XEN_ROOT + "/tools/xenstore" xc = Extension("xc", extra_compile_args = extra_compile_args, - include_dirs = [ PATH_XEN, PATH_LIBXC + "/include", "xen/lowlevel/xc" ], + include_dirs = [ PATH_XEN, PATH_LIBXENTOOLLOG + "/include", PATH_LIBXC + "/include", "xen/lowlevel/xc" ], library_dirs = [ PATH_LIBXC ], libraries = [ "xenctrl", "xenguest" ], - depends = [ PATH_LIBXC + "/libxenctrl.so", PATH_LIBXC + "/libxenguest.so" ], + depends = [ PATH_LIBXC + "/libxenctrl.so", PATH_LIBXC + "/libxenguest.so", "-Wl,-rpath-link="+PATH_LIBXENTOOLLOG ], sources = [ "xen/lowlevel/xc/xc.c" ]) xs = Extension("xs",
tools/xenpaging/Makefile +1 -1
@@ -3,7 +3,7 @@ include $(XEN_ROOT)/tools/Rules.mk # xenpaging.c and file_ops.c incorrectly use libxc internals CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenstore) $(PTHREAD_CFLAGS) -I$(XEN_ROOT)/tools/libxc -LDLIBS += $(LDLIBS_libxenctrl) $(LDLIBS_libxenstore) $(PTHREAD_LIBS) +LDLIBS += $(LDLIBS_libxentoollog) $(LDLIBS_libxenctrl) $(LDLIBS_libxenstore) $(PTHREAD_LIBS) LDFLAGS += $(PTHREAD_LDFLAGS) POLICY = default
Signature · 1 line
2.1.4
Re: [PATCH XEN v5 02/23] tools: Refactor "xentoollog" into its own library
Quoted 23 lines · Ian Campbell
tools/ocaml/Makefile.rules +9
-9@@ -1,18 +1,18 @@ -ifdef V - ifeq ("$(origin V)", "command line") - BUILD_VERBOSE = $(V) - endif -endif -ifndef BUILD_VERBOSE - BUILD_VERBOSE = 0 -endif -ifeq ($(BUILD_VERBOSE),1) +#ifdef V +# ifeq ("$(origin V)", "command line") +# BUILD_VERBOSE = $(V) +# endif +#endif +#ifndef BUILD_VERBOSE +# BUILD_VERBOSE = 0 +#endif +#ifeq ($(BUILD_VERBOSE),1)
tools/ocaml/Makefile.rules line 15
Quoted 10 lines
tools/ocaml/Makefile.rules +4
-4E = @true Q = -else - E = @echo - Q = @ -endif +#else +# E = @echo +# Q = @ +#endif
This hunk looks like temporary debugging?
~Andrew
Re: [PATCH XEN v5 02/23] tools: Refactor "xentoollog" into its own library
Quoted 28 lines · Andrew Cooper
Quoted 27 lines · Ian Campbell
tools/ocaml/Makefile.rules +9
-9@@ -1,18 +1,18 @@ -ifdef V - ifeq ("$(origin V)", "command line") - BUILD_VERBOSE = $(V) - endif -endif -ifndef BUILD_VERBOSE - BUILD_VERBOSE = 0 -endif -ifeq ($(BUILD_VERBOSE),1) +#ifdef V +# ifeq ("$(origin V)", "command line") +# BUILD_VERBOSE = $(V) +# endif +#endif +#ifndef BUILD_VERBOSE +# BUILD_VERBOSE = 0 +#endif +#ifeq ($(BUILD_VERBOSE),1)E = @true
Q =
-else
- E = @echo
Quoted 8 lines
tools/ocaml/Makefile.rules line 15
Quoted 6 lines
- Q = @
tools/ocaml/Makefile.rules +4
-1-endif +#else +# E = @echo +# Q = @ +#endifThis hunk looks like temporary debugging?
It does rather, I've no idea why or what I was doing.
Dropped.
Ian.
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
PATCH v5 3/23 tools/libxc: Remove osdep indirection for xc_evtchn
In reply to Ian CampbellThe alternative backend (a xen-api/xapi shim) is no longer around and so this stuff is now just baggage which is getting in the way of refactoring libxenctrl.
Note that the intention is to move this into a separate library shortly.
Nested virt probably suffices for this use case now.
One incorrect instance of using xc_interface where xc_evtchn (in ocaml stubs) is removed, this used to work because they were typedefs to the same struct, but is no longer permitted.
--- tools/libxc/include/xenctrl.h | 2 +- tools/libxc/include/xenctrlosdep.h | 16 ----- tools/libxc/xc_evtchn.c | 45 -------------- tools/libxc/xc_freebsd_osdep.c | 79 ++++++++---------------- tools/libxc/xc_linux_osdep.c | 76 +++++++++-------------- tools/libxc/xc_minios.c | 63 ++++++++----------- tools/libxc/xc_netbsd.c | 72 ++++++++-------------- tools/libxc/xc_private.c | 37 +++++++++--- tools/libxc/xc_private.h | 17 ++++++ tools/libxc/xc_solaris.c | 71 ++++++++-------------- tools/libxc/xenctrl_osdep_ENOSYS.c | 87 --------------------------- tools/ocaml/libs/eventchn/xeneventchn_stubs.c | 4 +- 12 files changed, 180 insertions(+), 389 deletions(-)
tools/libxc/include/xenctrl.h +1 -1
@@ -117,7 +117,7 @@*/ typedef struct xc_interface_core xc_interface ; -typedef struct xc_interface_core xc_evtchn ; +typedef struct xenevtchn_handle xc_evtchn ;typedef struct xc_interface_core xc_gnttab ;typedef struct xc_interface_core xc_gntshr ;
tools/libxc/include/xenctrlosdep.h +0 -16
@@ -51,7 +51,6 @@enum xc_osdep_type {XC_OSDEP_PRIVCMD , -XC_OSDEP_EVTCHN ,XC_OSDEP_GNTTAB ,XC_OSDEP_GNTSHR , };
@@ -90,21 +89,6 @@ struct xc_osdep_ops int nentries); } privcmd;struct { -int (*fd)(xc_evtchn *xce,xc_osdep_handle h); - -int (*notify)(xc_evtchn *xce,xc_osdep_handle h,evtchn_port_t port); - -evtchn_port_or_error_t (*bind_unbound_port)(xc_evtchn *xce,xc_osdep_handle h,int domid); -evtchn_port_or_error_t (*bind_interdomain)(xc_evtchn *xce,xc_osdep_handle h,int domid, -evtchn_port_t remote_port); -evtchn_port_or_error_t (*bind_virq)(xc_evtchn *xce,xc_osdep_handle h,unsigned int virq); - -int (*unbind)(xc_evtchn *xce,xc_osdep_handle h,evtchn_port_t port); - -evtchn_port_or_error_t (*pending)(xc_evtchn *xce,xc_osdep_handle h); -int (*unmask)(xc_evtchn *xce,xc_osdep_handle h,evtchn_port_t port); - } evtchn; -struct {#define XC_GRANT_MAP_SINGLE_DOMAIN 0x1 void *(*grant_map)(xc_gnttab *xcg, xc_osdep_handle h, uint32_t count, int flags, int prot,
tools/libxc/xc_evtchn.c +0 -45
51 lines not on this page · raw message
tools/libxc/xc_freebsd_osdep.c +26 -53
152 lines not on this page · raw message
tools/libxc/xc_linux_osdep.c +28 -48
155 lines not on this page · raw message
tools/libxc/xc_minios.c +24 -39
138 lines not on this page · raw message
tools/libxc/xc_netbsd.c +26 -46
141 lines not on this page · raw message
tools/libxc/xc_private.c +30 -7
@@ -119,7 +119,6 @@ static const char *xc_osdep_type_name(enum xc_osdep_type type)switch ( type ) {case XC_OSDEP_PRIVCMD :return "privcmd" ; -case XC_OSDEP_EVTCHN :return "evtchn" ;case XC_OSDEP_GNTTAB :return "gnttab" ;case XC_OSDEP_GNTSHR :return "gntshr" ; }
@@ -252,20 +251,44 @@ int do_xen_hypercall(xc_interface *xch, privcmd_hypercall_t *hypercall)return xch->ops->u.privcmd.hypercall (xch, xch->ops_handle, hypercall); } -xc_evtchn *xc_evtchn_open (xentoollog_logger *logger, -unsigned open_flags) +xc_evtchn *xc_evtchn_open (xentoollog_logger *logger,unsigned open_flags) { -xc_evtchn *xce; +xc_evtchn *xce =malloc (sizeof (*xce)); +int rc; + +if (!xce)return NULL ; + + xce->fd =-1 ; + xce->logger = logger; + xce->logger_tofree =NULL ; - xce =xc_interface_open_common (logger,NULL , open_flags, -XC_OSDEP_EVTCHN ); +if (!xce->logger) { + xce->logger = xce->logger_tofree = + (xentoollog_logger *) +xtl_createlogger_stdiostream (stderr,XTL_PROGRESS ,0 ); +if (!xce->logger) goto err; + } + + rc =osdep_evtchn_open (xce); +if ( rc <0 ) goto err;return xce; + +err: +osdep_evtchn_close (xce); +xtl_logger_destroy (xce->logger_tofree); +free (xce); +return NULL ; }int xc_evtchn_close (xc_evtchn *xce) { -return xc_interface_close_common (xce); +int rc; + + rc =osdep_evtchn_close (xce); +xtl_logger_destroy (xce->logger_tofree); +free (xce); +return rc; } xc_gnttab *xc_gnttab_open(xentoollog_logger *logger,
tools/libxc/xc_private.h +17 -0
@@ -123,6 +123,13 @@ struct xc_interface_core {xc_osdep_handle ops_handle;/* opaque data for xc_osdep_ops */ }; +struct xenevtchn_handle { +xentoollog_logger *logger, *logger_tofree; +int fd; +}; +int osdep_evtchn_open (xc_evtchn *xce); +int osdep_evtchn_close (xc_evtchn *xce); +void xc_report_error (xc_interface *xch,int code,const char *fmt, ...) __attribute__((format (printf,3 ,4 ))); void xc_reportv(xc_interface *xch, xentoollog_logger *lg, xentoollog_level,
@@ -446,3 +453,13 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t domain_id, int param, uint32_t *port);#endif /* __XC_PRIVATE_H__ */ + +/* +* Local variables: +* mode: C +* c-file-style: "BSD" +* c-basic-offset: 4 +* tab-width: 4 +* indent-tabs-mode: nil +* End: +*/
tools/libxc/xc_solaris.c +26 -45
145 lines not on this page · raw message
tools/libxc/xenctrl_osdep_ENOSYS.c +0 -87
99 lines not on this page · raw message
tools/ocaml/libs/eventchn/xeneventchn_stubs.c +2 -2
@@ -34,14 +34,14 @@#include <caml/callback.h> #include <caml/fail.h> -#define _H (__h) ((xc_interface *)(__h)) +#define _H (__h) ((xc_evtchn *)(__h)) CAMLprim value stub_eventchn_init(void) {CAMLparam0 ();CAMLlocal1 (result); -xc_interface *xce =xc_evtchn_open (NULL ,XC_OPENFLAG_NON_REENTRANT ); +xc_evtchn *xce =xc_evtchn_open (NULL ,XC_OPENFLAG_NON_REENTRANT );if (xce ==NULL )caml_failwith ("open failed" );
Signature · 1 line
2.1.4
PATCH v5 4/23 tools: Refactor /dev/xen/evtchn wrappers into libxenevtchn.
In reply to Ian Campbelllibxenevtchn will provide a stable API and ABI for accessing the evtchn device.
The functions are moved into the xenevtchn namespace to make a clean break from libxc and avoid ambiguity regarding which interfaces are stable.
All in-tree users are updated to use the new names.
Upon request (via #define XC_WANT_COMPAT_EVTCHN_API) libxenctrl will provide a compat API for the old names. This is used by qemu-xen for the time being. qemu-xen-traditional is updated in lockstep.
This leaves a few event channel related functions which go via privcmd (EVTCHNOP) rather than ioctls on the /dev/xen/evtchn device in libxenctrl. Specifically:
- xc_evtchn_alloc_unbound
- xc_evtchn_reset
- xc_evtchn_status
Note that xc_evtchn_alloc_unbound's functionality is also provided by xenevtchn_bind_unbound_port() (née xc_evtchn_bind_unbound_port) and is probably redundant.
These functions do not appear to be needed by qemu-dm, qemu-pv (provision of device model to HVM guests and PV backends respectively) or by libvchan suggesting they are not needed by non-toolstack uses of event channels. QEMU does use these in hw/xenpv/xen_domainbuild.c but that is a "toolstack use".
The new library uses a version script to ensure that only expected symbols are exported and to version them such that ABI guarantees can be kept in the future.
---
Must be applied with:
- "qemu-xen-traditional: Use libxenevtchn" and a corresponding QEMU_TAG update folded here.
- "mini-os: Include libxenevtchn with libxc"" and a corresponding bump to MINIOS_UPSTREAM_REVISION folded in here.
v2: Update doc at same time
Removed some stray compat thing
v3: Moved to tools/libs/evtchn
v4: typedef the xenevtchn_handle in xenguest.h instead of #include, to
avoid leaking the libxenevtchn namespace into callers who may not want it. (And also to avoid adding lots of -I to places like stubdom builds)
v5: Handle NULL passed to _close()
--- .gitignore | 1 + stubdom/Makefile | 19 +- tools/Makefile | 5 +- tools/Rules.mk | 14 +- tools/console/Makefile | 2 + tools/console/daemon/io.c | 43 ++-- tools/libs/Makefile | 1 + tools/libs/evtchn/Makefile | 65 +++++++ tools/libs/evtchn/core.c | 72 +++++++ tools/libs/evtchn/freebsd.c | 138 +++++++++++++ tools/libs/evtchn/include/xenevtchn.h | 150 ++++++++++++++ tools/libs/evtchn/libxenevtchn.map | 14 ++ tools/libs/evtchn/linux.c | 136 +++++++++++++ tools/libs/evtchn/minios.c | 269 ++++++++++++++++++++++++++ tools/libs/evtchn/netbsd.c | 147 ++++++++++++++ tools/libs/evtchn/private.h | 25 +++ tools/libs/evtchn/solaris.c | 135 +++++++++++++ tools/libs/toollog/include/xentoollog.h | 10 + tools/libs/toollog/xtl_core.c | 10 + tools/libs/toollog/xtl_logger_stdio.c | 10 + tools/libvchan/Makefile | 6 +- tools/libvchan/init.c | 20 +- tools/libvchan/io.c | 12 +- tools/libvchan/libxenvchan.h | 3 +- tools/libxc/Makefile | 8 +- tools/libxc/include/xenctrl.h | 99 +--------- tools/libxc/include/xenctrl_compat.h | 48 +++++ tools/libxc/include/xenguest.h | 14 +- tools/libxc/xc_evtchn_compat.c | 75 +++++++ tools/libxc/xc_freebsd_osdep.c | 101 ---------- tools/libxc/xc_linux_osdep.c | 95 --------- tools/libxc/xc_minios.c | 221 --------------------- tools/libxc/xc_netbsd.c | 109 ----------- tools/libxc/xc_private.c | 40 ---- tools/libxc/xc_private.h | 7 - tools/libxc/xc_solaris.c | 97 ---------- tools/libxc/xc_suspend.c | 18 +- tools/libxl/Makefile | 5 +- tools/libxl/libxl.c | 2 +- tools/libxl/libxl_dom_suspend.c | 4 +- tools/libxl/libxl_event.c | 14 +- tools/libxl/libxl_internal.h | 5 +- tools/misc/Makefile | 7 +- tools/misc/xen-hptool.c | 13 +- tools/misc/xen-lowmemd.c | 15 +- tools/ocaml/libs/eventchn/Makefile | 4 +- tools/ocaml/libs/eventchn/xeneventchn_stubs.c | 20 +- tools/python/setup.py | 7 +- tools/tests/xen-access/xen-access.c | 2 +- tools/xcutils/Makefile | 4 +- tools/xenmon/Makefile | 2 + tools/xenmon/xenbaked.c | 13 +- tools/xenpaging/Makefile | 4 +- tools/xenpaging/xenpaging.c | 18 +- tools/xenpaging/xenpaging.h | 3 +- tools/xenstore/Makefile | 5 +- tools/xenstore/xenstored_core.c | 6 +- tools/xenstore/xenstored_domain.c | 25 +-- tools/xentrace/Makefile | 5 +- tools/xentrace/xentrace.c | 13 +- 60 files changed, 1520 insertions(+), 915 deletions(-) create mode 100644 tools/libs/evtchn/Makefile create mode 100644 tools/libs/evtchn/core.c create mode 100644 tools/libs/evtchn/freebsd.c create mode 100644 tools/libs/evtchn/include/xenevtchn.h create mode 100644 tools/libs/evtchn/libxenevtchn.map create mode 100644 tools/libs/evtchn/linux.c create mode 100644 tools/libs/evtchn/minios.c create mode 100644 tools/libs/evtchn/netbsd.c create mode 100644 tools/libs/evtchn/private.h create mode 100644 tools/libs/evtchn/solaris.c create mode 100644 tools/libxc/include/xenctrl_compat.h create mode 100644 tools/libxc/xc_evtchn_compat.c
.gitignore +1 -0
@@ -59,6 +59,7 @@ stubdom/include stubdom/ioemu stubdom/xenstore stubdom/libxentoollog-* +stubdom/libxenevtchn-* stubdom/libxc-* stubdom/lwip-* stubdom/mini-os-*
stubdom/Makefile +18 -1
@@ -318,6 +318,12 @@ mk-headers-$(XEN_TARGET_ARCH): $(IOEMU_LINKFARM_TARGET) ln -sf $(XEN_ROOT)/tools/libs/toollog/include/*.h . && \ ln -sf $(XEN_ROOT)/tools/libs/toollog/*.c . && \ ln -sf $(XEN_ROOT)/tools/libs/toollog/Makefile . ) + mkdir -p libs-$(XEN_TARGET_ARCH)/evtchn/include + [ -h libs-$(XEN_TARGET_ARCH)/evtchn/Makefile ] || ( cd libs-$(XEN_TARGET_ARCH)/evtchn && \ + ln -sf $(XEN_ROOT)/tools/libs/evtchn/*.h . && \ + ln -sf $(XEN_ROOT)/tools/libs/evtchn/include/*.h include/ && \ + ln -sf $(XEN_ROOT)/tools/libs/evtchn/*.c . && \ + ln -sf $(XEN_ROOT)/tools/libs/evtchn/Makefile . ) mkdir -p libxc-$(XEN_TARGET_ARCH) [ -h libxc-$(XEN_TARGET_ARCH)/Makefile ] || ( cd libxc-$(XEN_TARGET_ARCH) && \ ln -sf $(XEN_ROOT)/tools/libxc/*.h . && \
@@ -352,12 +358,23 @@ libs-$(XEN_TARGET_ARCH)/toollog/libxentoollog.a: $(NEWLIB_STAMPFILE) CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= -C libs-$(XEN_TARGET_ARCH)/toollog ####### +# libxenevtchn +####### + +.PHONY: libxenevtchn +libxenevtchn: libs-$(XEN_TARGET_ARCH)/evtchn/libxenevtchn.a +libs-$(XEN_TARGET_ARCH)/evtchn/libxenevtchn.a: $(NEWLIB_STAMPFILE) + $(MAKE) -C $(XEN_ROOT)/tools/include + $(MAKE) DESTDIR= -C $(MINI_OS) links + CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= -C libs-$(XEN_TARGET_ARCH)/evtchn + +####### # libxc ####### .PHONY: libxc libxc: libxc-$(XEN_TARGET_ARCH)/libxenctrl.a libxc-$(XEN_TARGET_ARCH)/libxenguest.a -libxc-$(XEN_TARGET_ARCH)/libxenctrl.a: libxentoollog cross-zlib +libxc-$(XEN_TARGET_ARCH)/libxenctrl.a: libxentoollog libxenevtchn cross-zlib $(MAKE) -C $(XEN_ROOT)/tools/include $(MAKE) DESTDIR= -C $(MINI_OS) links CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= CONFIG_LIBXC_MINIOS=y -C libxc-$(XEN_TARGET_ARCH)
tools/Makefile +4 -1
@@ -248,8 +248,10 @@ subdir-all-qemu-xen-dir: qemu-xen-dir-find --libdir=$(LIBEXEC_LIB) \ --includedir=$(LIBEXEC_INC) \ --source-path=$$source \ - --extra-cflags="-I$(XEN_ROOT)/tools/include \ + --extra-cflags="-DXC_WANT_COMPAT_EVTCHN_API=1 \ + -I$(XEN_ROOT)/tools/include \ -I$(XEN_ROOT)/tools/libs/toollog/include \ + -I$(XEN_ROOT)/tools/libs/evtchn/include \ -I$(XEN_ROOT)/tools/libxc/include \ -I$(XEN_ROOT)/tools/xenstore/include \ -I$(XEN_ROOT)/tools/xenstore/compat/include \
@@ -257,6 +259,7 @@ subdir-all-qemu-xen-dir: qemu-xen-dir-find --extra-ldflags="-L$(XEN_ROOT)/tools/libxc \ -L$(XEN_ROOT)/tools/xenstore \ -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/toollog \ + -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/evtchn \ $(QEMU_UPSTREAM_RPATH)" \ --bindir=$(LIBEXEC_BIN) \ --datadir=$(SHAREDIR)/qemu-xen \
tools/Rules.mk +10 -4
@@ -11,6 +11,7 @@ INSTALL = $(XEN_ROOT)/tools/cross-install XEN_INCLUDE = $(XEN_ROOT)/tools/include XEN_LIBXENTOOLLOG = $(XEN_ROOT)/tools/libs/toollog +XEN_LIBXENEVTCHN = $(XEN_ROOT)/tools/libs/evtchn XEN_LIBXC = $(XEN_ROOT)/tools/libxc XEN_XENLIGHT = $(XEN_ROOT)/tools/libxl XEN_XENSTORE = $(XEN_ROOT)/tools/xenstore
@@ -82,13 +83,18 @@ SHDEPS_libxentoollog = LDLIBS_libxentoollog = $(XEN_LIBXENTOOLLOG)/libxentoollog$(libextension) SHLIB_libxentoollog = -Wl,-rpath-link=$(XEN_LIBXENTOOLLOG) +CFLAGS_libxenevtchn = -I$(XEN_LIBXENEVTCHN)/include $(CFLAGS_xeninclude) +SHDEPS_libxenevtchn = +LDLIBS_libxenevtchn = $(XEN_LIBXENEVTCHN)/libxenevtchn$(libextension) +SHLIB_libxenevtchn = -Wl,-rpath-link=$(XEN_LIBXENEVTCHN) + CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_libxentoollog) $(CFLAGS_xeninclude) -SHDEPS_libxenctrl = $(SHLIB_libxentoollog) +SHDEPS_libxenctrl = $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn) LDLIBS_libxenctrl = $(SHDEPS_libxenctrl) $(XEN_LIBXC)/libxenctrl$(libextension) SHLIB_libxenctrl = $(SHDEPS_libxenctrl) -Wl,-rpath-link=$(XEN_LIBXC) -CFLAGS_libxenguest = -I$(XEN_LIBXC)/include $(CFLAGS_xeninclude) -SHDEPS_libxenguest = +CFLAGS_libxenguest = -I$(XEN_LIBXC)/include $(CFLAGS_libxenevtchn) $(CFLAGS_xeninclude) +SHDEPS_libxenguest = $(SHLIB_libxenevtchn) LDLIBS_libxenguest = $(SHDEPS_libxenguest) $(XEN_LIBXC)/libxenguest$(libextension) SHLIB_libxenguest = $(SHDEPS_libxenguest) -Wl,-rpath-link=$(XEN_LIBXC)
@@ -103,7 +109,7 @@ LDLIBS_libxenstat = $(SHDEPS_libxenstat) $(XEN_LIBXENSTAT)/libxenstat$(libexten SHLIB_libxenstat = $(SHDEPS_libxenstat) -Wl,-rpath-link=$(XEN_LIBXENSTAT) CFLAGS_libxenvchan = -I$(XEN_LIBVCHAN) -SHDEPS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) +SHDEPS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libxenevtchn) LDLIBS_libxenvchan = $(SHDEPS_libxenvchan) $(XEN_LIBVCHAN)/libxenvchan$(libextension) SHLIB_libxenvchan = $(SHDEPS_libxenvchan) -Wl,-rpath-link=$(XEN_LIBVCHAN)
tools/console/Makefile +2 -0
@@ -3,8 +3,10 @@ include $(XEN_ROOT)/tools/Rules.mk CFLAGS += -Werror +CFLAGS += $(CFLAGS_libxenevtchn) CFLAGS += $(CFLAGS_libxenctrl) CFLAGS += $(CFLAGS_libxenstore) +LDLIBS += $(LDLIBS_libxenevtchn) LDLIBS += $(LDLIBS_libxenctrl) LDLIBS += $(LDLIBS_libxenstore) LDLIBS += $(SOCKET_LIBS)
tools/console/daemon/io.c +22 -21
165 lines not on this page · raw message
tools/libs/Makefile +1 -0
@@ -3,5 +3,6 @@ include $(XEN_ROOT)/tools/Rules.mk SUBDIRS-y := SUBDIRS-y += toollog +SUBDIRS-y += evtchn all clean install distclean: %: subdirs-%
tools/libs/evtchn/Makefile new file +65 -0
65 lines not on this page · raw message
tools/libs/evtchn/core.c new file +72 -0
72 lines not on this page · raw message
tools/libs/evtchn/freebsd.c new file +138 -0
138 lines not on this page · raw message
tools/libs/evtchn/include/xenevtchn.h new file +150 -0
150 lines not on this page · raw message
tools/libs/evtchn/libxenevtchn.map new file +14 -0
@@ -0,0 +1,14 @@ +VERS_1.0 { + global: + xenevtchn_fd; + xenevtchn_bind_unbound_port; + xenevtchn_unbind; + xenevtchn_unmask; + xenevtchn_notify; + xenevtchn_bind_interdomain; + xenevtchn_bind_virq; + xenevtchn_open; + xenevtchn_close; + xenevtchn_pending; + local: *; /* Do not expose anything by default */ +};
tools/libs/evtchn/linux.c new file +136 -0
136 lines not on this page · raw message
tools/libs/evtchn/minios.c new file +269 -0
269 lines not on this page · raw message
tools/libs/evtchn/netbsd.c new file +147 -0
147 lines not on this page · raw message
tools/libs/evtchn/private.h new file +25 -0
@@ -0,0 +1,25 @@ +#ifndef XENEVTCHN_PRIVATE_H +#define XENEVTCHN_PRIVATE_H + +#include <xentoollog.h> +#include <xenevtchn.h> + +struct xenevtchn_handle { +xentoollog_logger *logger, *logger_tofree; +int fd; +}; + +int osdep_evtchn_open (xenevtchn_handle *xce); +int osdep_evtchn_close (xenevtchn_handle *xce); + +#endif + +/* +* Local variables: +* mode: C +* c-file-style: "BSD" +* c-basic-offset: 4 +* tab-width: 4 +* indent-tabs-mode: nil +* End: +*/
tools/libs/evtchn/solaris.c new file +135 -0
135 lines not on this page · raw message
tools/libs/toollog/include/xentoollog.h +10 -0
@@ -134,3 +134,13 @@ const char *xtl_level_to_string(xentoollog_level); /* never fails */#endif /* XENTOOLLOG_H */ + +/* +* Local variables: +* mode: C +* c-file-style: "BSD" +* c-basic-offset: 4 +* tab-width: 4 +* indent-tabs-mode: nil +* End: +*/
tools/libs/toollog/xtl_core.c +10 -0
@@ -81,3 +81,13 @@ void xtl_logger_destroy(struct xentoollog_logger *logger) {if (!logger)return ; logger->destroy (logger); } + +/* +* Local variables: +* mode: C +* c-file-style: "BSD" +* c-basic-offset: 4 +* tab-width: 4 +* indent-tabs-mode: nil +* End: +*/
tools/libs/toollog/xtl_logger_stdio.c +10 -0
@@ -190,3 +190,13 @@ xentoollog_logger_stdiostream *xtl_createlogger_stdiostreamreturn XTL_NEW_LOGGER (stdiostream, newlogger); } + +/* +* Local variables: +* mode: C +* c-file-style: "BSD" +* c-basic-offset: 4 +* tab-width: 4 +* indent-tabs-mode: nil +* End: +*/
tools/libvchan/Makefile +3 -3
@@ -10,9 +10,9 @@ NODE_OBJS = node.o NODE2_OBJS = node-select.o LIBVCHAN_PIC_OBJS = $(patsubst %.o,%.opic,$(LIBVCHAN_OBJS)) -LIBVCHAN_LIBS = $(LDLIBS_libxenstore) $(LDLIBS_libxenctrl) -$(LIBVCHAN_OBJS) $(LIBVCHAN_PIC_OBJS): CFLAGS += $(CFLAGS_libxenstore) $(CFLAGS_libxenctrl) -$(NODE_OBJS) $(NODE2_OBJS): CFLAGS += $(CFLAGS_libxenctrl) +LIBVCHAN_LIBS = $(LDLIBS_libxenstore) $(LDLIBS_libxenctrl) $(LDLIBS_libxenevtchn) +$(LIBVCHAN_OBJS) $(LIBVCHAN_PIC_OBJS): CFLAGS += $(CFLAGS_libxenstore) $(CFLAGS_libxenctrl) $(CFLAGS_libxenevtchn) +$(NODE_OBJS) $(NODE2_OBJS): CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenevtchn) MAJOR = 1.0 MINOR = 0
tools/libvchan/init.c +10 -10
@@ -216,25 +216,25 @@ static int init_evt_srv(struct libxenvchan *ctrl, int domain, xentoollog_logger {evtchn_port_or_error_t port; - ctrl->event =xc_evtchn_open (logger,0 ); + ctrl->event =xenevtchn_open (logger,0 );if (!ctrl->event)return -1 ; - port =xc_evtchn_bind_unbound_port (ctrl->event, domain); + port =xenevtchn_bind_unbound_port (ctrl->event, domain);if (port <0 ) goto fail; ctrl->event_port = port; -if (xc_evtchn_unmask (ctrl->event, ctrl->event_port)) +if (xenevtchn_unmask (ctrl->event, ctrl->event_port)) goto fail;return 0 ; fail:if (port >=0 ) -xc_evtchn_unbind (ctrl->event, port); +xenevtchn_unbind (ctrl->event, port); -xc_evtchn_close (ctrl->event); +xenevtchn_close (ctrl->event); ctrl->event =NULL ;return -1 ;
@@ -346,26 +346,26 @@ static int init_evt_cli(struct libxenvchan *ctrl, int domain, xentoollog_logger {evtchn_port_or_error_t port; - ctrl->event =xc_evtchn_open (logger,0 ); + ctrl->event =xenevtchn_open (logger,0 );if (!ctrl->event)return -1 ; - port =xc_evtchn_bind_interdomain (ctrl->event, + port =xenevtchn_bind_interdomain (ctrl->event, domain, ctrl->event_port);if (port <0 ) goto fail; ctrl->event_port = port; -if (xc_evtchn_unmask (ctrl->event, ctrl->event_port)) +if (xenevtchn_unmask (ctrl->event, ctrl->event_port)) goto fail;return 0 ; fail:if (port >=0 ) -xc_evtchn_unbind (ctrl->event, port); +xenevtchn_unbind (ctrl->event, port); -xc_evtchn_close (ctrl->event); +xenevtchn_close (ctrl->event); ctrl->event =NULL ;return -1 ;
tools/libvchan/io.c +6 -6
@@ -105,7 +105,7 @@ static inline int send_notify(struct libxenvchan *ctrl, uint8_t bit) notify = ctrl->is_server ? &ctrl->ring->srv_notify : &ctrl->ring->cli_notify; prev =__sync_fetch_and_and (notify, ~bit);if (prev & bit) -return xc_evtchn_notify (ctrl->event, ctrl->event_port); +return xenevtchn_notify (ctrl->event, ctrl->event_port);else return 0 ; }
@@ -194,10 +194,10 @@ int libxenvchan_buffer_space(struct libxenvchan *ctrl)int libxenvchan_wait (struct libxenvchan *ctrl) { -int ret =xc_evtchn_pending (ctrl->event); +int ret =xenevtchn_pending (ctrl->event);if (ret <0 )return -1 ; -xc_evtchn_unmask (ctrl->event, ret); +xenevtchn_unmask (ctrl->event, ret);return 0 ; }
@@ -350,7 +350,7 @@ int libxenvchan_is_open(struct libxenvchan* ctrl)int libxenvchan_fd_for_select (struct libxenvchan *ctrl) { -return xc_evtchn_fd (ctrl->event); +return xenevtchn_fd (ctrl->event); }void libxenvchan_close (struct libxenvchan *ctrl)
@@ -372,8 +372,8 @@ void libxenvchan_close(struct libxenvchan *ctrl) }if (ctrl->event) {if (ctrl->ring) -xc_evtchn_notify (ctrl->event, ctrl->event_port); -xc_evtchn_close (ctrl->event); +xenevtchn_notify (ctrl->event, ctrl->event_port); +xenevtchn_close (ctrl->event); }if (ctrl->is_server) {if (ctrl->gntshr)
tools/libvchan/libxenvchan.h +2 -1
@@ -44,6 +44,7 @@#include <xen/io/libxenvchan.h> #include <xen/sys/evtchn.h> +#include <xenevtchn.h> #include <xenctrl.h> struct libxenvchan_ring {
@@ -71,7 +72,7 @@ struct libxenvchan {/* Pointer to shared ring page */ struct vchan_interface *ring;/* event channel interface */ -xc_evtchn *event; +xenevtchn_handle *event;uint32_t event_port;/* informative flags: are we acting as server? */ int is_server:1;
tools/libxc/Makefile +5 -3
@@ -48,6 +48,7 @@ CTRL_SRCS-$(CONFIG_SunOS) += xc_solaris.c CTRL_SRCS-$(CONFIG_NetBSD) += xc_netbsd.c CTRL_SRCS-$(CONFIG_NetBSDRump) += xc_netbsd.c CTRL_SRCS-$(CONFIG_MiniOS) += xc_minios.c +CTRL_SRCS-y += xc_evtchn_compat.c GUEST_SRCS-y := GUEST_SRCS-y += xg_private.c xc_suspend.c
@@ -111,6 +112,7 @@ CFLAGS-$(CONFIG_Linux) += -D_GNU_SOURCE CFLAGS += $(PTHREAD_CFLAGS) CFLAGS += $(CFLAGS_libxentoollog) +CFLAGS += $(CFLAGS_libxenevtchn) CTRL_LIB_OBJS := $(patsubst %.c,%.o,$(CTRL_SRCS-y)) CTRL_PIC_OBJS := $(patsubst %.c,%.opic,$(CTRL_SRCS-y))
@@ -164,7 +166,7 @@ install: build $(INSTALL_DATA) libxenctrl.a $(DESTDIR)$(libdir) $(SYMLINK_SHLIB) libxenctrl.so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir)/libxenctrl.so.$(MAJOR) $(SYMLINK_SHLIB) libxenctrl.so.$(MAJOR) $(DESTDIR)$(libdir)/libxenctrl.so - $(INSTALL_DATA) include/xenctrl.h include/xenctrlosdep.h $(DESTDIR)$(includedir) + $(INSTALL_DATA) include/xenctrl.h include/xenctrl_compat.h include/xenctrlosdep.h $(DESTDIR)$(includedir) $(INSTALL_SHLIB) libxenguest.so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir) $(INSTALL_DATA) libxenguest.a $(DESTDIR)$(libdir) $(SYMLINK_SHLIB) libxenguest.so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir)/libxenguest.so.$(MAJOR)
@@ -207,7 +209,7 @@ libxenctrl.so.$(MAJOR): libxenctrl.so.$(MAJOR).$(MINOR) $(SYMLINK_SHLIB) $< $@ libxenctrl.so.$(MAJOR).$(MINOR): $(CTRL_PIC_OBJS) - $(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LDLIBS_libxentoollog) $(DLOPEN_LIBS) $(PTHREAD_LIBS) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(DLOPEN_LIBS) $(PTHREAD_LIBS) $(APPEND_LDFLAGS) # libxenguest
@@ -230,7 +232,7 @@ xc_dom_bzimageloader.opic: CFLAGS += $(call zlib-options,D) libxenguest.so.$(MAJOR).$(MINOR): COMPRESSION_LIBS = $(call zlib-options,l) libxenguest.so.$(MAJOR).$(MINOR): $(GUEST_PIC_OBJS) libxenctrl.so - $(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenguest.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $(GUEST_PIC_OBJS) $(COMPRESSION_LIBS) -lz $(LDLIBS_libxenctrl) $(PTHREAD_LIBS) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenguest.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $(GUEST_PIC_OBJS) $(COMPRESSION_LIBS) -lz $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(PTHREAD_LIBS) $(APPEND_LDFLAGS) xenctrl_osdep_ENOSYS.so: $(OSDEP_PIC_OBJS) libxenctrl.so $(CC) $(LDFLAGS) $(SHLIB_LDFLAGS) -o $@ $(OSDEP_PIC_OBJS) $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
tools/libxc/include/xenctrl.h +3 -96
124 lines not on this page · raw message
tools/libxc/include/xenctrl_compat.h new file +48 -0
48 lines not on this page · raw message
tools/libxc/include/xenguest.h +10 -4
@@ -34,6 +34,12 @@#define X86_64_B_SIZE 64#define X86_32_B_SIZE 32 +/* +* User not using xc_suspend_* / xc_await_suspent may not want to +* include the full libxenevtchn API here. +*/ +typedef struct xenevtchn_handle xenevtchn_handle ; +/* callbacks provided by xc_domain_save */ struct save_callbacks {/* Called after expiration of checkpoint interval,
@@ -209,18 +215,18 @@ struct xc_hvm_firmware_module {* Sets *lockfd to -1. * Has deallocated everything even on error. */ -int xc_suspend_evtchn_release (xc_interface *xch,xc_evtchn *xce,int domid,int suspend_evtchn,int *lockfd); +int xc_suspend_evtchn_release (xc_interface *xch,xenevtchn_handle *xce,int domid,int suspend_evtchn,int *lockfd);/** * This function eats the initial notification. * xce must not be used for anything else * See xc_suspend_evtchn_init_sane re lockfd. */ -int xc_suspend_evtchn_init_exclusive (xc_interface *xch,xc_evtchn *xce, +int xc_suspend_evtchn_init_exclusive (xc_interface *xch,xenevtchn_handle *xce,int domid,int port,int *lockfd);/* xce must not be used for anything else */ -int xc_await_suspend (xc_interface *xch,xc_evtchn *xce,int suspend_evtchn); +int xc_await_suspend (xc_interface *xch,xenevtchn_handle *xce,int suspend_evtchn);/** * The port will be signaled immediately after this call
@@ -229,7 +235,7 @@ int xc_await_suspend(xc_interface *xch, xc_evtchn *xce, int suspend_evtchn);* and fed to xc_suspend_evtchn_release. (On error *lockfd is * undefined and xc_suspend_evtchn_release is not allowed.) */ -int xc_suspend_evtchn_init_sane (xc_interface *xch,xc_evtchn *xce, +int xc_suspend_evtchn_init_sane (xc_interface *xch,xenevtchn_handle *xce,int domid,int port,int *lockfd); int xc_get_bit_size(xc_interface *xch,
tools/libxc/xc_evtchn_compat.c new file +75 -0
75 lines not on this page · raw message
tools/libxc/xc_freebsd_osdep.c +0 -101
118 lines not on this page · raw message
tools/libxc/xc_linux_osdep.c +0 -95
107 lines not on this page · raw message
tools/libxc/xc_minios.c +0 -221
247 lines not on this page · raw message
tools/libxc/xc_netbsd.c +0 -109
121 lines not on this page · raw message
tools/libxc/xc_private.c +0 -40
@@ -251,46 +251,6 @@ int do_xen_hypercall(xc_interface *xch, privcmd_hypercall_t *hypercall)return xch->ops->u.privcmd.hypercall (xch, xch->ops_handle, hypercall); } -xc_evtchn *xc_evtchn_open (xentoollog_logger *logger,unsigned open_flags) -{ -xc_evtchn *xce =malloc (sizeof (*xce)); -int rc; - -if (!xce)return NULL ; - - xce->fd =-1 ; - xce->logger = logger; - xce->logger_tofree =NULL ; - -if (!xce->logger) { - xce->logger = xce->logger_tofree = - (xentoollog_logger *) -xtl_createlogger_stdiostream (stderr,XTL_PROGRESS ,0 ); -if (!xce->logger) goto err; - } - - rc =osdep_evtchn_open (xce); -if ( rc <0 ) goto err; - -return xce; - -err: -osdep_evtchn_close (xce); -xtl_logger_destroy (xce->logger_tofree); -free (xce); -return NULL ; -} - -int xc_evtchn_close (xc_evtchn *xce) -{ -int rc; - - rc =osdep_evtchn_close (xce); -xtl_logger_destroy (xce->logger_tofree); -free (xce); -return rc; -} -xc_gnttab *xc_gnttab_open (xentoollog_logger *logger,unsigned open_flags) {
tools/libxc/xc_private.h +0 -7
@@ -123,13 +123,6 @@ struct xc_interface_core {xc_osdep_handle ops_handle;/* opaque data for xc_osdep_ops */ }; -struct xenevtchn_handle { -xentoollog_logger *logger, *logger_tofree; -int fd; -}; -int osdep_evtchn_open (xc_evtchn *xce); -int osdep_evtchn_close (xc_evtchn *xce); -void xc_report_error (xc_interface *xch,int code,const char *fmt, ...) __attribute__((format (printf,3 ,4 ))); void xc_reportv(xc_interface *xch, xentoollog_logger *lg, xentoollog_level,
tools/libxc/xc_solaris.c +0 -97
109 lines not on this page · raw message
tools/libxc/xc_suspend.c +10 -8
@@ -16,6 +16,8 @@#include <unistd.h> #include <fcntl.h> +#include <xenevtchn.h> +#include "xc_private.h" #include "xenguest.h"
@@ -124,12 +126,12 @@ static int unlock_suspend_event(xc_interface *xch, int domid, int *lockfd)return -1 ; } -int xc_await_suspend (xc_interface *xch,xc_evtchn *xce,int suspend_evtchn) +int xc_await_suspend (xc_interface *xch,xenevtchn_handle *xce,int suspend_evtchn) {int rc; do { - rc = xc_evtchn_pending(xce); + rc = xenevtchn_pending(xce); if (rc < 0) { ERROR("error polling suspend notification channel: %d", rc); return -1;
@@ -137,7 +139,7 @@ int xc_await_suspend(xc_interface *xch, xc_evtchn *xce, int suspend_evtchn) }while (rc != suspend_evtchn);/* harmless for one-off suspend */ -if (xc_evtchn_unmask (xce, suspend_evtchn) <0 ) +if (xenevtchn_unmask (xce, suspend_evtchn) <0 )ERROR ("failed to unmask suspend notification channel: %d" , rc);return 0 ;
@@ -145,16 +147,16 @@ int xc_await_suspend(xc_interface *xch, xc_evtchn *xce, int suspend_evtchn)/* Internal callers are allowed to call this with suspend_evtchn<0 * but *lockfd>0. */ -int xc_suspend_evtchn_release (xc_interface *xch,xc_evtchn *xce, +int xc_suspend_evtchn_release (xc_interface *xch,xenevtchn_handle *xce,int domid,int suspend_evtchn,int *lockfd) {if (suspend_evtchn >=0 ) -xc_evtchn_unbind (xce, suspend_evtchn); +xenevtchn_unbind (xce, suspend_evtchn);return unlock_suspend_event (xch, domid, lockfd); } -int xc_suspend_evtchn_init_sane (xc_interface *xch,xc_evtchn *xce, +int xc_suspend_evtchn_init_sane (xc_interface *xch,xenevtchn_handle *xce,int domid,int port,int *lockfd) {int rc, suspend_evtchn =-1 ;
@@ -164,7 +166,7 @@ int xc_suspend_evtchn_init_sane(xc_interface *xch, xc_evtchn *xce, goto cleanup; } - suspend_evtchn =xc_evtchn_bind_interdomain (xce, domid, port); + suspend_evtchn =xenevtchn_bind_interdomain (xce, domid, port);if (suspend_evtchn <0 ) {ERROR ("failed to bind suspend event channel: %d" , suspend_evtchn); goto cleanup;
@@ -184,7 +186,7 @@ cleanup:return -1 ; } -int xc_suspend_evtchn_init_exclusive (xc_interface *xch,xc_evtchn *xce, +int xc_suspend_evtchn_init_exclusive (xc_interface *xch,xenevtchn_handle *xce,int domid,int port,int *lockfd) {int suspend_evtchn;
tools/libxl/Makefile +3 -2
@@ -20,12 +20,13 @@ LIBUUID_LIBS += -luuid endif LIBXL_LIBS = -LIBXL_LIBS = $(LDLIBS_libxentoollog) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libblktapctl) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS) +LIBXL_LIBS = $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libblktapctl) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS) ifeq ($(CONFIG_REMUS_NETBUF),y) LIBXL_LIBS += $(LIBNL3_LIBS) endif CFLAGS_LIBXL += $(CFLAGS_libxentoollog) +CFLAGS_LIBXL += $(CFLAGS_libxenevtchn) CFLAGS_LIBXL += $(CFLAGS_libxenctrl) CFLAGS_LIBXL += $(CFLAGS_libxenguest) CFLAGS_LIBXL += $(CFLAGS_libxenstore)
@@ -159,7 +160,7 @@ $(XEN_INIT_DOM0_OBJS): CFLAGS += $(CFLAGS_libxenctrl) $(XEN_INIT_DOM0_OBJS): CFLAGS += $(CFLAGS_libxenstore) SAVE_HELPER_OBJS = libxl_save_helper.o _libxl_save_msgs_helper.o -$(SAVE_HELPER_OBJS): CFLAGS += $(CFLAGS_libxenctrl) +$(SAVE_HELPER_OBJS): CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenevtchn) PKG_CONFIG = xenlight.pc xlutil.pc
tools/libxl/libxl.c +1 -1
@@ -186,7 +186,7 @@ int libxl_ctx_free(libxl_ctx *ctx)if (ctx->xch)xc_interface_close (ctx->xch);libxl_version_info_dispose (&ctx->version_info);if (ctx->xsh)xs_daemon_close (ctx->xsh); -if (ctx->xce)xc_evtchn_close (ctx->xce); +if (ctx->xce)xenevtchn_close (ctx->xce);libxl__poller_put (ctx, ctx->poller_app); ctx->poller_app =NULL ;
tools/libxl/libxl_dom_suspend.c +2 -2
@@ -107,9 +107,9 @@ static void domain_suspend_callback_common(libxl__egc *egc,if ((hvm_s_state ==0 ) && (dss->guest_evtchn.port >=0 )) {LOG (DEBUG ,"issuing %s suspend request via event channel" , dss->hvm ?"PVHVM" :"PV" ); - ret =xc_evtchn_notify (CTX ->xce, dss->guest_evtchn.port); + ret =xenevtchn_notify (CTX ->xce, dss->guest_evtchn.port);if (ret <0 ) { -LOG (ERROR ,"xc_evtchn_notify failed ret=%d" , ret); +LOG (ERROR ,"xenevtchn_notify failed ret=%d" , ret); rc =ERROR_FAIL ; goto err; }
tools/libxl/libxl_event.c +7 -7
@@ -739,7 +739,7 @@ static void evtchn_fd_callback(libxl__egc *egc, libxl__ev_fd *ev,/* OK, that's that workaround done. We can actually check for * work for us to do: */ - port =xc_evtchn_pending (CTX ->xce); + port =xenevtchn_pending (CTX ->xce);if (port <0 ) {if (errno ==EAGAIN )break ;
@@ -765,20 +765,20 @@ static void evtchn_fd_callback(libxl__egc *egc, libxl__ev_fd *ev, }int libxl__ctx_evtchn_init (libxl__gc *gc) { -xc_evtchn *xce; +xenevtchn_handle *xce;int rc, fd;if (CTX ->xce)return 0 ; - xce =xc_evtchn_open (CTX ->lg,0 ); + xce =xenevtchn_open (CTX ->lg,0 );if (!xce) {LOGE (ERROR ,"cannot open libxc evtchn handle" ); rc =ERROR_FAIL ; goto out; } - fd =xc_evtchn_fd (xce); + fd =xenevtchn_fd (xce);assert (fd >=0 ); rc =libxl_fd_set_nonblock (CTX , fd,1 );
@@ -788,7 +788,7 @@ int libxl__ctx_evtchn_init(libxl__gc *gc) {return 0 ; out: -xc_evtchn_close (xce); +xenevtchn_close (xce);return rc; }
@@ -810,14 +810,14 @@ int libxl__ev_evtchn_wait(libxl__gc *gc, libxl__ev_evtchn *evev)if (!libxl__ev_fd_isregistered (&CTX ->evtchn_efd)) { rc =libxl__ev_fd_register (gc, &CTX ->evtchn_efd, evtchn_fd_callback, -xc_evtchn_fd (CTX ->xce),POLLIN ); +xenevtchn_fd (CTX ->xce),POLLIN );if (rc) goto out; }if (evev->waiting)return 0 ; - r =xc_evtchn_unmask (CTX ->xce, evev->port); + r =xenevtchn_unmask (CTX ->xce, evev->port);if (r) {LOGE (ERROR ,"cannot unmask event channel %d" ,evev->port); rc =ERROR_FAIL ;
tools/libxl/libxl_internal.h +3 -2
@@ -48,6 +48,7 @@#include <sys/file.h> #include <sys/ioctl.h> +#include <xenevtchn.h> #include <xenstore.h> #include <xenctrl.h> #include <xenguest.h>
@@ -440,7 +441,7 @@ struct libxl__ctx {uint32_t watch_counter;/* helps disambiguate slot reuse */ libxl__ev_fd watch_efd; -xc_evtchn *xce;/* waiting must be done only with libxl__ev_evtchn* */ +xenevtchn_handle *xce;/* waiting must be done only with libxl__ev_evtchn* */ LIBXL_LIST_HEAD(, libxl__ev_evtchn) evtchns_waiting;libxl__ev_fd evtchn_efd;
@@ -914,7 +915,7 @@ static inline int libxl__ev_xswatch_isregistered(const libxl__ev_xswatch *xw)* When the event is signaled then the callback will be made, once. * Then you must call libxl__ev_evtchn_wait again, if desired. * -* You must NOT call xc_evtchn_unmask. wait will do that for you. +* You must NOT call xenevtchn_unmask. wait will do that for you. * * Calling libxl__ev_evtchn_cancel will arrange for libxl to disregard * future occurrences of event. Both libxl__ev_evtchn_wait and
tools/misc/Makefile +4 -3
@@ -4,6 +4,7 @@ include $(XEN_ROOT)/tools/Rules.mk CFLAGS += -Werror # Include configure output (config.h) CFLAGS += -include $(XEN_ROOT)/tools/config.h +CFLAGS += $(CFLAGS_libxenevtchn) CFLAGS += $(CFLAGS_libxenctrl) CFLAGS += $(CFLAGS_xeninclude) CFLAGS += $(CFLAGS_libxenstore)
@@ -88,18 +89,18 @@ xenlockprof: xenlockprof.o # xen-hptool incorrectly uses libxc internals xen-hptool.o: CFLAGS += -I$(XEN_ROOT)/tools/libxc xen-hptool: xen-hptool.o - $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(APPEND_LDFLAGS) # xen-mfndump incorrectly uses libxc internals xen-mfndump.o: CFLAGS += -I$(XEN_ROOT)/tools/libxc xen-mfndump: xen-mfndump.o - $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(APPEND_LDFLAGS) xenwatchdogd: xenwatchdogd.o $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS) xen-lowmemd: xen-lowmemd.o - $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(LDLIBS_libxenstore) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenstore) $(APPEND_LDFLAGS) gtraceview: gtraceview.o $(CC) $(LDFLAGS) -o $@ $< $(CURSES_LIBS) $(TINFO_LIBS) $(APPEND_LDFLAGS)
tools/misc/xen-hptool.c +7 -6
@@ -1,3 +1,4 @@ +#include <xenevtchn.h> #include <xenctrl.h> #include <xc_private.h> #include <xc_core.h>
@@ -98,7 +99,7 @@ static int hp_mem_query_func(int argc, char *argv[])return ret; } -static int suspend_guest (xc_interface *xch,xc_evtchn *xce,int domid, +static int suspend_guest (xc_interface *xch,xenevtchn_handle *xce,int domid,int *evtchn,int *lockfd) {int port, rc, suspend_evtchn =-1 ;
@@ -123,7 +124,7 @@ static int suspend_guest(xc_interface *xch, xc_evtchn *xce, int domid, } *evtchn = suspend_evtchn; - rc =xc_evtchn_notify (xce, suspend_evtchn); + rc =xenevtchn_notify (xce, suspend_evtchn);if (rc <0 ) {fprintf (stderr,"Failed to notify suspend channel: errno %d\n" , rc);
@@ -198,8 +199,8 @@ static int hp_mem_offline_func(int argc, char *argv[])else if (status &PG_OFFLINE_OWNED ) {int result, suspend_evtchn =-1 , suspend_lockfd =-1 ; -xc_evtchn *xce; - xce =xc_evtchn_open (NULL ,0 ); +xenevtchn_handle *xce; + xce =xenevtchn_open (NULL ,0 );if (xce ==NULL ) {
@@ -214,7 +215,7 @@ static int hp_mem_offline_func(int argc, char *argv[]) {fprintf (stderr,"Failed to suspend guest %d for" " mfn %lx\n" , domid, mfn); -xc_evtchn_close (xce); +xenevtchn_close (xce);return -1 ; }
@@ -238,7 +239,7 @@ static int hp_mem_offline_func(int argc, char *argv[])xc_domain_resume (xch, domid,1 );xc_suspend_evtchn_release (xch, xce, domid, suspend_evtchn, &suspend_lockfd); -xc_evtchn_close (xce); +xenevtchn_close (xce); }break ; }
tools/misc/xen-lowmemd.c +8 -7
@@ -4,22 +4,23 @@*/ #include <stdio.h> +#include <xenevtchn.h> #include <xenctrl.h> #include <xenstore.h> #include <stdlib.h> #include <string.h> static evtchn_port_t virq_port =-1 ; -static xc_evtchn *xce_handle =NULL ; +static xenevtchn_handle *xce_handle =NULL ;static xc_interface *xch =NULL ;static struct xs_handle *xs_handle =NULL ;void cleanup (void ) {if (virq_port >-1 ) -xc_evtchn_unbind (xce_handle, virq_port); +xenevtchn_unbind (xce_handle, virq_port);if (xce_handle) -xc_evtchn_close (xce_handle); +xenevtchn_close (xce_handle);if (xch)xc_interface_close (xch);if (xs_handle)
@@ -94,7 +95,7 @@ int main(int argc, char *argv[])return 1 ; } - xce_handle =xc_evtchn_open (NULL ,0 ); + xce_handle =xenevtchn_open (NULL ,0 );if (xce_handle ==NULL ) {perror ("Failed to open evtchn device" );
@@ -108,7 +109,7 @@ int main(int argc, char *argv[])return 3 ; } -if ((rc =xc_evtchn_bind_virq (xce_handle,VIRQ_ENOMEM )) ==-1 ) +if ((rc =xenevtchn_bind_virq (xce_handle,VIRQ_ENOMEM )) ==-1 ) {perror ("Failed to bind to domain exception virq port" );return 4 ;
@@ -120,7 +121,7 @@ int main(int argc, char *argv[]) {evtchn_port_t port; -if ((port =xc_evtchn_pending (xce_handle)) ==-1 ) +if ((port =xenevtchn_pending (xce_handle)) ==-1 ) {perror ("Failed to listen for pending event channel" );return 5 ;
@@ -134,7 +135,7 @@ int main(int argc, char *argv[])return 6 ; } -if (xc_evtchn_unmask (xce_handle, port) ==-1 ) +if (xenevtchn_unmask (xce_handle, port) ==-1 ) {perror ("Failed to unmask port" );return 7 ;
tools/ocaml/libs/eventchn/Makefile +2 -2
@@ -2,13 +2,13 @@ TOPLEVEL=$(CURDIR)/../.. XEN_ROOT=$(TOPLEVEL)/../.. include $(TOPLEVEL)/common.make
Lines of this file are not shown. View the raw message.
tools/ocaml/libs/eventchn/xeneventchn_stubs.c +10 -10
Lines of this file are not shown. View the raw message.
The rest of this diff is not shown. View the raw message.
Signature · 7 lines
2.1.4 _______________________________________________ Xen-devel mailing list [email protected] http://lists.xen.org/xen-devel
Part of the diff is not shown here. View the raw message.
Re: [PATCH XEN v5 04/23] tools: Refactor /dev/xen/evtchn wrappers into libxenevtchn.
Ian Campbell writes ("[PATCH XEN v5 04/23] tools: Refactor /dev/xen/evtchn wrappers into libxenevtchn."):
Quoted 2 lines
libxenevtchn will provide a stable API and ABI for accessing the evtchn device.
API reviewed.
Ian.
PATCH v5 5/23 tools: Arrange to check public headers for ANSI compatiblity
In reply to Ian CampbellUsing the same rune as we use for the Xen public headers, except we do not need stdint.h here and we use -pedantic too.
--- .gitignore | 2 ++ tools/Rules.mk | 8 ++++++++ tools/libs/evtchn/Makefile | 4 +++- tools/libs/toollog/Makefile | 5 ++++- 4 files changed, 17 insertions(+), 2 deletions(-)
.gitignore +2 -0
@@ -86,6 +86,8 @@ tools/config.cache config/Tools.mk config/Stubdom.mk config/Docs.mk +tools/libs/toollog/headers.chk +tools/libs/evtchn/headers.chk tools/blktap2/daemon/blktapctrl tools/blktap2/drivers/img2qcow tools/blktap2/drivers/lock-util
tools/Rules.mk +8 -0
@@ -176,6 +176,14 @@ INSTALL_PYTHON_PROG = \ %.opic: %.S $(CC) $(CPPFLAGS) -DPIC $(CFLAGS) $(CFLAGS.opic) -fPIC -c -o $@ $< $(APPEND_CFLAGS) +headers.chk: + for i in $(filter %.h,$^); do \ + $(CC) -x c -ansi -Wall -Werror -pedantic $(CFLAGS_xeninclude) \ + -S -o /dev/null $$i || exit 1; \ + echo $$i; \ + done >[email protected] + mv [email protected] $@ + subdirs-all subdirs-clean subdirs-install subdirs-distclean: .phony @set -e; for subdir in $(SUBDIRS) $(SUBDIRS-y); do \ $(MAKE) subdir-$(patsubst subdirs-%,%,$@)-$$subdir; \
tools/libs/evtchn/Makefile +3 -1
@@ -32,8 +32,9 @@ build: $(MAKE) libs .PHONY: libs -libs: $(LIB) +libs: headers.chk $(LIB) +headers.chk: $(wildcard include/*.h) libxenevtchn.a: $(LIB_OBJS) $(AR) rc $@ $^
@@ -63,3 +64,4 @@ TAGS: .PHONY: clean clean: rm -rf *.rpm $(LIB) *~ $(DEPS) $(LIB_OBJS) $(PIC_OBJS) + rm -f headers.chk
tools/libs/toollog/Makefile +4 -1
@@ -27,7 +27,9 @@ build: $(MAKE) libs .PHONY: libs -libs: $(LIB) +libs: headers.chk $(LIB) + +headers.chk: $(wildcard include/*.h) libxentoollog.a: $(LIB_OBJS) $(AR) rc $@ $^
@@ -57,3 +59,4 @@ TAGS: .PHONY: clean clean: rm -rf *.rpm $(LIB) *~ $(DEPS) $(LIB_OBJS) $(PIC_OBJS) + rm -f headers.chk
Signature · 1 line
2.1.4
PATCH v5 6/23 tools/libxc: Remove osdep indirection for xc_gnt{shr, tab}
In reply to Ian CampbellThe alternative backend (a xen-api/xapi shim) is no longer around and so this stuff is now just baggage which is getting in the way of refactoring libxenctrl.
Nested virt probably suffices for this use case now.
It is now necessary to provide explicit versions of things for platforms which do not implement this functionality, since the osdep dispatcher cannot fulfil this need any more. These are provided by appropriate xc_nognt???.c files which are compiled and linked on the appropriate platforms. In them open and close return failure and everything else aborts, since if open fails they should never be called.
--- tools/libxc/Makefile | 10 ++-- tools/libxc/include/xenctrl.h | 4 +- tools/libxc/include/xenctrlosdep.h | 23 ------- tools/libxc/xc_gnttab.c | 57 ++++-------------- tools/libxc/xc_linux_osdep.c | 119 +++++++++++++++---------------------- tools/libxc/xc_minios.c | 51 ++++++---------- tools/libxc/xc_nogntshr.c | 46 ++++++++++++++ tools/libxc/xc_nognttab.c | 50 ++++++++++++++++ tools/libxc/xc_private.c | 83 +++++++++++++++++++++----- tools/libxc/xc_private.h | 24 ++++++++ 10 files changed, 274 insertions(+), 193 deletions(-) create mode 100644 tools/libxc/xc_nogntshr.c create mode 100644 tools/libxc/xc_nognttab.c
tools/libxc/Makefile +5 -5
@@ -43,11 +43,11 @@ CTRL_SRCS-y += xc_resource.c CTRL_SRCS-$(CONFIG_X86) += xc_psr.c CTRL_SRCS-$(CONFIG_X86) += xc_pagetab.c CTRL_SRCS-$(CONFIG_Linux) += xc_linux.c xc_linux_osdep.c -CTRL_SRCS-$(CONFIG_FreeBSD) += xc_freebsd.c xc_freebsd_osdep.c -CTRL_SRCS-$(CONFIG_SunOS) += xc_solaris.c -CTRL_SRCS-$(CONFIG_NetBSD) += xc_netbsd.c -CTRL_SRCS-$(CONFIG_NetBSDRump) += xc_netbsd.c -CTRL_SRCS-$(CONFIG_MiniOS) += xc_minios.c +CTRL_SRCS-$(CONFIG_FreeBSD) += xc_freebsd.c xc_freebsd_osdep.c xc_nognttab.c xc_nogntshr.c +CTRL_SRCS-$(CONFIG_SunOS) += xc_solaris.c xc_nognttab.c xc_nogntshr.c +CTRL_SRCS-$(CONFIG_NetBSD) += xc_netbsd.c xc_nognttab.c xc_nogntshr.c +CTRL_SRCS-$(CONFIG_NetBSDRump) += xc_netbsd.c xc_nognttab.c xc_nogntshr.c +CTRL_SRCS-$(CONFIG_MiniOS) += xc_minios.c xc_nogntshr.c CTRL_SRCS-y += xc_evtchn_compat.c GUEST_SRCS-y :=
tools/libxc/include/xenctrl.h +2 -2
@@ -117,8 +117,8 @@*/ typedef struct xc_interface_core xc_interface ; -typedef struct xc_interface_core xc_gnttab ; -typedef struct xc_interface_core xc_gntshr ; +typedef struct xengntdev_handle xc_gnttab ; +typedef struct xengntdev_handle xc_gntshr ;enum xc_error_code {XC_ERROR_NONE =0 ,
tools/libxc/include/xenctrlosdep.h +0 -23
@@ -51,8 +51,6 @@enum xc_osdep_type {XC_OSDEP_PRIVCMD , -XC_OSDEP_GNTTAB , -XC_OSDEP_GNTSHR , };/* Opaque handle internal to the backend */
@@ -88,27 +86,6 @@ struct xc_osdep_ops size_t chunksize, privcmd_mmap_entry_t entries[], int nentries); } privcmd; -struct { -#define XC_GRANT_MAP_SINGLE_DOMAIN 0x1 -void *(*grant_map)(xc_gnttab *xcg,xc_osdep_handle h, -uint32_t count,int flags,int prot, -uint32_t *domids,uint32_t *refs, -uint32_t notify_offset, -evtchn_port_t notify_port); -int (*munmap)(xc_gnttab *xcg,xc_osdep_handle h, -void *start_address, -uint32_t count); -int (*set_max_grants)(xc_gnttab *xcg,xc_osdep_handle h,uint32_t count); - } gnttab; -struct { -void *(*share_pages)(xc_gntshr *xcg,xc_osdep_handle h, -uint32_t domid,int count, -uint32_t *refs,int writable, -uint32_t notify_offset, -evtchn_port_t notify_port); -int (*munmap)(xc_gntshr *xcg,xc_osdep_handle h, -void *start_address,uint32_t count); - } gntshr; } u; };typedef struct xc_osdep_ops xc_osdep_ops ;
tools/libxc/xc_gnttab.c +13 -44
103 lines not on this page · raw message
tools/libxc/xc_linux_osdep.c +47 -72
235 lines not on this page · raw message
tools/libxc/xc_minios.c +19 -32
97 lines not on this page · raw message
tools/libxc/xc_nogntshr.c new file +46 -0
46 lines not on this page · raw message
tools/libxc/xc_nognttab.c new file +50 -0
50 lines not on this page · raw message
tools/libxc/xc_private.c +68 -15
106 lines not on this page · raw message
tools/libxc/xc_private.h +24 -0
@@ -123,6 +123,30 @@ struct xc_interface_core {xc_osdep_handle ops_handle;/* opaque data for xc_osdep_ops */ }; +struct xengntdev_handle { +xentoollog_logger *logger, *logger_tofree; +int fd; +}; + +int osdep_gnttab_open (xc_gnttab *xgt); +int osdep_gnttab_close (xc_gnttab *xgt); + +#define XC_GRANT_MAP_SINGLE_DOMAIN 0x1 +void *osdep_gnttab_grant_map (xc_gnttab *xgt, +uint32_t count,int flags,int prot, +uint32_t *domids,uint32_t *refs, +uint32_t notify_offset, +evtchn_port_t notify_port); + +int osdep_gntshr_open (xc_gntshr *xgs); +int osdep_gntshr_close (xc_gntshr *xgs); + +void *osdep_gntshr_share_pages (xc_gntshr *xgs, +uint32_t domid,int count, +uint32_t *refs,int writable, +uint32_t notify_offset, +evtchn_port_t notify_port); +void xc_report_error (xc_interface *xch,int code,const char *fmt, ...) __attribute__((format (printf,3 ,4 ))); void xc_reportv(xc_interface *xch, xentoollog_logger *lg, xentoollog_level,
Signature · 1 line
2.1.4
PATCH v5 7/23 tools: Refactor /dev/xen/gnt{dev, shr} wrappers into libxengnttab.
In reply to Ian Campbelllibxengnttab will provide a stable API and ABI for accessing the grant table devices.
The functions are moved into the xengnt{tab,shr} namespace to make a clean break from libxc and avoid ambiguity regarding which interfaces are stable.
XXX consider combining into a single namespace (i.e. with xengnttab_handle having two open fd's in it on Linux)
All in-tree users are updated to use the new names.
Upon request (via #define XC_WANT_COMPAT_GNTTAB_API) libxenctrl will provide a compat API for the old names. This is used by qemu-xen for the time being. qemu-xen-traditional is updated in lockstep.
This leaves a few grant table related functions which go via privcmd (EVTCHNOP) rather than ioctls on the /dev/xen/gnt* devices in libxenctrl. Specifically:
- xc_gnttab_get_version
- xc_gnttab_map_table_v1
- xc_gnttab_map_table_v2
- xc_gnttab_op
These functions do not appear to be needed by qemu-dm, qemu-pv (provision of device model to HVM guests and PV backends respectively) or by libvchan suggesting they are not needed by non-toolstack uses of event channels.
The new library uses a version script to ensure that only expected symbols are exported and to version them such that ABI guarantees can be kept in the future.
After this change libxenvchan no longer needs to link against libxenctrl. It still needs xenctrl.h in one file for xen_mb and friends.
---
Must be applied with:
- "qemu-xen-traditional: Use libxengnttab" and a corresponding QEMU_TAG update folded here.
- "mini-os: Include libxengnttab with libxc"" and a corresponding bump to MINIOS_UPSTREAM_REVISION folded in here.
v3:
- Remove SHLIB_libxenctrl from SHDEPS_libxenvchan, and replace with SHLIB_libxentoollog.
- Move to tools/libs/gnttab
- Adjust for rebase over 31cf2ca75181 "tools/libxc: linux: Don't use getpagesize() when unmapping the grants"
v5: Allow _close(NULL).
---
.gitignore | 2 +
stubdom/Makefile | 19 +-
tools/Makefile | 3 +
tools/Rules.mk | 14 +-
tools/console/Makefile | 5 +-
tools/console/daemon/io.c | 21 +-
tools/libs/Makefile | 1 +
tools/libs/evtchn/minios.c | 5 +-
tools/libs/gnttab/Makefile | 69 +++++
tools/libs/gnttab/gntshr_core.c | 95 ++++++
.../xc_nognttab.c => libs/gnttab/gntshr_unimp.c} | 34 ++-
tools/libs/gnttab/gnttab_core.c | 124 ++++++++
tools/libs/gnttab/gnttab_unimp.c | 89 ++++++
tools/libs/gnttab/include/xengnttab.h | 218 ++++++++++++++
tools/libs/gnttab/libxengnttab.map | 23 ++
tools/libs/gnttab/linux.c | 329 +++++++++++++++++++++
tools/libs/gnttab/minios.c | 117 ++++++++
tools/libs/gnttab/private.h | 47 +++
tools/libvchan/Makefile | 8 +-
tools/libvchan/init.c | 24 +-
tools/libvchan/io.c | 8 +-
tools/libvchan/libxenvchan.h | 6 +-
tools/libxc/Makefile | 15 +-
tools/libxc/include/xenctrl.h | 168 -----------
tools/libxc/include/xenctrl_compat.h | 48 +++
tools/libxc/xc_gnttab.c | 53 ----
tools/libxc/xc_gnttab_compat.c | 111 +++++++
tools/libxc/xc_linux_osdep.c | 280 ------------------
tools/libxc/xc_minios.c | 73 -----
tools/libxc/xc_nogntshr.c | 46 ---
tools/libxc/xc_private.c | 80 -----
tools/libxc/xc_private.h | 24 --
tools/xenstore/Makefile | 4 +-
tools/xenstore/xenstored_core.h | 4 +-
tools/xenstore/xenstored_domain.c | 24 +-
tools/xenstore/xenstored_minios.c | 5 +-
36 files changed, 1396 insertions(+), 800 deletions(-)
create mode 100644 tools/libs/gnttab/Makefile
create mode 100644 tools/libs/gnttab/gntshr_core.c
rename tools/{libxc/xc_nognttab.c => libs/gnttab/gntshr_unimp.c} (52%)
create mode 100644 tools/libs/gnttab/gnttab_core.c
create mode 100644 tools/libs/gnttab/gnttab_unimp.c
create mode 100644 tools/libs/gnttab/include/xengnttab.h
create mode 100644 tools/libs/gnttab/libxengnttab.map
create mode 100644 tools/libs/gnttab/linux.c
create mode 100644 tools/libs/gnttab/minios.c
create mode 100644 tools/libs/gnttab/private.h
create mode 100644 tools/libxc/xc_gnttab_compat.c
delete mode 100644 tools/libxc/xc_nogntshr.c.gitignore +2 -0
@@ -60,6 +60,7 @@ stubdom/ioemu stubdom/xenstore stubdom/libxentoollog-* stubdom/libxenevtchn-* +stubdom/libxengnttab-* stubdom/libxc-* stubdom/lwip-* stubdom/mini-os-*
@@ -88,6 +89,7 @@ config/Stubdom.mk config/Docs.mk tools/libs/toollog/headers.chk tools/libs/evtchn/headers.chk +tools/libs/gnttab/headers.chk tools/blktap2/daemon/blktapctrl tools/blktap2/drivers/img2qcow tools/blktap2/drivers/lock-util
stubdom/Makefile +18 -1
@@ -324,6 +324,12 @@ mk-headers-$(XEN_TARGET_ARCH): $(IOEMU_LINKFARM_TARGET) ln -sf $(XEN_ROOT)/tools/libs/evtchn/include/*.h include/ && \ ln -sf $(XEN_ROOT)/tools/libs/evtchn/*.c . && \ ln -sf $(XEN_ROOT)/tools/libs/evtchn/Makefile . ) + mkdir -p libs-$(XEN_TARGET_ARCH)/gnttab/include + [ -h libs-$(XEN_TARGET_ARCH)/gnttab/Makefile ] || ( cd libs-$(XEN_TARGET_ARCH)/gnttab && \ + ln -sf $(XEN_ROOT)/tools/libs/gnttab/*.h . && \ + ln -sf $(XEN_ROOT)/tools/libs/gnttab/include/*.h include/ && \ + ln -sf $(XEN_ROOT)/tools/libs/gnttab/*.c . && \ + ln -sf $(XEN_ROOT)/tools/libs/gnttab/Makefile . ) mkdir -p libxc-$(XEN_TARGET_ARCH) [ -h libxc-$(XEN_TARGET_ARCH)/Makefile ] || ( cd libxc-$(XEN_TARGET_ARCH) && \ ln -sf $(XEN_ROOT)/tools/libxc/*.h . && \
@@ -369,12 +375,23 @@ libs-$(XEN_TARGET_ARCH)/evtchn/libxenevtchn.a: $(NEWLIB_STAMPFILE) CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= -C libs-$(XEN_TARGET_ARCH)/evtchn ####### +# libxengnttab +####### + +.PHONY: libxengnttab +libxengnttab: libs-$(XEN_TARGET_ARCH)/gnttab/libxengnttab.a +libs-$(XEN_TARGET_ARCH)/gnttab/libxengnttab.a: $(NEWLIB_STAMPFILE) + $(MAKE) -C $(XEN_ROOT)/tools/include + $(MAKE) DESTDIR= -C $(MINI_OS) links + CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= -C libs-$(XEN_TARGET_ARCH)/gnttab + +####### # libxc ####### .PHONY: libxc libxc: libxc-$(XEN_TARGET_ARCH)/libxenctrl.a libxc-$(XEN_TARGET_ARCH)/libxenguest.a -libxc-$(XEN_TARGET_ARCH)/libxenctrl.a: libxentoollog libxenevtchn cross-zlib +libxc-$(XEN_TARGET_ARCH)/libxenctrl.a: libxentoollog libxenevtchn libxengnttab cross-zlib $(MAKE) -C $(XEN_ROOT)/tools/include $(MAKE) DESTDIR= -C $(MINI_OS) links CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= CONFIG_LIBXC_MINIOS=y -C libxc-$(XEN_TARGET_ARCH)
tools/Makefile +3 -0
@@ -249,9 +249,11 @@ subdir-all-qemu-xen-dir: qemu-xen-dir-find --includedir=$(LIBEXEC_INC) \ --source-path=$$source \ --extra-cflags="-DXC_WANT_COMPAT_EVTCHN_API=1 \ + -DXC_WANT_COMPAT_GNTTAB_API=1 \ -I$(XEN_ROOT)/tools/include \ -I$(XEN_ROOT)/tools/libs/toollog/include \ -I$(XEN_ROOT)/tools/libs/evtchn/include \ + -I$(XEN_ROOT)/tools/libs/gnttab/include \ -I$(XEN_ROOT)/tools/libxc/include \ -I$(XEN_ROOT)/tools/xenstore/include \ -I$(XEN_ROOT)/tools/xenstore/compat/include \
@@ -260,6 +262,7 @@ subdir-all-qemu-xen-dir: qemu-xen-dir-find -L$(XEN_ROOT)/tools/xenstore \ -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/toollog \ -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/evtchn \ + -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/gnttab \ $(QEMU_UPSTREAM_RPATH)" \ --bindir=$(LIBEXEC_BIN) \ --datadir=$(SHAREDIR)/qemu-xen \
tools/Rules.mk +12 -2
@@ -12,6 +12,7 @@ INSTALL = $(XEN_ROOT)/tools/cross-install XEN_INCLUDE = $(XEN_ROOT)/tools/include XEN_LIBXENTOOLLOG = $(XEN_ROOT)/tools/libs/toollog XEN_LIBXENEVTCHN = $(XEN_ROOT)/tools/libs/evtchn +XEN_LIBXENGNTTAB = $(XEN_ROOT)/tools/libs/gnttab XEN_LIBXC = $(XEN_ROOT)/tools/libxc XEN_XENLIGHT = $(XEN_ROOT)/tools/libxl XEN_XENSTORE = $(XEN_ROOT)/tools/xenstore
@@ -88,8 +89,17 @@ SHDEPS_libxenevtchn = LDLIBS_libxenevtchn = $(XEN_LIBXENEVTCHN)/libxenevtchn$(libextension) SHLIB_libxenevtchn = -Wl,-rpath-link=$(XEN_LIBXENEVTCHN) +CFLAGS_libxengnttab = -I$(XEN_LIBXENGNTTAB)/include $(CFLAGS_xeninclude) +LDLIBS_libxengnttab = $(XEN_LIBXENGNTTAB)/libxengnttab$(libextension) +SHLIB_libxengnttab = -Wl,-rpath-link=$(XEN_LIBXENGNTTAB) + +# xengntshr_* interfaces are actually part of libxengnttab.so +CFLAGS_libxengntshr = -I$(XEN_LIBXENGNTTAB)/include $(CFLAGS_xeninclude) +LDLIBS_libxengntshr = $(XEN_LIBXENGNTTAB)/libxengnttab$(libextension) +SHLIB_libxengntshr = -Wl,-rpath-link=$(XEN_LIBXENGNTTAB) + CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_libxentoollog) $(CFLAGS_xeninclude) -SHDEPS_libxenctrl = $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn) +SHDEPS_libxenctrl = $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn) $(SHLIB_libxengnttab) $(SHLIB_libxengntshr) LDLIBS_libxenctrl = $(SHDEPS_libxenctrl) $(XEN_LIBXC)/libxenctrl$(libextension) SHLIB_libxenctrl = $(SHDEPS_libxenctrl) -Wl,-rpath-link=$(XEN_LIBXC)
@@ -109,7 +119,7 @@ LDLIBS_libxenstat = $(SHDEPS_libxenstat) $(XEN_LIBXENSTAT)/libxenstat$(libexten SHLIB_libxenstat = $(SHDEPS_libxenstat) -Wl,-rpath-link=$(XEN_LIBXENSTAT) CFLAGS_libxenvchan = -I$(XEN_LIBVCHAN) -SHDEPS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libxenevtchn) +SHDEPS_libxenvchan = $(SHLIB_libxentoollog) $(SHLIB_libxenstore) $(SHLIB_libxenevtchn) $(SHLIB_libxengnttab) $(SHLIB_libxengntshr) LDLIBS_libxenvchan = $(SHDEPS_libxenvchan) $(XEN_LIBVCHAN)/libxenvchan$(libextension) SHLIB_libxenvchan = $(SHDEPS_libxenvchan) -Wl,-rpath-link=$(XEN_LIBVCHAN)
tools/console/Makefile +2 -3
@@ -3,10 +3,8 @@ include $(XEN_ROOT)/tools/Rules.mk CFLAGS += -Werror -CFLAGS += $(CFLAGS_libxenevtchn) CFLAGS += $(CFLAGS_libxenctrl) CFLAGS += $(CFLAGS_libxenstore) -LDLIBS += $(LDLIBS_libxenevtchn) LDLIBS += $(LDLIBS_libxenctrl) LDLIBS += $(LDLIBS_libxenstore) LDLIBS += $(SOCKET_LIBS)
@@ -28,8 +26,9 @@ clean: .PHONY: distclean distclean: clean +daemon/io.o: CFLAGS += $(CFLAGS_libxenevtchn) $(CFLAGS_libxengnttab) xenconsoled: $(patsubst %.c,%.o,$(wildcard daemon/*.c)) - $(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS) $(LDLIBS_xenconsoled) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS) $(LDLIBS_libxenevtchn) $(LDLIBS_libxengnttab) $(LDLIBS_xenconsoled) $(APPEND_LDFLAGS) xenconsole: client/_paths.h $(patsubst %.c,%.o,$(wildcard client/*.c)) $(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS) $(LDLIBS_xenconsole) $(APPEND_LDFLAGS)
tools/console/daemon/io.c +11 -10
@@ -22,6 +22,7 @@#include "utils.h" #include "io.h" #include <xenevtchn.h> +#include <xengnttab.h> #include <xenstore.h> #include <xen/io/console.h> #include <xen/grant_table.h>
@@ -72,7 +73,7 @@ static int log_time_hv_needts = 1;static int log_time_guest_needts =1 ;static int log_hv_fd =-1 ; -static xc_gnttab *xcg_handle =NULL ; +static xengnttab_handle *xgt_handle =NULL ;static struct pollfd *fds;static unsigned int current_array_size;
@@ -520,8 +521,8 @@ static void domain_unmap_interface(struct domain *dom) {if (dom->interface ==NULL )return ; -if (xcg_handle && dom->ring_ref ==-1 ) -xc_gnttab_munmap (xcg_handle, dom->interface,1 ); +if (xgt_handle && dom->ring_ref ==-1 ) +xengnttab_munmap (xgt_handle, dom->interface,1 );else munmap (dom->interface,XC_PAGE_SIZE ); dom->interface =NULL ;
@@ -552,9 +553,9 @@ static int domain_create_ring(struct domain *dom)if (ring_ref != dom->ring_ref && dom->ring_ref !=-1 )domain_unmap_interface (dom); -if (!dom->interface && xcg_handle) { +if (!dom->interface && xgt_handle) {/* Prefer using grant table */ - dom->interface =xc_gnttab_map_grant_ref (xcg_handle, + dom->interface =xengnttab_map_grant_ref (xgt_handle, dom->domid,GNTTAB_RESERVED_CONSOLE ,PROT_READ |PROT_WRITE ); dom->ring_ref =-1 ;
@@ -1029,8 +1030,8 @@ void handle_io(void)handle_hv_logs (xce_handle, true); } - xcg_handle =xc_gnttab_open (NULL ,0 ); -if (xcg_handle ==NULL ) { + xgt_handle =xengnttab_open (NULL ,0 ); +if (xgt_handle ==NULL ) {dolog (LOG_DEBUG ,"Failed to open xcg handle: %d (%s)" , errno,strerror (errno)); }
@@ -1206,9 +1207,9 @@ void handle_io(void)xenevtchn_close (xce_handle); xce_handle =NULL ; } -if (xcg_handle !=NULL ) { -xc_gnttab_close (xcg_handle); - xcg_handle =NULL ; +if (xgt_handle !=NULL ) { +xengnttab_close (xgt_handle); + xgt_handle =NULL ; } log_hv_evtchn =-1 ; }
tools/libs/Makefile +1 -0
@@ -4,5 +4,6 @@ include $(XEN_ROOT)/tools/Rules.mk SUBDIRS-y := SUBDIRS-y += toollog SUBDIRS-y += evtchn +SUBDIRS-y += gnttab all clean install distclean: %: subdirs-%
tools/libs/evtchn/minios.c +1 -4
@@ -27,13 +27,12 @@#include <mini-os/events.h> #include <mini-os/wait.h> -#include <sys/socket.h> -#include <assert.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdint.h> +#include <unistd.h> #include <inttypes.h> #include <malloc.h>
@@ -43,8 +42,6 @@ extern void minios_evtchn_close_fd(int fd);extern struct wait_queue_head event_queue; -//void minios_evtchn_close_fd(int fd); -/* XXX Note: This is not threadsafe */ static struct evtchn_port_info *port_alloc (int fd) {struct evtchn_port_info *port_info;
tools/libs/gnttab/Makefile new file +69 -0
69 lines not on this page · raw message
tools/libs/gnttab/gntshr_core.c new file +95 -0
95 lines not on this page · raw message
tools/libs/gnttab/gntshr_unimp.c renamed from tools/libxc/xc_nognttab.c +23 -11
@@ -14,37 +14,49 @@* * You should have received a copy of the GNU Lesser General Public * License along with this library; If not, see <http://www.gnu.org/licenses/>. +* +* Split out from xc_gnttab.c */ #include <stdlib.h> -#include "xc_private.h" +#include "private.h" -int osdep_gnttab_open (xc_gnttab *xgt) +xengntshr_handle *xengntshr_open (xentoollog_logger *logger,unsigned open_flags) { -return -1 ; +return NULL ; } -int osdep_gnttab_close (xc_gnttab *xgt) +int xengntshr_close (xengntshr_handle *xgs) {return 0 ; } -int xc_gnttab_set_max_grants (xc_gnttab *xgt,uint32_t count) +void *xengntshr_share_pages (xengntshr_handle *xcg,uint32_t domid, +int count,uint32_t *refs,int writable) {abort (); } -void *osdep_gnttab_grant_map (xc_gnttab *xgt, -uint32_t count,int flags,int prot, -uint32_t *domids,uint32_t *refs, -uint32_t notify_offset, -evtchn_port_t notify_port) +void *xengntshr_share_page_notify (xengntshr_handle *xcg,uint32_t domid, +uint32_t *ref,int writable, +uint32_t notify_offset, +evtchn_port_t notify_port) {abort (); } -int xc_gnttab_munmap (xc_gnttab *xgt,void *start_address,uint32_t count) +int xengntshr_munmap (xengntshr_handle *xgs,void *start_address,uint32_t count) {abort (); } + +/* +* Local variables: +* mode: C +* c-file-style: "BSD" +* c-basic-offset: 4 +* tab-width: 4 +* indent-tabs-mode: nil +* End: +*/
tools/libs/gnttab/gnttab_core.c new file +124 -0
124 lines not on this page · raw message
tools/libs/gnttab/gnttab_unimp.c new file +89 -0
89 lines not on this page · raw message
tools/libs/gnttab/include/xengnttab.h new file +218 -0
218 lines not on this page · raw message
tools/libs/gnttab/libxengnttab.map new file +23 -0
@@ -0,0 +1,23 @@ +VERS_1.0 { + global: + xengnttab_open; + xengnttab_close; + + xengnttab_set_max_grants; + + xengnttab_map_domain_grant_refs; + xengnttab_map_grant_ref; + xengnttab_map_grant_ref_notify; + xengnttab_map_grant_refs; + + xengnttab_munmap; + + xengntshr_open; + xengntshr_close; + + xengntshr_share_page_notify; + xengntshr_share_pages; + + xengntshr_munmap; + local: *; /* Do not expose anything by default */ +};
tools/libs/gnttab/linux.c new file +329 -0
329 lines not on this page · raw message
tools/libs/gnttab/minios.c new file +117 -0
117 lines not on this page · raw message
tools/libs/gnttab/private.h new file +47 -0
47 lines not on this page · raw message
tools/libvchan/Makefile +5 -3
@@ -10,15 +10,17 @@ NODE_OBJS = node.o NODE2_OBJS = node-select.o LIBVCHAN_PIC_OBJS = $(patsubst %.o,%.opic,$(LIBVCHAN_OBJS)) -LIBVCHAN_LIBS = $(LDLIBS_libxenstore) $(LDLIBS_libxenctrl) $(LDLIBS_libxenevtchn) -$(LIBVCHAN_OBJS) $(LIBVCHAN_PIC_OBJS): CFLAGS += $(CFLAGS_libxenstore) $(CFLAGS_libxenctrl) $(CFLAGS_libxenevtchn) -$(NODE_OBJS) $(NODE2_OBJS): CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenevtchn) +LIBVCHAN_LIBS = $(LDLIBS_libxenstore) $(LDLIBS_libxengnttab) $(LDLIBS_libxengntshr) $(LDLIBS_libxenevtchn) +$(LIBVCHAN_OBJS) $(LIBVCHAN_PIC_OBJS): CFLAGS += $(CFLAGS_libxenstore) $(CFLAGS_libxengnttab) $(CFLAGS_libxengntshr) $(CFLAGS_libxenevtchn) +$(NODE_OBJS) $(NODE2_OBJS): CFLAGS += $(CFLAGS_libxengnttab) $(CFLAGS_libxengntshr) $(CFLAGS_libxenevtchn) MAJOR = 1.0 MINOR = 0 CFLAGS += -I../include -I. +io.o io.opic: CFLAGS += $(CFLAGS_libxenctrl) # for xen_mb et al + .PHONY: all all: libxenvchan.so vchan-node1 vchan-node2 libxenvchan.a
tools/libvchan/init.c +12 -12
@@ -78,7 +78,7 @@ static int init_gnt_srv(struct libxenvchan *ctrl, int domain)uint32_t ring_ref =-1 ;void *ring; - ring =xc_gntshr_share_page_notify (ctrl->gntshr, domain, + ring =xengntshr_share_page_notify (ctrl->gntshr, domain, &ring_ref,1 , offsetof(struct vchan_interface , srv_live), ctrl->event_port);
@@ -104,7 +104,7 @@ static int init_gnt_srv(struct libxenvchan *ctrl, int domain) ctrl->read.buffer = ((void *)ctrl->ring) +LARGE_RING_OFFSET ;break ;default : - ctrl->read.buffer =xc_gntshr_share_pages (ctrl->gntshr, domain, + ctrl->read.buffer =xengntshr_share_pages (ctrl->gntshr, domain, pages_left, ctrl->ring->grants,1 );if (!ctrl->read.buffer) goto out_ring;
@@ -118,7 +118,7 @@ static int init_gnt_srv(struct libxenvchan *ctrl, int domain) ctrl->write.buffer = ((void *)ctrl->ring) +LARGE_RING_OFFSET ;break ;default : - ctrl->write.buffer =xc_gntshr_share_pages (ctrl->gntshr, domain, + ctrl->write.buffer =xengntshr_share_pages (ctrl->gntshr, domain, pages_right, ctrl->ring->grants + pages_left,1 );if (!ctrl->write.buffer) goto out_unmap_left;
@@ -128,9 +128,9 @@ out:return ring_ref; out_unmap_left:if (pages_left) -xc_gntshr_munmap (ctrl->gntshr, ctrl->read.buffer, pages_left); +xengntshr_munmap (ctrl->gntshr, ctrl->read.buffer, pages_left); out_ring: -xc_gntshr_munmap (ctrl->gntshr, ring,1 ); +xengntshr_munmap (ctrl->gntshr, ring,1 ); ring_ref =-1 ; ctrl->ring =NULL ; ctrl->write.order = ctrl->read.order =0 ;
@@ -142,7 +142,7 @@ static int init_gnt_cli(struct libxenvchan *ctrl, int domain, uint32_t ring_ref)int rv =-1 ;uint32_t *grants; - ctrl->ring =xc_gnttab_map_grant_ref_notify (ctrl->gnttab, + ctrl->ring =xengnttab_map_grant_ref_notify (ctrl->gnttab, domain, ring_ref,PROT_READ |PROT_WRITE , offsetof(struct vchan_interface , cli_live), ctrl->event_port);
@@ -172,7 +172,7 @@ static int init_gnt_cli(struct libxenvchan *ctrl, int domain, uint32_t ring_ref)default : {int pages_left =1 << (ctrl->write.order -PAGE_SHIFT ); - ctrl->write.buffer =xc_gnttab_map_domain_grant_refs (ctrl->gnttab, + ctrl->write.buffer =xengnttab_map_domain_grant_refs (ctrl->gnttab, pages_left, domain, grants,PROT_READ |PROT_WRITE );if (!ctrl->write.buffer) goto out_unmap_ring;
@@ -190,7 +190,7 @@ static int init_gnt_cli(struct libxenvchan *ctrl, int domain, uint32_t ring_ref)default : {int pages_right =1 << (ctrl->read.order -PAGE_SHIFT ); - ctrl->read.buffer =xc_gnttab_map_domain_grant_refs (ctrl->gnttab, + ctrl->read.buffer =xengnttab_map_domain_grant_refs (ctrl->gnttab, pages_right, domain, grants,PROT_READ );if (!ctrl->read.buffer) goto out_unmap_left;
@@ -202,10 +202,10 @@ static int init_gnt_cli(struct libxenvchan *ctrl, int domain, uint32_t ring_ref)return rv; out_unmap_left:if (ctrl->write.order >=PAGE_SHIFT ) -xc_gnttab_munmap (ctrl->gnttab, ctrl->write.buffer, +xengnttab_munmap (ctrl->gnttab, ctrl->write.buffer,1 << (ctrl->write.order -PAGE_SHIFT )); out_unmap_ring: -xc_gnttab_munmap (ctrl->gnttab, ctrl->ring,1 ); +xengnttab_munmap (ctrl->gnttab, ctrl->ring,1 ); ctrl->ring =0 ; ctrl->write.order = ctrl->read.order =0 ; rv =-1 ;
@@ -325,7 +325,7 @@ struct libxenvchan *libxenvchan_server_init(xentoollog_logger *logger, int domai ctrl->write.order =LARGE_RING_SHIFT ; } - ctrl->gntshr =xc_gntshr_open (logger,0 ); + ctrl->gntshr =xengntshr_open (logger,0 );if (!ctrl->gntshr) goto out;
@@ -413,7 +413,7 @@ struct libxenvchan *libxenvchan_client_init(xentoollog_logger *logger, int domaiif (!ctrl->event_port) goto fail; - ctrl->gnttab =xc_gnttab_open (logger,0 ); + ctrl->gnttab =xengnttab_open (logger,0 );if (!ctrl->gnttab) goto fail;
tools/libvchan/io.c +4 -4
@@ -364,10 +364,10 @@ void libxenvchan_close(struct libxenvchan *ctrl)if (ctrl->ring) {if (ctrl->is_server) { ctrl->ring->srv_live =0 ; -xc_gntshr_munmap (ctrl->gntshr, ctrl->ring,1 ); +xengntshr_munmap (ctrl->gntshr, ctrl->ring,1 ); }else { ctrl->ring->cli_live =0 ; -xc_gnttab_munmap (ctrl->gnttab, ctrl->ring,1 ); +xengnttab_munmap (ctrl->gnttab, ctrl->ring,1 ); } }if (ctrl->event) {
@@ -377,10 +377,10 @@ void libxenvchan_close(struct libxenvchan *ctrl) }if (ctrl->is_server) {if (ctrl->gntshr) -xc_gntshr_close (ctrl->gntshr); +xengntshr_close (ctrl->gntshr); }else {if (ctrl->gnttab) -xc_gnttab_close (ctrl->gnttab); +xengnttab_close (ctrl->gnttab); }free (ctrl); }
tools/libvchan/libxenvchan.h +3 -3
@@ -45,7 +45,7 @@#include <xen/io/libxenvchan.h> #include <xen/sys/evtchn.h> #include <xenevtchn.h> -#include <xenctrl.h> +#include <xengnttab.h> struct libxenvchan_ring {/* Pointer into the shared page. Offsets into buffer. */
@@ -66,8 +66,8 @@ struct libxenvchan_ring {struct libxenvchan {/* Mapping handle for shared ring page */ union { -xc_gntshr *gntshr;/* for server */ -xc_gnttab *gnttab;/* for client */ +xengntshr_handle *gntshr;/* for server */ +xengnttab_handle *gnttab;/* for client */ };/* Pointer to shared ring page */ struct vchan_interface *ring;
tools/libxc/Makefile +9 -6
@@ -43,12 +43,13 @@ CTRL_SRCS-y += xc_resource.c CTRL_SRCS-$(CONFIG_X86) += xc_psr.c CTRL_SRCS-$(CONFIG_X86) += xc_pagetab.c CTRL_SRCS-$(CONFIG_Linux) += xc_linux.c xc_linux_osdep.c -CTRL_SRCS-$(CONFIG_FreeBSD) += xc_freebsd.c xc_freebsd_osdep.c xc_nognttab.c xc_nogntshr.c -CTRL_SRCS-$(CONFIG_SunOS) += xc_solaris.c xc_nognttab.c xc_nogntshr.c -CTRL_SRCS-$(CONFIG_NetBSD) += xc_netbsd.c xc_nognttab.c xc_nogntshr.c -CTRL_SRCS-$(CONFIG_NetBSDRump) += xc_netbsd.c xc_nognttab.c xc_nogntshr.c -CTRL_SRCS-$(CONFIG_MiniOS) += xc_minios.c xc_nogntshr.c +CTRL_SRCS-$(CONFIG_FreeBSD) += xc_freebsd.c xc_freebsd_osdep.c +CTRL_SRCS-$(CONFIG_SunOS) += xc_solaris.c +CTRL_SRCS-$(CONFIG_NetBSD) += xc_netbsd.c +CTRL_SRCS-$(CONFIG_NetBSDRump) += xc_netbsd.c +CTRL_SRCS-$(CONFIG_MiniOS) += xc_minios.c CTRL_SRCS-y += xc_evtchn_compat.c +CTRL_SRCS-y += xc_gnttab_compat.c GUEST_SRCS-y := GUEST_SRCS-y += xg_private.c xc_suspend.c
@@ -126,6 +127,8 @@ OSDEP_PIC_OBJS := $(patsubst %.c,%.opic,$(OSDEP_SRCS-y)) $(CTRL_LIB_OBJS) $(GUEST_LIB_OBJS) $(OSDEP_LIB_OBJS) \ $(CTRL_PIC_OBJS) $(GUEST_PIC_OBJS) $(OSDEP_PIC_OBJS) : CFLAGS += -include $(XEN_ROOT)/tools/config.h +$(CTRL_LIB_OBJS) $(CTRL_PIC_OBJS): CFLAGS += $(CFLAGS_libxengnttab) $(CFLAGS_libxengntshr) + LIB := libxenctrl.a ifneq ($(nosharedlibs),y) LIB += libxenctrl.so libxenctrl.so.$(MAJOR) libxenctrl.so.$(MAJOR).$(MINOR)
@@ -209,7 +212,7 @@ libxenctrl.so.$(MAJOR): libxenctrl.so.$(MAJOR).$(MINOR) $(SYMLINK_SHLIB) $< $@ libxenctrl.so.$(MAJOR).$(MINOR): $(CTRL_PIC_OBJS) - $(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(DLOPEN_LIBS) $(PTHREAD_LIBS) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxengnttab) $(LDLIBS_libxengntshr) $(DLOPEN_LIBS) $(PTHREAD_LIBS) $(APPEND_LDFLAGS) # libxenguest
tools/libxc/include/xenctrl.h +0 -168
192 lines not on this page · raw message
tools/libxc/include/xenctrl_compat.h +48 -0
54 lines not on this page · raw message
tools/libxc/xc_gnttab.c +0 -53
59 lines not on this page · raw message
tools/libxc/xc_gnttab_compat.c new file +111 -0
111 lines not on this page · raw message
tools/libxc/xc_linux_osdep.c +0 -280
298 lines not on this page · raw message
tools/libxc/xc_minios.c +0 -73
91 lines not on this page · raw message
tools/libxc/xc_nogntshr.c deleted +0 -46
46 lines not on this page · raw message
tools/libxc/xc_private.c +0 -80
86 lines not on this page · raw message
tools/libxc/xc_private.h +0 -24
@@ -123,30 +123,6 @@ struct xc_interface_core {xc_osdep_handle ops_handle;/* opaque data for xc_osdep_ops */ }; -struct xengntdev_handle { -xentoollog_logger *logger, *logger_tofree; -int fd; -}; - -int osdep_gnttab_open (xc_gnttab *xgt); -int osdep_gnttab_close (xc_gnttab *xgt); - -#define XC_GRANT_MAP_SINGLE_DOMAIN 0x1 -void *osdep_gnttab_grant_map (xc_gnttab *xgt, -uint32_t count,int flags,int prot, -uint32_t *domids,uint32_t *refs, -uint32_t notify_offset, -evtchn_port_t notify_port); - -int osdep_gntshr_open (xc_gntshr *xgs); -int osdep_gntshr_close (xc_gntshr *xgs); - -void *osdep_gntshr_share_pages (xc_gntshr *xgs, -uint32_t domid,int count, -uint32_t *refs,int writable, -uint32_t notify_offset, -evtchn_port_t notify_port); -void xc_report_error (xc_interface *xch,int code,const char *fmt, ...) __attribute__((format (printf,3 ,4 ))); void xc_reportv(xc_interface *xch, xentoollog_logger *lg, xentoollog_level,
tools/xenstore/Makefile +3 -1
@@ -78,8 +78,10 @@ init-xenstore-domain.o: CFLAGS += $(CFLAGS_libxenguest) init-xenstore-domain: init-xenstore-domain.o $(LIBXENSTORE) $(CC) $^ $(LDFLAGS) $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) -o $@ $(APPEND_LDFLAGS) +$(XENSTORED_OBJS): CFLAGS += $(CFLAGS_libxengnttab) + xenstored: $(XENSTORED_OBJS) - $(CC) $^ $(LDFLAGS) $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(SOCKET_LIBS) -o $@ $(APPEND_LDFLAGS) + $(CC) $^ $(LDFLAGS) $(LDLIBS_libxenevtchn) $(LDLIBS_libxengnttab) $(LDLIBS_libxenctrl) $(SOCKET_LIBS) -o $@ $(APPEND_LDFLAGS) xenstored.a: $(XENSTORED_OBJS) $(AR) cr $@ $^
tools/xenstore/xenstored_core.h +3 -1
@@ -20,12 +20,14 @@#define _XENSTORED_CORE_H#include <xenctrl.h> +#include <xengnttab.h> #include <sys/types.h> #include <dirent.h> #include <stdbool.h> #include <stdint.h> #include <errno.h> +#include "xenstore_lib.h" #include "list.h" #include "tdb.h"
@@ -196,7 +198,7 @@ void finish_daemonize(void);/* Open a pipe for signal handling */ void init_pipe (int reopen_log_pipe[2 ]); -xc_gnttab **xcg_handle; +xengnttab_handle **xgt_handle;#endif /* _XENSTORED_CORE_H */
tools/xenstore/xenstored_domain.c +12 -12
@@ -34,7 +34,7 @@#include <xen/grant_table.h> static xc_interface **xc_handle; -xc_gnttab **xcg_handle; +xengnttab_handle **xgt_handle;static evtchn_port_t virq_port;xenevtchn_handle *xce_handle =NULL ;
@@ -166,9 +166,9 @@ static int readchn(struct connection *conn, void *data, unsigned int len)static void *map_interface (domid_t domid,unsigned long mfn) { -if (*xcg_handle !=NULL ) { +if (*xgt_handle !=NULL ) {/* this is the preferred method */ -return xc_gnttab_map_grant_ref (*xcg_handle, domid, +return xengnttab_map_grant_ref (*xgt_handle, domid,GNTTAB_RESERVED_XENSTORE ,PROT_READ |PROT_WRITE ); }else { return xc_map_foreign_range(*xc_handle, domid,
@@ -178,8 +178,8 @@ static void *map_interface(domid_t domid, unsigned long mfn)static void unmap_interface (void *interface) { -if (*xcg_handle !=NULL ) -xc_gnttab_munmap (*xcg_handle, interface,1 ); +if (*xgt_handle !=NULL ) +xengnttab_munmap (*xgt_handle, interface,1 );else munmap (interface,XC_PAGE_SIZE ); }
@@ -577,9 +577,9 @@ static int close_xc_handle(void *_handle)return 0 ; } -static int close_xcg_handle (void *_handle) +static int close_xgt_handle (void *_handle) { -xc_gnttab_close (*(xc_gnttab **)_handle); +xengnttab_close (*(xengnttab_handle **)_handle);return 0 ; }
@@ -634,15 +634,15 @@ void domain_init(void)talloc_set_destructor (xc_handle, close_xc_handle); - xcg_handle = talloc(talloc_autofree_context(), xc_gnttab*); -if (!xcg_handle) + xgt_handle = talloc(talloc_autofree_context(), xengnttab_handle*); +if (!xgt_handle)barf_perror ("Failed to allocate domain gnttab handle" ); - *xcg_handle =xc_gnttab_open (NULL ,0 ); -if (*xcg_handle ==NULL ) + *xgt_handle =xengnttab_open (NULL ,0 ); +if (*xgt_handle ==NULL )xprintf ("WARNING: Failed to open connection to gnttab\n" );else -talloc_set_destructor (xcg_handle, close_xcg_handle); +talloc_set_destructor (xgt_handle, close_xgt_handle); xce_handle =xenevtchn_open (NULL ,0 );
tools/xenstore/xenstored_minios.c +2 -3
@@ -17,7 +17,6 @@*/ #include <sys/types.h> #include <sys/mman.h> -#include <xenctrl.h> #include "xenstored_core.h" #include <xen/grant_table.h>
@@ -50,12 +49,12 @@ evtchn_port_t xenbus_evtchn(void)void *xenbus_map (void ) { -return xc_gnttab_map_grant_ref (*xcg_handle,xenbus_master_domid (), +return xengnttab_map_grant_ref (*xgt_handle,xenbus_master_domid (),GNTTAB_RESERVED_XENSTORE ,PROT_READ |PROT_WRITE ); }void unmap_xenbus (void *interface) { -xc_gnttab_munmap (*xcg_handle, interface,1 ); +xengnttab_munmap (*xgt_handle, interface,1 ); }
Signature · 1 line
2.1.4
Re: [PATCH XEN v5 07/23] tools: Refactor /dev/xen/gnt{dev, shr} wrappers into libxengnttab.
Quoted 10 lines · Ian Campbell
libxengnttab will provide a stable API and ABI for accessing the grant table devices.
The functions are moved into the xengnt{tab,shr} namespace to make a clean break from libxc and avoid ambiguity regarding which interfaces are stable.
XXX consider combining into a single namespace (i.e. with
xengnttab_handlehaving two open fd's in it on Linux)
Forgot to delete this?
I think your analysis in earlier reply is reasonable, so
Re: [PATCH XEN v5 07/23] tools: Refactor /dev/xen/gnt{dev, shr} wrappers into libxengnttab.
In reply to Ian CampbellIan Campbell writes ("[PATCH XEN v5 07/23] tools: Refactor /dev/xen/gnt{dev,shr} wrappers into libxengnttab."):
Quoted 6 lines
libxengnttab will provide a stable API and ABI for accessing the grant table devices.
The functions are moved into the xengnt{tab,shr} namespace to make a clean break from libxc and avoid ambiguity regarding which interfaces are stable.
I have reviewed the API. Mostly this produced questions...
Quoted 2 lines
XXX consider combining into a single namespace (i.e. with
xengnttab_handlehaving two open fd's in it on Linux)
Arguments in favour of combining:
* Some kernel might provide a single thing in /dev, and might even have trouble coping with a process which opens it more than once.
* This is less fiddly for callers.
Arguments against combining:
* Perhaps some OSes will exist which can do only one and not the other. (Tenuous, and a workaround is possible.)
* Slightly lower performance for a client which uses only one of the interfaces. (Barrel-scraping, here.)
* It is more work.
I conclude it would be better to unify them.
Quoted 5 lines
+/*
+ * Note:
+ * After fork a child process must not use any opened xc gnttab
+ * handle inherited from their parent. They must open a new handle if
+ * they want to interact with xc.
This should document
(a) that it is safe to close the handle
(b) that it is not safe to access grant mapped areas in the child
(c) how to reclaim the address space which is otherwise lost
tools/libs/gnttab/include/xengnttab.h line 81
Quoted 13 lines
tools/libs/gnttab/include/xengnttab.h new file +13
-0+/** +* Memory maps one or more grant references from one or more domains to a +* contiguous local address range. Mappings should be unmapped with +* xengnttab_munmap. Logs errors. +* +* @parm xgt a handle on an open grant table interface +* @parm count the number of grant references to be mapped +* @parm domids an array of @count domain IDs by which the corresponding @refs +* were granted +* @parm refs an array of @count grant references to be mapped +* @parm prot same flag as in mmap() +*/ +void *xengnttab_map_grant_refs(xengnttab_handle *xgt,
Should explain what happens on partial failure.
Quoted 4 lines
+/**
+ * Memory maps one or more grant references from one domain to a
+ * contiguous local address range. Mappings should be unmapped with
+ *xengnttab_munmap. Logs errors.
...
Quoted 1 line
+void *xengnttab_map_domain_grant_refs(xengnttab_handle *xgt,
Should say that this is equivalent to a suitable call to xengnttab_map_grant_refs. (Assuming that it is.)
Quoted 7 lines
+/**
+ * Memory maps a grant reference from one domain to a local address range.
+ * Mappings should be unmapped withxengnttab_munmap. Ifnotify_offsetor
+ *notify_portare not -1, this version will attempt to set up an unmap
+ * notification at the given offset and event channel. When the page is
+ * unmapped, the byte at the given offset will be zeroed and a wakeup will be
+ * sent to the given event channel. Logs errors.
What happens if the unmap notification cannot be set up ?
Also "when the page is unmapped" makes it sound like you mean xengnttab_munmap but actually I think this is when the grant is withdrawn by the grantor ?
If the grant is withdrawn by the grantor, does the page become unuseable immediately ? If so, how can anyone ever use this safely ?
Quoted 3 lines
+/*
+ * Sets the maximum number of grants that may be mapped by the given instance
+ * to @count. Never logs.
Line wrap.
tools/libs/gnttab/include/xengnttab.h line 147
Quoted 2 lines
tools/libs/gnttab/include/xengnttab.h new file +2
-0+int xengnttab_set_max_grants (xengnttab_handle *xgt, +uint32_t count);
Is count in pages or grants or what ?
Quoted 2 lines
+/*
+ * Return an fd onto the grant sharing driver. Logs errors.
It does not return an fd. (See also my comments on gntmap.)
Quoted 3 lines
+/*
+ * Creates and shares pages with another domain.
+ *
...
tools/libs/gnttab/include/xengnttab.h line 184
Quoted 2 lines
tools/libs/gnttab/include/xengnttab.h new file +2
-0+void *xengntshr_share_pages (xengntshr_handle *xgs,uint32_t domid, +int count,uint32_t *refs,int writable);
Can this fail ? Can it partially succeed ?
tools/libs/gnttab/include/xengnttab.h line 198
Quoted 13 lines
tools/libs/gnttab/include/xengnttab.h new file +13
-0+/* +* Creates and shares a page with another domain, with unmap notification. +* +* @parm xgs a handle to an open grant sharing instance +* @parm domid the domain to share memory with +* @parm refs the grant reference of the pages (output) +* @parm writable true if the other domain can write to the page +* @parm notify_offset The byte offset in the page to use for unmap +* notification; -1 for none. +* @parm notify_port The event channel port to use for unmap notify, or -1 +* @return local mapping of the page +*/ +void *xengntshr_share_page_notify(xengntshr_handle *xgs, uint32_t domid,
What is this `unmap notification' ?
Quoted 3 lines
+/*
+ * Unmaps the @count pages starting at @start_address, which were mapped by a
+ * call to xengntshr_share_*. Never logs.
Linewrap in the comment.
Quoted 2 lines
+ */
+intxengntshr_munmap(xengntshr_handle *xgs, void *start_address, uint32_t count);
What effect does this have on the peer ?
Ian.
Re: [PATCH XEN v5 07/23] tools: Refactor /dev/xen/gnt{dev, shr} wrappers into libxengnttab.
Quoted 10 lines · Ian Jackson
Ian Campbell writes ("[PATCH XEN v5 07/23] tools: Refactor
/dev/xen/gnt{dev,shr}wrappers into libxengnttab."):Quoted 6 lines
libxengnttab will provide a stable API and ABI for accessing the grant table devices.
The functions are moved into the xengnt{tab,shr} namespace to make a clean break from libxc and avoid ambiguity regarding which interfaces are stable.
I have reviewed the API. Mostly this produced questions...
Yes, thanks this is the sort of feedback I was looking for before we call this a stable interface.
Some of my answers are of the "yes, we should decide that" variety.
Daniel, I've added you because some of the questions below relate to the notification mechanism and to gntshr which I don't really understand (not that I really understand gnttab either).
Quoted 8 lines
Quoted 2 lines
XXX consider combining into a single namespace (i.e. with
xengnttab_handlehaving two open fd's in it on Linux)Arguments in favour of combining:
* Some kernel might provide a single thing in /dev, and might even have trouble coping with a process which opens it more than once.
* This is less fiddly for callers.
Quoted 8 lines
Arguments against combining:
* Perhaps some OSes will exist which can do only one and not the other. (Tenuous, and a workaround is possible.)
* Slightly lower performance for a client which uses only one of the interfaces. (Barrel-scraping, here.)
* It is more work.I conclude it would be better to unify them.
OK, I'm convinced.
Quoted 9 lines
Quoted 5 lines
+/*
+ * Note:
+ * After fork a child process must not use any opened xc gnttab
+ * handle inherited from their parent. They must open a new handle if
+ * they want to interact with xc.This should document
(a) that it is safe to close the handle
(b) that it is not safe to access grant mapped areas in the child
These two are easy.
Quoted 1 line
(c) how to reclaim the address space which is otherwise lost
The "obviously going to work, but probably not very useful" answer is you should reclaim them before forking. That's clearly not practical in any number of situations.
I really not sure what would happen if the child did a gnttab_close(). I _think_ the kernel side ought to do the right thing (in that my opinion is that really it should, and looking at the code it seems like it might).
Making a statement here that gnttab_close() is OK (and the right thing) to do in the child might make the kernel driver insta-buggy. That might be tolerable though, no one seems too be bothered by such bugs today and if someone trips over them we can fix them.
Quoted 22 lines
Quoted 7 lines
+/**
+ * Memory maps one or more grant references from one or more domains to a
+ * contiguous local address range. Mappings should be unmapped with
+ * xengnttab_munmap. Logs errors.
+ *
+ * @parm xgt a handle on an open grant table interfaceQuoted 8 lines
+ * @parm count the number of grant references to be mapped
+ * @parm domids an array of @count domain IDs by which the corresponding @refs
+ * were granted
+ * @parm refs an array of @count grant references to be mapped
+ * @parm prot same flag as inmmap()
+ */
+void *xengnttab_map_grant_refs(xengnttab_handle *xgt,Should explain what happens on partial failure.
Quoted 4 lines
+/**
+ * Memory maps one or more grant references from one domain to a
+ * contiguous local address range. Mappings should be unmapped with
+ * xengnttab_munmap. Logs errors.
Quoted 5 lines
...
Quoted 1 line
+void *xengnttab_map_domain_grant_refs(xengnttab_handle *xgt,
Should say that this is equivalent to a suitable call to xengnttab_map_grant_refs. (Assuming that it is.)
I believe so.
Which might argue for not having both, but I think avoiding the common case of needing to provide an array full of the same domid makes it worthwhile to have this.
Quoted 13 lines
Quoted 4 lines
+/**
+ * Memory maps a grant reference from one domain to a local address range.
+ * Mappings should be unmapped withxengnttab_munmap. Ifnotify_offsetQuoted 8 lines
or
+ *notify_portare not -1, this version will attempt to set up an unmap
+ * notification at the given offset and event channel. When the page is
+ * unmapped, the byte at the given offset will be zeroed and a wakeup will be
+ * sent to the given event channel. Logs errors.
Quoted 8 lines
What happens if the unmap notification cannot be set up ?
Also "when the page is unmapped" makes it sound like you mean
xengnttab_munmapbut actually I think this is when the grant is withdrawn by the grantor ?If the grant is withdrawn by the grantor, does the page become unuseable immediately ? If so, how can anyone ever use this safely ?
Daniel, could you answer these ones please.
Quoted 6 lines
Quoted 5 lines
+/*
+ * Sets the maximum number of grants that may be mapped by the given instance
+ * to @count. Never logs.
Quoted 7 lines
Line wrap.
tools/libs/gnttab/include/xengnttab.h line 147
Quoted 2 lines
tools/libs/gnttab/include/xengnttab.h new file +2
-0+int xengnttab_set_max_grants (xengnttab_handle *xgt, + uint32_t count);Is count in pages or grants or what ?
It was hard to find this out, because the underlying ioctl doesn't exist in the Linux side. In the end I found it is in grants as the name suggests.
AFAICT this is implemented only by linux-2.6.18-xen.hg and mini-os.git. We could consider omitting it from the initial API. QEMU calls it but doesn't care if it didn't work.
Quoted 4 lines
Quoted 2 lines
+/*
+ * Return an fd onto the grant sharing driver. Logs errors.It does not return an fd.
Oh yes.
Quoted 1 line
(See also my comments on gntmap.)
I'm not sure which ones you mean here. If you meant gnttab then I'm still not sure since you didn't comment on _open() there, but that's the only commonality in the API.
Quoted 9 lines
Quoted 4 lines
+/*
+ * Creates and shares pages with another domain.
+ *...
Quoted 2 lines
+void *xengntshr_share_pages(xengntshr_handle *xgs,
uint32_tdomid, + int count,uint32_t*refs, int writable);Can this fail ? Can it partially succeed ?
Daniel?
Quoted 11 lines
Quoted 11 lines
+/*
+ * Creates and shares a page with another domain, with unmap notification.
+ *
+ * @parm xgs a handle to an open grant sharing instance
+ * @parm domid the domain to share memory with
+ * @parm refs the grant reference of the pages (output)
+ * @parm writable true if the other domain can write to the page
+ * @parmnotify_offsetThe byte offset in the page to use for unmap
+ * notification; -1 for none.
Quoted 8 lines
Quoted 6 lines
+ * @parm
notify_portThe event channel port to use for unmap notify, or -1
+ * @return local mapping of the page
+ */
+void *xengntshr_share_page_notify(xengntshr_handle *xgs,uint32_tdomid,What is this `unmap notification' ?
Daniel?
Quoted 6 lines
Quoted 5 lines
+/*
+ * Unmaps the @count pages starting at @start_address, which were mapped by a
+ * call to xengntshr_share_*. Never logs.
Quoted 7 lines
Linewrap in the comment.
Quoted 3 lines
+ */
+intxengntshr_munmap(xengntshr_handle *xgs, void *start_address, uint32_t count);What effect does this have on the peer ?
Daniel?
Quoted 2 lines
Ian.
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
Re: [PATCH XEN v5 07/23] tools: Refactor /dev/xen/gnt{dev, shr} wrappers into libxengnttab.
Quoted 12 lines · Ian Campbell
Quoted 10 lines · Ian Jackson
Ian Campbell writes ("[PATCH XEN v5 07/23] tools: Refactor
/dev/xen/gnt{dev,shr}wrappers into libxengnttab."):Quoted 6 lines
libxengnttab will provide a stable API and ABI for accessing the grant table devices.
The functions are moved into the xengnt{tab,shr} namespace to make a clean break from libxc and avoid ambiguity regarding which interfaces are stable.
I have reviewed the API. Mostly this produced questions...
Quoted 8 lines
Yes, thanks this is the sort of feedback I was looking for before we call this a stable interface.
Some of my answers are of the "yes, we should decide that" variety.
Daniel, I've added you because some of the questions below relate to the notification mechanism and to gntshr which I don't really understand (not that I really understand gnttab either).
Responses below. I also agree that unifying the interfaces would be better.
[...]
Quoted 15 lines
Quoted 15 lines
Quoted 4 lines
+/**
+ * Memory maps a grant reference from one domain to a local address range.
+ * Mappings should be unmapped withxengnttab_munmap. Ifnotify_offsetQuoted 8 lines
or
+ *notify_portare not -1, this version will attempt to set up an unmap
+ * notification at the given offset and event channel. When the page is
+ * unmapped, the byte at the given offset will be zeroed and a wakeup will be
+ * sent to the given event channel. Logs errors.What happens if the unmap notification cannot be set up ?
Quoted 8 lines
Quoted 6 lines
Also "when the page is unmapped" makes it sound like you mean
xengnttab_munmapbut actually I think this is when the grant is withdrawn by the grantor ?If the grant is withdrawn by the grantor, does the page become unuseable immediately ? If so, how can anyone ever use this safely ?
Daniel, could you answer these ones please.
This is intended to allow the kernel to send a close-request notification when the application that allocated the grant page exits without calling a proper shutdown (i.e. it crashes, calls _exit, calls execve, etc).
Without this signal, the kernel has no way to request that the mapper of the page release it, and since Xen has no grant revocation mechanism, the page will likely be tied up until the process on the other side is told to release the page through some other method.
Quoted 10 lines
Quoted 8 lines
Quoted 3 lines
+/*
+ * Creates and shares pages with another domain.
+ *...
tools/libs/gnttab/include/xengnttab.h line 184
Quoted 2 lines
tools/libs/gnttab/include/xengnttab.h new file +2
-0+void *xengntshr_share_pages (xengntshr_handle *xgs,uint32_t domid, +int count,uint32_t *refs,int writable);Can this fail ? Can it partially succeed ?
Daniel?
It can fail if you are out of pages to grant (there is a module parameter that can be adjusted via sysfs for the maximum), or in the unlikely case that the kernel itself is out of room in its grant mapping table (or if the syscall itself encounters -ENOMEM).
Quoted 19 lines
Quoted 10 lines
Quoted 10 lines
+/*
+ * Creates and shares a page with another domain, with unmap notification.
+ *
+ * @parm xgs a handle to an open grant sharing instance
+ * @parm domid the domain to share memory with
+ * @parm refs the grant reference of the pages (output)
+ * @parm writable true if the other domain can write to the page
+ * @parmnotify_offsetThe byte offset in the page to use for unmap
+ * notification; -1 for none.Quoted 8 lines
Quoted 6 lines
+ * @parm
notify_portThe event channel port to use for unmap notify, or -1
+ * @return local mapping of the page
+ */
+void *xengntshr_share_page_notify(xengntshr_handle *xgs,uint32_tdomid,What is this `unmap notification' ?
Quoted 1 line
Daniel?
As mentioned above, it is a way for the kernel to request for the other side to unmap a page. It is probably easiest to understand if looking at the libvchan driver: one byte of the page is a "status" byte, and when the side using xengntshr exits or dies, this byte is set to zero and the event channel is notified. When the peer is woken by the notify and sees the state byte set to zero, it removes its own mappings so that the shared pages can be freed.
Quoted 8 lines
Quoted 8 lines
Quoted 5 lines
+/*
+ * Unmaps the @count pages starting at @start_address, which were mapped by a
+ * call to xengntshr_share_*. Never logs.Linewrap in the comment.
Quoted 7 lines
Quoted 5 lines
Quoted 3 lines
+ */
+intxengntshr_munmap(xengntshr_handle *xgs, void *start_address, uint32_t count);What effect does this have on the peer ?
Daniel?
If this removes the (final copy of the) mapping and a notify offset/port is set, that processing happens. Otherwise, the peer cannot tell when this is called.
Signature · 2 lines
Daniel De Graaf National Security Agency
Re: [PATCH XEN v5 07/23] tools: Refactor /dev/xen/gnt{dev, shr} wrappers into libxengnttab.
Quoted 21 lines · Daniel De Graaf
Quoted 20 lines · Ian Campbell
Quoted 5 lines · Ian Jackson
Ian Campbell writes ("[PATCH XEN v5 07/23] tools: Refactor
/dev/xen/gnt{dev,shr}wrappers into libxengnttab."):Quoted 3 lines
libxengnttab will provide a stable API and ABI for accessing the grant table devices.
Quoted 7 lines
Quoted 5 lines
The functions are moved into the xengnt{tab,shr} namespace to make a
clean break from libxc and avoid ambiguity regarding which interfaces
are stable.I have reviewed the API. Mostly this produced questions...
Yes, thanks this is the sort of feedback I was looking for before we call
this a stable interface.Some of my answers are of the "yes, we should decide that" variety.
Quoted 7 lines
Quoted 5 lines
Daniel, I've added you because some of the questions below relate to the
notification mechanism and to gntshr which I don't really understand (not
that I really understand gnttab either).Responses below.
Thanks.
Quoted 27 lines
I also agree that unifying the interfaces would be better.
[...]
Quoted 23 lines
Quoted 23 lines
Quoted 8 lines
+/**
+ * Memory maps a grant reference from one domain to a local address
range.
+ * Mappings should be unmapped withxengnttab_munmap. Ifnotify_offset
or
+ *notify_portare not -1, this version will attempt to set up anQuoted 8 lines
unmap
+ * notification at the given offset and event channel. When the page
is
+ * unmapped, the byte at the given offset will be zeroed and a wakeup
will be
+ * sent to the given event channel. Logs errors.What happens if the unmap notification cannot be set up ?
Also "when the page is unmapped" makes it sound like you mean
xengnttab_munmapbut actually I think this is when the grant is withdrawn by the grantor ?
Quoted 8 lines
Quoted 4 lines
Quoted 2 lines
If the grant is withdrawn by the grantor, does the page become unuseable immediately ? If so, how can anyone ever use this safely ?
Daniel, could you answer these ones please.
This is intended to allow the kernel to send a close-request notification when the application that allocated the grant page exits without calling a proper shutdown (i.e. it crashes, calls
_exit, calls execve, etc).
That is the kernel of the grantor or grantee process? It sounds like grantor tells grantee (who would then be expected to unmap?)
Who actually does the unmap, the grantee process or their kernel? I suppose the process, which is expected to be watching for the notification and is required to do the unmap itself. IOW the "munmap notification" is a request to please munmap, not a notification that something has been unmapped out from beneath the calling process.
What happens if the unmap notification cannot be set up? Does the call fail (and unmap what it has done) or does it succeed?
I think the answer to the other two questions depend on the clarifications above, but I think it is the case that nothing is unmapped automatically, all that this does is give you a result from evtchn_poll etc with the expectation that the caller will call xengnttab_munmap in a controlled way by themselves.
Quoted 16 lines
Without this signal, the kernel has no way to request that the mapper of the page release it, and since Xen has no grant revocation mechanism, the page will likely be tied up until the process on the other side is told to release the page through some other method.
Quoted 8 lines
Quoted 8 lines
Quoted 3 lines
+/*
+ * Creates and shares pages with another domain.
+ *...
Quoted 3 lines
+void *xengntshr_share_pages(xengntshr_handle *xgs,
uint32_tdomid, + int count,uint32_t*refs, int writable);
Quoted 8 lines
Quoted 3 lines
Quoted 1 line
Can this fail ? Can it partially succeed ?
Daniel?
It can fail if you are out of pages to grant (there is a module parameter that can be adjusted via sysfs for the maximum), or in the unlikely case that the kernel itself is out of room in its grant mapping table (or if the syscall itself encounters
-ENOMEM).
Does it either completely succeed or undo partial work, or does it return partial success somehow?
Quoted 24 lines
Quoted 22 lines
Quoted 13 lines
Quoted 13 lines
+/*
+ * Creates and shares a page with another domain, with unmap notification.
+ *
+ * @parm xgs a handle to an open grant sharing instance
+ * @parm domid the domain to share memory with
+ * @parm refs the grant reference of the pages (output)
+ * @parm writable true if the other domain can write to the page
+ * @parmnotify_offsetThe byte offset in the page to use for unmap
+ * notification; -1 for none.
+ * @parmnotify_portThe event channel port to use for unmapQuoted 8 lines
Quoted 6 lines
notify,
or -1
+ * @return local mapping of the page
+ */
+void *xengntshr_share_page_notify(xengntshr_handle *xgs,uint32_tdomid,What is this `unmap notification' ?
Quoted 1 line
Daniel?
Quoted 7 lines
As mentioned above, it is a way for the kernel to request for the other side to unmap a page. It is probably easiest to understand if looking at the libvchan driver: one byte of the page is a "status" byte, and when the side using xengntshr exits or dies, this byte is set to zero and the event channel is notified. When the peer is woken by the notify and sees the state byte set to zero, it removes its own mappings so that the shared pages can be freed.
This is the sending end of the notification requested by the caller of xengnttab_map_grant_ref_notify I think?
Quoted 13 lines
Quoted 13 lines
Quoted 13 lines
Quoted 6 lines
+/*
+ * Unmaps the @count pages starting at @start_address, which were mapped by a
+ * call to xengntshr_share_*. Never logs.Linewrap in the comment.
Quoted 3 lines
+ */
+intxengntshr_munmap(xengntshr_handle *xgs, void *start_address, uint32_t count);
Quoted 7 lines
Quoted 3 lines
Quoted 1 line
What effect does this have on the peer ?
Daniel?
If this removes the (final copy of the) mapping and a notify offset/port is set, that processing happens. Otherwise, the peer cannot tell when this is called.
So this will always success (I think?) but the underlying page cannot be freed until the other end unmaps it (whether because of the notification of some other reason).
What is the status of the memory at start_address between the call to xengntshr_munmap and the otherend doing xengnttab_munmap?
What is the status of the mapping made by the peer via xengnttab_map_grant_ref_notify in that same interval?
Who is responsible for reclaiming the underlying memory, the kernel or the process?
Thanks,
Ian.
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
Re: [PATCH XEN v5 07/23] tools: Refactor /dev/xen/gnt{dev, shr} wrappers into libxengnttab.
Quoted 7 lines · Ian Campbell
Quoted 6 lines · Daniel De Graaf
Quoted 5 lines · Ian Campbell
Quoted 4 lines · Ian Jackson
Ian Campbell writes ("[PATCH XEN v5 07/23] tools: Refactor
/dev/xen/gnt{dev,shr}wrappers into libxengnttab."):Quoted 2 lines
libxengnttab will provide a stable API and ABI for accessing the grant table devices.
[...]
Quoted 26 lines
Quoted 26 lines
Quoted 26 lines
Quoted 25 lines
Quoted 8 lines
+/**
+ * Memory maps a grant reference from one domain to a local address
range.
+ * Mappings should be unmapped withxengnttab_munmap. Ifnotify_offset
or
+ *notify_portare not -1, this version will attempt to set up anQuoted 8 lines
unmap
+ * notification at the given offset and event channel. When the page
is
+ * unmapped, the byte at the given offset will be zeroed and a wakeup
will be
+ * sent to the given event channel. Logs errors.What happens if the unmap notification cannot be set up ?
Also "when the page is unmapped" makes it sound like you mean
xengnttab_munmapbut actually I think this is when the grant is withdrawn by the grantor ?If the grant is withdrawn by the grantor, does the page become unuseable immediately ? If so, how can anyone ever use this safely ?
Quoted 8 lines
Quoted 5 lines
Quoted 1 line
Daniel, could you answer these ones please.
This is intended to allow the kernel to send a close-request notification when the application that allocated the grant page exits without calling a proper shutdown (i.e. it crashes, calls
_exit, calls execve, etc).That is the kernel of the grantor or grantee process? It sounds like grantor tells grantee (who would then be expected to unmap?)
The kernel providing gntalloc is the one that sends the notification, since the other domain (gntdev) must take action to unmap the page.
Quoted 5 lines
Who actually does the unmap, the grantee process or their kernel? I suppose the process, which is expected to be watching for the notification and is required to do the unmap itself. IOW the "munmap notification" is a request to please munmap, not a notification that something has been unmapped out from beneath the calling process.
Correct. The remote process actually does the unmap; there is no back-channel available to notify the kernel of the other side directly (and setting one up would usually be a waste of resources).
Quoted 2 lines
What happens if the unmap notification cannot be set up? Does the call fail (and unmap what it has done) or does it succeed?
The only reason for the setup to fail is if an invalid event channel or offset is specified. It looks like this causes a new mapping to fail (it is freed).
Quoted 23 lines
I think the answer to the other two questions depend on the clarifications above, but I think it is the case that nothing is unmapped automatically, all that this does is give you a result from
evtchn_polletc with the expectation that the caller will callxengnttab_munmapin a controlled way by themselves.Quoted 17 lines
Without this signal, the kernel has no way to request that the mapper of the page release it, and since Xen has no grant revocation mechanism, the page will likely be tied up until the process on the other side is told to release the page through some other method.
Quoted 11 lines
Quoted 9 lines
Quoted 3 lines
+/*
+ * Creates and shares pages with another domain.
+ *...
Quoted 3 lines
(quoted diff) +2
-0+void *xengntshr_share_pages(xengntshr_handle *xgs, uint32_t domid, + int count, uint32_t *refs, intwritable);
Can this fail ? Can it partially succeed ?
Daniel?
Quoted 7 lines
Quoted 4 lines
It can fail if you are out of pages to grant (there is a module parameter that can be adjusted via sysfs for the maximum), or in the unlikely case that the kernel itself is out of room in its grant mapping table (or if the syscall itself encounters
-ENOMEM).Does it either completely succeed or undo partial work, or does it return partial success somehow?
The limit is checked (and the current count updated) prior to making any changes.
Quoted 32 lines
Quoted 24 lines
Quoted 22 lines
Quoted 13 lines
Quoted 13 lines
+/*
+ * Creates and shares a page with another domain, with unmap notification.
+ *
+ * @parm xgs a handle to an open grant sharing instance
+ * @parm domid the domain to share memory with
+ * @parm refs the grant reference of the pages (output)
+ * @parm writable true if the other domain can write to the page
+ * @parmnotify_offsetThe byte offset in the page to use for unmap
+ * notification; -1 for none.
+ * @parmnotify_portThe event channel port to use for unmapQuoted 8 lines
Quoted 6 lines
notify,
or -1
+ * @return local mapping of the page
+ */
+void *xengntshr_share_page_notify(xengntshr_handle *xgs,uint32_tdomid,What is this `unmap notification' ?
Quoted 1 line
Daniel?
Quoted 7 lines
As mentioned above, it is a way for the kernel to request for the other side to unmap a page. It is probably easiest to understand if looking at the libvchan driver: one byte of the page is a "status" byte, and when the side using xengntshr exits or dies, this byte is set to zero and the event channel is notified. When the peer is woken by the notify and sees the state byte set to zero, it removes its own mappings so that the shared pages can be freed.
Quoted 2 lines
This is the sending end of the notification requested by the caller of
xengnttab_map_grant_ref_notifyI think?
Yes.
Quoted 15 lines
Quoted 15 lines
Quoted 14 lines
Quoted 5 lines
Quoted 4 lines
+/*
+ * Unmaps the @count pages starting at @start_address, which were mapped by a
+ * call to xengntshr_share_*. Never logs.Quoted 7 lines
Linewrap in the comment.
Quoted 3 lines
+ */
+intxengntshr_munmap(xengntshr_handle *xgs, void *start_address, uint32_t count);What effect does this have on the peer ?
Daniel?
Quoted 7 lines
Quoted 3 lines
If this removes the (final copy of the) mapping and a notify offset/port is set, that processing happens. Otherwise, the peer cannot tell when this is called.
So this will always success (I think?) but the underlying page cannot be freed until the other end unmaps it (whether because of the notification of some other reason).
Yes.
Quoted 2 lines
What is the status of the memory at
start_addressbetween the call toxengntshr_munmapand the otherend doingxengnttab_munmap?
A reference to the page is held in gntalloc's gref_list; the page itself is not usable by that domain until it can verify (gnttab_query_foreign_access) that the page is not mapped elsewhere. At that point, the page is released back to the kernel MM.
Quoted 2 lines
What is the status of the mapping made by the peer via
xengnttab_map_grant_ref_notifyin that same interval?
The gnttab_map_grant_ref_notify is an analogous notification for the gnttab device, allowing the application using gntalloc to close the channel when the application that is using it has gone away. The notification in this case is not needed to clean up the grant mapping (that has already been done by the gntdev kernel code), but is useful if the sharing application wishes to clean up (remove the shared pages or perhaps exit) when its peer exits.
Quoted 2 lines
Who is responsible for reclaiming the underlying memory, the kernel or the process?
The kernel: gntalloc.c do_cleanup.
Quoted 3 lines
Thanks,
Ian.
Signature · 2 lines
Daniel De Graaf National Security Agency
Re: [PATCH XEN v5 07/23] tools: Refactor /dev/xen/gnt{dev, shr} wrappers into libxengnttab.
In reply to Ian JacksonQuoted 3 lines · Ian Jackson
Quoted 2 lines
XXX consider combining into a single namespace (i.e. with
xengnttab_handlehaving two open fd's in it on Linux)
[...]
Quoted 1 line
I conclude it would be better to unify them.
Starting to look into this I have some queries on the direction I ought to take.
Currently the real world implementations are such that a given installation either provides:
* Neither gnttab nor gntshr (*BSD)
* Only gnttab, not gntshr (mini-os, older Linux versions)
* Both gnttab and ghtshr (newer Linux versions)
In particular gntshr but not gnttab is not found in any real world system. Should I plan for such systems existing in the API? I think I probably should.
A second question is then what functionality should be provided for callers who only want either gnttab or gntshr, but not both. (The canonical example would be the xc_gntshr_* compat layer in libxenctrl, there may be others).
Previously code could rely on either xc_gnt{tab,shr}_open failing if the underlying interface was not present, and react accordingly, which might involve disabling functionality entirely (in such a way as the other calls to xc_gnt{tab,shr}_* do not need to handle ENOSYS, including by calling exit(1)).
Now xengnttab_open could succeed because the other interface is available, which may cause these applications to think they have an interface which they in reality do not => confusion.
Options I can think of:
* A set of open flags, either FOO_MANDATORY or FOO_ONLY (the latter allowing us to skip opening the relevant interface).
* Provide an interface to query the actual functionality which a given handle supports, so apps can react accordingly (e.g. by closing it again and erroring)
* Force all callers to adjust to handling ENOSYS as part of this transition
Opinions?
Ian.
Re: [PATCH XEN v5 07/23] tools: Refactor /dev/xen/gnt{dev, shr} wrappers into libxengnttab.
On Mon, 2015-11-23 at 17:05 +0000, Ian Campbell wrote:
Adding Daniel who I should have included the first time, plus a few more thoughts from me at the end.
Quoted 44 lines · Ian Jackson
Quoted 3 lines
Quoted 2 lines
XXX consider combining into a single namespace (i.e. with
xengnttab_handlehaving two open fd's in it on Linux)[...]
Quoted 1 line
I conclude it would be better to unify them.
Starting to look into this I have some queries on the direction I ought to take.
Currently the real world implementations are such that a given installation either provides:
* Neither gnttab nor gntshr (*BSD)
* Only gnttab, not gntshr (mini-os, older Linux versions)
* Both gnttab and ghtshr (newer Linux versions)In particular gntshr but not gnttab is not found in any real world system. Should I plan for such systems existing in the API? I think I probably should.
A second question is then what functionality should be provided for callers who only want either gnttab or gntshr, but not both. (The canonical example would be the xc_gntshr_* compat layer in libxenctrl, there may be others).
Previously code could rely on either xc_gnt{tab,shr}_open failing if the underlying interface was not present, and react accordingly, which might involve disabling functionality entirely (in such a way as the other calls to xc_gnt{tab,shr}_* do not need to handle ENOSYS, including by calling exit(1)).
Now
xengnttab_opencould succeed because the other interface is available, which may cause these applications to think they have an interface which they in reality do not => confusion.Options I can think of:
* A set of open flags, either
FOO_MANDATORYorFOO_ONLY(the latter allowing us to skip opening the relevant interface).
* Provide an interface to query the actual functionality which a given handle supports, so apps can react accordingly (e.g. by closing it again and erroring)
* Force all callers to adjust to handling ENOSYS as part of this transition
Quoted 1 line
Opinions?
Thinking about this some more overnight, it occurred to me that the real issue is that gnttab and gntshr are actually two quite difference APIs. gnttab is all about consuming grant references which are given to you from elsewhere while gntshr is all about creating grant references to give to others. They have relatively little in common wrt the underlying infrastructure, e.g. gnttab is mostly about making GNTTABOP hypercalls while gntshr mostly interacts with the kernel's grant ref allocator with no interaction with the hypervisor.
Maybe that and the API issues above constitute an argument for not combining, I'm really not sure.
Ian.
Re: [PATCH XEN v5 07/23] tools: Refactor /dev/xen/gnt{dev, shr} wrappers into libxengnttab.
Quoted 11 lines · Ian Campbell
Thinking about this some more overnight, it occurred to me that the real issue is that gnttab and gntshr are actually two quite difference APIs. gnttab is all about consuming grant references which are given to you from elsewhere while gntshr is all about creating grant references to give to others. They have relatively little in common wrt the underlying infrastructure, e.g. gnttab is mostly about making GNTTABOP hypercalls while gntshr mostly interacts with the kernel's grant ref allocator with no interaction with the hypervisor.
Maybe that and the API issues above constitute an argument for not combining, I'm really not sure.
Ian and I discussed this (briefly) in real life and based on the above argumentation we decided that keeping the two APIs separate (but in the same library) was justified, since there is a reasonable enough air gap between their functionality (i.e. consuming vs producing grants).
We did wonder a bit about changing the names to make that divide clearer, but couldn't think of anything especially compelling and decided to stick with the current shade of yellow.
Ian.
PATCH v5 8/23 tools/libxc: Remove osdep indirection for privcmd
In reply to Ian CampbellThe alternative backend (a xen-api/xapi shim) is no longer around and so this stuff is now just baggage which is getting in the way of refactoring libxenctrl.
Nested virt probably suffices for this use case now.
This was the last component of the osdep infrastructure, so all the dynamic loading etc stuff all falls away too.
As part of this I was forced to investigate the twisty xc_map_foreign_* maze, which I have added to the toolstack-library-apis doc in the hopes of doing something sensible.
NetBSD and Solaris now call xc_map_foreign_bulk_compat directly from their xc_map_foreign_bulk, which could have been achieved by using some ifdefs around a renamed function. This will fall out in the wash when these functions move to their own library.
--- config/FreeBSD.mk | 2 - config/NetBSD.mk | 3 - config/NetBSDRump.mk | 1 - config/StdGNU.mk | 1 - config/SunOS.mk | 1 - tools/libxc/Makefile | 27 ++---- tools/libxc/include/xenctrl.h | 9 -- tools/libxc/include/xenctrlosdep.h | 133 --------------------------- tools/libxc/xc_foreign_memory.c | 31 +------ tools/libxc/xc_freebsd_osdep.c | 100 ++++++--------------- tools/libxc/xc_hcall_buf.c | 6 +- tools/libxc/xc_linux_osdep.c | 88 ++++++------------ tools/libxc/xc_minios.c | 82 +++++------------ tools/libxc/xc_netbsd.c | 90 +++++++------------ tools/libxc/xc_private.c | 174 ++---------------------------------- tools/libxc/xc_private.h | 19 ++-- tools/libxc/xc_solaris.c | 90 +++++++------------ tools/libxc/xenctrl_osdep_ENOSYS.c | 123 ------------------------- tools/ocaml/libs/xc/xenctrl.ml | 2 - tools/ocaml/libs/xc/xenctrl.mli | 1 - tools/ocaml/libs/xc/xenctrl_stubs.c | 7 -- tools/ocaml/xenstored/domains.ml | 6 +- tools/ocaml/xenstored/xenstored.ml | 5 +- 23 files changed, 178 insertions(+), 823 deletions(-) delete mode 100644 tools/libxc/include/xenctrlosdep.h delete mode 100644 tools/libxc/xenctrl_osdep_ENOSYS.c
config/FreeBSD.mk +0 -2
@@ -1,6 +1,4 @@ include $(XEN_ROOT)/config/StdGNU.mk -DLOPEN_LIBS = - # No wget on FreeBSD base system WGET = ftp
config/NetBSD.mk +0 -3
@@ -1,6 +1,3 @@ include $(XEN_ROOT)/config/StdGNU.mk -# Override settings for this OS -DLOPEN_LIBS = - WGET = ftp
config/NetBSDRump.mk +0 -1
@@ -1,6 +1,5 @@ include $(XEN_ROOT)/config/StdGNU.mk -DLOPEN_LIBS = PTHREAD_LIBS = WGET = ftp
config/StdGNU.mk +0 -1
@@ -31,7 +31,6 @@ DEBUG_DIR ?= /usr/lib/debug SOCKET_LIBS = UTIL_LIBS = -lutil -DLOPEN_LIBS = -ldl SONAME_LDFLAG = -soname SHLIB_LDFLAGS = -shared
config/SunOS.mk +0 -1
@@ -27,7 +27,6 @@ SunOS_LIBDIR_x86_64 = /usr/sfw/lib/amd64 SOCKET_LIBS = -lsocket PTHREAD_LIBS = -lpthread UTIL_LIBS = -DLOPEN_LIBS = -ldl SONAME_LDFLAG = -h SHLIB_LDFLAGS = -R $(SunOS_LIBDIR) -shared
tools/libxc/Makefile +7 -20
@@ -101,8 +101,6 @@ GUEST_SRCS-y += xc_dom_decompress_unsafe_lzo1x.c GUEST_SRCS-y += xc_dom_decompress_unsafe_xz.c endif -OSDEP_SRCS-y += xenctrl_osdep_ENOSYS.c - -include $(XEN_TARGET_ARCH)/Makefile CFLAGS += -Werror -Wmissing-prototypes
@@ -121,11 +119,8 @@ CTRL_PIC_OBJS := $(patsubst %.c,%.opic,$(CTRL_SRCS-y)) GUEST_LIB_OBJS := $(patsubst %.c,%.o,$(GUEST_SRCS-y)) GUEST_PIC_OBJS := $(patsubst %.c,%.opic,$(GUEST_SRCS-y)) -OSDEP_LIB_OBJS := $(patsubst %.c,%.o,$(OSDEP_SRCS-y)) -OSDEP_PIC_OBJS := $(patsubst %.c,%.opic,$(OSDEP_SRCS-y)) - -$(CTRL_LIB_OBJS) $(GUEST_LIB_OBJS) $(OSDEP_LIB_OBJS) \ -$(CTRL_PIC_OBJS) $(GUEST_PIC_OBJS) $(OSDEP_PIC_OBJS) : CFLAGS += -include $(XEN_ROOT)/tools/config.h +$(CTRL_LIB_OBJS) $(GUEST_LIB_OBJS) \ +$(CTRL_PIC_OBJS) $(GUEST_PIC_OBJS): CFLAGS += -include $(XEN_ROOT)/tools/config.h $(CTRL_LIB_OBJS) $(CTRL_PIC_OBJS): CFLAGS += $(CFLAGS_libxengnttab) $(CFLAGS_libxengntshr)
@@ -139,17 +134,13 @@ ifneq ($(nosharedlibs),y) LIB += libxenguest.so libxenguest.so.$(MAJOR) libxenguest.so.$(MAJOR).$(MINOR) endif -ifneq ($(nosharedlibs),y) -LIB += xenctrl_osdep_ENOSYS.so -endif - genpath-target = $(call buildmakevars2header,_paths.h) $(eval $(genpath-target)) xc_private.h: _paths.h -$(CTRL_LIB_OBJS) $(GUEST_LIB_OBJS) $(OSDEP_LIB_OBJS) \ -$(CTRL_PIC_OBJS) $(GUEST_PIC_OBJS) $(OSDEP_PIC_OBJS): xc_private.h +$(CTRL_LIB_OBJS) $(GUEST_LIB_OBJS) \ +$(CTRL_PIC_OBJS) $(GUEST_PIC_OBJS): xc_private.h .PHONY: all all: build
@@ -169,7 +160,7 @@ install: build $(INSTALL_DATA) libxenctrl.a $(DESTDIR)$(libdir) $(SYMLINK_SHLIB) libxenctrl.so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir)/libxenctrl.so.$(MAJOR) $(SYMLINK_SHLIB) libxenctrl.so.$(MAJOR) $(DESTDIR)$(libdir)/libxenctrl.so - $(INSTALL_DATA) include/xenctrl.h include/xenctrl_compat.h include/xenctrlosdep.h $(DESTDIR)$(includedir) + $(INSTALL_DATA) include/xenctrl.h include/xenctrl_compat.h $(DESTDIR)$(includedir) $(INSTALL_SHLIB) libxenguest.so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir) $(INSTALL_DATA) libxenguest.a $(DESTDIR)$(libdir) $(SYMLINK_SHLIB) libxenguest.so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir)/libxenguest.so.$(MAJOR)
@@ -185,8 +176,7 @@ clean: rm -rf *.rpm $(LIB) *~ $(DEPS) \ _paths.h \ $(CTRL_LIB_OBJS) $(CTRL_PIC_OBJS) \ - $(GUEST_LIB_OBJS) $(GUEST_PIC_OBJS) \ - $(OSDEP_LIB_OBJS) $(OSDEP_PIC_OBJS) + $(GUEST_LIB_OBJS) $(GUEST_PIC_OBJS) .PHONY: distclean distclean: clean
@@ -212,7 +202,7 @@ libxenctrl.so.$(MAJOR): libxenctrl.so.$(MAJOR).$(MINOR) $(SYMLINK_SHLIB) $< $@ libxenctrl.so.$(MAJOR).$(MINOR): $(CTRL_PIC_OBJS) - $(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxengnttab) $(LDLIBS_libxengntshr) $(DLOPEN_LIBS) $(PTHREAD_LIBS) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxengnttab) $(LDLIBS_libxengntshr) $(PTHREAD_LIBS) $(APPEND_LDFLAGS) # libxenguest
@@ -237,8 +227,5 @@ libxenguest.so.$(MAJOR).$(MINOR): COMPRESSION_LIBS = $(call zlib-options,l) libxenguest.so.$(MAJOR).$(MINOR): $(GUEST_PIC_OBJS) libxenctrl.so $(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenguest.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $(GUEST_PIC_OBJS) $(COMPRESSION_LIBS) -lz $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(PTHREAD_LIBS) $(APPEND_LDFLAGS) -xenctrl_osdep_ENOSYS.so: $(OSDEP_PIC_OBJS) libxenctrl.so - $(CC) $(LDFLAGS) $(SHLIB_LDFLAGS) -o $@ $(OSDEP_PIC_OBJS) $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS) - -include $(DEPS)
tools/libxc/include/xenctrl.h +0 -9
@@ -181,15 +181,6 @@ enum xc_open_flags {*/ int xc_interface_close (xc_interface *xch); -/** -* Query the active OS interface (i.e. that which would be returned by -* xc_interface_open) to find out if it is fake (i.e. backends onto -* something other than an actual Xen hypervisor). -* -* @return 0 is "real", >0 if fake, -1 on error. -*/ -int xc_interface_is_fake (void ); -/* * HYPERCALL SAFE MEMORY BUFFER *
tools/libxc/include/xenctrlosdep.h deleted +0 -133
133 lines not on this page · raw message
tools/libxc/xc_foreign_memory.c +1 -30
@@ -50,37 +50,8 @@ void *xc_map_foreign_pages(xc_interface *xch, uint32_t dom, int prot,return res; } -void *xc_map_foreign_range (xc_interface *xch,uint32_t dom, -int size,int prot,unsigned long mfn) -{ -return xch->ops->u.privcmd.map_foreign_range (xch, xch->ops_handle, - dom, size, prot, mfn); -} - -void *xc_map_foreign_ranges (xc_interface *xch,uint32_t dom, -size_t size,int prot,size_t chunksize, -privcmd_mmap_entry_t entries[],int nentries) -{ -return xch->ops->u.privcmd.map_foreign_ranges (xch, xch->ops_handle, - dom, size, prot, chunksize, entries, nentries); -} - -void *xc_map_foreign_batch (xc_interface *xch,uint32_t dom,int prot, -xen_pfn_t *arr,int num) -{ -return xch->ops->u.privcmd.map_foreign_batch (xch, xch->ops_handle, - dom, prot, arr, num); -} - -void *xc_map_foreign_bulk (xc_interface *xch,uint32_t dom,int prot, -const xen_pfn_t *arr,int *err,unsigned int num) -{ -return xch->ops->u.privcmd.map_foreign_bulk (xch, xch->ops_handle, - dom, prot, arr, err, num); -} -/* stub for all not yet converted OSes */ -void *xc_map_foreign_bulk_compat (xc_interface *xch,xc_osdep_handle h, +void *xc_map_foreign_bulk_compat (xc_interface *xch,uint32_t dom,int prot,const xen_pfn_t *arr,int *err,unsigned int num) {
tools/libxc/xc_freebsd_osdep.c +27 -73
173 lines not on this page · raw message
tools/libxc/xc_hcall_buf.c +3 -3
@@ -122,7 +122,7 @@ void xc__hypercall_buffer_cache_release(xc_interface *xch)while ( xch->hypercall_buffer_cache_nr >0 ) { p = xch->hypercall_buffer_cache[--xch->hypercall_buffer_cache_nr]; - xch->ops->u.privcmd.free_hypercall_buffer (xch, xch->ops_handle, p,1 ); +osdep_free_hypercall_buffer (xch, p,1 ); }hypercall_buffer_cache_unlock (xch);
@@ -133,7 +133,7 @@ void *xc__hypercall_buffer_alloc_pages(xc_interface *xch, xc_hypercall_buffer_tvoid *p =hypercall_buffer_cache_alloc (xch, nr_pages);if ( !p ) - p = xch->ops->u.privcmd.alloc_hypercall_buffer (xch, xch->ops_handle, nr_pages); + p =osdep_alloc_hypercall_buffer (xch, nr_pages);if (!p)return NULL ;
@@ -151,7 +151,7 @@ void xc__hypercall_buffer_free_pages(xc_interface *xch, xc_hypercall_buffer_t *breturn ;if ( !hypercall_buffer_cache_free (xch, b->hbuf, nr_pages) ) - xch->ops->u.privcmd.free_hypercall_buffer (xch, xch->ops_handle, b->hbuf, nr_pages); +osdep_free_hypercall_buffer (xch, b->hbuf, nr_pages); }struct allocation_header {
tools/libxc/xc_linux_osdep.c +28 -60
167 lines not on this page · raw message
tools/libxc/xc_minios.c +24 -58
148 lines not on this page · raw message
tools/libxc/xc_netbsd.c +32 -58
164 lines not on this page · raw message
tools/libxc/xc_private.c +7 -167
223 lines not on this page · raw message
tools/libxc/xc_private.h +13 -6
@@ -30,7 +30,6 @@#include "_paths.h" #include "xenctrl.h" -#include "xenctrlosdep.h" #include <xen/sys/privcmd.h>
@@ -88,7 +87,6 @@ struct iovec {#define MAX_PAGECACHE_USAGE (4*1024)struct xc_interface_core { -enum xc_osdep_type type;int flags;xentoollog_logger *error_handler, *error_handler_tofree;xentoollog_logger *dombuild_logger, *dombuild_logger_tofree;
@@ -117,12 +115,21 @@ struct xc_interface_core {int hypercall_buffer_cache_misses;int hypercall_buffer_cache_toobig; -/* Low lovel OS interface */ -xc_osdep_info_t osdep; -xc_osdep_ops *ops;/* backend operations */ -xc_osdep_handle ops_handle;/* opaque data for xc_osdep_ops */ +/* Privcmd interface */ +int privcmdfd; }; +int osdep_privcmd_open (xc_interface *xch); +int osdep_privcmd_close (xc_interface *xch); + +void *osdep_alloc_hypercall_buffer (xc_interface *xch,int npages); +void osdep_free_hypercall_buffer (xc_interface *xch,void *ptr,int npages); + +/* Stub for not yet converted OSes */ +void *xc_map_foreign_bulk_compat (xc_interface *xch, +uint32_t dom,int prot, +const xen_pfn_t *arr,int *err,unsigned int num); +void xc_report_error (xc_interface *xch,int code,const char *fmt, ...) __attribute__((format (printf,3 ,4 ))); void xc_reportv(xc_interface *xch, xentoollog_logger *lg, xentoollog_level,
tools/libxc/xc_solaris.c +32 -58
158 lines not on this page · raw message
tools/libxc/xenctrl_osdep_ENOSYS.c deleted +0 -123
123 lines not on this page · raw message
tools/ocaml/libs/xc/xenctrl.ml +0 -2
@@ -108,8 +108,6 @@ external sizeof_xen_pfn: unit -> int = "stub_sizeof_xen_pfn" external interface_open: unit -> handle = "stub_xc_interface_open" external interface_close: handle -> unit = "stub_xc_interface_close" -external is_fake: unit -> bool = "stub_xc_interface_is_fake" - let with_intf f = let xc = interface_open () in let r = try f xc with exn -> interface_close xc; raise exn in
tools/ocaml/libs/xc/xenctrl.mli +0 -1
@@ -72,7 +72,6 @@ external sizeof_vcpu_guest_context : unit -> int = "stub_sizeof_vcpu_guest_context" external sizeof_xen_pfn : unit -> int = "stub_sizeof_xen_pfn" external interface_open : unit -> handle = "stub_xc_interface_open" -external is_fake : unit -> bool = "stub_xc_interface_is_fake" external interface_close : handle -> unit = "stub_xc_interface_close" val with_intf : (handle -> 'a) -> 'a val domain_create : handle -> int32 -> domain_create_flag list -> string -> domid
tools/ocaml/libs/xc/xenctrl_stubs.c +0 -7
@@ -126,13 +126,6 @@ CAMLprim value stub_xc_interface_open(void) } -CAMLprim value stub_xc_interface_is_fake(void) -{ -CAMLparam0 (); -int is_fake =xc_interface_is_fake (); -CAMLreturn (Val_int (is_fake)); -} - CAMLprim value stub_xc_interface_close(value xch) {CAMLparam1 (xch);
tools/ocaml/xenstored/domains.ml +2 -4
@@ -65,11 +65,9 @@ let create xc doms domid mfn port = Domain.bind_interdomain dom; dom -let create0 fake doms = +let create0 doms = let port, interface = - if fake then ( - 0, Xenctrl.with_intf (fun xc -> Xenctrl.map_foreign_range xc 0 (Xenmmap.getpagesize()) 0n) - ) else ( + ( let port = Utils.read_file_single_integer Define.xenstored_proc_port and fd = Unix.openfile Define.xenstored_proc_kva [ Unix.O_RDWR ] 0o600 in
tools/ocaml/xenstored/xenstored.ml +2 -3
@@ -176,7 +176,7 @@ let from_channel store cons doms chan = if domid > 0 then Domains.create xc doms domid mfn port else - Domains.create0 false doms + Domains.create0 doms in Connections.add_domain cons ndom; in
@@ -278,8 +278,7 @@ let _ = Store.mkdir store (Perms.Connection.create 0) localpath; if cf.domain_init then ( - let usingxiu = Xenctrl.is_fake () in - Connections.add_domain cons (Domains.create0 usingxiu domains); + Connections.add_domain cons (Domains.create0 domains); Event.bind_dom_exc_virq eventchn ); );
Signature · 1 line
2.1.4
PATCH v5 9/23 tools: Refactor hypercall calling wrappers into libxencall.
In reply to Ian Campbelllibxencall will provide a stable API and ABI for calling hypercalls (although those hypercalls themselves may not have a stable API). As well as the hypercall buffer infrastructure needed in order to safely provide pointer arguments to hypercalls.
libxenctrl encapsulates a instance of this interface, so users of that library are not currently subjected to any actual changes. However all hypercalls made internally by libxc now use the correct interface. It is expected that most users of this library will be other libraries providing a higher level interface, rather than applications directly.
Only the basic functionality to allocate hypercall safe memory is moved, the type safe stuff and bounce buffers remain in libxc.
Note that the functionality to map foreign pages using privcmd is not yet moved, meaning that an xc_interface will now contain two open privcmd file descriptors. Foreign memory mapping is logically separate functionality and will be moved into its own library.
The new library uses a version script to ensure that only expected symbols are exported and to version them such that ABI guarantees can be kept in the future.
---
Must be applied with:
- "qemu-xen-traditional: Add libxencall to rpath-link" and a corresponding QEMU_TAG update folded here.
- "mini-os: Include libxencall with libxc" and a corresponding bump to MINIOS_UPSTREAM_REVISION folded in here.
v3: Moved to tools/libs/call
Ported new wrappers (altp2m)
v5: Allow _close(NULL).
--- .gitignore | 2 + stubdom/Makefile | 20 +++- tools/Makefile | 1 + tools/Rules.mk | 7 +- tools/libs/Makefile | 1 + tools/libs/call/Makefile | 67 +++++++++++++ tools/libs/call/buffer.c | 192 ++++++++++++++++++++++++++++++++++++++ tools/libs/call/core.c | 147 +++++++++++++++++++++++++++++ tools/libs/call/freebsd.c | 140 +++++++++++++++++++++++++++ tools/libs/call/include/xencall.h | 84 +++++++++++++++++ tools/libs/call/libxencall.map | 19 ++++ tools/libs/call/linux.c | 132 ++++++++++++++++++++++++++ tools/libs/call/minios.c | 81 ++++++++++++++++ tools/libs/call/netbsd.c | 121 ++++++++++++++++++++++++ tools/libs/call/private.h | 68 ++++++++++++++ tools/libs/call/solaris.c | 97 +++++++++++++++++++ tools/libxc/Makefile | 7 +- tools/libxc/xc_altp2m.c | 64 ++++--------- tools/libxc/xc_domain.c | 105 +++++++-------------- tools/libxc/xc_evtchn.c | 9 +- tools/libxc/xc_flask.c | 8 +- tools/libxc/xc_freebsd_osdep.c | 47 ---------- tools/libxc/xc_gnttab.c | 9 +- tools/libxc/xc_hcall_buf.c | 138 ++------------------------- tools/libxc/xc_kexec.c | 36 +++---- tools/libxc/xc_linux_osdep.c | 49 ---------- tools/libxc/xc_minios.c | 32 ------- tools/libxc/xc_misc.c | 79 ++++++---------- tools/libxc/xc_netbsd.c | 40 -------- tools/libxc/xc_private.c | 64 +++++-------- tools/libxc/xc_private.h | 76 +++++---------- tools/libxc/xc_solaris.c | 16 ---- tools/libxc/xc_tmem.c | 7 +- tools/misc/Makefile | 4 +- tools/xcutils/Makefile | 2 +- tools/xenpaging/Makefile | 2 +- 36 files changed, 1341 insertions(+), 632 deletions(-) create mode 100644 tools/libs/call/Makefile create mode 100644 tools/libs/call/buffer.c create mode 100644 tools/libs/call/core.c create mode 100644 tools/libs/call/freebsd.c create mode 100644 tools/libs/call/include/xencall.h create mode 100644 tools/libs/call/libxencall.map create mode 100644 tools/libs/call/linux.c create mode 100644 tools/libs/call/minios.c create mode 100644 tools/libs/call/netbsd.c create mode 100644 tools/libs/call/private.h create mode 100644 tools/libs/call/solaris.c
.gitignore +2 -0
@@ -61,6 +61,7 @@ stubdom/xenstore stubdom/libxentoollog-* stubdom/libxenevtchn-* stubdom/libxengnttab-* +stubdom/libxencall-* stubdom/libxc-* stubdom/lwip-* stubdom/mini-os-*
@@ -90,6 +91,7 @@ config/Docs.mk tools/libs/toollog/headers.chk tools/libs/evtchn/headers.chk tools/libs/gnttab/headers.chk +tools/libs/call/headers.chk tools/blktap2/daemon/blktapctrl tools/blktap2/drivers/img2qcow tools/blktap2/drivers/lock-util
stubdom/Makefile +19 -1
@@ -330,6 +330,12 @@ mk-headers-$(XEN_TARGET_ARCH): $(IOEMU_LINKFARM_TARGET) ln -sf $(XEN_ROOT)/tools/libs/gnttab/include/*.h include/ && \ ln -sf $(XEN_ROOT)/tools/libs/gnttab/*.c . && \ ln -sf $(XEN_ROOT)/tools/libs/gnttab/Makefile . ) + mkdir -p libs-$(XEN_TARGET_ARCH)/call/include + [ -h libs-$(XEN_TARGET_ARCH)/call/Makefile ] || ( cd libs-$(XEN_TARGET_ARCH)/call && \ + ln -sf $(XEN_ROOT)/tools/libs/call/*.h . && \ + ln -sf $(XEN_ROOT)/tools/libs/call/include/*.h include/ && \ + ln -sf $(XEN_ROOT)/tools/libs/call/*.c . && \ + ln -sf $(XEN_ROOT)/tools/libs/call/Makefile . ) mkdir -p libxc-$(XEN_TARGET_ARCH) [ -h libxc-$(XEN_TARGET_ARCH)/Makefile ] || ( cd libxc-$(XEN_TARGET_ARCH) && \ ln -sf $(XEN_ROOT)/tools/libxc/*.h . && \
@@ -386,12 +392,24 @@ libs-$(XEN_TARGET_ARCH)/gnttab/libxengnttab.a: $(NEWLIB_STAMPFILE) CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= -C libs-$(XEN_TARGET_ARCH)/gnttab ####### +# libxencall +####### + +.PHONY: libxencall +libxencall: libs-$(XEN_TARGET_ARCH)/call/libxencall.a +libs-$(XEN_TARGET_ARCH)/call/libxencall.a: $(NEWLIB_STAMPFILE) + $(MAKE) -C $(XEN_ROOT)/tools/include + $(MAKE) DESTDIR= -C $(MINI_OS) links + CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= -C libs-$(XEN_TARGET_ARCH)/call +APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libs-$(MINIOS_TARGET_ARCH)/call -whole-archive -lxencall -no-whole-archive + +####### # libxc ####### .PHONY: libxc libxc: libxc-$(XEN_TARGET_ARCH)/libxenctrl.a libxc-$(XEN_TARGET_ARCH)/libxenguest.a -libxc-$(XEN_TARGET_ARCH)/libxenctrl.a: libxentoollog libxenevtchn libxengnttab cross-zlib +libxc-$(XEN_TARGET_ARCH)/libxenctrl.a: libxentoollog libxenevtchn libxengnttab libxencall cross-zlib $(MAKE) -C $(XEN_ROOT)/tools/include $(MAKE) DESTDIR= -C $(MINI_OS) links CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= CONFIG_LIBXC_MINIOS=y -C libxc-$(XEN_TARGET_ARCH)
tools/Makefile +1 -0
@@ -263,6 +263,7 @@ subdir-all-qemu-xen-dir: qemu-xen-dir-find -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/toollog \ -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/evtchn \ -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/gnttab \ + -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/call \ $(QEMU_UPSTREAM_RPATH)" \ --bindir=$(LIBEXEC_BIN) \ --datadir=$(SHAREDIR)/qemu-xen \
tools/Rules.mk +6 -1
@@ -13,6 +13,7 @@ XEN_INCLUDE = $(XEN_ROOT)/tools/include XEN_LIBXENTOOLLOG = $(XEN_ROOT)/tools/libs/toollog XEN_LIBXENEVTCHN = $(XEN_ROOT)/tools/libs/evtchn XEN_LIBXENGNTTAB = $(XEN_ROOT)/tools/libs/gnttab +XEN_LIBXENCALL = $(XEN_ROOT)/tools/libs/call XEN_LIBXC = $(XEN_ROOT)/tools/libxc XEN_XENLIGHT = $(XEN_ROOT)/tools/libxl XEN_XENSTORE = $(XEN_ROOT)/tools/xenstore
@@ -98,8 +99,12 @@ CFLAGS_libxengntshr = -I$(XEN_LIBXENGNTTAB)/include $(CFLAGS_xeninclude) LDLIBS_libxengntshr = $(XEN_LIBXENGNTTAB)/libxengnttab$(libextension) SHLIB_libxengntshr = -Wl,-rpath-link=$(XEN_LIBXENGNTTAB) +CFLAGS_libxencall = -I$(XEN_LIBXENCALL)/include $(CFLAGS_xeninclude) +LDLIBS_libxencall = $(XEN_LIBXENCALL)/libxencall$(libextension) +SHLIB_libxencall = -Wl,-rpath-link=$(XEN_LIBXENCALL) + CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_libxentoollog) $(CFLAGS_xeninclude) -SHDEPS_libxenctrl = $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn) $(SHLIB_libxengnttab) $(SHLIB_libxengntshr) +SHDEPS_libxenctrl = $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn) $(SHLIB_libxengnttab) $(SHLIB_libxengntshr) $(SHLIB_libxencall) LDLIBS_libxenctrl = $(SHDEPS_libxenctrl) $(XEN_LIBXC)/libxenctrl$(libextension) SHLIB_libxenctrl = $(SHDEPS_libxenctrl) -Wl,-rpath-link=$(XEN_LIBXC)
tools/libs/Makefile +1 -0
@@ -5,5 +5,6 @@ SUBDIRS-y := SUBDIRS-y += toollog SUBDIRS-y += evtchn SUBDIRS-y += gnttab +SUBDIRS-y += call all clean install distclean: %: subdirs-%
tools/libs/call/Makefile new file +67 -0
67 lines not on this page · raw message
tools/libs/call/buffer.c new file +192 -0
192 lines not on this page · raw message
tools/libs/call/core.c new file +147 -0
147 lines not on this page · raw message
tools/libs/call/freebsd.c new file +140 -0
140 lines not on this page · raw message
tools/libs/call/include/xencall.h new file +84 -0
84 lines not on this page · raw message
tools/libs/call/libxencall.map new file +19 -0
@@ -0,0 +1,19 @@ +VERS_1.0 { + global: + xencall_open; + xencall_close; + + xencall0; + xencall1; + xencall2; + xencall3; + xencall4; + xencall5; + xencall6; + + xencall_alloc_buffer; + xencall_free_buffer; + xencall_alloc_buffer_pages; + xencall_free_buffer_pages; + local: *; /* Do not expose anything by default */ +};
tools/libs/call/linux.c new file +132 -0
132 lines not on this page · raw message
tools/libs/call/minios.c new file +81 -0
81 lines not on this page · raw message
tools/libs/call/netbsd.c new file +121 -0
121 lines not on this page · raw message
tools/libs/call/private.h new file +68 -0
68 lines not on this page · raw message
tools/libs/call/solaris.c new file +97 -0
97 lines not on this page · raw message
tools/libxc/Makefile +6 -1
@@ -122,6 +122,11 @@ GUEST_PIC_OBJS := $(patsubst %.c,%.opic,$(GUEST_SRCS-y)) $(CTRL_LIB_OBJS) $(GUEST_LIB_OBJS) \ $(CTRL_PIC_OBJS) $(GUEST_PIC_OBJS): CFLAGS += -include $(XEN_ROOT)/tools/config.h +# libxenguest includes xc_private.h, so needs this despite not using +# this functionality directly. +$(CTRL_LIB_OBJS) $(GUEST_LIB_OBJS) \ +$(CTRL_PIC_OBJS) $(GUEST_PIC_OBJS): CFLAGS += $(CFLAGS_libxencall) + $(CTRL_LIB_OBJS) $(CTRL_PIC_OBJS): CFLAGS += $(CFLAGS_libxengnttab) $(CFLAGS_libxengntshr) LIB := libxenctrl.a
@@ -202,7 +207,7 @@ libxenctrl.so.$(MAJOR): libxenctrl.so.$(MAJOR).$(MINOR) $(SYMLINK_SHLIB) $< $@ libxenctrl.so.$(MAJOR).$(MINOR): $(CTRL_PIC_OBJS) - $(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxengnttab) $(LDLIBS_libxengntshr) $(PTHREAD_LIBS) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxengnttab) $(LDLIBS_libxengntshr) $(LDLIBS_libxencall) $(PTHREAD_LIBS) $(APPEND_LDFLAGS) # libxenguest
tools/libxc/xc_altp2m.c +16 -48
203 lines not on this page · raw message
tools/libxc/xc_domain.c +36 -69
296 lines not on this page · raw message
tools/libxc/xc_evtchn.c +3 -6
@@ -25,7 +25,6 @@ static int do_evtchn_op(xc_interface *xch, int cmd, void *arg, size_t arg_size, int silently_fail) {int ret =-1 ; -DECLARE_HYPERCALL ;DECLARE_HYPERCALL_BOUNCE (arg, arg_size,XC_HYPERCALL_BUFFER_BOUNCE_BOTH );if (xc_hypercall_bounce_pre (xch, arg) )
@@ -34,11 +33,9 @@ static int do_evtchn_op(xc_interface *xch, int cmd, void *arg, goto out; } - hypercall.op = __HYPERVISOR_event_channel_op; - hypercall.arg[0 ] = cmd; - hypercall.arg[1 ] =HYPERCALL_BUFFER_AS_ARG (arg); - -if ((ret =do_xen_hypercall (xch, &hypercall)) <0 && !silently_fail) + ret =xencall2 (xch->xcall, __HYPERVISOR_event_channel_op, + cmd,HYPERCALL_BUFFER_AS_ARG (arg)); +if ( ret <0 && !silently_fail )ERROR ("do_evtchn_op: HYPERVISOR_event_channel_op failed: %d" , ret);xc_hypercall_bounce_post (xch, arg);
tools/libxc/xc_flask.c +3 -5
@@ -37,7 +37,6 @@int xc_flask_op (xc_interface *xch,xen_flask_op_t *op) {int ret =-1 ; -DECLARE_HYPERCALL ;DECLARE_HYPERCALL_BOUNCE (op,sizeof (*op),XC_HYPERCALL_BUFFER_BOUNCE_BOTH ); op->interface_version =XEN_FLASK_INTERFACE_VERSION ;
@@ -48,10 +47,9 @@ int xc_flask_op(xc_interface *xch, xen_flask_op_t *op) goto out; } - hypercall.op = __HYPERVISOR_xsm_op; - hypercall.arg[0 ] =HYPERCALL_BUFFER_AS_ARG (op); - -if ( (ret =do_xen_hypercall (xch, &hypercall)) <0 ) + ret =xencall1 (xch->xcall, __HYPERVISOR_xsm_op, +HYPERCALL_BUFFER_AS_ARG (op)); +if ( ret <0 ) {if ( errno ==EACCES )fprintf (stderr,"XSM operation failed!\n" );
tools/libxc/xc_freebsd_osdep.c +0 -47
53 lines not on this page · raw message
tools/libxc/xc_gnttab.c +2 -7
@@ -21,7 +21,6 @@int xc_gnttab_op (xc_interface *xch,int cmd,void * op,int op_size,int count) {int ret =0 ; -DECLARE_HYPERCALL ;DECLARE_HYPERCALL_BOUNCE (op, count * op_size,XC_HYPERCALL_BUFFER_BOUNCE_BOTH );if (xc_hypercall_bounce_pre (xch, op) )
@@ -30,12 +29,8 @@ int xc_gnttab_op(xc_interface *xch, int cmd, void * op, int op_size, int count) goto out1; } - hypercall.op = __HYPERVISOR_grant_table_op; - hypercall.arg[0 ] = cmd; - hypercall.arg[1 ] =HYPERCALL_BUFFER_AS_ARG (op); - hypercall.arg[2 ] = count; - - ret =do_xen_hypercall (xch, &hypercall); + ret =xencall3 (xch->xcall, __HYPERVISOR_grant_table_op, + cmd,HYPERCALL_BUFFER_AS_ARG (op), count);xc_hypercall_bounce_post (xch, op);
tools/libxc/xc_hcall_buf.c +6 -132
176 lines not on this page · raw message
tools/libxc/xc_kexec.c +12 -24
@@ -14,7 +14,6 @@int xc_kexec_exec (xc_interface *xch,int type) { -DECLARE_HYPERCALL ;DECLARE_HYPERCALL_BUFFER (xen_kexec_exec_t, exec);int ret =-1 ;
@@ -27,11 +26,9 @@ int xc_kexec_exec(xc_interface *xch, int type) exec->type = type; - hypercall.op = __HYPERVISOR_kexec_op; - hypercall.arg[0 ] = KEXEC_CMD_kexec; - hypercall.arg[1 ] =HYPERCALL_BUFFER_AS_ARG (exec); - - ret =do_xen_hypercall (xch, &hypercall); + ret =xencall2 (xch->xcall, __HYPERVISOR_kexec_op, + KEXEC_CMD_kexec, +HYPERCALL_BUFFER_AS_ARG (exec)); out:xc_hypercall_buffer_free (xch, exec);
@@ -42,7 +39,6 @@ out:int xc_kexec_get_range (xc_interface *xch,int range,int nr,uint64_t *size,uint64_t *start) { -DECLARE_HYPERCALL ;DECLARE_HYPERCALL_BUFFER (xen_kexec_range_t, get_range);int ret =-1 ;
@@ -56,11 +52,9 @@ int xc_kexec_get_range(xc_interface *xch, int range, int nr, get_range->range = range; get_range->nr = nr; - hypercall.op = __HYPERVISOR_kexec_op; - hypercall.arg[0 ] = KEXEC_CMD_kexec_get_range; - hypercall.arg[1 ] =HYPERCALL_BUFFER_AS_ARG (get_range); - - ret =do_xen_hypercall (xch, &hypercall); + ret =xencall2 (xch->xcall, __HYPERVISOR_kexec_op, + KEXEC_CMD_kexec_get_range, +HYPERCALL_BUFFER_AS_ARG (get_range)); *size = get_range->size; *start = get_range->start;
@@ -76,7 +70,6 @@ int xc_kexec_load(xc_interface *xch, uint8_t type, uint16_t arch, uint32_t nr_segments, xen_kexec_segment_t *segments) { int ret = -1; -DECLARE_HYPERCALL ;DECLARE_HYPERCALL_BOUNCE (segments,sizeof (*segments) * nr_segments,XC_HYPERCALL_BUFFER_BOUNCE_IN );DECLARE_HYPERCALL_BUFFER (xen_kexec_load_t, load);
@@ -99,11 +92,9 @@ int xc_kexec_load(xc_interface *xch, uint8_t type, uint16_t arch, load->nr_segments = nr_segments;set_xen_guest_handle (load->segments.h, segments); - hypercall.op = __HYPERVISOR_kexec_op; - hypercall.arg[0 ] = KEXEC_CMD_kexec_load; - hypercall.arg[1 ] =HYPERCALL_BUFFER_AS_ARG (load); - - ret =do_xen_hypercall (xch, &hypercall); + ret =xencall2 (xch->xcall, __HYPERVISOR_kexec_op, + KEXEC_CMD_kexec_load, +HYPERCALL_BUFFER_AS_ARG (load)); out:xc_hypercall_buffer_free (xch, load);
@@ -114,7 +105,6 @@ out:int xc_kexec_unload (xc_interface *xch,int type) { -DECLARE_HYPERCALL ;DECLARE_HYPERCALL_BUFFER (xen_kexec_unload_t, unload);int ret =-1 ;
@@ -127,11 +117,9 @@ int xc_kexec_unload(xc_interface *xch, int type) unload->type = type; - hypercall.op = __HYPERVISOR_kexec_op; - hypercall.arg[0 ] = KEXEC_CMD_kexec_unload; - hypercall.arg[1 ] =HYPERCALL_BUFFER_AS_ARG (unload); - - ret =do_xen_hypercall (xch, &hypercall); + ret =xencall2 (xch->xcall, __HYPERVISOR_kexec_op, + KEXEC_CMD_kexec_unload, +HYPERCALL_BUFFER_AS_ARG (unload)); out:xc_hypercall_buffer_free (xch, unload);
tools/libxc/xc_linux_osdep.c +0 -49
55 lines not on this page · raw message
tools/libxc/xc_minios.c +0 -32
@@ -61,38 +61,6 @@ void minios_interface_close_fd(int fd) files[fd].type =FTYPE_NONE ; } -void *osdep_alloc_hypercall_buffer (xc_interface *xch,int npages) -{ -return xc_memalign (xch,PAGE_SIZE , npages *PAGE_SIZE ); -} - -void osdep_free_hypercall_buffer (xc_interface *xch,void *ptr,int npages) -{ -free (ptr); -} - -int do_xen_hypercall (xc_interface *xch,privcmd_hypercall_t *hypercall) -{ -multicall_entry_t call; -int i, ret; - - call.op = hypercall->op; -for (i =0 ; i <ARRAY_SIZE (hypercall->arg); i++) - call.args[i] = hypercall->arg[i]; - - ret =HYPERVISOR_multicall (&call,1 ); - -if (ret <0 ) { - errno = -ret; -return -1 ; - } -if ((long ) call.result <0 ) { - errno = - (long ) call.result; -return -1 ; - } -return call.result; -} -void *xc_map_foreign_bulk (xc_interface *xch,uint32_t dom,int prot,const xen_pfn_t *arr,int *err,unsigned int num)
tools/libxc/xc_misc.c +27 -52
214 lines not on this page · raw message
tools/libxc/xc_netbsd.c +0 -40
@@ -67,46 +67,6 @@ int osdep_privcmd_close(xc_interface *xch)return close (fd); } -void *osdep_alloc_hypercall_buffer (xc_interface *xch,int npages) -{ -size_t size = npages *XC_PAGE_SIZE ; -void *p; - - p =xc_memalign (xch,XC_PAGE_SIZE , size); -if (!p) -return NULL ; - -if (mlock (p, size) <0 ) - { -free (p); -return NULL ; - } -return p; -} - -void osdep_free_hypercall_buffer (xc_interface *xch,void *ptr,int npages) -{ - (void )munlock (ptr, npages *XC_PAGE_SIZE ); -free (ptr); -} - -int do_xen_hypercall (xc_interface *xch,privcmd_hypercall_t *hypercall) -{ -int fd = xch->privcmdfd; -int error =ioctl (fd,IOCTL_PRIVCMD_HYPERCALL , hypercall); - -/* -* Since NetBSD ioctl can only return 0 on success or < 0 on -* error, if we want to return a value from ioctl we should -* do so by setting hypercall->retval, to mimic Linux ioctl -* implementation. -*/ -if (error <0 ) -return error; -else -return hypercall->retval; -} -void *xc_map_foreign_bulk (xc_interface *xch,uint32_t dom,int prot,const xen_pfn_t *arr,int *err,unsigned int num)
tools/libxc/xc_private.c +25 -39
125 lines not on this page · raw message
tools/libxc/xc_private.h +21 -55
160 lines not on this page · raw message
tools/libxc/xc_solaris.c +0 -16
@@ -67,22 +67,6 @@ int osdep_privcmd_close(xc_interface *xch)return close (fd); } -void *osdep_alloc_hypercall_buffer (xc_interface *xch,int npages) -{ -return xc_memalign (xch,XC_PAGE_SIZE , npages *XC_PAGE_SIZE ); -} - -static void osdep_free_hypercall_buffer (xc_interface *xch,void *ptr,int npages) -{ -free (ptr); -} - -int do_xen_hypercall (xc_interface *xch,privcmd_hypercall_t *hypercall) -{ -int fd = xch->privcmdfd; -return ioctl (fd,IOCTL_PRIVCMD_HYPERCALL , hypercall); -} -void *xc_map_foreign_batch (xc_interface *xch,uint32_t dom,int prot,xen_pfn_t *arr,int num)
tools/libxc/xc_tmem.c +3 -4
@@ -23,7 +23,6 @@static int do_tmem_op (xc_interface *xch,tmem_op_t *op) {int ret; -DECLARE_HYPERCALL ;DECLARE_HYPERCALL_BOUNCE (op,sizeof (*op),XC_HYPERCALL_BUFFER_BOUNCE_BOTH );if (xc_hypercall_bounce_pre (xch, op) )
@@ -32,9 +31,9 @@ static int do_tmem_op(xc_interface *xch, tmem_op_t *op)return -EFAULT ; } - hypercall.op = __HYPERVISOR_tmem_op; - hypercall.arg[0 ] =HYPERCALL_BUFFER_AS_ARG (op); -if ((ret =do_xen_hypercall (xch, &hypercall)) <0 ) + ret =xencall1 (xch->xcall, __HYPERVISOR_tmem_op, +HYPERCALL_BUFFER_AS_ARG (op)); +if ( ret <0 ) {if ( errno ==EACCES ) DPRINTF("tmem operation failed -- need to"
tools/misc/Makefile +2 -2
@@ -87,12 +87,12 @@ xenlockprof: xenlockprof.o $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS) # xen-hptool incorrectly uses libxc internals -xen-hptool.o: CFLAGS += -I$(XEN_ROOT)/tools/libxc +xen-hptool.o: CFLAGS += -I$(XEN_ROOT)/tools/libxc $(CFLAGS_libxencall) xen-hptool: xen-hptool.o $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(APPEND_LDFLAGS) # xen-mfndump incorrectly uses libxc internals -xen-mfndump.o: CFLAGS += -I$(XEN_ROOT)/tools/libxc +xen-mfndump.o: CFLAGS += -I$(XEN_ROOT)/tools/libxc $(CFLAGS_libxencall) xen-mfndump: xen-mfndump.o $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(APPEND_LDFLAGS)
tools/xcutils/Makefile +1 -1
@@ -16,7 +16,7 @@ PROGRAMS = readnotes lsevtchn CFLAGS += -Werror # incorrectly uses libxc internals -CFLAGS_readnotes.o := $(CFLAGS_libxenevtchn) $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest) -I$(XEN_ROOT)/tools/libxc +CFLAGS_readnotes.o := $(CFLAGS_libxenevtchn) $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest) -I$(XEN_ROOT)/tools/libxc $(CFLAGS_libxencall) CFLAGS_lsevtchn.o := $(CFLAGS_libxenevtchn) $(CFLAGS_libxenctrl) .PHONY: all
tools/xenpaging/Makefile +1 -1
@@ -2,7 +2,7 @@ XEN_ROOT=$(CURDIR)/../.. include $(XEN_ROOT)/tools/Rules.mk # xenpaging.c and file_ops.c incorrectly use libxc internals -CFLAGS += $(CFLAGS_libxentoollog) $(CFLAGS_libxenevtchn) $(CFLAGS_libxenctrl) $(CFLAGS_libxenstore) $(PTHREAD_CFLAGS) -I$(XEN_ROOT)/tools/libxc +CFLAGS += $(CFLAGS_libxentoollog) $(CFLAGS_libxenevtchn) $(CFLAGS_libxenctrl) $(CFLAGS_libxenstore) $(PTHREAD_CFLAGS) -I$(XEN_ROOT)/tools/libxc $(CFLAGS_libxencall) LDLIBS += $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenstore) $(PTHREAD_LIBS) LDFLAGS += $(PTHREAD_LDFLAGS)
Signature · 1 line
2.1.4
Re: [PATCH XEN v5 09/23] tools: Refactor hypercall calling wrappers into libxencall.
Ian Campbell writes ("[PATCH XEN v5 09/23] tools: Refactor hypercall calling wrappers into libxencall."):
Quoted 4 lines
libxencall will provide a stable API and ABI for calling hypercalls (although those hypercalls themselves may not have a stable API). As well as the hypercall buffer infrastructure needed in order to safely provide pointer arguments to hypercalls.
...
Quoted 5 lines
+/*
+ * This library allows you to make arbitrary hypercalls (subject to
+ * sufficient permission for the process and the domain itself). Note
+ * that while the library interface is stable the hypercalls are
+ * subject to their own rules.
Something needs to say what the error handling is like.
Do these functions set errno ?
tools/libs/call/include/xencall.h line 50
Quoted 4 lines
tools/libs/call/include/xencall.h new file +4
-0+/* +* Call hypercalls with varying numbers of arguments. +*/ +int xencall0 (xencall_handle *xcall,unsigned int op);
Is the return value the raw hypercall return value, or is hypervisor do_foo returning -EFOOBAR turned into to -1/errno=EFOOBAR ? (Hopefully the answer to this doesn't depend on the hypercall ABI...)
tools/libs/call/include/xencall.h line 72
Quoted 9 lines
tools/libs/call/include/xencall.h new file +9
-0+/* +* Allocate and free memory which is suitable for use as a pointer +* argument to a hypercall. +*/ +void *xencall_alloc_buffer_pages (xencall_handle *xcall,int nr_pages); +void xencall_free_buffer_pages (xencall_handle *xcall,void *p,int nr_pages); + +void *xencall_alloc_buffer (xencall_handle *xcall,size_t size); +void xencall_free_buffer (xencall_handle *xcall,void *p);
See above re error handling.
Can these functions be used without (a) knowing the page size
(b) a rounding macro ?
It would be best to save callers the trouble of providing those themselves.
Ian.
Re: [PATCH XEN v5 09/23] tools: Refactor hypercall calling wrappers into libxencall.
Quoted 16 lines · Ian Jackson
Ian Campbell writes ("[PATCH XEN v5 09/23] tools: Refactor hypercall calling wrappers into libxencall."):
Quoted 4 lines
libxencall will provide a stable API and ABI for calling hypercalls (although those hypercalls themselves may not have a stable API). As well as the hypercall buffer infrastructure needed in order to safely provide pointer arguments to hypercalls.
...
Quoted 5 lines
+/*
+ * This library allows you to make arbitrary hypercalls (subject to
+ * sufficient permission for the process and the domain itself). Note
+ * that while the library interface is stable the hypercalls are
+ * subject to their own rules.Something needs to say what the error handling is like.
Do these functions set errno ?
Quoted 9 lines
tools/libs/call/include/xencall.h line 50
Quoted 4 lines
tools/libs/call/include/xencall.h new file +4
-0+/* +* Call hypercalls with varying numbers of arguments. +*/ +int xencall0 (xencall_handle *xcall,unsigned int op);Is the return value the raw hypercall return value, or is hypervisor
do_fooreturning-EFOOBARturned into to -1/errno=EFOOBAR ? (Hopefully the answer to this doesn't depend on the hypercall ABI...)
That is -1/errno=E_XEN_FOOBAR across all OSes.
(I think this stems from Linux ioctl semantics. Then NetBSD etc follow suit.)
Never noticed before the error handling is not documented though. I agree it should be documented. :-)
Quoted 19 lines
tools/libs/call/include/xencall.h line 72
Quoted 9 lines
tools/libs/call/include/xencall.h new file +9
-0+/* +* Allocate and free memory which is suitable for use as a pointer +* argument to a hypercall. +*/ +void *xencall_alloc_buffer_pages (xencall_handle *xcall,int nr_pages); +void xencall_free_buffer_pages (xencall_handle *xcall,void *p,int nr_pages); + +void *xencall_alloc_buffer (xencall_handle *xcall,size_t size); +void xencall_free_buffer (xencall_handle *xcall,void *p);See above re error handling.
Can these functions be used without (a) knowing the page size
(b) a rounding macro ?It would be best to save callers the trouble of providing those themselves.
Ian.
Re: [PATCH XEN v5 09/23] tools: Refactor hypercall calling wrappers into libxencall.
Quoted 29 lines · Wei Liu
Quoted 18 lines · Ian Jackson
Ian Campbell writes ("[PATCH XEN v5 09/23] tools: Refactor hypercall calling wrappers into libxencall."):
Quoted 4 lines
libxencall will provide a stable API and ABI for calling hypercalls (although those hypercalls themselves may not have a stable API). As well as the hypercall buffer infrastructure needed in order to safely provide pointer arguments to hypercalls.
...
Quoted 6 lines
+/*
+ * This library allows you to make arbitrary hypercalls (subject to
+ * sufficient permission for the process and the domain itself). Note
+ * that while the library interface is stable the hypercalls are
+ * subject to their own rules.Something needs to say what the error handling is like.
Do these functions set errno ?
Quoted 9 lines
tools/libs/call/include/xencall.h line 50
Quoted 4 lines
tools/libs/call/include/xencall.h new file +4
-0+/* +* Call hypercalls with varying numbers of arguments. +*/ +int xencall0 (xencall_handle *xcall,unsigned int op);Is the return value the raw hypercall return value, or is hypervisor
do_fooreturning-EFOOBARturned into to -1/errno=EFOOBAR ? (Hopefully the answer to this doesn't depend on the hypercall ABI...)
Quoted 4 lines
That is -1/errno=E_XEN_FOOBAR across all OSes.
(I think this stems from Linux ioctl semantics. Then NetBSD etc follow suit.)
I wish it were that simple :-(
Re: [PATCH XEN v5 09/23] tools: Refactor hypercall calling wrappers into libxencall.
In reply to Ian JacksonQuoted 13 lines · Ian Jackson
Ian Campbell writes ("[PATCH XEN v5 09/23] tools: Refactor hypercall calling wrappers into libxencall."):
Quoted 4 lines
libxencall will provide a stable API and ABI for calling hypercalls (although those hypercalls themselves may not have a stable API). As well as the hypercall buffer infrastructure needed in order to safely provide pointer arguments to hypercalls.
...
Quoted 5 lines
+/*
+ * This library allows you to make arbitrary hypercalls (subject to
+ * sufficient permission for the process and the domain itself). Note
+ * that while the library interface is stable the hypercalls are
+ * subject to their own rules.
Quoted 3 lines
Something needs to say what the error handling is like.
Do these functions set errno ?
Yes, they should have the customary "return -1 and set errno" pattern. I shall make this explicit.
Quoted 8 lines
tools/libs/call/include/xencall.h line 50
Quoted 4 lines
tools/libs/call/include/xencall.h new file +4
-0+/* +* Call hypercalls with varying numbers of arguments. +*/ +int xencall0 (xencall_handle *xcall,unsigned int op);Is the return value the raw hypercall return value, or is hypervisor
do_fooreturning-EFOOBARturned into to -1/errno=EFOOBAR ? (Hopefully the answer to this doesn't depend on the hypercall ABI...)
Oh god, this looks to vary by platform :-(
Linux returns the hypercall return value directly from the ioctl as its return value, which the usual libc stuff turns into -1/errno=EFOO on failure.
FreeBSD has a separate hypervisor retval field in the ioctl argument struct and does:
return (ret == 0) ? hypercall->retval : ret;
MiniOS goes for -1/errno=EFOO.
What a mess.
Either Linux+MiniOS or FreeBSD are going to have to change (i.e. in the wrappers in this library, not the underlying mechanisms) to match the other for consistency.
On FreeBSD hypercall->retval is in the XEN_ERRNO_* space. But I think we probably want to map onto the FreeBSD ERRNO space, IIRC we decided on this approach, rather than converting all our callers to the XEN_ERRNO_* space, in a previous discussion.
If we are going to standardise on one of those then given we've gone for -1/errno in most other places and it's the "normal" way to do things I think we should do the same here and the freebsd driver in libxencall should set errno.
There are other alternatives, such as having this library return the "privcmd ioctl" result in its return value + errno and the "hypercall result" in a separate output pointer argument. This would require, possibly substantial, changes in the callers, but right now they are all in libxc, which could munge that back into the current somewhat braindead scheme allowing us to update those call paths piecemeal and allowing new users to use the sane interface.
Thoughts?
Quoted 13 lines
tools/libs/call/include/xencall.h line 72
Quoted 10 lines
tools/libs/call/include/xencall.h new file +6
-0+/* +* Allocate and free memory which is suitable for use as a pointer +* argument to a hypercall. +*/ +void *xencall_alloc_buffer_pages (xencall_handle *xcall,int nr_pages); +void xencall_free_buffer_pages(xencall_handle *xcall, void *p, int
nr_pages);tools/libs/call/include/xencall.h new file +3
-0+ +void *xencall_alloc_buffer (xencall_handle *xcall,size_t size); +void xencall_free_buffer (xencall_handle *xcall,void *p);See above re error handling.
Quoted 5 lines
Can these functions be used without (a) knowing the page size
(b) a rounding macro ?It would be best to save callers the trouble of providing those themselves.
The library deals with this internally, size can be anything the caller likes.
Ian.
Re: [PATCH XEN v5 09/23] tools: Refactor hypercall calling wrappers into libxencall.
Quoted 14 lines · Ian Campbell
If we are going to standardise on one of those then given we've gone for -1/errno in most other places and it's the "normal" way to do things I think we should do the same here and the freebsd driver in libxencall should set errno.There are other alternatives, such as having this library return the "privcmd ioctl" result in its return value + errno and the "hypercall result" in a separate output pointer argument. This would require, possibly substantial, changes in the callers, but right now they are all in libxc, which could munge that back into the current somewhat braindead scheme allowing us to update those call paths piecemeal and allowing new users to use the sane interface.
Quoted 1 line
Thoughts?
Ian and I discusses this IRL. We decided that an interface that required the caller to check two error returns (the "privcmd ioctl result" and the "hypercall result" was unwieldy).
As a result we've decided that -1/errno=EFOO is the best approach, but that we should try and partition the errno space (so far as possible given the existing hypercall interfaces) into "From hypercall" and "From OS machinery for making hypercalls" where it matters.
For some cases the distinction may not be so important (e.g. EFAULT from either the kernel reading the ioctl arg or the hypervisor reading the hypercall arg). But in other cases it might be relevant (e.g. EPERM from the hypervisor vs a permissions error relating to the privcmd fd having been locked to a particular domain at the kernel/process level).
Ian.
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
Re: [PATCH XEN v5 09/23] tools: Refactor hypercall calling wrappers into libxencall.
In reply to Ian CampbellQuoted 5 lines · Ian Campbell
On FreeBSD
hypercall->retvalis in the XEN_ERRNO_* space. But I think we probably want to map onto the FreeBSD ERRNO space, IIRC we decided on this approach, rather than converting all our callers to the XEN_ERRNO_* space, in a previous discussion.
Roger, can you confirm whether or not something on FreeBSD translated the XEN_ERRNO errors into the BSD errno space? If so, then where is it? I looked in FreeBSD's privcmd.c and in libxc and failed to find it...
Ian.
Re: [PATCH XEN v5 09/23] tools: Refactor hypercall calling wrappers into libxencall.
El 13/11/15 a les 17.57, Ian Campbell ha escrit:
Quoted 10 lines · Ian Campbell
Quoted 5 lines
On FreeBSD
hypercall->retvalis in the XEN_ERRNO_* space. But I think we probably want to map onto the FreeBSD ERRNO space, IIRC we decided on this approach, rather than converting all our callers to the XEN_ERRNO_* space, in a previous discussion.Roger, can you confirm whether or not something on FreeBSD translated the
XEN_ERRNOerrors into the BSD errno space? If so, then where is it? I looked in FreeBSD'sprivcmd.cand in libxc and failed to find it...
Yes, the translation is done in the privcmd driver:
https://github.com/freebsd/freebsd/blob/master/sys/dev/xen/privcmd/privcmd.c#L242
So errors returned from the ioctl (in errno) are in the BSD space. I still have to implement the error codes distributed from the Xen public headers, right now we have a custom Xen error translation:
https://github.com/freebsd/freebsd/blob/master/sys/xen/error.h
Roger.
Re: [PATCH XEN v5 09/23] tools: Refactor hypercall calling wrappers into libxencall.
Quoted 16 lines · Roger Pau Monné
El 13/11/15 a les 17.57, Ian Campbell ha escrit:
Quoted 10 lines · Ian Campbell
Quoted 8 lines
On FreeBSD
hypercall->retvalis in the XEN_ERRNO_* space. But I think we
probably want to map onto the FreeBSD ERRNO space, IIRC we decided on this
approach, rather than converting all our callers to the XEN_ERRNO_* space,
in a previous discussion.Quoted 4 lines
Roger, can you confirm whether or not something on FreeBSD translated the
XEN_ERRNOerrors into the BSD errno space? If so, then where is it? I looked in FreeBSD'sprivcmd.cand in libxc and failed to find it...
Quoted 4 lines
Yes, the translation is done in the privcmd driver:
https://github.com/freebsd/freebsd/blob/master/sys/dev/xen/privcmd/privcm
d.c#L242
Thanks, I was looking for a big table but it's out of line in another file so I missed it.
Quoted 8 lines
So errors returned from the ioctl (in errno) are in the BSD space. I still have to implement the error codes distributed from the Xen public headers, right now we have a custom Xen error translation:
https://github.com/freebsd/freebsd/blob/master/sys/xen/error.h
Roger.
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
Re: [PATCH XEN v5 09/23] tools: Refactor hypercall calling wrappers into libxencall.
In reply to Ian CampbellQuoted 65 lines · Ian Campbell
tools/libs/call/include/xencall.h new file +59
-0@@ -0,0 +1,84 @@ +/* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; If not, see <http://www.gnu.org/licenses/>. +*/ +#ifndef XENCALL_H +#define XENCALL_H + +/* +* This library allows you to make arbitrary hypercalls (subject to +* sufficient permission for the process and the domain itself). Note +* that while the library interface is stable the hypercalls are +* subject to their own rules. +*/ + +#include <stdint.h> +#include <stddef.h> + +/* Callers who don't care don't need to #include <xentoollog.h> */ +typedef struct xentoollog_logger xentoollog_logger ; + +typedef struct xencall_handle xencall_handle ; + +/* +*/ +#define XENCALL_OPENFLAG_NON_REENTRANT (1U<<0) + +/* +* Return a handle onto the hypercall driver. Logs errors. +*/ +xencall_handle *xencall_open (xentoollog_logger *logger,unsigned open_flags); + +/* +* Close a handle previously allocated with xencall_open(). +*/ +int xencall_close (xencall_handle *xcall); + +/* +* Call hypercalls with varying numbers of arguments. +*/ +int xencall0 (xencall_handle *xcall,unsigned int op); +int xencall1 (xencall_handle *xcall,unsigned int op, +uint64_t arg1); +int xencall2 (xencall_handle *xcall,unsigned int op, +uint64_t arg1,uint64_t arg2); +int xencall3 (xencall_handle *xcall,unsigned int op, +uint64_t arg1,uint64_t arg2,uint64_t arg3); +int xencall4 (xencall_handle *xcall,unsigned int op, +uint64_t arg1,uint64_t arg2,uint64_t arg3, +uint64_t arg4);
tools/libs/call/include/xencall.h line 69
Quoted 10 lines
tools/libs/call/include/xencall.h new file +10
-0+int xencall5 (xencall_handle *xcall,unsigned int op, +uint64_t arg1,uint64_t arg2,uint64_t arg3, +uint64_t arg4,uint64_t arg5); + +/* +* Allocate and free memory which is suitable for use as a pointer +* argument to a hypercall. +*/ +void *xencall_alloc_buffer_pages (xencall_handle *xcall,int nr_pages); +void xencall_free_buffer_pages (xencall_handle *xcall,void *p,int nr_pages);
size_t nr_pages. (The osdep internals appear to use unsigned nr_pages, just to be different).
~Andrew
Re: [PATCH XEN v5 09/23] tools: Refactor hypercall calling wrappers into libxencall.
In reply to Ian CampbellQuoted 28 lines · Ian Campbell
tools/libs/call/linux.c new file +22
-0@@ -0,0 +1,132 @@ +/* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; If not, see <http://www.gnu.org/licenses/>. +* +* Split out from xc_linus_osdep.c: +* +* Copyright 2006 Sun Microsystems, Inc. All rights reserved. +*/ + +#include <errno.h> +#include <fcntl.h> +#include <unistd.h>
tools/libs/call/linux.c line 32
Quoted 10 lines
tools/libs/call/linux.c new file +10
-0+ +#include <sys/mman.h> +#include <sys/ioctl.h> + +#include "private.h" + +int osdep_xencall_open (xencall_handle *xcall) +{ +int flags, saved_errno; +int fd =open ("/proc/xen/privcmd" ,O_RDWR );
I know this is a straight copy, but these new libraries really should start with the PVOps interface of /dev/xen/privcmd before falling back to the older classic-linux interfaces under /proc
Ideally, once all these library improvements are done, there should be no need to mount xenfs in a Linux PVops domain.
tools/libs/call/linux.c line 43
Quoted 11 lines
tools/libs/call/linux.c new file +11
-0+ +if ( fd ==-1 ) + { +PERROR ("Could not obtain handle on privileged command interface" ); +return -1 ; + } + +/* Although we return the file handle as the 'xc handle' the API +does not specify / guarentee that this integer is in fact +a file handle. Thus we must take responsiblity to ensure +it doesn't propagate (ie leak) outside the process */
Again, I know this is a straight copy, but it is racy. The open() call needs O_CLOEXEC.
There might be some issues here to do with older versions of libc.
Quoted 44 lines
tools/libs/call/linux.c new file +44
-0+if ( (flags =fcntl (fd,F_GETFD )) <0 ) + { +PERROR ("Could not get file handle flags" ); + goto error; + } + + flags |=FD_CLOEXEC ; + +if (fcntl (fd,F_SETFD , flags) <0 ) + { +PERROR ("Could not set file handle flags" ); + goto error; + } + + xcall->fd = fd; +return 0 ; + + error: + saved_errno = errno; +close (fd); + errno = saved_errno; +return -1 ; +} + +int osdep_xencall_close (xencall_handle *xcall) +{ +int fd = xcall->fd; +if (fd ==-1 ) +return 0 ; +return close (fd); +} + +int osdep_hypercall (xencall_handle *xcall,privcmd_hypercall_t *hypercall) +{ +return ioctl (xcall->fd,IOCTL_PRIVCMD_HYPERCALL , hypercall); +} + +void *osdep_alloc_pages (xencall_handle *xcall,unsigned int npages) +{ +size_t size = npages *PAGE_SIZE ; +void *p; +int rc, saved_errno; + +/* Address returned by mmap is page aligned. */
tools/libs/call/linux.c line 97
Quoted 10 lines
tools/libs/call/linux.c new file +10
-0+ p =mmap (NULL , size,PROT_READ |PROT_WRITE ,MAP_PRIVATE |MAP_ANONYMOUS |MAP_LOCKED ,-1 ,0 ); +if ( p ==MAP_FAILED ) + { +PERROR ("xc_alloc_hypercall_buffer: mmap failed" ); +return NULL ; + } + +/* Do not copy the VMA to child process on fork. Avoid the page being COW +on hypercall. */ + rc =madvise (p, npages *PAGE_SIZE ,MADV_DONTFORK );
This also seems racy, although it is unclear from the manpages how to avoid the race.
~Andrew
Quoted 35 lines
tools/libs/call/linux.c new file +35
-0+if ( rc <0 ) + { +PERROR ("xc_alloc_hypercall_buffer: madvise failed" ); + goto out; + } + +return p; + +out: + saved_errno = errno; + (void )munmap (p, size); + errno = saved_errno; +return NULL ; +} + +void osdep_free_pages (xencall_handle *xcall,void *ptr,unsigned int npages) +{ +int saved_errno = errno; +/* Recover the VMA flags. Maybe it's not necessary */ +madvise (ptr, npages *PAGE_SIZE ,MADV_DOFORK ); + +munmap (ptr, npages *PAGE_SIZE ); +/* We MUST propagate the hypercall errno, not unmap call's. */ + errno = saved_errno; +} + +/* +* Local variables: +* mode: C +* c-file-style: "BSD" +* c-basic-offset: 4 +* tab-width: 4 +* indent-tabs-mode: nil +* End: +*/
Re: [PATCH XEN v5 09/23] tools: Refactor hypercall calling wrappers into libxencall.
Quoted 36 lines · Andrew Cooper
Quoted 35 lines · Ian Campbell
tools/libs/call/linux.c new file +13
-0@@ -0,0 +1,132 @@ +/* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; If not, see <http://www.gnu.org/li censes/>.
+ *
+ * Split out fromxc_linus_osdep.c:
+ *
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ */tools/libs/call/linux.c new file +10
-0+ +#include <errno.h> +#include <fcntl.h> +#include <unistd.h> + +#include <sys/mman.h> +#include <sys/ioctl.h> + +#include "private.h" +
Quoted 8 lines
tools/libs/call/linux.c line 32
Quoted 4 lines
tools/libs/call/linux.c new file +4
-0+int osdep_xencall_open (xencall_handle *xcall) +{ + int flags, saved_errno; + int fd = open("/proc/xen/privcmd", O_RDWR);I know this is a straight copy, but these new libraries really should start with the PVOps interface of
/dev/xen/privcmdbefore falling back to the older classic-linux interfaces under /proc
Right, I'll pick this up for (almost, modulo resolving a conflict or two) free when I rebase over Doug's patch to do this, which I'll be doing before reposting.
Quoted 19 lines
Ideally, once all these library improvements are done, there should be no need to mount xenfs in a Linux PVops domain.
Quoted 4 lines
+
+ if ( fd == -1 )
+ {
+ PERROR("Could not obtain handle on privileged commandQuoted 8 lines
interface");
+ return -1;
+ }
+
+ /* Although we return the file handle as the 'xc handle' the API + does not specify / guarentee that this integer is in fact + a file handle. Thus we must take responsiblity to ensure + it doesn't propagate (ie leak) outside the process */Again, I know this is a straight copy, but it is racy. The
open()call needsO_CLOEXEC.
Quoted 1 line
There might be some issues here to do with older versions of libc.
Or indeed super old versions of Linux (O_CLOEXEC came with 2.6.23 according to man).
I'm tempted to hedge and use O_CLOEXEC with /dev/xen/privcmd, and leave the legacy /proc/xen/privcmd path doing it this way, after all we've managed to get this far...
Quoted 7 lines
Quoted 4 lines
+ /* Do not copy the VMA to child process on fork. Avoid the page being COW
+ on hypercall. */
+ rc =madvise(p, npages * PAGE_SIZE, MADV_DONTFORK);This also seems racy, although it is unclear from the manpages how to avoid the race.
pthread_atfork() might be one approach, and libxencall already uses pthreads (for locking the cache), so it wouldn't be a problem to add more uses, I don't think.
Ian.
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
PATCH v5 10/23 tools/libxc: drop xc_map_foreign_bulk_compat wrappers
In reply to Ian CampbellOn Solaris and NetBSD xc_map_foreign_bulk is implemented by calling xc_map_foreign_bulk_compat and xc_map_foreign_bulk_compat is exposed as a symbol by libxenctrl.so.
Remove these wrappers and turn the compat function into the real thing surrounded by the appropriate ifdef.
As this is a compat function all new ports should instead implement xc_map_foreign_bulk properly, hence the ifdef should never be expanded.
--- tools/libxc/xc_foreign_memory.c | 13 +++++++++---- tools/libxc/xc_netbsd.c | 7 ------- tools/libxc/xc_private.h | 5 ----- tools/libxc/xc_solaris.c | 7 ------- 4 files changed, 9 insertions(+), 23 deletions(-)
tools/libxc/xc_foreign_memory.c +9 -4
@@ -50,10 +50,14 @@ void *xc_map_foreign_pages(xc_interface *xch, uint32_t dom, int prot,return res; } -/* stub for all not yet converted OSes */ -void *xc_map_foreign_bulk_compat (xc_interface *xch, -uint32_t dom,int prot, -const xen_pfn_t *arr,int *err,unsigned int num) +/* +* stub for all not yet converted OSes (NetBSD and Solaris). New OSes should +* just implement xc_map_foreign_bulk. +*/ +#if defined(__NetBSD__) || defined(__sun__) +void *xc_map_foreign_bulk (xc_interface *xch, +uint32_t dom,int prot, +const xen_pfn_t *arr,int *err,unsigned int num) {xen_pfn_t *pfn;unsigned int i;
@@ -90,6 +94,7 @@ void *xc_map_foreign_bulk_compat(xc_interface *xch, return ret; } +#endif /* * Local variables:
tools/libxc/xc_netbsd.c +0 -7
@@ -67,13 +67,6 @@ int osdep_privcmd_close(xc_interface *xch)return close (fd); } -void *xc_map_foreign_bulk (xc_interface *xch, -uint32_t dom,int prot, -const xen_pfn_t *arr,int *err,unsigned int num) -{ -return xc_map_foreign_bulk_compat (xch, dom, prot, arr, err, num); -} -void *xc_map_foreign_batch (xc_interface *xch,uint32_t dom,int prot,xen_pfn_t *arr,int num)
tools/libxc/xc_private.h +0 -5
@@ -107,11 +107,6 @@ int osdep_privcmd_close(xc_interface *xch);void *osdep_alloc_hypercall_buffer (xc_interface *xch,int npages);void osdep_free_hypercall_buffer (xc_interface *xch,void *ptr,int npages); -/* Stub for not yet converted OSes */ -void *xc_map_foreign_bulk_compat (xc_interface *xch, -uint32_t dom,int prot, -const xen_pfn_t *arr,int *err,unsigned int num); -void xc_report_error (xc_interface *xch,int code,const char *fmt, ...) __attribute__((format (printf,3 ,4 ))); void xc_reportv(xc_interface *xch, xentoollog_logger *lg, xentoollog_level,
tools/libxc/xc_solaris.c +0 -7
@@ -94,13 +94,6 @@ void *xc_map_foreign_batch(xc_interface *xch, } -void *xc_map_foreign_bulk (xc_interface *xch, -uint32_t dom,int prot, -const xen_pfn_t *arr,int *err,unsigned int num) -{ -return xc_map_foreign_bulk_compat (xch, dom, prot, arr, err, num); -} - void *xc_map_foreign_range(xc_interface *xch, uint32_t dom, int size, int prot,
Signature · 1 line
2.1.4
PATCH v5 11/23 tools: Remove xc_map_foreign_batch
In reply to Ian CampbellIt can trivially be replaced by xc_map_foreign_bulk which is the interface I want to move to going forward. All in tree users are trivially converted by supplying the appropriate error array and adjusting the what error handling exists (which in many cases is not much).
This reduces the twist maze of xc_map_foreign_* by one, which will be useful when trying to come up with an underlying stable interface.
NetBSD and Solaris implemented xc_map_foreign_bulk in terms of xc_map_foreign_batch via a compat layer, so xc_map_foreign_batch becomes an internal osdep for them. New OS ports should always implement xc_map_foreign_bulk instead.
--- tools/libxc/include/xenctrl.h | 10 ------- tools/libxc/xc_foreign_memory.c | 4 ++- tools/libxc/xc_linux_osdep.c | 59 +++-------------------------------------- tools/libxc/xc_minios.c | 22 --------------- tools/libxc/xc_netbsd.c | 10 +++---- tools/libxc/xc_solaris.c | 6 ++--- tools/libxc/xc_vm_event.c | 25 ++++++++++++----- tools/xenmon/xenbaked.c | 19 ++++++++++--- tools/xenpaging/pagein.c | 4 ++- tools/xenpaging/xenpaging.c | 12 +++++---- tools/xentrace/xentrace.c | 10 ++++--- 11 files changed, 63 insertions(+), 118 deletions(-)
tools/libxc/include/xenctrl.h +0 -10
@@ -1395,16 +1395,6 @@ void *xc_map_foreign_pages(xc_interface *xch, uint32_t dom, int prot, const xen_pfn_t *arr, int num );/** -* DEPRECATED - use xc_map_foreign_bulk() instead. -* -* Like xc_map_foreign_pages(), except it can succeeed partially. -* When a page cannot be mapped, its PFN in @arr is or'ed with -* 0xF0000000 to indicate the error. -*/ -void *xc_map_foreign_batch (xc_interface *xch,uint32_t dom,int prot, -xen_pfn_t *arr,int num ); - -/** * Like xc_map_foreign_pages(), except it can succeed partially. * When a page cannot be mapped, its respective field in @err is * set to the corresponding errno value.
tools/libxc/xc_foreign_memory.c +3 -1
@@ -55,6 +55,8 @@ void *xc_map_foreign_pages(xc_interface *xch, uint32_t dom, int prot,* just implement xc_map_foreign_bulk. */ #if defined(__NetBSD__) || defined(__sun__) +void *osdep_map_foreign_batch (xc_interface *xch,uint32_t dom,int prot, +xen_pfn_t *arr,int num );void *xc_map_foreign_bulk (xc_interface *xch,uint32_t dom,int prot,const xen_pfn_t *arr,int *err,unsigned int num)
@@ -75,7 +77,7 @@ void *xc_map_foreign_bulk(xc_interface *xch, }memcpy (pfn, arr, num *sizeof (*arr)); - ret =xc_map_foreign_batch (xch, dom, prot, pfn, num); + ret =osdep_map_foreign_batch (xch, dom, prot, pfn, num);if (ret) {for (i =0 ; i < num; ++i)
tools/libxc/xc_linux_osdep.c +3 -56
77 lines not on this page · raw message
tools/libxc/xc_minios.c +0 -22
@@ -73,28 +73,6 @@ void *xc_map_foreign_bulk(xc_interface *xch,return map_frames_ex (arr, num,1 ,0 ,1 , dom, err, pt_prot); } -void *xc_map_foreign_batch (xc_interface *xch, -uint32_t dom,int prot, -xen_pfn_t *arr,int num) -{ -unsigned long pt_prot =0 ; -int err[num]; -int i; -unsigned long addr; - -if (prot &PROT_READ ) - pt_prot =L1_PROT_RO ; -if (prot &PROT_WRITE ) - pt_prot =L1_PROT ; - - addr = (unsigned long )map_frames_ex (arr, num,1 ,0 ,1 , dom, err, pt_prot); -for (i =0 ; i < num; i++) { -if (err[i]) - arr[i] |=0xF0000000 ; - } -return (void *) addr; -} - void *xc_map_foreign_range(xc_interface *xch, uint32_t dom, int size, int prot,
tools/libxc/xc_netbsd.c +5 -5
@@ -67,16 +67,16 @@ int osdep_privcmd_close(xc_interface *xch)return close (fd); } -void *xc_map_foreign_batch (xc_interface *xch, -uint32_t dom,int prot, -xen_pfn_t *arr,int num) +void *osdep_map_foreign_batch (xc_interface *xch, +uint32_t dom,int prot, +xen_pfn_t *arr,int num) {int fd = xch->privcmdfd;privcmd_mmapbatch_t ioctlx;void *addr; addr =mmap (NULL , num*XC_PAGE_SIZE , prot,MAP_ANON |MAP_SHARED ,-1 ,0 );if ( addr ==MAP_FAILED ) { -PERROR ("xc_map_foreign_batch: mmap failed" ); +PERROR ("osdep_map_foreign_batch: mmap failed" );return NULL ; }
@@ -87,7 +87,7 @@ void *xc_map_foreign_batch(xc_interface *xch,if (ioctl (fd,IOCTL_PRIVCMD_MMAPBATCH , &ioctlx) <0 ) {int saved_errno = errno; -PERROR ("xc_map_foreign_batch: ioctl failed" ); +PERROR ("osdep_map_foreign_batch: ioctl failed" ); (void )munmap (addr, num*XC_PAGE_SIZE ); errno = saved_errno;return NULL ;
tools/libxc/xc_solaris.c +3 -3
@@ -67,9 +67,9 @@ int osdep_privcmd_close(xc_interface *xch)return close (fd); } -void *xc_map_foreign_batch (xc_interface *xch, -uint32_t dom,int prot, -xen_pfn_t *arr,int num) +void *osdep_map_foreign_batch (xc_interface *xch, +uint32_t dom,int prot, +xen_pfn_t *arr,int num) {int fd = xch->privcmdfd;privcmd_mmapbatch_t ioctlx;
tools/libxc/xc_vm_event.c +18 -7
@@ -45,6 +45,7 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t domain_id, int param,void *ring_page =NULL ;uint64_t pfn;xen_pfn_t ring_pfn, mmap_pfn; +int err;unsigned int op, mode;int rc1, rc2, saved_errno;
@@ -72,9 +73,9 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t domain_id, int param, ring_pfn = pfn; mmap_pfn = pfn; - ring_page =xc_map_foreign_batch (xch, domain_id,PROT_READ |PROT_WRITE , - &mmap_pfn,1 ); -if ( mmap_pfn &XEN_DOMCTL_PFINFO_XTAB ) + ring_page =xc_map_foreign_bulk (xch, domain_id,PROT_READ |PROT_WRITE , + &mmap_pfn, &err,1 ); +if ( !ring_page ) {/* Map failed, populate ring page */ rc1 = xc_domain_populate_physmap_exact(xch, domain_id, 1, 0, 0,
@@ -86,11 +87,11 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t domain_id, int param, } mmap_pfn = ring_pfn; - ring_page =xc_map_foreign_batch (xch, domain_id,PROT_READ |PROT_WRITE , - &mmap_pfn,1 ); -if ( mmap_pfn &XEN_DOMCTL_PFINFO_XTAB ) + ring_page =xc_map_foreign_bulk (xch, domain_id,PROT_READ |PROT_WRITE , + &mmap_pfn, &err,1 ); +if ( !ring_page ) { -PERROR ("Could not map the ring page\n" ); +PERROR ("Could not map the ring page: %d\n" , err); goto out; } }
@@ -156,3 +157,13 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t domain_id, int param,return ring_page; } + +/* +* Local variables: +* mode: C +* c-file-style: "BSD" +* c-basic-offset: 4 +* tab-width: 4 +* indent-tabs-mode: nil +* End: +*/
tools/xenmon/xenbaked.c +15 -4
@@ -407,14 +407,15 @@ static struct t_struct *map_tbufs(unsigned long tbufs_mfn, unsigned int num, + tbufs.t_info->mfn_offset[i];int j;xen_pfn_t pfn_list[tbufs.t_info->tbuf_size]; +int err_list[tbufs.t_info->tbuf_size];for ( j=0 ; j<tbufs.t_info->tbuf_size; j++) pfn_list[j] = (xen_pfn_t )mfn_list[j]; - tbufs.meta[i] =xc_map_foreign_batch (xc_handle,DOMID_XEN , -PROT_READ |PROT_WRITE , - pfn_list, - tbufs.t_info->tbuf_size); + tbufs.meta[i] =xc_map_foreign_bulk (xc_handle,DOMID_XEN , +PROT_READ |PROT_WRITE , + pfn_list, err_list, + tbufs.t_info->tbuf_size);if ( tbufs.meta[i] ==NULL ) {PERROR ("Failed to map cpu buffer!" );
@@ -1175,3 +1176,13 @@ static int process_record(int cpu, struct t_rec *r)return 4 + (r->cycles_included ?8 :0 ) + (r->extra_u32 *4 ); } + +/* +* Local variables: +* mode: C +* c-file-style: "BSD" +* c-basic-offset: 4 +* tab-width: 4 +* indent-tabs-mode: nil +* End: +*/
tools/xenpaging/pagein.c +3 -1
@@ -23,6 +23,7 @@ static void *page_in(void *arg)void *page;int i, num;xen_pfn_t gfns[XENPAGING_PAGEIN_QUEUE_SIZE ]; +int errs[XENPAGING_PAGEIN_QUEUE_SIZE ];while (1 ) {
@@ -42,7 +43,8 @@ static void *page_in(void *arg)pthread_mutex_unlock (&page_in_mutex);/* Ignore errors */ - page =xc_map_foreign_pages (pia->xch, pia->dom,PROT_READ , gfns, num); + page =xc_map_foreign_bulk (pia->xch, pia->dom,PROT_READ , + gfns, errs, num);if (page)munmap (page,PAGE_SIZE * num); }
tools/xenpaging/xenpaging.c +7 -5
@@ -281,6 +281,7 @@ static struct xenpaging *xenpaging_init(int argc, char *argv[])char *p;int rc;unsigned long ring_pfn, mmap_pfn; +int mmap_err;/* Allocate memory */ paging =calloc (1 ,sizeof (struct xenpaging ));
@@ -342,8 +343,8 @@ static struct xenpaging *xenpaging_init(int argc, char *argv[]) HVM_PARAM_PAGING_RING_PFN, &ring_pfn); mmap_pfn = ring_pfn; paging->vm_event.ring_page = -xc_map_foreign_batch (xch, paging->vm_event.domain_id, -PROT_READ |PROT_WRITE , &mmap_pfn,1 ); +xc_map_foreign_bulk (xch, paging->vm_event.domain_id, +PROT_READ |PROT_WRITE , &mmap_pfn, &mmap_err,1 );if ( mmap_pfn &XEN_DOMCTL_PFINFO_XTAB ) {/* Map failed, populate ring page */
@@ -358,11 +359,12 @@ static struct xenpaging *xenpaging_init(int argc, char *argv[]) mmap_pfn = ring_pfn; paging->vm_event.ring_page = -xc_map_foreign_batch (xch, paging->vm_event.domain_id, -PROT_READ |PROT_WRITE , &mmap_pfn,1 ); +xc_map_foreign_bulk (xch, paging->vm_event.domain_id, +PROT_READ |PROT_WRITE , + &mmap_pfn, &mmap_err,1 );if ( mmap_pfn &XEN_DOMCTL_PFINFO_XTAB ) { -PERROR ("Could not map the ring page\n" ); +PERROR ("Could not map the ring page: %d\n" , mmap_err); goto err; } }
tools/xentrace/xentrace.c +6 -4
@@ -504,14 +504,15 @@ static struct t_struct *map_tbufs(unsigned long tbufs_mfn, unsigned int num, + tbufs.t_info->mfn_offset[i];int j;xen_pfn_t pfn_list[tbufs.t_info->tbuf_size]; +int pfn_err[tbufs.t_info->tbuf_size];for ( j=0 ; j<tbufs.t_info->tbuf_size; j++) pfn_list[j] = (xen_pfn_t )mfn_list[j]; - tbufs.meta[i] =xc_map_foreign_batch (xc_handle,DOMID_XEN , -PROT_READ |PROT_WRITE , - pfn_list, - tbufs.t_info->tbuf_size); + tbufs.meta[i] =xc_map_foreign_bulk (xc_handle,DOMID_XEN , +PROT_READ |PROT_WRITE , + pfn_list, pfn_err, + tbufs.t_info->tbuf_size);if ( tbufs.meta[i] ==NULL ) {PERROR ("Failed to map cpu buffer!" );
@@ -1221,6 +1222,7 @@ int main(int argc, char **argv)return ret; } +/* * Local variables: * mode: C
Signature · 1 line
2.1.4
PATCH v5 12/23 tools: Implement xc_map_foreign_range(s) in terms of common helper
In reply to Ian CampbellBoth Linux and FreeBSD already implemented these functions using identical helpers based on xc_map_foreign_pages. Make one copy of these common helpers and switch all OSes to use them, even those which previously had a specific lower level implementation of this functionality.
This is makes two fewer low level interfaces to think about.
--- tools/libxc/xc_foreign_memory.c | 50 +++++++++++++++++++++++++++++ tools/libxc/xc_freebsd_osdep.c | 50 ----------------------------- tools/libxc/xc_linux_osdep.c | 49 ----------------------------- tools/libxc/xc_minios.c | 43 ------------------------- tools/libxc/xc_netbsd.c | 70 ----------------------------------------- tools/libxc/xc_solaris.c | 67 --------------------------------------- 6 files changed, 50 insertions(+), 279 deletions(-)
tools/libxc/xc_foreign_memory.c +50 -0
@@ -50,6 +50,56 @@ void *xc_map_foreign_pages(xc_interface *xch, uint32_t dom, int prot,return res; } +void *xc_map_foreign_range (xc_interface *xch, +uint32_t dom,int size,int prot, +unsigned long mfn) +{ +xen_pfn_t *arr; +int num; +int i; +void *ret; + + num = (size +XC_PAGE_SIZE -1 ) >>XC_PAGE_SHIFT ; + arr =calloc (num,sizeof (xen_pfn_t)); +if ( arr ==NULL ) +return NULL ; + +for ( i =0 ; i < num; i++ ) + arr[i] = mfn + i; + + ret =xc_map_foreign_pages (xch, dom, prot, arr, num); +free (arr); +return ret; +} + +void *xc_map_foreign_ranges (xc_interface *xch, +uint32_t dom,size_t size, +int prot,size_t chunksize, +privcmd_mmap_entry_t entries[], +int nentries) +{ +xen_pfn_t *arr; +int num_per_entry; +int num; +int i; +int j; +void *ret; + + num_per_entry = chunksize >>XC_PAGE_SHIFT ; + num = num_per_entry * nentries; + arr =calloc (num,sizeof (xen_pfn_t)); +if ( arr ==NULL ) +return NULL ; + +for ( i =0 ; i < nentries; i++ ) +for ( j =0 ; j < num_per_entry; j++ ) + arr[i * num_per_entry + j] = entries[i].mfn + j; + + ret =xc_map_foreign_pages (xch, dom, prot, arr, num); +free (arr); +return ret; +} +/* * stub for all not yet converted OSes (NetBSD and Solaris). New OSes should * just implement xc_map_foreign_bulk.
tools/libxc/xc_freebsd_osdep.c +0 -50
56 lines not on this page · raw message
tools/libxc/xc_linux_osdep.c +0 -49
55 lines not on this page · raw message
tools/libxc/xc_minios.c +0 -43
49 lines not on this page · raw message
tools/libxc/xc_netbsd.c +0 -70
76 lines not on this page · raw message
tools/libxc/xc_solaris.c +0 -67
73 lines not on this page · raw message
Signature · 1 line
2.1.4
PATCH v5 13/23 tools: Refactor foreign memory mapping into libxenforeignmemory
In reply to Ian Campbelllibxenforeignmemory will provide a stable API and ABI for mapping foreign domain memory (subject to appropriate privileges).
The new library exposes an interface equivalent to xc_map_foreign_memory_bulk, which all the other xc_map_foreign_memory_* functions (which remain in libxc) are implemented in terms of.
Upon request (via #define XC_WANT_COMPAT_MAP_FOREIGN_API) libxenctrl will provide a compat API for the old names. This is used by qemu-xen and qemu-trad as well as various in tree things (which required de-dupping various #includes in some too to get the #define before the first).
---
Must be applied with:
- "qemu-xen-traditional: qemu-xen-traditional: Add libxenforeignmemory to rpath-link" and a corresponding QEMU_TAG update folded here.
- "mini-os: mini-os: Include libxenforeignmemory with libxc" and a corresponding bump to MINIOS_UPSTREAM_REVISION folded in here.
v5: Allow close(NULL)
---
.gitignore | 2 +
stubdom/Makefile | 20 ++++-
tools/Makefile | 2 +
tools/Rules.mk | 11 ++-
tools/console/daemon/utils.c | 1 -
tools/console/daemon/utils.h | 1 +
tools/libs/Makefile | 1 +
tools/libs/foreignmemory/Makefile | 67 +++++++++++++++
tools/libs/foreignmemory/compat.c | 72 ++++++++++++++++
tools/libs/foreignmemory/core.c | 71 ++++++++++++++++
.../foreignmemory/freebsd.c} | 33 +++-----
.../libs/foreignmemory/include/xenforeignmemory.h | 71 ++++++++++++++++
tools/libs/foreignmemory/libxenforeignmemory.map | 7 ++
.../foreignmemory/linux.c} | 70 +++++++---------
tools/libs/foreignmemory/minios.c | 62 ++++++++++++++
tools/libs/foreignmemory/netbsd.c | 95 ++++++++++++++++++++++
tools/libs/foreignmemory/private.h | 47 +++++++++++
tools/libs/foreignmemory/solaris.c | 94 +++++++++++++++++++++
tools/libxc/Makefile | 8 +-
tools/libxc/include/xenctrl.h | 26 ------
tools/libxc/include/xenctrl_compat.h | 36 ++++++++
tools/libxc/xc_foreign_memory.c | 49 +----------
tools/libxc/xc_minios.c | 29 -------
tools/libxc/xc_netbsd.c | 73 -----------------
tools/libxc/xc_private.c | 13 +--
tools/libxc/xc_private.h | 11 ++-
tools/libxc/xc_solaris.c | 73 -----------------
tools/libxc/xc_sr_restore.c | 4 +-
tools/libxc/xc_sr_save.c | 4 +-
tools/libxc/xc_vm_event.c | 10 ++-
tools/libxc/xg_private.h | 3 +-
tools/libxl/libxl_internal.h | 1 +
tools/misc/xen-mfndump.c | 1 +
tools/ocaml/libs/xc/xenctrl_stubs.c | 1 +
tools/python/xen/lowlevel/xc/xc.c | 2 +-
tools/xenmon/xenbaked.c | 1 +
tools/xenpaging/pagein.c | 1 -
tools/xenpaging/xenpaging.c | 1 -
tools/xenpaging/xenpaging.h | 2 +
tools/xenstore/xenstored_core.c | 1 -
tools/xenstore/xenstored_core.h | 1 +
tools/xentrace/xenctx.c | 3 +-
tools/xentrace/xentrace.c | 1 +
43 files changed, 743 insertions(+), 339 deletions(-)
create mode 100644 tools/libs/foreignmemory/Makefile
create mode 100644 tools/libs/foreignmemory/compat.c
create mode 100644 tools/libs/foreignmemory/core.c
rename tools/{libxc/xc_freebsd_osdep.c => libs/foreignmemory/freebsd.c} (76%)
create mode 100644 tools/libs/foreignmemory/include/xenforeignmemory.h
create mode 100644 tools/libs/foreignmemory/libxenforeignmemory.map
rename tools/{libxc/xc_linux_osdep.c => libs/foreignmemory/linux.c} (83%)
create mode 100644 tools/libs/foreignmemory/minios.c
create mode 100644 tools/libs/foreignmemory/netbsd.c
create mode 100644 tools/libs/foreignmemory/private.h
create mode 100644 tools/libs/foreignmemory/solaris.c.gitignore +2 -0
@@ -62,6 +62,7 @@ stubdom/libxentoollog-* stubdom/libxenevtchn-* stubdom/libxengnttab-* stubdom/libxencall-* +stubdom/libxenforeignmemory-* stubdom/libxc-* stubdom/lwip-* stubdom/mini-os-*
@@ -92,6 +93,7 @@ tools/libs/toollog/headers.chk tools/libs/evtchn/headers.chk tools/libs/gnttab/headers.chk tools/libs/call/headers.chk +tools/libs/foreignmemory/headers.chk tools/blktap2/daemon/blktapctrl tools/blktap2/drivers/img2qcow tools/blktap2/drivers/lock-util
stubdom/Makefile +18 -2
@@ -336,6 +336,12 @@ mk-headers-$(XEN_TARGET_ARCH): $(IOEMU_LINKFARM_TARGET) ln -sf $(XEN_ROOT)/tools/libs/call/include/*.h include/ && \ ln -sf $(XEN_ROOT)/tools/libs/call/*.c . && \ ln -sf $(XEN_ROOT)/tools/libs/call/Makefile . ) + mkdir -p libs-$(XEN_TARGET_ARCH)/foreignmemory/include + [ -h libs-$(XEN_TARGET_ARCH)/foreignmemory/Makefile ] || ( cd libs-$(XEN_TARGET_ARCH)/foreignmemory && \ + ln -sf $(XEN_ROOT)/tools/libs/foreignmemory/*.h . && \ + ln -sf $(XEN_ROOT)/tools/libs/foreignmemory/include/*.h include/ && \ + ln -sf $(XEN_ROOT)/tools/libs/foreignmemory/*.c . && \ + ln -sf $(XEN_ROOT)/tools/libs/foreignmemory/Makefile . ) mkdir -p libxc-$(XEN_TARGET_ARCH) [ -h libxc-$(XEN_TARGET_ARCH)/Makefile ] || ( cd libxc-$(XEN_TARGET_ARCH) && \ ln -sf $(XEN_ROOT)/tools/libxc/*.h . && \
@@ -401,7 +407,17 @@ libs-$(XEN_TARGET_ARCH)/call/libxencall.a: $(NEWLIB_STAMPFILE) $(MAKE) -C $(XEN_ROOT)/tools/include $(MAKE) DESTDIR= -C $(MINI_OS) links CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= -C libs-$(XEN_TARGET_ARCH)/call -APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libs-$(MINIOS_TARGET_ARCH)/call -whole-archive -lxencall -no-whole-archive + +####### +# libxenforeignmemory +####### + +.PHONY: libxenforeignmemory +libxenforeignmemory: libs-$(XEN_TARGET_ARCH)/foreignmemory/libxenforeignmemory.a +libs-$(XEN_TARGET_ARCH)/foreignmemory/libxenforeignmemory.a: $(NEWLIB_STAMPFILE) + $(MAKE) -C $(XEN_ROOT)/tools/include + $(MAKE) DESTDIR= -C $(MINI_OS) links + CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= -C libs-$(XEN_TARGET_ARCH)/foreignmemory ####### # libxc
@@ -409,7 +425,7 @@ APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libs-$(MINIOS_TARGET_ARCH)/call -whole-archi .PHONY: libxc libxc: libxc-$(XEN_TARGET_ARCH)/libxenctrl.a libxc-$(XEN_TARGET_ARCH)/libxenguest.a -libxc-$(XEN_TARGET_ARCH)/libxenctrl.a: libxentoollog libxenevtchn libxengnttab libxencall cross-zlib +libxc-$(XEN_TARGET_ARCH)/libxenctrl.a: libxentoollog libxenevtchn libxengnttab libxencall libxenforeignmemory cross-zlib $(MAKE) -C $(XEN_ROOT)/tools/include $(MAKE) DESTDIR= -C $(MINI_OS) links CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= CONFIG_LIBXC_MINIOS=y -C libxc-$(XEN_TARGET_ARCH)
tools/Makefile +2 -0
@@ -250,6 +250,7 @@ subdir-all-qemu-xen-dir: qemu-xen-dir-find --source-path=$$source \ --extra-cflags="-DXC_WANT_COMPAT_EVTCHN_API=1 \ -DXC_WANT_COMPAT_GNTTAB_API=1 \ + -DXC_WANT_COMPAT_MAP_FOREIGN_API=1 \ -I$(XEN_ROOT)/tools/include \ -I$(XEN_ROOT)/tools/libs/toollog/include \ -I$(XEN_ROOT)/tools/libs/evtchn/include \
@@ -264,6 +265,7 @@ subdir-all-qemu-xen-dir: qemu-xen-dir-find -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/evtchn \ -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/gnttab \ -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/call \ + -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/foreignmemory \ $(QEMU_UPSTREAM_RPATH)" \ --bindir=$(LIBEXEC_BIN) \ --datadir=$(SHAREDIR)/qemu-xen \
tools/Rules.mk +8 -3
@@ -14,6 +14,7 @@ XEN_LIBXENTOOLLOG = $(XEN_ROOT)/tools/libs/toollog XEN_LIBXENEVTCHN = $(XEN_ROOT)/tools/libs/evtchn XEN_LIBXENGNTTAB = $(XEN_ROOT)/tools/libs/gnttab XEN_LIBXENCALL = $(XEN_ROOT)/tools/libs/call +XEN_LIBXENFOREIGNMEMORY = $(XEN_ROOT)/tools/libs/foreignmemory XEN_LIBXC = $(XEN_ROOT)/tools/libxc XEN_XENLIGHT = $(XEN_ROOT)/tools/libxl XEN_XENSTORE = $(XEN_ROOT)/tools/xenstore
@@ -103,12 +104,16 @@ CFLAGS_libxencall = -I$(XEN_LIBXENCALL)/include $(CFLAGS_xeninclude) LDLIBS_libxencall = $(XEN_LIBXENCALL)/libxencall$(libextension) SHLIB_libxencall = -Wl,-rpath-link=$(XEN_LIBXENCALL) -CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_libxentoollog) $(CFLAGS_xeninclude) -SHDEPS_libxenctrl = $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn) $(SHLIB_libxengnttab) $(SHLIB_libxengntshr) $(SHLIB_libxencall) +CFLAGS_libxenforeignmemory = -I$(XEN_LIBXENFOREIGNMEMORY)/include $(CFLAGS_xeninclude) +LDLIBS_libxenforeignmemory = $(XEN_LIBXENFOREIGNMEMORY)/libxenforeignmemory$(libextension) +SHLIB_libxenforeignmemory = -Wl,-rpath-link=$(XEN_LIBXENFOREIGNMEMORY) + +CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_libxentoollog) $(CFLAGS_libxenforeignmemory) $(CFLAGS_xeninclude) +SHDEPS_libxenctrl = $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn) $(SHLIB_libxengnttab) $(SHLIB_libxengntshr) $(SHLIB_libxencall) $(SHLIB_libxenforeignmemory) LDLIBS_libxenctrl = $(SHDEPS_libxenctrl) $(XEN_LIBXC)/libxenctrl$(libextension) SHLIB_libxenctrl = $(SHDEPS_libxenctrl) -Wl,-rpath-link=$(XEN_LIBXC) -CFLAGS_libxenguest = -I$(XEN_LIBXC)/include $(CFLAGS_libxenevtchn) $(CFLAGS_xeninclude) +CFLAGS_libxenguest = -I$(XEN_LIBXC)/include $(CFLAGS_libxenevtchn) $(CFLAGS_libxenforeignmemory) $(CFLAGS_xeninclude) SHDEPS_libxenguest = $(SHLIB_libxenevtchn) LDLIBS_libxenguest = $(SHDEPS_libxenguest) $(XEN_LIBXC)/libxenguest$(libextension) SHLIB_libxenguest = $(SHDEPS_libxenguest) -Wl,-rpath-link=$(XEN_LIBXC)
tools/console/daemon/utils.c +0 -1
@@ -33,7 +33,6 @@#include <string.h> #include <signal.h> -#include "xenctrl.h" #include "utils.h" struct xs_handle *xs;
tools/console/daemon/utils.h +1 -0
@@ -23,6 +23,7 @@#include <stdbool.h> #include <syslog.h> #include <stdio.h> +#define XC_WANT_COMPAT_MAP_FOREIGN_API #include <xenctrl.h> #include <xenstore.h>
tools/libs/Makefile +1 -0
@@ -6,5 +6,6 @@ SUBDIRS-y += toollog SUBDIRS-y += evtchn SUBDIRS-y += gnttab SUBDIRS-y += call +SUBDIRS-y += foreignmemory all clean install distclean: %: subdirs-%
tools/libs/foreignmemory/Makefile new file +67 -0
67 lines not on this page · raw message
tools/libs/foreignmemory/compat.c new file +72 -0
72 lines not on this page · raw message
tools/libs/foreignmemory/core.c new file +71 -0
71 lines not on this page · raw message
tools/libs/foreignmemory/freebsd.c renamed from tools/libxc/xc_freebsd_osdep.c +13 -20
@@ -3,9 +3,6 @@* Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. * -* xc_gnttab functions: -* Copyright (c) 2007-2008, D G Murray <[email protected]> -* * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation;
@@ -30,14 +27,11 @@#include <sys/mman.h> #include <sys/ioctl.h> -#include <xen/memory.h> - -#include "xc_private.h" +#include "private.h" #define PRIVCMD_DEV "/dev/xen/privcmd" -/*------------------------- Privcmd device interface -------------------------*/ -int osdep_privcmd_open (xc_interface *xch) +int osdep_xenforeignmemory_open (xenforeignmemory_handle *fmem) {int flags, saved_errno;int fd =open (PRIVCMD_DEV ,O_RDWR );
@@ -46,7 +40,7 @@ int osdep_privcmd_open(xc_interface *xch) {PERROR ("Could not obtain handle on privileged command interface " PRIVCMD_DEV ); - return -1 +return -1 ; }/*
@@ -69,7 +63,7 @@ int osdep_privcmd_open(xc_interface *xch) goto error; } - xch->privcmdfd = fd; + fmem->fd = fd;return 0 ; error:
@@ -80,26 +74,25 @@ int osdep_privcmd_open(xc_interface *xch)return -1 ; } -int osdep_privcmd_close (xc_interface *xch) +int osdep_xenforeignmemory_close (xenforeignmemory_handle *fmem) { -int fd = xch->privcmdfd; +int fd = fmem->fd;if ( fd ==-1 )return 0 ;return close (fd); } -/*----------------------- Privcmd foreign map interface ----------------------*/ -void *xc_map_foreign_bulk (xc_interface *xch, -uint32_t dom,int prot, -const xen_pfn_t *arr,int *err, -unsigned int num) +void *xenforeignmemory_map (xenforeignmemory_handle *fmem, +uint32_t dom,int prot, +const xen_pfn_t *arr,int *err, +unsigned int num) { -int fd = xch->privcmdfd; +int fd = fmem->fd;privcmd_mmapbatch_t ioctlx;void *addr;int rc; - addr =mmap (NULL , num <<XC_PAGE_SHIFT , prot,MAP_SHARED , fd,0 ); + addr =mmap (NULL , num <<PAGE_SHIFT , prot,MAP_SHARED , fd,0 );if ( addr ==MAP_FAILED ) {PERROR ("xc_map_foreign_bulk: mmap failed" );
@@ -117,7 +110,7 @@ void *xc_map_foreign_bulk(xc_interface *xch, {int saved_errno = errno;PERROR ("xc_map_foreign_bulk: ioctl failed" ); - (void )munmap (addr, num <<XC_PAGE_SHIFT ); + (void )munmap (addr, num <<PAGE_SHIFT ); errno = saved_errno;return NULL ; }
tools/libs/foreignmemory/include/xenforeignmemory.h new file +71 -0
71 lines not on this page · raw message
tools/libs/foreignmemory/libxenforeignmemory.map new file +7 -0
@@ -0,0 +1,7 @@ +VERS_1.0 { + global: + xenforeignmemory_open; + xenforeignmemory_close; + xenforeignmemory_map; + local: *; /* Do not expose anything by default */ +};
tools/libs/foreignmemory/linux.c renamed from tools/libxc/xc_linux_osdep.c +31 -39
175 lines not on this page · raw message
tools/libs/foreignmemory/minios.c new file +62 -0
62 lines not on this page · raw message
tools/libs/foreignmemory/netbsd.c new file +95 -0
95 lines not on this page · raw message
tools/libs/foreignmemory/private.h new file +47 -0
47 lines not on this page · raw message
tools/libs/foreignmemory/solaris.c new file +94 -0
94 lines not on this page · raw message
tools/libxc/Makefile +4 -4
@@ -42,8 +42,8 @@ CTRL_SRCS-y += xc_kexec.c CTRL_SRCS-y += xc_resource.c CTRL_SRCS-$(CONFIG_X86) += xc_psr.c CTRL_SRCS-$(CONFIG_X86) += xc_pagetab.c -CTRL_SRCS-$(CONFIG_Linux) += xc_linux.c xc_linux_osdep.c -CTRL_SRCS-$(CONFIG_FreeBSD) += xc_freebsd.c xc_freebsd_osdep.c +CTRL_SRCS-$(CONFIG_Linux) += xc_linux.c +CTRL_SRCS-$(CONFIG_FreeBSD) += xc_freebsd.c CTRL_SRCS-$(CONFIG_SunOS) += xc_solaris.c CTRL_SRCS-$(CONFIG_NetBSD) += xc_netbsd.c CTRL_SRCS-$(CONFIG_NetBSDRump) += xc_netbsd.c
@@ -125,7 +125,7 @@ $(CTRL_PIC_OBJS) $(GUEST_PIC_OBJS): CFLAGS += -include $(XEN_ROOT)/tools/config. # libxenguest includes xc_private.h, so needs this despite not using # this functionality directly. $(CTRL_LIB_OBJS) $(GUEST_LIB_OBJS) \ -$(CTRL_PIC_OBJS) $(GUEST_PIC_OBJS): CFLAGS += $(CFLAGS_libxencall) +$(CTRL_PIC_OBJS) $(GUEST_PIC_OBJS): CFLAGS += $(CFLAGS_libxencall) $(CFLAGS_libxenforeignmemory) $(CTRL_LIB_OBJS) $(CTRL_PIC_OBJS): CFLAGS += $(CFLAGS_libxengnttab) $(CFLAGS_libxengntshr)
@@ -207,7 +207,7 @@ libxenctrl.so.$(MAJOR): libxenctrl.so.$(MAJOR).$(MINOR) $(SYMLINK_SHLIB) $< $@ libxenctrl.so.$(MAJOR).$(MINOR): $(CTRL_PIC_OBJS) - $(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxengnttab) $(LDLIBS_libxengntshr) $(LDLIBS_libxencall) $(PTHREAD_LIBS) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxengnttab) $(LDLIBS_libxengntshr) $(LDLIBS_libxencall) $(LDLIBS_libxenforeignmemory) $(PTHREAD_LIBS) $(APPEND_LDFLAGS) # libxenguest
tools/libxc/include/xenctrl.h +0 -26
@@ -1377,32 +1377,6 @@ int xc_lockprof_query(xc_interface *xch,void *xc_memalign (xc_interface *xch,size_t alignment,size_t size);/** -* Memory maps a range within one domain to a local address range. Mappings -* should be unmapped with munmap and should follow the same rules as mmap -* regarding page alignment. Returns NULL on failure. -* -* @parm xch a handle on an open hypervisor interface -* @parm dom the domain to map memory from -* @parm size the amount of memory to map (in multiples of page size) -* @parm prot same flag as in mmap(). -* @parm mfn the frame address to map. -*/ -void *xc_map_foreign_range (xc_interface *xch,uint32_t dom, -int size,int prot, -unsigned long mfn ); - -void *xc_map_foreign_pages (xc_interface *xch,uint32_t dom,int prot, -const xen_pfn_t *arr,int num ); - -/** -* Like xc_map_foreign_pages(), except it can succeed partially. -* When a page cannot be mapped, its respective field in @err is -* set to the corresponding errno value. -*/ -void *xc_map_foreign_bulk (xc_interface *xch,uint32_t dom,int prot, -const xen_pfn_t *arr,int *err,unsigned int num); - -/** * Translates a virtual address in the context of a given domain and * vcpu returning the GFN containing the address (that is, an MFN for * PV guests, a PFN for HVM guests). Returns 0 for failure.
tools/libxc/include/xenctrl_compat.h +36 -0
@@ -12,6 +12,42 @@#ifndef XENCTRL_COMPAT_H #define XENCTRL_COMPAT_H +#ifdef XC_WANT_COMPAT_MAP_FOREIGN_API +/** +* Memory maps a range within one domain to a local address range. Mappings +* should be unmapped with munmap and should follow the same rules as mmap +* regarding page alignment. Returns NULL on failure. +* +* @parm xch a handle on an open hypervisor interface +* @parm dom the domain to map memory from +* @parm size the amount of memory to map (in multiples of page size) +* @parm prot same flag as in mmap(). +* @parm mfn the frame address to map. +*/ +void *xc_map_foreign_range (xc_interface *xch,uint32_t dom, +int size,int prot, +unsigned long mfn ); + +void *xc_map_foreign_pages (xc_interface *xch,uint32_t dom,int prot, +const xen_pfn_t *arr,int num ); + +/* Nothing within the library itself other than the compat wrapper +* itself should be using this, everything inside has access to +* xenforeignmemory_map(). +*/ +#if !defined(XC_INTERNAL_COMPAT_MAP_FOREIGN_API ) || \ + defined(XC_BUILDING_COMPAT_MAP_FOREIGN_API ) +/** +* Like xc_map_foreign_pages(), except it can succeed partially. +* When a page cannot be mapped, its respective field in @err is +* set to the corresponding errno value. +*/ +void *xc_map_foreign_bulk (xc_interface *xch,uint32_t dom,int prot, +const xen_pfn_t *arr,int *err,unsigned int num); +#endif + +#endif +#ifdef XC_WANT_COMPAT_EVTCHN_API typedef struct xenevtchn_handle xc_evtchn ;
tools/libxc/xc_foreign_memory.c +4 -45
70 lines not on this page · raw message
tools/libxc/xc_minios.c +0 -29
@@ -39,40 +39,11 @@ void minios_interface_close_fd(int fd);extern void minios_interface_close_fd (int fd); -int osdep_privcmd_open (xc_interface *xch) -{ -int fd =alloc_fd (FTYPE_XC ); - -if ( fd ==-1 ) -return -1 ; - - xch->privcmdfd = fd; -return 0 ; -} - -int osdep_privcmd_close (xc_interface *xch) -{ -int fd = xch->privcmdfd; -return close (fd); -} -void minios_interface_close_fd (int fd) { files[fd].type =FTYPE_NONE ; } -void *xc_map_foreign_bulk (xc_interface *xch, -uint32_t dom,int prot, -const xen_pfn_t *arr,int *err,unsigned int num) -{ -unsigned long pt_prot =0 ; -if (prot &PROT_READ ) - pt_prot =L1_PROT_RO ; -if (prot &PROT_WRITE ) - pt_prot =L1_PROT ; -return map_frames_ex (arr, num,1 ,0 ,1 , dom, err, pt_prot); -} -/* Optionally flush file to disk and discard page cache */ void discard_file_cache (xc_interface *xch,int fd,int flush) {
tools/libxc/xc_netbsd.c +0 -73
79 lines not on this page · raw message
tools/libxc/xc_private.c +7 -6
@@ -58,11 +58,12 @@ struct xc_interface_core *xc_interface_open(xentoollog_logger *logger,if (open_flags &XC_OPENFLAG_DUMMY )return xch;/* We are done */ -if (osdep_privcmd_open (xch) <0 ) - goto err; - xch->xcall =xencall_open (xch->error_handler, open_flags &XC_OPENFLAG_NON_REENTRANT ?XENCALL_OPENFLAG_NON_REENTRANT :0U ); +if ( xch->xcall ==NULL ) + goto err; + + xch->fmem =xenforeignmemory_open (xch->error_handler,0 );if ( xch->xcall ==NULL ) goto err;
@@ -70,7 +71,7 @@ struct xc_interface_core *xc_interface_open(xentoollog_logger *logger,return xch; err: -osdep_privcmd_close (xch); +xencall_close (xch->xcall);xtl_logger_destroy (xch->error_handler_tofree);if (xch != &xch_buf)free (xch);return NULL ;
@@ -86,8 +87,8 @@ int xc_interface_close(xc_interface *xch) rc =xencall_close (xch->xcall);if (rc)PERROR ("Could not close xencall interface" ); - rc =osdep_privcmd_close (xch); -if (rc)PERROR ("Could not close hypervisor interface" ); + rc =xenforeignmemory_close (xch->fmem); +if (rc)PERROR ("Could not close foreign memory interface" );xtl_logger_destroy (xch->dombuild_logger_tofree);xtl_logger_destroy (xch->error_handler_tofree);
tools/libxc/xc_private.h +8 -3
@@ -29,8 +29,13 @@#include <sys/ioctl.h> #include "_paths.h" + +#define XC_WANT_COMPAT_MAP_FOREIGN_API +#define XC_INTERNAL_COMPAT_MAP_FOREIGN_API #include "xenctrl.h" +#include <xencall.h> +#include <xenforeignmemory.h> #include <xen/sys/privcmd.h>
@@ -94,11 +99,11 @@ struct xc_interface_core {FILE *dombuild_logger_file;const char *currently_progress_reporting; -/* Privcmd interface */ -int privcmdfd; -/* Hypercall interface */ xencall_handle *xcall; + +/* Foreign mappings */ +xenforeignmemory_handle *fmem; };int osdep_privcmd_open (xc_interface *xch);
tools/libxc/xc_solaris.c +0 -73
81 lines not on this page · raw message
tools/libxc/xc_sr_restore.c +2 -2
@@ -316,8 +316,8 @@ static int process_page_data(struct xc_sr_context *ctx, unsigned count,if ( nr_pages ==0 ) goto done; - mapping = guest_page =xc_map_foreign_bulk ( - xch, ctx->domid,PROT_READ |PROT_WRITE , + mapping = guest_page =xenforeignmemory_map (xch->fmem, + ctx->domid,PROT_READ |PROT_WRITE , mfns, map_errs, nr_pages);if ( !mapping ) {
tools/libxc/xc_sr_save.c +2 -2
@@ -153,8 +153,8 @@ static int write_batch(struct xc_sr_context *ctx)if ( nr_pages >0 ) { - guest_mapping =xc_map_foreign_bulk ( - xch, ctx->domid,PROT_READ , mfns, errors, nr_pages); + guest_mapping =xenforeignmemory_map (xch->fmem, + ctx->domid,PROT_READ , mfns, errors, nr_pages);if ( !guest_mapping ) {PERROR ("Failed to map guest pages" );
tools/libxc/xc_vm_event.c +6 -4
@@ -73,8 +73,9 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t domain_id, int param, ring_pfn = pfn; mmap_pfn = pfn; - ring_page =xc_map_foreign_bulk (xch, domain_id,PROT_READ |PROT_WRITE , - &mmap_pfn, &err,1 ); + ring_page =xenforeignmemory_map (xch->fmem, + domain_id,PROT_READ |PROT_WRITE , + &mmap_pfn, &err,1 );if ( !ring_page ) {/* Map failed, populate ring page */
@@ -87,8 +88,9 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t domain_id, int param, } mmap_pfn = ring_pfn; - ring_page =xc_map_foreign_bulk (xch, domain_id,PROT_READ |PROT_WRITE , - &mmap_pfn, &err,1 ); + ring_page =xenforeignmemory_map (xch->fmem, + domain_id,PROT_READ |PROT_WRITE , + &mmap_pfn, &err,1 );if ( !ring_page ) {PERROR ("Could not map the ring page: %d\n" , err);
tools/libxc/xg_private.h +1 -2
@@ -26,9 +26,8 @@#include <sys/types.h> #include <sys/stat.h> -#include "xenctrl.h" -#include "xenguest.h" #include "xc_private.h" +#include "xenguest.h" #include <xen/memory.h> #include <xen/elfnote.h>
tools/libxl/libxl_internal.h +1 -0
@@ -50,6 +50,7 @@#include <xenevtchn.h> #include <xenstore.h> +#define XC_WANT_COMPAT_MAP_FOREIGN_API #include <xenctrl.h> #include <xenguest.h>
tools/misc/xen-mfndump.c +1 -0
@@ -1,3 +1,4 @@ +#define XC_WANT_COMPAT_MAP_FOREIGN_API #include <xenctrl.h> #include <xc_private.h> #include <xc_core.h>
tools/ocaml/libs/xc/xenctrl_stubs.c +1 -0
@@ -29,6 +29,7 @@#include <stdint.h> #include <string.h> +#define XC_WANT_COMPAT_MAP_FOREIGN_API #include <xenctrl.h> #include "mmap_stubs.h"
tools/python/xen/lowlevel/xc/xc.c +1 -1
@@ -5,6 +5,7 @@*/ #include <Python.h> +#define XC_WANT_COMPAT_MAP_FOREIGN_API #include <xenctrl.h> #include <xenguest.h> #include <zlib.h>
@@ -17,7 +18,6 @@#include <netdb.h> #include <arpa/inet.h> -#include "xenctrl.h" #include <xen/elfnote.h> #include <xen/tmem.h> #include "xc_dom.h"
tools/xenmon/xenbaked.c +1 -0
@@ -38,6 +38,7 @@#include <errno.h> #include <signal.h> #include <xenevtchn.h> +#define XC_WANT_COMPAT_MAP_FOREIGN_API #include <xenctrl.h> #include <xen/xen.h> #include <string.h>
tools/xenpaging/pagein.c +0 -1
@@ -1,6 +1,5 @@/* Trigger a page-in in a separate thread-of-execution to avoid deadlock */ #include <pthread.h> -#include <xc_private.h> #include "xenpaging.h" struct page_in_args {
tools/xenpaging/xenpaging.c +0 -1
@@ -27,7 +27,6 @@#include <signal.h> #include <unistd.h> #include <poll.h> -#include <xc_private.h> #include <xenstore.h> #include <getopt.h>
tools/xenpaging/xenpaging.h +2 -0
@@ -25,6 +25,8 @@#include <xenevtchn.h> +#define XC_WANT_COMPAT_MAP_FOREIGN_API +#include <xenctrl.h> #include <xc_private.h> #include <xen/event_channel.h> #include <xen/vm_event.h>
tools/xenstore/xenstored_core.c +0 -1
@@ -50,7 +50,6 @@#include "xenstored_watch.h" #include "xenstored_transaction.h" #include "xenstored_domain.h" -#include "xenctrl.h" #include "tdb.h" #include "hashtable.h"
tools/xenstore/xenstored_core.h +1 -0
@@ -19,6 +19,7 @@#ifndef _XENSTORED_CORE_H#define _XENSTORED_CORE_H +#define XC_WANT_COMPAT_MAP_FOREIGN_API #include <xenctrl.h> #include <xengnttab.h>
tools/xentrace/xenctx.c +2 -1
@@ -25,7 +25,8 @@#include <getopt.h> #include <limits.h> -#include "xenctrl.h" +#define XC_WANT_COMPAT_MAP_FOREIGN_API +#include <xenctrl.h> #include <xen/foreign/x86_32.h> #include <xen/foreign/x86_64.h> #include <xen/hvm/save.h>
tools/xentrace/xentrace.c +1 -0
@@ -30,6 +30,7 @@#include <xen/xen.h> #include <xen/trace.h> +#define XC_WANT_COMPAT_MAP_FOREIGN_API #include <xenevtchn.h> #include <xenctrl.h>
Signature · 1 line
2.1.4
Re: [PATCH XEN v5 13/23] tools: Refactor foreign memory mapping into libxenforeignmemory
Ian Campbell writes ("[PATCH XEN v5 13/23] tools: Refactor foreign memory mapping into libxenforeignmemory"):
Quoted 7 lines
libxenforeignmemory will provide a stable API and ABI for mapping foreign domain memory (subject to appropriate privileges).
The new library exposes an interface equivalent to
xc_map_foreign_memory_bulk, which all the other xc_map_foreign_memory_* functions (which remain in libxc) are implemented in terms of.
...
tools/libs/foreignmemory/include/xenforeignmemory.h line 38
Quoted 7 lines
tools/libs/foreignmemory/include/xenforeignmemory.h +5
-0+/* +* Return a handle onto the hypercall driver. Logs errors. +*/ +xenforeignmemory_handle *xenforeignmemory_open (xentoollog_logger *logger, +unsigned open_flags);
`onto the foreign memory driver'.
This file should probably say something about fork(). Perhaps just a refernce to the rules in the grant map driver.
Quoted 11 lines
+/*
+ * Maps a range within one domain to a local address range. Mappings
+ * should be unmapped with munmap and should follow the same rules as mmap
+ * regarding page alignment.
+ *
+ * prot is as for mmap(2).
+ *
+ * Can partially succeed. When a page cannot be mapped, its respective
+ * field in @err is set to the corresponding errno value.
+ *
+ * Returns NULL if no pages can be mapped.
...
tools/libs/foreignmemory/include/xenforeignmemory.h line 59
Quoted 3 lines
tools/libs/foreignmemory/include/xenforeignmemory.h +3
-0+void *xenforeignmemory_map (xenforeignmemory_handle *fmem,uint32_t dom, +int prot,const xen_pfn_t *arr,int *err, +unsigned int num);
If it returns NULL, will all of *err be filled with errno values ? Ie is all of err[] always written ?
Does this function ever set errno ?
I would write `int err_out[num]' in the prototype which is a bit clearer about the semantics.
This API invites callers to fail to notice partial failures.
How about permitting err==NULL to mean `on partial failure, unmap everything and return NULL setting errno' ?
Ian.
Re: [PATCH XEN v5 13/23] tools: Refactor foreign memory mapping into libxenforeignmemory
Quoted 22 lines · Ian Jackson
Ian Campbell writes ("[PATCH XEN v5 13/23] tools: Refactor foreign memory mapping into libxenforeignmemory"):
Quoted 7 lines
libxenforeignmemory will provide a stable API and ABI for mapping foreign domain memory (subject to appropriate privileges).
The new library exposes an interface equivalent to
xc_map_foreign_memory_bulk, which all the other xc_map_foreign_memory_* functions (which remain in libxc) are implemented in terms of....
Quoted 9 lines
tools/libs/foreignmemory/include/xenforeignmemory.h +4
-0+/* +* Return a handle onto the hypercall driver. Logs errors. +*/ +xenforeignmemory_handle *xenforeignmemory_open(xentoollog_logger*logger,
+ unsignedopen_flags);`onto the foreign memory driver'.
Quoted 2 lines
This file should probably say something about fork(). Perhaps just a refernce to the rules in the grant map driver.
Yes, same rules I think.
Quoted 19 lines
Quoted 13 lines
+/*
+ * Maps a range within one domain to a local address range. Mappings
+ * should be unmapped with munmap and should follow the same rules as mmap
+ * regarding page alignment.
+ *
+ * prot is as for mmap(2).
+ *
+ * Can partially succeed. When a page cannot be mapped, its respective
+ * field in @err is set to the corresponding errno value.
+ *
+ * Returns NULL if no pages can be mapped....
Quoted 4 lines
+void *xenforeignmemory_map(xenforeignmemory_handle *fmem,
uint32_tdom,
+ int prot, constxen_pfn_t*arr, int *err, + unsigned int num);
Quoted 4 lines
If it returns NULL, will all of *err be filled with errno values ? Ie is all of err[] always written ?
Does this function ever set errno ?
I'll figure all these out and say.
Quoted 2 lines
I would write `int err_out[num]' in the prototype which is a bit clearer about the semantics.
Are you suggesting:
void *xenforeignmemory_map(xenforeignmemory_handle *fmem, uint32_t dom, int prot, const xen_pfn_t *arr,
int err_out[num],
unsigned int num);
Is that (a var sized array based on another param) really allowed?
Or did you mean as comment like:
void *xenforeignmemory_map(xenforeignmemory_handle *fmem, uint32_t dom,
int prot, const xen_pfn_t *arr,
int *err_out /*int err_out[num]*/,
unsigned
int num);
Quoted 4 lines
This API invites callers to fail to notice partial failures.
How about permitting err==NULL to mean `on partial failure, unmap everything and return NULL setting errno' ?
Not a bad idea.
Ian.
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
Re: [PATCH XEN v5 13/23] tools: Refactor foreign memory mapping into libxenforeignmemory
Ian Campbell writes ("Re: [PATCH XEN v5 13/23] tools: Refactor foreign memory mapping into libxenforeignmemory"):
Quoted 9 lines · Ian Jackson
Are you suggesting:
void *xenforeignmemory_map(xenforeignmemory_handle *fmem,
uint32_tdom, int prot, constxen_pfn_t*arr,
int err_out[num],
unsigned int num);Is that (a var sized array based on another param) really allowed?
Yes, if the array size precedes the array. Maybe you don't prefer that.
Quoted 9 lines
Or did you mean as comment like:
void *xenforeignmemory_map(xenforeignmemory_handle *fmem,
uint32_tdom,
int prot, constxen_pfn_t*arr,int *err_out /*int err_out[num]*/,unsigned
int num);
If you don't want to swap the arguments, at the very least
int err_out[/*num*/]
Ian.
Re: [PATCH XEN v5 13/23] tools: Refactor foreign memory mapping into libxenforeignmemory
Quoted 5 lines · Ian Jackson
Ian Campbell writes ("Re: [PATCH XEN v5 13/23] tools: Refactor foreign memory mapping into libxenforeignmemory"):
Quoted 3 lines · Ian Jackson
Are you suggesting:
Quoted 8 lines
Quoted 6 lines
void *xenforeignmemory_map(xenforeignmemory_handle *fmem,
uint32_tdom, int prot, constxen_pfn_t*arr, int err_out[num],
unsigned int num);Is that (a var sized array based on another param) really allowed?
Yes, if the array size precedes the array.
Sadly:
for i in include/xenforeignmemory.h; do \
gcc -x c -ansi -Wall -Werror -pedantic -I/local/scratch/ianc/devel/libxenctrl-split/xen.git/tools/libs/foreignmemory/../../../tools/include \
-S -o /dev/null $i || exit 1; \
echo $i; \
done >headers.chk.new
include/xenforeignmemory.h:142:28: error: ISO C90 forbids variable length array ‘arr’ [-Werror=vla]
const xen_pfn_t *arr[pages], int err[pages]);
^
include/xenforeignmemory.h:142:28: error: ISO C90 forbids variable length array ‘err’ [-Werror=vla]
cc1: all warnings being treated as errors
/local/scratch/ianc/devel/libxenctrl-split/xen.git/tools/libs/foreignmemory/../../../tools/Rules.mk:200: recipe for target 'headers.chk' failedIt's -ansi (AKA -std=c90) together with -pedantic which does it. -std=c99 is happy with it (including with -pedantic).
The original motivation for this check was [0]:
As part of the tidyup, we should choose a particular C standard (89, probably) and ensure that the API/ABI complies with gcc -std=c$VER -pedantic. This will help to provide a consistent API on other platforms (I seem to recall an effort to port libvchan to windows.)
It's not clear to me how much the "89 probably" was influenced by the "on other platforms ... windows" bit (maybe Andy or Paul has an opinion).
C99 was 16 years ago now, I'm struggling to think of a reason not to move the baseline for tools stuff at least to that.
https://en.wikipedia.org/wiki/Visual_C%2B%2B might be one such reason I suppose, although I'm not convinced a libvchan port to Windows, even if not entirely hypothetical, would be using any of xen.git/tools/libs/* rather than the equivalent frameworks provided by the Windows PV drivers.
Ian.
[0] http://article.gmane.org/gmane.comp.emulators.xen.devel/247265
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
Re: [PATCH XEN v5 13/23] tools: Refactor foreign memory mapping into libxenforeignmemory
Quoted 30 lines · Ian Campbell
Quoted 5 lines · Ian Jackson
Ian Campbell writes ("Re: [PATCH XEN v5 13/23] tools: Refactor foreign memory mapping into libxenforeignmemory"):
Quoted 3 lines · Ian Jackson
Are you suggesting:
Quoted 7 lines
Quoted 6 lines
void *xenforeignmemory_map(xenforeignmemory_handle *fmem,
uint32_tdom,
int prot, constxen_pfn_t*arr, int err_out[num],
unsigned int num);Is that (a var sized array based on another param) really allowed?
Yes, if the array size precedes the array.
Sadly:
for i in include/xenforeignmemory.h; do \ gcc -x c -ansi -Wall -Werror -pedantic -I/local/scratch/ianc/devel/libxenctrl-split/xen.git/tools/libs/foreignmemory/../../../tools/include \ -S -o /dev/null $i || exit 1; \ echo $i; \ done >headers.chk.new include/xenforeignmemory.h:142:28: error: ISO C90 forbids variable length array ‘arr’ [-Werror=vla] const xen_pfn_t *arr[pages], int err[pages]); ^ include/xenforeignmemory.h:142:28: error: ISO C90 forbids variable length array ‘err’ [-Werror=vla] cc1: all warnings being treated as errors /local/scratch/ianc/devel/libxenctrl-split/xen.git/tools/libs/foreignmemory/../../../tools/Rules.mk:200: recipe for target 'headers.chk' failedIt's -ansi (AKA -std=c90) together with -pedantic which does it. -std=c99 is happy with it (including with -pedantic).
Quoted 8 lines
The original motivation for this check was [0]:
As part of the tidyup, we should choose a particular C standard (89, probably) and ensure that the API/ABI complies withgcc -std=c$VER -pedantic. This will help to provide a consistent API on other platforms (I seem to recall an effort to port libvchan to windows.)It's not clear to me how much the "89 probably" was influenced by the "on other platforms ... windows" bit (maybe Andy or Paul has an opinion).
I was under the impression that MSVC still doesn't have C99 support.
According to wikipedia, VS2013 gained some C99, and 2015 "achieved a level of the C99 standard compliance in the library that is similar to other C compilers".
According to MSDN about Visual C++:
C99 Conformance: Visual Studio 2015 fully implements the C99 Standard Library, with the exception of any library features that depend on compiler features not yet supported by the Visual C++ compiler (for example, <tgmath.h> is not implemented).
which is wonderfully circular.
According to
https://msdn.microsoft.com/en-us/library/zb1574zs%28v=vs.140%29.aspx
which appears to be the documentation, VLAs are still not supported, even in VS2015.
Quoted 8 lines
C99 was 16 years ago now, I'm struggling to think of a reason not to move the baseline for tools stuff at least to that.
https://en.wikipedia.org/wiki/Visual_C%2B%2B might be one such reason I suppose, although I'm not convinced a libvchan port to Windows, even if not entirely hypothetical, would be using any of xen.git/tools/libs/* rather than the equivalent frameworks provided by the Windows PV drivers.
It would be nice to at least be able to use the same header files, for ease of porting userspace software.
In this case, VLAs are just being used as an aid for the compiler to spot errors. It doesn't change the API/ABI, and could be #ifdef'd around, if we care both for using C99 in general, and Windows support.
~Andrew
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
Re: [PATCH XEN v5 13/23] tools: Refactor foreign memory mapping into libxenforeignmemory
Quoted 1 line
-----Original Message-----
[snip]
Quoted 12 lines
Quoted 5 lines
C99 was 16 years ago now, I'm struggling to think of a reason not to move the baseline for tools stuff at least to that.
https://en.wikipedia.org/wiki/Visual_C%2B%2B might be one such reason I suppose, although I'm not convinced a libvchan port to Windows, even if
not
Quoted 2 lines
entirely hypothetical, would be using any of xen.git/tools/libs/* rather than the equivalent frameworks provided by the Windows PV drivers.
It would be nice to at least be able to use the same header files, for ease of porting userspace software.
It's possible that libvchan on Windows will make use of the tools/libs headers. As Andy says it would ease porting client software.
Quoted 4 lines
In this case, VLAs are just being used as an aid for the compiler to spot errors. It doesn't change the API/ABI, and could be #ifdef'd around, if we care both for using C99 in general, and Windows support.
We still compile with VS2012 in Citrix and Xen Project uses VS2013 so we can't rely on C99. A #ifdef here does seem like the best solution.
Paul
A message that is not in the archive (sent off-list or not yet received): 9AAE0902D5BC7E449B7C8E4E778ABCD02F69D32F@AMSPEX01CL01.citrite.net
Re: [PATCH XEN v5 13/23] tools: Refactor foreign memory mapping into libxenforeignmemory
Quoted 22 lines · Paul Durrant
Quoted 1 line
-----Original Message-----
[snip]
Quoted 8 lines
Quoted 8 lines
C99 was 16 years ago now, I'm struggling to think of a reason not to move
the baseline for tools stuff at least to that.https://en.wikipedia.org/wiki/Visual_C%2B%2B might be one such reason I
suppose, although I'm not convinced a libvchan port to Windows, even ifQuoted 8 lines
not
Quoted 3 lines
entirely hypothetical, would be using any of xen.git/tools/libs/* rather
than the equivalent frameworks provided by the Windows PV drivers.It would be nice to at least be able to use the same header files, for ease of porting userspace software.
It's possible that libvchan on Windows will make use of the
tools/libsheaders. As Andy says it would ease porting client software.
Quoted 7 lines
Quoted 4 lines
In this case, VLAs are just being used as an aid for the compiler to spot errors. It doesn't change the API/ABI, and could be #ifdef'd around, if we care both for using C99 in general, and Windows support.
We still compile with VS2012 in Citrix and Xen Project uses VS2013 so we can't rely on C99. A #ifdef here does seem like the best solution.
Would you expect new projects (i.e. stuff based on tools/libs) to continue to have requirements to build with those older versions? (Although with Andy's link saying even VS2015 doesn't do VLAs maybe it is a bit moot).
I don't think using VLA here is worth an ifdef, but I think it is worth reordering the arguments such that once we end up with a new enough compiler baseline (in $donkeys years) we can switch without changing the ABI (I think that's the case).
Ian.
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [PATCH XEN v5 13/23] tools: Refactor foreign memory mapping into libxenforeignmemory
Quoted 37 lines
-----Original Message-----
From: Ian Campbell [mailto:[email protected]]
Sent: 30 November 2015 09:52
To: Paul Durrant; Andrew Cooper; Ian Jackson
Cc: Wei Liu; [email protected]; [email protected]
Subject: Re: [PATCH XEN v5 13/23] tools: Refactor foreign memory mapping into libxenforeignmemoryQuoted 7 lines · Paul Durrant
Quoted 1 line
-----Original Message-----
[snip]
Quoted 5 lines
Quoted 5 lines
C99 was 16 years ago now, I'm struggling to think of a reason not to move
the baseline for tools stuff at least to that.https://en.wikipedia.org/wiki/Visual_C%2B%2B might be one such
reason
Quoted 20 lines
Quoted 11 lines
Quoted 3 lines
I
suppose, although I'm not convinced a libvchan port to Windows, even ifnot
Quoted 3 lines
entirely hypothetical, would be using any of xen.git/tools/libs/* rather
than the equivalent frameworks provided by the Windows PV drivers.It would be nice to at least be able to use the same header files, for ease of porting userspace software.
It's possible that libvchan on Windows will make use of the
tools/libsheaders. As Andy says it would ease porting client software.Quoted 4 lines
In this case, VLAs are just being used as an aid for the compiler to spot errors. It doesn't change the API/ABI, and could be #ifdef'd around, if we care both for using C99 in general, and Windows support.
Quoted 7 lines
Quoted 2 lines
We still compile with VS2012 in Citrix and Xen Project uses VS2013 so we can't rely on C99. A #ifdef here does seem like the best solution.
Would you expect new projects (i.e. stuff based on
tools/libs) to continue to have requirements to build with those older versions? (Although with Andy's link saying even VS2015 doesn't do VLAs maybe it is a bit moot).
It would certainly be preferable to have something that did build under a sufficiently old C standard to cover as many environments as is reasonable, and I think any supported MSVC build environment should be included in that set (although I have no problem using #ifdefs to achieve that).
Quoted 5 lines
I don't think using VLA here is worth an ifdef, but I think it is worth reordering the arguments such that once we end up with a new enough compiler baseline (in $donkeys years) we can switch without changing the ABI (I think that's the case).
IIUC correctly the use of VLAs does not change the calling convention in any way, right? It would still mean a pointer to err_out is passed and the use of a VLA is so that bounds checking can be performed? I certainly don't think we should get ourselves into a situation where additions to compilers or C standards do cause changes in the ABI (and we already have to be careful with Windows 32-bit since it defaults to pascal calling convention).
Paul
Quoted 1 line
Ian.
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
Re: [PATCH XEN v5 13/23] tools: Refactor foreign memory mapping into libxenforeignmemory
In reply to Ian JacksonQuoted 18 lines · Ian Jackson
Quoted 12 lines
+/*
+ * Maps a range within one domain to a local address range. Mappings
+ * should be unmapped with munmap and should follow the same rules as mmap
+ * regarding page alignment.
+ *
+ * prot is as for mmap(2).
+ *
+ * Can partially succeed. When a page cannot be mapped, its respective
+ * field in @err is set to the corresponding errno value.
+ *
+ * Returns NULL if no pages can be mapped....
Quoted 4 lines
+void *xenforeignmemory_map(xenforeignmemory_handle *fmem,
uint32_tdom,
+ int prot, constxen_pfn_t*arr, int *err, + unsigned int num);
Quoted 4 lines
If it returns NULL, will all of *err be filled with errno values ? Ie is all of err[] always written ?
Does this function ever set errno ?
From my reading of the Linux code it appears to be thus:
If it returns NULL it will have set errno. In that case it appears that err is invalid.
If it returns non-NULL then all of err has been written to either 0 or a negative errno val, indicating the state of that particular frame.
errno vals are in the OS space, not the Xen one, for both the global errno and the err[] array vals.
I think the same is true of FreeBSD from my reading of that code.
In both cases the behaviour is a combined property of the behaviours of the libxc functions, the privcmd driver and the hypercall on xen side, where the first two differ a fair bit on different platforms (and call different hypercalls under the hood, with different behaviour there too)
But the sum _seems_ to add up the same in both cases. Mini-OS is simpler but looks to do about the same.
IOW I'm not 100% sure of the above but it seems a) like a sensible/desirable enough behaviour and b) it does look, as far as I can tell, like the code does this.
Quoted 4 lines
This API invites callers to fail to notice partial failures.
How about permitting err==NULL to mean `on partial failure, unmap everything and return NULL setting errno' ?
AFAICT both the FreeBSD and Linux privcmd driver do not handle this case, so we would be looking at adding functionality to the library to paper over it.
Looking at the users it seems that those which map batches of pages get things right, since they naturally tend to be looping over the arrays anyway.
It's the callers who are mapping a single page which tend to get this wrong, many of them are pre-existing bugs but a fair few are as a result of conversions made in this set of series.
In particular xc_map_foreign_pages used to unmap and return NULL with errno set to the value first non-zero errno from the err array, which I suppose is what you were thinking of for setting errno in this case?
I'm considering whether to add a second function in the API to map single pages (since that seems to be the most common usage, and commonly exhibits this error) vs doing as you suggest, which has the downside of throwing away all the other errors (which may be more critical than the first).
I did briefly consider allow err == NULL iff nr == 1, but that seems worse than both the other options.
Ian.
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
PATCH v5 14/23 tools: foreignmemory: provide xenforeignmemory_unmap.
In reply to Ian CampbellAnd require it be used instead of direct munmap.
This will allow e.g. Valgrind hooks to help track incorrect use of foreign mappings.
Switch all uses of xenforeignmemory_map to use xenforeignmemory_unmap, not that foreign mappings via the libxc compat xc_map_foreign_* interface will not take advantage of this and will need converting.
---
v4: xenforeignmemory_unmap takes pages not bytes, adjust callers.
--- tools/libs/foreignmemory/freebsd.c | 6 ++++++ tools/libs/foreignmemory/include/xenforeignmemory.h | 7 +++++-- tools/libs/foreignmemory/libxenforeignmemory.map | 1 + tools/libs/foreignmemory/linux.c | 6 ++++++ tools/libs/foreignmemory/minios.c | 6 ++++++ tools/libs/foreignmemory/netbsd.c | 6 ++++++ tools/libs/foreignmemory/solaris.c | 6 ++++++ tools/libxc/xc_sr_restore.c | 2 +- tools/libxc/xc_sr_save.c | 2 +- tools/libxc/xc_vm_event.c | 2 +- 10 files changed, 39 insertions(+), 5 deletions(-)
tools/libs/foreignmemory/freebsd.c +6 -0
@@ -118,6 +118,12 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem,return addr; } +int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, +void *addr,unsigned int num) +{ +return munmap (addr, num <<PAGE_SHIFT ); +} +/* * Local variables: * mode: C
tools/libs/foreignmemory/include/xenforeignmemory.h +5 -2
@@ -44,8 +44,8 @@ int xenforeignmemory_close(xenforeignmemory_handle *xmem);/* * Maps a range within one domain to a local address range. Mappings -* should be unmapped with munmap and should follow the same rules as mmap -* regarding page alignment. +* must be unmapped with xenforeignmemory_unmap and should follow the +* same rules as mmap regarding page alignment. * * prot is as for mmap(2). *
@@ -58,6 +58,9 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem, uint32_t dom, int prot, const xen_pfn_t *arr, int *err, unsigned int num); +int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, +void *addr,unsigned int num); +#endif /*
tools/libs/foreignmemory/libxenforeignmemory.map +1 -0
@@ -3,5 +3,6 @@ VERS_1.0 { xenforeignmemory_open; xenforeignmemory_close; xenforeignmemory_map; + xenforeignmemory_unmap; local: *; /* Do not expose anything by default */ };
tools/libs/foreignmemory/linux.c +6 -0
@@ -276,6 +276,12 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem,return addr; } +int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, +void *addr,unsigned int num) +{ +return munmap (addr, (unsigned long )num <<PAGE_SHIFT ); +} +/* * Local variables: * mode: C
tools/libs/foreignmemory/minios.c +6 -0
@@ -51,6 +51,12 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem,return map_frames_ex (arr, num,1 ,0 ,1 , dom, err, pt_prot); } +int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, +void *addr,unsigned int num) +{ +return munmap (addr, num <<PAGE_SHIFT ); +} +/* * Local variables: * mode: C
tools/libs/foreignmemory/netbsd.c +6 -0
@@ -93,3 +93,9 @@ void *compat_mapforeign_batch(xenforeignmem_handle *fmem, uint32_t dom,return addr; } + +int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, +void *addr,unsigned int num) +{ +return munmap (addr, num*XC_PAGE_SIZE ); +}
tools/libs/foreignmemory/solaris.c +6 -0
@@ -92,3 +92,9 @@ void *compat_mapforeign_batch(xenforeignmem_handle *fmem, uint32_t dom,return addr; } + +int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, +void *addr,unsigned int num) +{ +return munmap (addr, num*XC_PAGE_SIZE ); +}
tools/libxc/xc_sr_restore.c +1 -1
@@ -378,7 +378,7 @@ static int process_page_data(struct xc_sr_context *ctx, unsigned count, err:if ( mapping ) -munmap (mapping, nr_pages *PAGE_SIZE ); +xenforeignmemory_unmap (xch->fmem, mapping, nr_pages);free (map_errs);free (mfns);
tools/libxc/xc_sr_save.c +1 -1
@@ -263,7 +263,7 @@ static int write_batch(struct xc_sr_context *ctx) err:free (rec_pfns);if ( guest_mapping ) -munmap (guest_mapping, nr_pages_mapped *PAGE_SIZE ); +xenforeignmemory_unmap (xch->fmem, guest_mapping, nr_pages_mapped);for ( i =0 ; local_pages && i < nr_pfns; ++i )free (local_pages[i]);free (iov);
tools/libxc/xc_vm_event.c +1 -1
@@ -151,7 +151,7 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t domain_id, int param, }if ( ring_page ) -munmap (ring_page,XC_PAGE_SIZE ); +xenforeignmemory_unmap (xch->fmem, ring_page,1 ); ring_page =NULL ; errno = saved_errno;
Signature · 1 line
2.1.4
Re: [PATCH XEN v5 14/23] tools: foreignmemory: provide xenforeignmemory_unmap.
Ian Campbell writes ("[PATCH XEN v5 14/23] tools: foreignmemory: provide xenforeignmemory_unmap."):
Quoted 9 lines
And require it be used instead of direct munmap.
This will allow e.g. Valgrind hooks to help track incorrect use of foreign mappings.
Switch all uses of
xenforeignmemory_mapto usexenforeignmemory_unmap, not that foreign mappings via the libxc compat xc_map_foreign_* interface will not take advantage of this and will need converting.
...
tools/libs/foreignmemory/include/xenforeignmemory.h void *xenforeignmemory_map(xenforeignmemory_handle *fmem, uint32_t dom, · line 63
Quoted 3 lines
tools/libs/foreignmemory/include/xenforeignmemory.h +3
-0+int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, +void *addr,unsigned int num); +
What kind of errors might this return ?
Ian.
Re: [PATCH XEN v5 14/23] tools: foreignmemory: provide xenforeignmemory_unmap.
Quoted 11 lines · Ian Jackson
Ian Campbell writes ("[PATCH XEN v5 14/23] tools: foreignmemory: provide
xenforeignmemory_unmap."):Quoted 9 lines
And require it be used instead of direct munmap.
This will allow e.g. Valgrind hooks to help track incorrect use of foreign mappings.
Switch all uses of
xenforeignmemory_mapto usexenforeignmemory_unmap, not that foreign mappings via the libxc compat xc_map_foreign_* interface will not take advantage of this and will need converting.
Quoted 6 lines
...
tools/libs/foreignmemory/include/xenforeignmemory.h void *xenforeignmemory_map(xenforeignmemory_handle *fmem, uint32_t dom, · line 63
Quoted 3 lines
tools/libs/foreignmemory/include/xenforeignmemory.h +3
-0+int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, + void *addr, unsigned int num); +What kind of errors might this return ?
Same as munmap(2), i.e. only EINVAL according to http://pubs.opengroup.org/
onlinepubs/9699919799/functions/munmap.html
Ian,
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
Re: [PATCH XEN v5 14/23] tools: foreignmemory: provide xenforeignmemory_unmap.
In reply to Ian Campbelltools/libs/foreignmemory/linux.c void *xenforeignmemory_map(xenforeignmemory_handle *fmem, · line 282
Quoted 12 lines · Ian Campbell
tools/libs/foreignmemory/linux.c +4
-0@@ -276,6 +276,12 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem,return addr; } +int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, +void *addr,unsigned int num) +{ +return munmap (addr, (unsigned long )num <<PAGE_SHIFT );
This should be size_t to match the type expected by munmap()
Quoted 10 lines
tools/libs/foreignmemory/linux.c +2
-0+} +/* * Local variables: * mode: C tools/libs/foreignmemory/minios.c +0
-0
tools/libs/foreignmemory/minios.c void *xenforeignmemory_map(xenforeignmemory_handle *fmem, · line 57
Quoted 7 lines
tools/libs/foreignmemory/minios.c +4
-0@@ -51,6 +51,12 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem,return map_frames_ex (arr, num,1 ,0 ,1 , dom, err, pt_prot); } +int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, +void *addr,unsigned int num) +{ +return munmap (addr, num <<PAGE_SHIFT );
This num (and freebsd/netbsd/solaris) needs upcasting before multiplication, to avoid loosing the top 12 bits on 64bit platforms.
~Andrew
Re: [PATCH XEN v5 14/23] tools: foreignmemory: provide xenforeignmemory_unmap.
Quoted 28 lines · Andrew Cooper
tools/libs/foreignmemory/linux.c void *xenforeignmemory_map(xenforeignmemory_handle *fmem, · line 282
Quoted 12 lines · Ian Campbell
tools/libs/foreignmemory/linux.c +4
-0@@ -276,6 +276,12 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem,return addr; } +int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, +void *addr,unsigned int num) +{ +return munmap (addr, (unsigned long )num <<PAGE_SHIFT );This should be
size_tto match the type expected bymunmap()Quoted 13 lines
tools/libs/foreignmemory/linux.c +2
-0+} +/* * Local variables: * mode: C tools/libs/foreignmemory/minios.c +0
-0@@ -51,6 +51,12 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem,return map_frames_ex (arr, num,1 ,0 ,1 , dom, err, pt_prot); }
Quoted 6 lines
tools/libs/foreignmemory/minios.c void *xenforeignmemory_map(xenforeignmemory_handle *fmem, · line 57
Quoted 4 lines
tools/libs/foreignmemory/minios.c +4
-0+int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, +void *addr,unsigned int num) +{ +return munmap (addr, num <<PAGE_SHIFT );This num (and freebsd/netbsd/solaris) needs upcasting before multiplication, to avoid loosing the top 12 bits on 64bit platforms.
Sorry - ignore me. I hadn't looked at the subsequent patch while reviewing this one.
~Andrew
PATCH v5 15/23 foreignmemory: use size_t for size arguments.
In reply to Ian CampbellSurprisingly it appears no callers need updating.
---
v4: New patch
--- tools/libs/foreignmemory/compat.c | 2 +- tools/libs/foreignmemory/freebsd.c | 4 ++-- .../libs/foreignmemory/include/xenforeignmemory.h | 4 ++-- tools/libs/foreignmemory/linux.c | 25 +++++++++++----------- tools/libs/foreignmemory/minios.c | 6 +++--- tools/libs/foreignmemory/netbsd.c | 2 +- tools/libs/foreignmemory/solaris.c | 2 +- 7 files changed, 23 insertions(+), 22 deletions(-)
tools/libs/foreignmemory/compat.c +1 -1
@@ -23,7 +23,7 @@void *xc_map_foreign_bulk (xenforeignmem_handle *fmem,uint32_t dom,int prot, -const xen_pfn_t *arr,int *err,unsigned int num) +const xen_pfn_t *arr,int *err,size_t num) {xen_pfn_t *pfn;unsigned int i;
tools/libs/foreignmemory/freebsd.c +2 -2
@@ -85,7 +85,7 @@ int osdep_xenforeignmemory_close(xenforeignmemory_handle *fmem)void *xenforeignmemory_map (xenforeignmemory_handle *fmem,uint32_t dom,int prot,const xen_pfn_t *arr,int *err, -unsigned int num) +size_t num) {int fd = fmem->fd;privcmd_mmapbatch_t ioctlx;
@@ -119,7 +119,7 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem, }int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, -void *addr,unsigned int num) +void *addr,size_t num) {return munmap (addr, num <<PAGE_SHIFT ); }
tools/libs/foreignmemory/include/xenforeignmemory.h +2 -2
@@ -56,10 +56,10 @@ int xenforeignmemory_close(xenforeignmemory_handle *xmem);*/ void *xenforeignmemory_map (xenforeignmemory_handle *fmem,uint32_t dom,int prot,const xen_pfn_t *arr,int *err, -unsigned int num); +size_t pages);int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, -void *addr,unsigned int num); +void *addr,size_t pages);#endif
tools/libs/foreignmemory/linux.c +13 -12
@@ -109,10 +109,11 @@ static int map_foreign_batch_single(int fd, uint32_t dom,* This will keep the request ring full and avoids delays. */ static int retry_paged (int fd,uint32_t dom,void *addr, -const xen_pfn_t *arr,int *err,unsigned int num) +const xen_pfn_t *arr,int *err,size_t num) {privcmd_mmapbatch_v2_t ioctlx; -int rc, paged =0 , i =0 ; +int rc, paged =0 ; +size_t i =0 ; do {
@@ -128,7 +129,7 @@ static int retry_paged(int fd, uint32_t dom, void *addr,/* At least one gfn is still in paging state */ ioctlx.num =1 ; ioctlx.dom = dom; - ioctlx.addr = (unsigned long )addr + ((unsigned long )i<<PAGE_SHIFT ); + ioctlx.addr = (unsigned long )addr + (i<<PAGE_SHIFT ); ioctlx.arr = arr + i; ioctlx.err = err + i;
@@ -153,16 +154,16 @@ out: }void *xenforeignmemory_map (xenforeignmemory_handle *fmem, -uint32_t dom,int prot, -const xen_pfn_t *arr,int *err,unsigned int num) +uint32_t dom,int prot, +const xen_pfn_t *arr,int *err,size_t num) {int fd = fmem->fd;privcmd_mmapbatch_v2_t ioctlx;void *addr; -unsigned int i; +size_t i;int rc; - addr =mmap (NULL , (unsigned long )num <<PAGE_SHIFT , prot,MAP_SHARED , + addr =mmap (NULL , num <<PAGE_SHIFT , prot,MAP_SHARED , fd,0 );if ( addr ==MAP_FAILED ) {
@@ -206,7 +207,7 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem,if ( pfn ==MAP_FAILED ) {PERROR ("mmap of pfn array failed" ); - (void )munmap (addr, (unsigned long )num <<PAGE_SHIFT ); + (void )munmap (addr, num <<PAGE_SHIFT );return NULL ; } }
@@ -239,7 +240,7 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem,continue ; } rc =map_foreign_batch_single (fd, dom, pfn + i, - (unsigned long )addr + ((unsigned long )i<<PAGE_SHIFT )); + (unsigned long )addr + (i<<PAGE_SHIFT ));if ( rc <0 ) { rc = -errno;
@@ -268,7 +269,7 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem,int saved_errno = errno;PERROR ("ioctl failed" ); - (void )munmap (addr, (unsigned long )num <<PAGE_SHIFT ); + (void )munmap (addr, num <<PAGE_SHIFT ); errno = saved_errno;return NULL ; }
@@ -277,9 +278,9 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem, }int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, -void *addr,unsigned int num) +void *addr,size_t num) { -return munmap (addr, (unsigned long )num <<PAGE_SHIFT ); +return munmap (addr, num <<PAGE_SHIFT ); }/*
tools/libs/foreignmemory/minios.c +3 -3
@@ -40,8 +40,8 @@ int osdep_xenforeignmemory_close(xenforeignmemory_handle *fmem) }void *xenforeignmemory_map (xenforeignmemory_handle *fmem, -uint32_t dom,int prot, -const xen_pfn_t *arr,int *err,unsigned int num) +uint32_t dom,int prot, +const xen_pfn_t *arr,int *err,size_t num) {unsigned long pt_prot =0 ;if (prot &PROT_READ )
@@ -52,7 +52,7 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem, }int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, -void *addr,unsigned int num) +void *addr,size_t num) {return munmap (addr, num <<PAGE_SHIFT ); }
tools/libs/foreignmemory/netbsd.c +1 -1
@@ -95,7 +95,7 @@ void *compat_mapforeign_batch(xenforeignmem_handle *fmem, uint32_t dom, }int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, -void *addr,unsigned int num) +void *addr,size_t num) {return munmap (addr, num*XC_PAGE_SIZE ); }
tools/libs/foreignmemory/solaris.c +1 -1
@@ -94,7 +94,7 @@ void *compat_mapforeign_batch(xenforeignmem_handle *fmem, uint32_t dom, }int xenforeignmemory_unmap (xenforeignmemory_handle *fmem, -void *addr,unsigned int num) +void *addr,size_t num) {return munmap (addr, num*XC_PAGE_SIZE ); }
Signature · 1 line
2.1.4
Re: [PATCH XEN v5 15/23] foreignmemory: use size_t for size arguments.
Ian Campbell writes ("[PATCH XEN v5 15/23] foreignmemory: use size_t for size arguments."):
Quoted 4 lines
Surprisingly it appears no callers need updating.
Signed-off-by Ian Campbell <[email protected]>Acked-by Wei Liu <[email protected]>
This is a good API change.
PATCH v5 16/23 tools/libs/evtchn: Review and update doc comments.
In reply to Ian CampbellRemove the reference to pre-4.1, since this is now a new library.
Fixup references to xc.
--- tools/libs/evtchn/include/xenevtchn.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
tools/libs/evtchn/include/xenevtchn.h +2 -4
@@ -46,11 +46,9 @@ typedef struct xentoollog_logger xentoollog_logger;* which case errno will be set appropriately. * * Note: -* After fork a child process must not use any opened xc evtchn +* After fork a child process must not use any opened evtchn * handle inherited from their parent. They must open a new handle if -* they want to interact with xc. -* -* Before Xen pre-4.1 this function would sometimes report errors with perror. +* they want to interact with evtchn. */ /* Currently no flags are defined */ xenevtchn_handle *xenevtchn_open (xentoollog_logger *logger,unsigned open_flags);
Signature · 1 line
2.1.4
Re: [PATCH XEN v5 16/23] tools/libs/evtchn: Review and update doc comments.
Ian Campbell writes ("[PATCH XEN v5 16/23] tools/libs/evtchn: Review and update doc comments."):
Quoted 3 lines
Remove the reference to pre-4.1, since this is now a new library.
Fixup references to xc.
PATCH v5 17/23 tools/libs: Clean up hard tabs.
In reply to Ian CampbellThese were wrong in the context of libxc before this code was extracted, clean them up.
Also add some emacs magic blocks
--- tools/libs/call/buffer.c | 4 ++-- tools/libs/call/core.c | 2 +- tools/libs/call/minios.c | 4 ++-- tools/libs/evtchn/minios.c | 28 ++++++++++++++-------------- tools/libs/evtchn/netbsd.c | 12 ++++++------ tools/libs/foreignmemory/freebsd.c | 2 +- tools/libs/foreignmemory/minios.c | 6 +++--- tools/libs/foreignmemory/netbsd.c | 12 +++++++++++- tools/libs/foreignmemory/private.h | 2 +- tools/libs/foreignmemory/solaris.c | 13 +++++++++++-- tools/libs/gnttab/include/xengnttab.h | 4 ++-- tools/libs/gnttab/linux.c | 6 +++--- tools/libs/toollog/xtl_logger_stdio.c | 2 +- 13 files changed, 58 insertions(+), 39 deletions(-)
tools/libs/call/buffer.c +2 -2
@@ -20,7 +20,7 @@#include "private.h" #define DBGPRINTF(_m...) \ - xtl_log(xcall->logger, XTL_DEBUG, -1, "xencall:buffer", _m) + xtl_log(xcall->logger, XTL_DEBUG, -1, "xencall:buffer", _m)#define ROUNDUP (_x,_w) (((unsigned long)(_x)+(1UL<<(_w))-1) & ~((1UL<<(_w))-1))
@@ -86,7 +86,7 @@ static int cache_free(xencall_handle *xcall, void *p, int nr_pages) xcall->buffer_current_allocations--;if ( nr_pages ==1 && - xcall->buffer_cache_nr <BUFFER_CACHE_SIZE ) + xcall->buffer_cache_nr <BUFFER_CACHE_SIZE ) { xcall->buffer_cache[xcall->buffer_cache_nr++] = p; rc =1 ;
tools/libs/call/core.c +1 -1
@@ -19,7 +19,7 @@xencall_handle *xencall_open (xentoollog_logger *logger,unsigned open_flags) { -xencall_handle *xcall =malloc (sizeof (*xcall)); +xencall_handle *xcall =malloc (sizeof (*xcall));int rc;if (!xcall)return NULL ;
tools/libs/call/minios.c +2 -2
@@ -50,8 +50,8 @@ int osdep_hypercall(xencall_handle *xcall, privcmd_hypercall_t *hypercall) ret =HYPERVISOR_multicall (&call,1 );if (ret <0 ) { - errno = -ret; -return -1 ; + errno = -ret; +return -1 ; }if ((long ) call.result <0 ) { errno = - (long ) call.result;
tools/libs/evtchn/minios.c +14 -14
@@ -103,8 +103,8 @@ int xenevtchn_notify(xenevtchn_handle *xce, evtchn_port_t port) ret =notify_remote_via_evtchn (port);if (ret <0 ) { - errno = -ret; - ret =-1 ; + errno = -ret; + ret =-1 ; }return ret; }
@@ -138,16 +138,16 @@ evtchn_port_or_error_t xenevtchn_bind_unbound_port(xenevtchn_handle *xce, int doassert (get_current () == main_thread); port_info =port_alloc (fd);if (port_info ==NULL ) -return -1 ; +return -1 ;printf ("xenevtchn_bind_unbound_port(%d)" , domid); ret =evtchn_alloc_unbound (domid, evtchn_handler, (void *)(intptr_t )fd, &port);printf (" = %d\n" , ret);if (ret <0 ) { -port_dealloc (port_info); - errno = -ret; -return -1 ; +port_dealloc (port_info); + errno = -ret; +return -1 ; } port_info->bound =1 ; port_info->port = port;
@@ -166,16 +166,16 @@ evtchn_port_or_error_t xenevtchn_bind_interdomain(xenevtchn_handle *xce, int domassert (get_current () == main_thread); port_info =port_alloc (fd);if (port_info ==NULL ) -return -1 ; +return -1 ;printf ("xenevtchn_bind_interdomain(%d, %" PRId32")" , domid, remote_port); ret =evtchn_bind_interdomain (domid, remote_port, evtchn_handler, (void *)(intptr_t )fd, &local_port);printf (" = %d\n" , ret);if (ret <0 ) { -port_dealloc (port_info); - errno = -ret; -return -1 ; +port_dealloc (port_info); + errno = -ret; +return -1 ; } port_info->bound =1 ; port_info->port = local_port;
@@ -208,15 +208,15 @@ evtchn_port_or_error_t xenevtchn_bind_virq(xenevtchn_handle *xce, unsigned int vassert (get_current () == main_thread); port_info =port_alloc (fd);if (port_info ==NULL ) -return -1 ; +return -1 ;printf ("xenevtchn_bind_virq(%d)" , virq); port =bind_virq (virq, evtchn_handler, (void *)(intptr_t )fd);if (port <0 ) { -port_dealloc (port_info); - errno = -port; -return -1 ; +port_dealloc (port_info); + errno = -port; +return -1 ; } port_info->bound =1 ; port_info->port = port;
tools/libs/evtchn/netbsd.c +6 -6
@@ -72,9 +72,9 @@ evtchn_port_or_error_t xenevtchn_bind_unbound_port(xenevtchn_handle * xce, int d ret =ioctl (fd,IOCTL_EVTCHN_BIND_UNBOUND_PORT , &bind);if (ret ==0 ) -return bind.port; +return bind.port;else -return -1 ; +return -1 ; } evtchn_port_or_error_t xenevtchn_bind_interdomain(xenevtchn_handle *xce, int domid,
@@ -89,9 +89,9 @@ evtchn_port_or_error_t xenevtchn_bind_interdomain(xenevtchn_handle *xce, int dom ret =ioctl (fd,IOCTL_EVTCHN_BIND_INTERDOMAIN , &bind);if (ret ==0 ) -return bind.port; +return bind.port;else -return -1 ; +return -1 ; }int xenevtchn_unbind (xenevtchn_handle *xce,evtchn_port_t port)
@@ -114,9 +114,9 @@ evtchn_port_or_error_t xenevtchn_bind_virq(xenevtchn_handle *xce, unsigned int v err =ioctl (fd,IOCTL_EVTCHN_BIND_VIRQ , &bind);if (err) -return -1 ; +return -1 ;else -return bind.port; +return bind.port; }evtchn_port_or_error_t xenevtchn_pending (xenevtchn_handle *xce)
tools/libs/foreignmemory/freebsd.c +1 -1
@@ -121,7 +121,7 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem,int xenforeignmemory_unmap (xenforeignmemory_handle *fmem,void *addr,size_t num) { -return munmap (addr, num <<PAGE_SHIFT ); +return munmap (addr, num <<PAGE_SHIFT ); }/*
tools/libs/foreignmemory/minios.c +3 -3
@@ -45,16 +45,16 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem, {unsigned long pt_prot =0 ;if (prot &PROT_READ ) - pt_prot =L1_PROT_RO ; + pt_prot =L1_PROT_RO ;if (prot &PROT_WRITE ) - pt_prot =L1_PROT ; + pt_prot =L1_PROT ;return map_frames_ex (arr, num,1 ,0 ,1 , dom, err, pt_prot); }int xenforeignmemory_unmap (xenforeignmemory_handle *fmem,void *addr,size_t num) { -return munmap (addr, num <<PAGE_SHIFT ); +return munmap (addr, num <<PAGE_SHIFT ); }/*
tools/libs/foreignmemory/netbsd.c +11 -1
@@ -97,5 +97,15 @@ void *compat_mapforeign_batch(xenforeignmem_handle *fmem, uint32_t dom,int xenforeignmemory_unmap (xenforeignmemory_handle *fmem,void *addr,size_t num) { -return munmap (addr, num*XC_PAGE_SIZE ); +return munmap (addr, num*XC_PAGE_SIZE ); } + +/* +* Local variables: +* mode: C +* c-file-style: "BSD" +* c-basic-offset: 4 +* tab-width: 4 +* indent-tabs-mode: nil +* End: +*/
tools/libs/foreignmemory/private.h +1 -1
@@ -32,7 +32,7 @@ void *compat_mapforeign_batch(xenforeignmem_handle *fmem, uint32_t dom,#endif #define PERROR(_f...) \ - xtl_log(fmem->logger, XTL_ERROR, errno, "xenforeignmemory", _f) + xtl_log(fmem->logger, XTL_ERROR, errno, "xenforeignmemory", _f)#endif
tools/libs/foreignmemory/solaris.c +11 -2
@@ -90,11 +90,20 @@ void *compat_mapforeign_batch(xenforeignmem_handle *fmem, uint32_t dom,return NULL ; }return addr; - }int xenforeignmemory_unmap (xenforeignmemory_handle *fmem,void *addr,size_t num) { -return munmap (addr, num*XC_PAGE_SIZE ); +return munmap (addr, num*XC_PAGE_SIZE ); } + +/* +* Local variables: +* mode: C +* c-file-style: "BSD" +* c-basic-offset: 4 +* tab-width: 4 +* indent-tabs-mode: nil +* End: +*/
tools/libs/gnttab/include/xengnttab.h +2 -2
@@ -144,7 +144,7 @@ int xengnttab_munmap(xengnttab_handle *xgt,* of grants. */ int xengnttab_set_max_grants (xengnttab_handle *xgt, -uint32_t count); +uint32_t count);/* * Grant Sharing Interface (allocating and granting pages)
@@ -162,7 +162,7 @@ typedef struct xengntdev_handle xengntshr_handle;* */ xengntshr_handle *xengntshr_open (xentoollog_logger *logger, -unsigned open_flags); +unsigned open_flags);/* * Close a handle previously allocated with xengntshr_open().
tools/libs/gnttab/linux.c +3 -3
@@ -294,9 +294,9 @@ void *osdep_gntshr_share_pages(xengntshr_handle *xgs, err =ioctl (fd,IOCTL_GNTALLOC_SET_UNMAP_NOTIFY , ¬ify);if (err) {GSERROR (xgs->logger,"ioctl SET_UNMAP_NOTIFY failed" ); -munmap (area, count *PAGE_SIZE ); - area =NULL ; - } +munmap (area, count *PAGE_SIZE ); + area =NULL ; + }memcpy (refs, gref_info->gref_ids, count *sizeof (uint32_t ));
tools/libs/toollog/xtl_logger_stdio.c +1 -1
@@ -135,7 +135,7 @@ static void stdiostream_progress(struct xentoollog_logger *logger_in, newpel =fprintf (lg->f,"%s%s" "%s: %lu/%lu %3d%%%s" , context?context:"" , context?": " :"" , doing_what, done, total, percent, - done == total ?"\n" :"" ); + done == total ?"\n" :"" ); extra_erase = lg->progress_erase_len - newpel;if (extra_erase >0 )
Signature · 1 line
2.1.4
PATCH v5 18/23 tools/libs/gnttab: Review and update doc comments.
In reply to Ian CampbellRemove some stray xc references.
While I'm not convinced by javadoc/doxygen cause the existing comments which appear to use that syntax to have the appropriate /** marker.
Also fix a typo in a code comment.
--- tools/libs/gnttab/include/xengnttab.h | 21 +++++++++++---------- tools/libs/gnttab/linux.c | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-)
tools/libs/gnttab/include/xengnttab.h +11 -10
@@ -38,9 +38,9 @@ typedef struct xengntdev_handle xengnttab_handle;/* * Note: -* After fork a child process must not use any opened xc gnttab +* After fork a child process must not use any opened gnttab * handle inherited from their parent. They must open a new handle if -* they want to interact with xc. +* they want to interact with gnttab. * * Return an fd onto the grant table driver. Logs errors. */
@@ -52,7 +52,7 @@ xengnttab_handle *xengnttab_open(xentoollog_logger *logger, unsigned open_flags)*/ int xengnttab_close (xengnttab_handle *xgt); -/* +/** * Memory maps a grant reference from one domain to a local address range. * Mappings should be unmapped with xengnttab_munmap. Logs errors. *
@@ -124,7 +124,7 @@ void *xengnttab_map_grant_ref_notify(xengnttab_handle *xgt,uint32_t notify_offset, evtchn_port_t notify_port); -/* +/** * Unmaps the @count pages starting at @start_address, which were mapped by a * call to xengnttab_map_grant_ref or xengnttab_map_grant_refs. Never logs. */
@@ -132,7 +132,7 @@ int xengnttab_munmap(xengnttab_handle *xgt,void *start_address, uint32_t count); -/* +/** * Sets the maximum number of grants that may be mapped by the given instance * to @count. Never logs. *
@@ -156,9 +156,9 @@ typedef struct xengntdev_handle xengntshr_handle;* Return an fd onto the grant sharing driver. Logs errors. * * Note: -* After fork a child process must not use any opened xc gntshr +* After fork a child process must not use any opened gntshr * handle inherited from their parent. They must open a new handle if -* they want to interact with xc. +* they want to interact with gntshr. * */ xengntshr_handle *xengntshr_open(xentoollog_logger *logger,
@@ -170,7 +170,7 @@ xengntshr_handle *xengntshr_open(xentoollog_logger *logger,*/ int xengntshr_close (xengntshr_handle *xgs); -/* +/** * Creates and shares pages with another domain. * * @parm xgs a handle to an open grant sharing instance
@@ -183,7 +183,7 @@ int xengntshr_close(xengntshr_handle *xgs);void *xengntshr_share_pages (xengntshr_handle *xgs,uint32_t domid,int count,uint32_t *refs,int writable); -/* +/** * Creates and shares a page with another domain, with unmap notification. * * @parm xgs a handle to an open grant sharing instance
@@ -199,7 +199,8 @@ void *xengntshr_share_page_notify(xengntshr_handle *xgs, uint32_t domid, uint32_t *ref, int writable, uint32_t notify_offset, evtchn_port_t notify_port); -/* + +/** * Unmaps the @count pages starting at @start_address, which were mapped by a * call to xengntshr_share_*. Never logs. */
tools/libs/gnttab/linux.c +1 -1
@@ -136,7 +136,7 @@ void *osdep_gnttab_grant_map(xengnttab_handle *xgt,* swapped out. Since the paging daemon may be in the same domain, the * hypercall cannot block without causing a deadlock. * -* Because there are no notificaitons when the page is swapped in, wait +* Because there are no notifications when the page is swapped in, wait * a bit before retrying, and hope that the page will arrive eventually. */ usleep (1000 );
Signature · 1 line
2.1.4
Re: [PATCH XEN v5 18/23] tools/libs/gnttab: Review and update doc comments.
Ian Campbell writes ("[PATCH XEN v5 18/23] tools/libs/gnttab: Review and update doc comments."):
Quoted 6 lines
Remove some stray xc references.
While I'm not convinced by javadoc/doxygen cause the existing comments which appear to use that syntax to have the appropriate /** marker.
Also fix a typo in a code comment.
While you're here you might
tools/libs/gnttab/linux.c void *osdep_gnttab_grant_map(xengnttab_handle *xgt, · line 136
Quoted 6 lines
tools/libs/gnttab/linux.c +0
-0@@ -136,7 +136,7 @@ void *osdep_gnttab_grant_map(xengnttab_handle *xgt,* swapped out. Since the paging daemon may be in the same domain\
, the
tools/libs/gnttab/linux.c void *osdep_gnttab_grant_map(xengnttab_handle *xgt,
Quoted 3 lines
tools/libs/gnttab/linux.c +0
-1* hypercall cannot block without causing a deadlock. * -* Because there are no notificaitons when the page is swapped in\
, wait
tools/libs/gnttab/linux.c void *osdep_gnttab_grant_map(xengnttab_handle *xgt, · line 139
Quoted 1 line
tools/libs/gnttab/linux.c +1
-0+* Because there are no notifications when the page is swapped in\
, wait
tools/libs/gnttab/linux.c void *osdep_gnttab_grant_map(xengnttab_handle *xgt, · line 140
Quoted 1 line
tools/libs/gnttab/linux.c +0
-0* a bit before retrying, and hope that the page will arrive even\
tually.
tools/libs/gnttab/linux.c void *osdep_gnttab_grant_map(xengnttab_handle *xgt, · line 141
Quoted 1 line
tools/libs/gnttab/linux.c +0
-0*/
rewrap this.
Ian.
PATCH v5 19/23 tools/libs/call: Update some log messages to not refer to xc.
In reply to Ian Campbell--- tools/libs/call/linux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/libs/call/linux.c +2 -2
@@ -88,7 +88,7 @@ void *osdep_alloc_pages(xencall_handle *xcall, unsigned int npages) p =mmap (NULL , size,PROT_READ |PROT_WRITE ,MAP_PRIVATE |MAP_ANONYMOUS |MAP_LOCKED ,-1 ,0 );if ( p ==MAP_FAILED ) { -PERROR ("xc_alloc_hypercall_buffer: mmap failed" ); +PERROR ("alloc_pages: mmap failed" );return NULL ; }
@@ -97,7 +97,7 @@ void *osdep_alloc_pages(xencall_handle *xcall, unsigned int npages) rc =madvise (p, npages *PAGE_SIZE ,MADV_DONTFORK );if ( rc <0 ) { -PERROR ("xc_alloc_hypercall_buffer: madvise failed" ); +PERROR ("alloc_pages: madvise failed" ); goto out; }
Signature · 1 line
2.1.4
Re: [PATCH XEN v5 19/23] tools/libs/call: Update some log messages to not refer to xc.
Quoted 2 lines · Ian Campbell
Signed-off-by Ian Campbell <[email protected]>Acked-by Wei Liu <[email protected]>
I agree with the sentiment, but the error message refer to the libxencall entry API, so a developer can match it back to the call in their code.
~Andrew
Quoted 26 lines
--- tools/libs/call/linux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)tools/libs/call/linux.c +2
-2@@ -88,7 +88,7 @@ void *osdep_alloc_pages(xencall_handle *xcall, unsigned int npages) p =mmap (NULL , size,PROT_READ |PROT_WRITE ,MAP_PRIVATE |MAP_ANONYMOUS |MAP_LOCKED ,-1 ,0 );if ( p ==MAP_FAILED ) { -PERROR ("xc_alloc_hypercall_buffer: mmap failed" ); +PERROR ("alloc_pages: mmap failed" );return NULL ; }@@ -97,7 +97,7 @@ void *osdep_alloc_pages(xencall_handle *xcall, unsigned int npages) rc =madvise (p, npages *PAGE_SIZE ,MADV_DONTFORK );if ( rc <0 ) { -PERROR ("xc_alloc_hypercall_buffer: madvise failed" ); +PERROR ("alloc_pages: madvise failed" ); goto out; }
Re: [PATCH XEN v5 19/23] tools/libs/call: Update some log messages to not refer to xc.
Quoted 7 lines · Andrew Cooper
Quoted 2 lines · Ian Campbell
Signed-off-by Ian Campbell <[email protected]>Acked-by Wei Liu <[email protected]>I agree with the sentiment, but the error message refer to the libxencall entry API, so a developer can match it back to the call in their code.
The PERROR will prepend "xencall" onto the message.
This osdep_alloc_pages can be called from either xencall_alloc_buffer_pages or xencall_alloc_buffer, so I don't think it is possible to make them more specific than that "xencall: alloc_pages". (The old message was similarly misleading in that regard)
Ian.
Quoted 24 lines
~Andrew
Quoted 21 lines
---
tools/libs/call/linux.c | 4 ++--1 file changed, 2 insertions(+), 2 deletions(-)tools/libs/call/linux.c +1
-1@@ -88,7 +88,7 @@ void *osdep_alloc_pages(xencall_handle *xcall, unsigned int npages) p = mmap(NULL, size, PROT_READ|PROT_WRITE,MAP_PRIVATE |MAP_ANONYMOUS |MAP_LOCKED ,-1 ,0 ); if ( p == MAP_FAILED ) { - PERROR("xc_alloc_hypercall_buffer: mmap failed"); + PERROR("alloc_pages: mmap failed"); return NULL;}
tools/libs/call/linux.c +0
-0@@ -97,7 +97,7 @@ void *osdep_alloc_pages(xencall_handle *xcall, unsigned int npages)
Quoted 9 lines
Quoted 8 lines
tools/libs/call/linux.c +1
-1rc = madvise(p, npages * PAGE_SIZE, MADV_DONTFORK); if ( rc < 0 ) { - PERROR("xc_alloc_hypercall_buffer: madvise failed"); + PERROR("alloc_pages: madvise failed"); goto out; }
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
PATCH v5 20/23 tools/libs/call: Avoid xc_memalign in netbsd and solaris backends
In reply to Ian CampbellThese are already arch specific, so just use the appropriate interfaces (as determined by looking at the xc_memalign backend).
--- tools/libs/call/netbsd.c | 4 ++-- tools/libs/call/solaris.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
tools/libs/call/netbsd.c +2 -2
@@ -74,8 +74,8 @@ void *osdep_alloc_hypercall_buffer(xencall_handle *xcall, unsigned int npages)size_t size = npages *XC_PAGE_SIZE ;void *p; - p =xc_memalign (xcall,XC_PAGE_SIZE , size); -if (!p) + ret =posix_memalign (&p,XC_PAGE_SIZE , size); +if ( ret !=0 || !p )return NULL ;if (mlock (p, size) <0 )
tools/libs/call/solaris.c +1 -1
@@ -71,7 +71,7 @@ int osdep_xencall_close(xencall_handle *xcall)void *osdep_alloc_hypercall_buffer (xencall_handle *xcall,unsigned int npages) { -return xc_memalign (xcall,XC_PAGE_SIZE , npages *XC_PAGE_SIZE ); +return memalign (XC_PAGE_SIZE , npages *XC_PAGE_SIZE ); } void osdep_free_hypercall_buffer(xencall_handle *xcall, void *ptr,
Signature · 1 line
2.1.4
PATCH v5 21/23 tools/libs/foreignmemory: Mention restrictions on fork in docs.
In reply to Ian Campbell--- tools/libs/foreignmemory/include/xenforeignmemory.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
tools/libs/foreignmemory/include/xenforeignmemory.h +6 -1
@@ -32,7 +32,12 @@ typedef struct xentoollog_logger xentoollog_logger;typedef struct xenforeignmemory_handle xenforeignmemory_handle ;/* -* Return a handle onto the hypercall driver. Logs errors. +* Return a handle onto the foreign memory mapping driver. Logs errors. +* +* Note: After fork a child process must not use any opened handle +* inherited from their parent. Any existing mappings should be +* assumed to become invalid. Therefore children must open a new +* handle and make new mappings if necessary. */ xenforeignmemory_handle *xenforeignmemory_open (xentoollog_logger *logger,unsigned open_flags);
Signature · 1 line
2.1.4
Re: [PATCH XEN v5 21/23] tools/libs/foreignmemory: Mention restrictions on fork in docs.
Ian Campbell writes ("[PATCH XEN v5 21/23] tools/libs/foreignmemory: Mention restrictions on fork in docs."):
Quoted 2 lines
Signed-off-by Ian Campbell <[email protected]>Acked-by Wei Liu <[email protected]>
Oh, good.
Quoted 8 lines
/*
- * Return a handle onto the hypercall driver. Logs errors.
+ * Return a handle onto the foreign memory mapping driver. Logs errors.
+ *
+ * Note: After fork a child process must not use any opened handle
+ * inherited from their parent. Any existing mappings should be
+ * assumed to become invalid. Therefore children must open a new
+ * handle and make new mappings if necessary.
However, you still need to say how to reclaim the virtual address space. (See my comments on the gntmap API.)
Ian.
PATCH v5 22/23 tools: Update CFLAGS for qemu-xen to allow it to use new libraries
In reply to Ian CampbellThis means adding -L for libxen{evtchn,gnttab,foreignmemory} so that it can link them directly (rather than using the libxenctrl compat layer exposed via -rpath-link). Also add -I for libxenforeignmemory.
--- tools/Makefile | 4 ++++ 1 file changed, 4 insertions(+)
tools/Makefile +4 -0
@@ -255,12 +255,16 @@ subdir-all-qemu-xen-dir: qemu-xen-dir-find -I$(XEN_ROOT)/tools/libs/toollog/include \ -I$(XEN_ROOT)/tools/libs/evtchn/include \ -I$(XEN_ROOT)/tools/libs/gnttab/include \ + -I$(XEN_ROOT)/tools/libs/foreignmemory/include \ -I$(XEN_ROOT)/tools/libxc/include \ -I$(XEN_ROOT)/tools/xenstore/include \ -I$(XEN_ROOT)/tools/xenstore/compat/include \ $(EXTRA_CFLAGS_QEMU_XEN)" \ --extra-ldflags="-L$(XEN_ROOT)/tools/libxc \ -L$(XEN_ROOT)/tools/xenstore \ + -L$(XEN_ROOT)/tools/libs/evtchn \ + -L$(XEN_ROOT)/tools/libs/gnttab \ + -L$(XEN_ROOT)/tools/libs/foreignmemory \ -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/toollog \ -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/evtchn \ -Wl,-rpath-link=$(XEN_ROOT)/tools/libs/gnttab \
Signature · 1 line
2.1.4
PATCH v5 23/23 HACK: Update Config.mk to pull all the right bits from my xenbits trees
In reply to Ian Campbellv4: Config.mk instead of .config
--- Config.mk | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
Config.mk +10 -10
@@ -242,20 +242,20 @@ endif ifeq ($(GIT_HTTP),y) OVMF_UPSTREAM_URL ?= http://xenbits.xen.org/git-http/ovmf.git -QEMU_UPSTREAM_URL ?= http://xenbits.xen.org/git-http/qemu-xen.git -QEMU_TRADITIONAL_URL ?= http://xenbits.xen.org/git-http/qemu-xen-traditional.git +QEMU_UPSTREAM_URL ?= http://xenbits.xen.org/git-http/people/ianc/libxenctrl-split/qemu-xen.git +QEMU_TRADITIONAL_URL ?= http://xenbits.xen.org/git-http/people/ianc/libxenctrl-split/qemu-xen-traditional.git SEABIOS_UPSTREAM_URL ?= http://xenbits.xen.org/git-http/seabios.git -MINIOS_UPSTREAM_URL ?= http://xenbits.xen.org/git-http/mini-os.git +MINIOS_UPSTREAM_URL ?= http://xenbits.xen.org/git-http/people/ianc/libxenctrl-split/mini-os.git else OVMF_UPSTREAM_URL ?= git://xenbits.xen.org/ovmf.git -QEMU_UPSTREAM_URL ?= git://xenbits.xen.org/qemu-xen.git -QEMU_TRADITIONAL_URL ?= git://xenbits.xen.org/qemu-xen-traditional.git +QEMU_UPSTREAM_URL ?= git://xenbits.xen.org/people/ianc/libxenctrl-split/qemu-xen.git +QEMU_TRADITIONAL_URL ?= git://xenbits.xen.org/people/ianc/libxenctrl-split/qemu-xen-traditional.git SEABIOS_UPSTREAM_URL ?= git://xenbits.xen.org/seabios.git -MINIOS_UPSTREAM_URL ?= git://xenbits.xen.org/mini-os.git +MINIOS_UPSTREAM_URL ?= git://xenbits.xen.org/people/ianc/libxenctrl-split/mini-os.git endif -OVMF_UPSTREAM_REVISION ?= af9785a9ed61daea52b47f0bf448f1f228beee1e -QEMU_UPSTREAM_REVISION ?= master -MINIOS_UPSTREAM_REVISION ?= 256035e01a1aa5739e34f245f3b1e9e8ee204210 +OVMF_UPSTREAM_REVISION ?= cb9a7ebabcd6b8a49dc0854b2f9592d732b5afbd +QEMU_UPSTREAM_REVISION ?= origin/v5 +MINIOS_UPSTREAM_REVISION ?= origin/v5 # Thu Jul 23 11:08:38 2015 +0100 # arm: interrupt controller
@@ -266,7 +266,7 @@ SEABIOS_UPSTREAM_REVISION ?= rel-1.8.2 ETHERBOOT_NICS ?= rtl8139 8086100e -QEMU_TRADITIONAL_REVISION ?= bc00cad75d8bcc3ba696992bec219c21db8406aa +QEMU_TRADITIONAL_REVISION ?= origin/v5 # Tue Mar 11 10:19:23 2014 +0000 # block-vvfat: fix resource leaks in read_directory()
Signature · 1 line
2.1.4
Ian Campbell writes ("[PATCH XEN v5 00/23] Begin to disentangle libxenctrl and provide some stable libraries"):
Quoted 2 lines
We intend to stabilise some parts of the libxenctrl interface by splitting out some functionality into separate stable libraries.
I have, I think, now reviewed all of the proposed new stable APIs. This is good work, thanks.
I have made a few comments on the individual patches, mostly about error handling (ah, my favourite topic).
Ian.
v5 cover Begin to disentangle libxenctrl and provide some stable libraries
In reply to Ian CampbellWe intend to stabilise some parts of the libxenctrl interface by splitting out some functionality into separate stable libraries.
This is the qemu-xen part of the first phase of that change.
This mail is (or is intended to be) a reply to a "0/<VARIOUS>" super-intro mail covering all of the related patch series and which contains more details.
Ian Campbell (9):
xen_console: correctly cleanup primary console on teardown.
xen: Switch to libxenevtchn interface for compat shims.
xen: Switch to libxengnttab interface for compat shims.
xen: Switch uses of xc_map_foreign_range into xc_map_foreign_bulk
xen: Switch uses of xc_map_foreign_pages into xc_map_foreign_bulk
xen: Switch uses of xc_map_foreign_bulk to use libxenforeignmemory
API.
xen: Use stable library interfaces when they are available.
xen: domainbuild: reopen libxenctrl interface after forking for domain
watcher.
xen: make it possible to build without the Xen PV domain builder
configure | 70 +++++++++++++++++++++++ hw/block/xen_disk.c | 38 +++++++------ hw/char/xen_console.c | 20 +++---- hw/display/xenfb.c | 22 ++++--- hw/net/xen_nic.c | 18 +++--- hw/xen/xen_backend.c | 44 +++++++------- hw/xenpv/Makefile.objs | 4 +- hw/xenpv/xen_domainbuild.c | 9 ++- hw/xenpv/xen_machine_pv.c | 15 +++-- include/hw/xen/xen_backend.h | 5 +- include/hw/xen/xen_common.h | 133 +++++++++++++++++++++++++++++++++---------- xen-common.c | 6 ++ xen-hvm.c | 53 +++++++++-------- xen-mapcache.c | 6 +- 14 files changed, 307 insertions(+), 136 deletions(-)
Signature · 1 line
2.1.4
PATCH v5 1/9 xen_console: correctly cleanup primary console on teardown.
All of the work in con_disconnect applies to the primary console case (when xendev->dev is NULL). Therefore remove the early check and bail and allow it to fall through. All of the existing code is correctly conditional already.
The ->dev and ->gnttabdev handles are either both set or neither. For consistency with con_initialise() with to the former here too.
With this con_initialise and con_disconnect now mirror each other.
Fix up a hard tab in the function while editing.
---
v4: New patch based on feedback to "xen: Switch uses of xc_map_foreign_bulk to use libxenforeignmemory API."
--- hw/char/xen_console.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
hw/char/xen_console.c +2 -5
@@ -265,9 +265,6 @@ static void con_disconnect(struct XenDevice *xendev) { struct XenConsole *con = container_of(xendev, struct XenConsole, xendev); -if (!xendev->dev) { -return ; - }if (con->chr) {qemu_chr_add_handlers (con->chr,NULL ,NULL ,NULL ,NULL );qemu_chr_fe_release (con->chr);
@@ -275,12 +272,12 @@ static void con_disconnect(struct XenDevice *xendev)xen_be_unbind_evtchn (&con->xendev);if (con->sring) { -if (!xendev->gnttabdev) { +if (!xendev->dev) {munmap (con->sring,XC_PAGE_SIZE ); }else {xc_gnttab_munmap (xendev->gnttabdev, con->sring,1 ); } - con->sring =NULL ; + con->sring =NULL ; } }
Signature · 1 line
2.1.4
PATCH v5 1/9 xen_console: correctly cleanup primary console on teardown.
In reply to Ian CampbellAll of the work in con_disconnect applies to the primary console case (when xendev->dev is NULL). Therefore remove the early check and bail and allow it to fall through. All of the existing code is correctly conditional already.
The ->dev and ->gnttabdev handles are either both set or neither. For consistency with con_initialise() with to the former here too.
With this con_initialise and con_disconnect now mirror each other.
Fix up a hard tab in the function while editing.
---
v4: New patch based on feedback to "xen: Switch uses of xc_map_foreign_bulk to use libxenforeignmemory API."
--- hw/char/xen_console.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
hw/char/xen_console.c +2 -5
@@ -265,9 +265,6 @@ static void con_disconnect(struct XenDevice *xendev) { struct XenConsole *con = container_of(xendev, struct XenConsole, xendev); -if (!xendev->dev) { -return ; - }if (con->chr) {qemu_chr_add_handlers (con->chr,NULL ,NULL ,NULL ,NULL );qemu_chr_fe_release (con->chr);
@@ -275,12 +272,12 @@ static void con_disconnect(struct XenDevice *xendev)xen_be_unbind_evtchn (&con->xendev);if (con->sring) { -if (!xendev->gnttabdev) { +if (!xendev->dev) {munmap (con->sring,XC_PAGE_SIZE ); }else {xc_gnttab_munmap (xendev->gnttabdev, con->sring,1 ); } - con->sring =NULL ; + con->sring =NULL ; } }
Signature · 1 line
2.1.4
PATCH v5 2/9 xen: Switch to libxenevtchn interface for compat shims.
In reply to Ian CampbellIn Xen 4.7 we are refactoring parts libxenctrl into a number of separate libraries which will provide backward and forward API and ABI compatiblity.
One such library will be libxenevtchn which provides access to event channels.
In preparation for this switch the compatibility layer in xen_common.h (which support building with older versions of Xen) to use what will be the new library API. This means that the evtchn shim will disappear for versions of Xen which include libxenevtchn.
To simplify things for the <= 4.0.0 support we wrap the int fd in a malloc(sizeof int) such that the handle is always a pointer. This leads to less typedef headaches and the need for XC_HANDLER_INITIAL_VALUE etc for these interfaces.
Note that this patch does not add any support for actually using libxenevtchn, it just adjusts the existing shims.
Note that xc_evtchn_alloc_unbound functionality remains in libxenctrl, since that functionality is not exposed by /dev/xen/evtchn.
---
v4: Ran checkpatch, fixed all errors
Allocate correct size for handle (i.e. not size of the ptr)
--- hw/xen/xen_backend.c | 31 ++++++++++++++++--------------- include/hw/xen/xen_backend.h | 2 +- include/hw/xen/xen_common.h | 44 ++++++++++++++++++++++++++++++++++---------- xen-hvm.c | 25 +++++++++++++------------ 4 files changed, 64 insertions(+), 38 deletions(-)
hw/xen/xen_backend.c +16 -15
@@ -243,19 +243,19 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev, xendev->debug = debug; xendev->local_port =-1 ; - xendev->evtchndev =xen_xc_evtchn_open (NULL ,0 ); -if (xendev->evtchndev ==XC_HANDLER_INITIAL_VALUE ) { + xendev->evtchndev =xenevtchn_open (NULL ,0 ); +if (xendev->evtchndev ==NULL ) {xen_be_printf (NULL ,0 ,"can't open evtchn device\n" );g_free (xendev);return NULL ; } -fcntl (xc_evtchn_fd (xendev->evtchndev),F_SETFD ,FD_CLOEXEC ); +fcntl (xenevtchn_fd (xendev->evtchndev),F_SETFD ,FD_CLOEXEC );if (ops->flags &DEVOPS_FLAG_NEED_GNTDEV ) { xendev->gnttabdev =xen_xc_gnttab_open (NULL ,0 );if (xendev->gnttabdev ==XC_HANDLER_INITIAL_VALUE ) {xen_be_printf (NULL ,0 ,"can't open gnttab device\n" ); -xc_evtchn_close (xendev->evtchndev); +xenevtchn_close (xendev->evtchndev);g_free (xendev);return NULL ; }
@@ -306,8 +306,8 @@ static struct XenDevice *xen_be_del_xendev(int dom, int dev)g_free (xendev->fe); } -if (xendev->evtchndev !=XC_HANDLER_INITIAL_VALUE ) { -xc_evtchn_close (xendev->evtchndev); +if (xendev->evtchndev !=NULL ) { +xenevtchn_close (xendev->evtchndev); }if (xendev->gnttabdev !=XC_HANDLER_INITIAL_VALUE ) {xc_gnttab_close (xendev->gnttabdev);
@@ -691,13 +691,14 @@ static void xen_be_evtchn_event(void *opaque)struct XenDevice *xendev = opaque;evtchn_port_t port; - port =xc_evtchn_pending (xendev->evtchndev); + port =xenevtchn_pending (xendev->evtchndev);if (port != xendev->local_port) { -xen_be_printf (xendev,0 ,"xc_evtchn_pending returned %d (expected %d)\n" , +xen_be_printf (xendev,0 , +"xenevtchn_pending returned %d (expected %d)\n" , port, xendev->local_port);return ; } -xc_evtchn_unmask (xendev->evtchndev, port); +xenevtchn_unmask (xendev->evtchndev, port);if (xendev->ops->event) { xendev->ops->event (xendev);
@@ -740,14 +741,14 @@ int xen_be_bind_evtchn(struct XenDevice *xendev)if (xendev->local_port !=-1 ) {return 0 ; } - xendev->local_port =xc_evtchn_bind_interdomain + xendev->local_port =xenevtchn_bind_interdomain (xendev->evtchndev, xendev->dom, xendev->remote_port);if (xendev->local_port ==-1 ) { -xen_be_printf (xendev,0 ,"xc_evtchn_bind_interdomain failed\n" ); +xen_be_printf (xendev,0 ,"xenevtchn_bind_interdomain failed\n" );return -1 ; }xen_be_printf (xendev,2 ,"bind evtchn port %d\n" , xendev->local_port); -qemu_set_fd_handler (xc_evtchn_fd (xendev->evtchndev), +qemu_set_fd_handler (xenevtchn_fd (xendev->evtchndev), xen_be_evtchn_event,NULL , xendev);return 0 ; }
@@ -757,15 +758,15 @@ void xen_be_unbind_evtchn(struct XenDevice *xendev)if (xendev->local_port ==-1 ) {return ; } -qemu_set_fd_handler (xc_evtchn_fd (xendev->evtchndev),NULL ,NULL ,NULL ); -xc_evtchn_unbind (xendev->evtchndev, xendev->local_port); +qemu_set_fd_handler (xenevtchn_fd (xendev->evtchndev),NULL ,NULL ,NULL ); +xenevtchn_unbind (xendev->evtchndev, xendev->local_port);xen_be_printf (xendev,2 ,"unbind evtchn port %d\n" , xendev->local_port); xendev->local_port =-1 ; }int xen_be_send_notify (struct XenDevice *xendev) { -return xc_evtchn_notify (xendev->evtchndev, xendev->local_port); +return xenevtchn_notify (xendev->evtchndev, xendev->local_port); }/*
include/hw/xen/xen_backend.h +1 -1
@@ -46,7 +46,7 @@ struct XenDevice {int remote_port;int local_port; -XenEvtchn evtchndev; +xenevtchn_handle *evtchndev;XenGnttab gnttabdev;struct XenDevOps *ops;
include/hw/xen/xen_common.h +34 -10
68 lines not on this page · raw message
xen-hvm.c +13 -12
@@ -109,7 +109,7 @@ typedef struct XenIOState {/* evtchn local port for buffered io */ evtchn_port_t bufioreq_local_port;/* the evtchn fd for polling */ -XenEvtchn xce_handle; +xenevtchn_handle *xce_handle;/* which vcpu we are serving */ int send_vcpu;
@@ -714,7 +714,7 @@ static ioreq_t *cpu_get_ioreq(XenIOState *state)int i;evtchn_port_t port; - port =xc_evtchn_pending (state->xce_handle); + port =xenevtchn_pending (state->xce_handle);if (port == state->bufioreq_local_port) {timer_mod (state->buffered_io_timer,BUFFER_IO_MAX_DELAY +qemu_clock_get_ms (QEMU_CLOCK_REALTIME ));
@@ -733,7 +733,7 @@ static ioreq_t *cpu_get_ioreq(XenIOState *state) }/* unmask the wanted port again */ -xc_evtchn_unmask (state->xce_handle, port); +xenevtchn_unmask (state->xce_handle, port);/* get the io packet from shared memory */ state->send_vcpu = i;
@@ -1040,7 +1040,7 @@ static void handle_buffered_io(void *opaque) BUFFER_IO_MAX_DELAY + qemu_clock_get_ms(QEMU_CLOCK_REALTIME)); }else {timer_del (state->buffered_io_timer); -xc_evtchn_unmask (state->xce_handle, state->bufioreq_local_port); +xenevtchn_unmask (state->xce_handle, state->bufioreq_local_port); } }
@@ -1084,7 +1084,8 @@ static void cpu_handle_ioreq(void *opaque) } req->state =STATE_IORESP_READY ; -xc_evtchn_notify (state->xce_handle, state->ioreq_local_port[state->send_vcpu]); +xenevtchn_notify (state->xce_handle, + state->ioreq_local_port[state->send_vcpu]); } }
@@ -1092,8 +1093,8 @@ static void xen_main_loop_prepare(XenIOState *state) {int evtchn_fd =-1 ; -if (state->xce_handle !=XC_HANDLER_INITIAL_VALUE ) { - evtchn_fd =xc_evtchn_fd (state->xce_handle); +if (state->xce_handle !=NULL ) { + evtchn_fd =xenevtchn_fd (state->xce_handle); } state->buffered_io_timer = timer_new_ms(QEMU_CLOCK_REALTIME, handle_buffered_io,
@@ -1131,7 +1132,7 @@ static void xen_exit_notifier(Notifier *n, void *data) {XenIOState *state =container_of (n, XenIOState, exit); -xc_evtchn_close (state->xce_handle); +xenevtchn_close (state->xce_handle);xs_daemon_close (state->xenstore); }
@@ -1200,8 +1201,8 @@ int xen_hvm_init(PCMachineState *pcms, state =g_malloc0 (sizeof (XenIOState)); - state->xce_handle =xen_xc_evtchn_open (NULL ,0 ); -if (state->xce_handle ==XC_HANDLER_INITIAL_VALUE ) { + state->xce_handle =xenevtchn_open (NULL ,0 ); +if (state->xce_handle ==NULL ) {perror ("xen: event channel open" );return -1 ; }
@@ -1281,7 +1282,7 @@ int xen_hvm_init(PCMachineState *pcms,/* FIXME: how about if we overflow the page here? */ for (i =0 ; i < max_cpus; i++) { - rc =xc_evtchn_bind_interdomain (state->xce_handle, xen_domid, + rc =xenevtchn_bind_interdomain (state->xce_handle, xen_domid,xen_vcpu_eport (state->shared_page, i));if (rc ==-1 ) {fprintf (stderr,"shared evtchn %d bind error %d\n" , i, errno);
@@ -1290,7 +1291,7 @@ int xen_hvm_init(PCMachineState *pcms, state->ioreq_local_port[i] = rc; } - rc =xc_evtchn_bind_interdomain (state->xce_handle, xen_domid, + rc =xenevtchn_bind_interdomain (state->xce_handle, xen_domid, bufioreq_evtchn);if (rc ==-1 ) {fprintf (stderr,"buffered evtchn bind error %d\n" , errno);
Signature · 1 line
2.1.4
PATCH v5 3/9 xen: Switch to libxengnttab interface for compat shims.
In reply to Ian CampbellIn Xen 4.7 we are refactoring parts libxenctrl into a number of separate libraries which will provide backward and forward API and ABI compatiblity.
One such library will be libxengnttab which provides access to grant tables.
In preparation for this switch the compatibility layer in xen_common.h (which support building with older versions of Xen) to use what will be the new library API. This means that the gnttab shim will disappear for versions of Xen which include libxengnttab.
To simplify things for the <= 4.0.0 support we wrap the int fd in a malloc(sizeof int) such that the handle is always a pointer. This leads to less typedef headaches and the need for XC_HANDLER_INITIAL_VALUE etc for these interfaces.
Note that this patch does not add any support for actually using libxengnttab, it just adjusts the existing shims.
---
v4: Ran checkpatch, fixed all errors
Allocate correct size for handle (i.e. not size of the ptr) Rebase onto "xen_console: correctly cleanup primary console on teardown."
v5: Rebase over b4f72e31b924 "hw/net/xen_nic.c: Free 'netdev->txs' when map 'netdev->rxs' fails" which added a new gnttab_munmap.
--- hw/block/xen_disk.c | 38 ++++++++++++++++++++------------------ hw/char/xen_console.c | 4 ++-- hw/net/xen_nic.c | 18 +++++++++--------- hw/xen/xen_backend.c | 10 +++++----- include/hw/xen/xen_backend.h | 2 +- include/hw/xen/xen_common.h | 42 ++++++++++++++++++++++++++++++++---------- 6 files changed, 69 insertions(+), 45 deletions(-)
hw/block/xen_disk.c +20 -18
@@ -173,11 +173,11 @@ static gint int_cmp(gconstpointer a, gconstpointer b, gpointer user_data)static void destroy_grant (gpointer pgnt) {PersistentGrant *grant = pgnt; -XenGnttab gnt = grant->blkdev->xendev.gnttabdev; +xengnttab_handle *gnt = grant->blkdev->xendev.gnttabdev; -if (xc_gnttab_munmap (gnt, grant->page,1 ) !=0 ) { +if (xengnttab_munmap (gnt, grant->page,1 ) !=0 ) {xen_be_printf (&grant->blkdev->xendev,0 , -"xc_gnttab_munmap failed: %s\n" , +"xengnttab_munmap failed: %s\n" ,strerror (errno)); } grant->blkdev->persistent_gnt_count--;
@@ -190,11 +190,11 @@ static void remove_persistent_region(gpointer data, gpointer dev) {PersistentRegion *region = data;struct XenBlkDev *blkdev = dev; -XenGnttab gnt = blkdev->xendev.gnttabdev; +xengnttab_handle *gnt = blkdev->xendev.gnttabdev; -if (xc_gnttab_munmap (gnt, region->addr, region->num) !=0 ) { +if (xengnttab_munmap (gnt, region->addr, region->num) !=0 ) {xen_be_printf (&blkdev->xendev,0 , -"xc_gnttab_munmap region %p failed: %s\n" , +"xengnttab_munmap region %p failed: %s\n" , region->addr,strerror (errno)); } xen_be_printf(&blkdev->xendev, 3,
@@ -329,7 +329,7 @@ err:static void ioreq_unmap (struct ioreq *ioreq) { -XenGnttab gnt = ioreq->blkdev->xendev.gnttabdev; +xengnttab_handle *gnt = ioreq->blkdev->xendev.gnttabdev;int i;if (ioreq->num_unmap ==0 || ioreq->mapped ==0 ) {
@@ -339,8 +339,9 @@ static void ioreq_unmap(struct ioreq *ioreq)if (!ioreq->pages) {return ; } -if (xc_gnttab_munmap (gnt, ioreq->pages, ioreq->num_unmap) !=0 ) { -xen_be_printf (&ioreq->blkdev->xendev,0 ,"xc_gnttab_munmap failed: %s\n" , +if (xengnttab_munmap (gnt, ioreq->pages, ioreq->num_unmap) !=0 ) { +xen_be_printf (&ioreq->blkdev->xendev,0 , +"xengnttab_munmap failed: %s\n" ,strerror (errno)); } ioreq->blkdev->cnt_map -= ioreq->num_unmap;
@@ -350,8 +351,9 @@ static void ioreq_unmap(struct ioreq *ioreq)if (!ioreq->page[i]) {continue ; } -if (xc_gnttab_munmap (gnt, ioreq->page[i],1 ) !=0 ) { -xen_be_printf (&ioreq->blkdev->xendev,0 ,"xc_gnttab_munmap failed: %s\n" , +if (xengnttab_munmap (gnt, ioreq->page[i],1 ) !=0 ) { +xen_be_printf (&ioreq->blkdev->xendev,0 , +"xengnttab_munmap failed: %s\n" ,strerror (errno)); } ioreq->blkdev->cnt_map--;
@@ -363,7 +365,7 @@ static void ioreq_unmap(struct ioreq *ioreq)static int ioreq_map (struct ioreq *ioreq) { -XenGnttab gnt = ioreq->blkdev->xendev.gnttabdev; +xengnttab_handle *gnt = ioreq->blkdev->xendev.gnttabdev;uint32_t domids[BLKIF_MAX_SEGMENTS_PER_REQUEST ];uint32_t refs[BLKIF_MAX_SEGMENTS_PER_REQUEST ];void *page[BLKIF_MAX_SEGMENTS_PER_REQUEST ];
@@ -414,7 +416,7 @@ static int ioreq_map(struct ioreq *ioreq) }if (batch_maps && new_maps) { - ioreq->pages =xc_gnttab_map_grant_refs + ioreq->pages =xengnttab_map_grant_refs (gnt, new_maps, domids, refs, ioreq->prot);if (ioreq->pages ==NULL ) { xen_be_printf(&ioreq->blkdev->xendev, 0,
@@ -430,7 +432,7 @@ static int ioreq_map(struct ioreq *ioreq) ioreq->blkdev->cnt_map += new_maps; }else if (new_maps) {for (i =0 ; i < new_maps; i++) { - ioreq->page[i] =xc_gnttab_map_grant_ref + ioreq->page[i] =xengnttab_map_grant_ref (gnt, domids[i], refs[i], ioreq->prot);if (ioreq->page[i] ==NULL ) { xen_be_printf(&ioreq->blkdev->xendev, 0,
@@ -763,9 +765,9 @@ static void blk_alloc(struct XenDevice *xendev)if (xen_mode !=XEN_EMULATE ) { batch_maps =1 ; } -if (xc_gnttab_set_max_grants (xendev->gnttabdev, +if (xengnttab_set_max_grants (xendev->gnttabdev,MAX_GRANTS (max_requests,BLKIF_MAX_SEGMENTS_PER_REQUEST )) <0 ) { -xen_be_printf (xendev,0 ,"xc_gnttab_set_max_grants failed: %s\n" , +xen_be_printf (xendev,0 ,"xengnttab_set_max_grants failed: %s\n" ,strerror (errno)); } }
@@ -972,7 +974,7 @@ static int blk_connect(struct XenDevice *xendev) } } - blkdev->sring =xc_gnttab_map_grant_ref (blkdev->xendev.gnttabdev, + blkdev->sring =xengnttab_map_grant_ref (blkdev->xendev.gnttabdev, blkdev->xendev.dom, blkdev->ring_ref,PROT_READ |PROT_WRITE );
@@ -1037,7 +1039,7 @@ static void blk_disconnect(struct XenDevice *xendev)xen_be_unbind_evtchn (&blkdev->xendev);if (blkdev->sring) { -xc_gnttab_munmap (blkdev->xendev.gnttabdev, blkdev->sring,1 ); +xengnttab_munmap (blkdev->xendev.gnttabdev, blkdev->sring,1 ); blkdev->cnt_map--; blkdev->sring =NULL ; }
hw/char/xen_console.c +2 -2
@@ -233,7 +233,7 @@ static int con_initialise(struct XenDevice *xendev)PROT_READ |PROT_WRITE , con->ring_ref); }else { - con->sring =xc_gnttab_map_grant_ref (xendev->gnttabdev, con->xendev.dom, + con->sring =xengnttab_map_grant_ref (xendev->gnttabdev, con->xendev.dom, con->ring_ref,PROT_READ |PROT_WRITE ); }
@@ -275,7 +275,7 @@ static void con_disconnect(struct XenDevice *xendev)if (!xendev->dev) {munmap (con->sring,XC_PAGE_SIZE ); }else { -xc_gnttab_munmap (xendev->gnttabdev, con->sring,1 ); +xengnttab_munmap (xendev->gnttabdev, con->sring,1 ); } con->sring =NULL ; }
hw/net/xen_nic.c +9 -9
@@ -168,7 +168,7 @@ static void net_tx_packets(struct XenNetDev *netdev) (txreq.flags & NETTXF_more_data) ?" more_data" :"" , (txreq.flags & NETTXF_extra_info) ? " extra_info" : ""); - page =xc_gnttab_map_grant_ref (netdev->xendev.gnttabdev, + page =xengnttab_map_grant_ref (netdev->xendev.gnttabdev, netdev->xendev.dom, txreq.gref,PROT_READ );if (page ==NULL ) {
@@ -190,7 +190,7 @@ static void net_tx_packets(struct XenNetDev *netdev)qemu_send_packet (qemu_get_queue (netdev->nic), page + txreq.offset, txreq.size); } -xc_gnttab_munmap (netdev->xendev.gnttabdev, page,1 ); +xengnttab_munmap (netdev->xendev.gnttabdev, page,1 );net_tx_response (netdev, &txreq,NETIF_RSP_OKAY ); }if (!netdev->tx_work) {
@@ -260,7 +260,7 @@ static ssize_t net_rx_packet(NetClientState *nc, const uint8_t *buf, size_t sizememcpy (&rxreq,RING_GET_REQUEST (&netdev->rx_ring, rc),sizeof (rxreq)); netdev->rx_ring.req_cons = ++rc; - page =xc_gnttab_map_grant_ref (netdev->xendev.gnttabdev, + page =xengnttab_map_grant_ref (netdev->xendev.gnttabdev, netdev->xendev.dom, rxreq.gref,PROT_WRITE );if (page ==NULL ) {
@@ -270,7 +270,7 @@ static ssize_t net_rx_packet(NetClientState *nc, const uint8_t *buf, size_t sizereturn -1 ; }memcpy (page +NET_IP_ALIGN , buf, size); -xc_gnttab_munmap (netdev->xendev.gnttabdev, page,1 ); +xengnttab_munmap (netdev->xendev.gnttabdev, page,1 );net_rx_response (netdev, &rxreq,NETIF_RSP_OKAY ,NET_IP_ALIGN , size,0 );return size;
@@ -342,19 +342,19 @@ static int net_connect(struct XenDevice *xendev)return -1 ; } - netdev->txs =xc_gnttab_map_grant_ref (netdev->xendev.gnttabdev, + netdev->txs =xengnttab_map_grant_ref (netdev->xendev.gnttabdev, netdev->xendev.dom, netdev->tx_ring_ref,PROT_READ |PROT_WRITE );if (!netdev->txs) {return -1 ; } - netdev->rxs =xc_gnttab_map_grant_ref (netdev->xendev.gnttabdev, + netdev->rxs =xengnttab_map_grant_ref (netdev->xendev.gnttabdev, netdev->xendev.dom, netdev->rx_ring_ref,PROT_READ |PROT_WRITE );if (!netdev->rxs) { -xc_gnttab_munmap (netdev->xendev.gnttabdev, netdev->txs,1 ); +xengnttab_munmap (netdev->xendev.gnttabdev, netdev->txs,1 ); netdev->txs =NULL ;return -1 ; }
@@ -379,11 +379,11 @@ static void net_disconnect(struct XenDevice *xendev)xen_be_unbind_evtchn (&netdev->xendev);if (netdev->txs) { -xc_gnttab_munmap (netdev->xendev.gnttabdev, netdev->txs,1 ); +xengnttab_munmap (netdev->xendev.gnttabdev, netdev->txs,1 ); netdev->txs =NULL ; }if (netdev->rxs) { -xc_gnttab_munmap (netdev->xendev.gnttabdev, netdev->rxs,1 ); +xengnttab_munmap (netdev->xendev.gnttabdev, netdev->rxs,1 ); netdev->rxs =NULL ; } }
hw/xen/xen_backend.c +5 -5
@@ -252,15 +252,15 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev,fcntl (xenevtchn_fd (xendev->evtchndev),F_SETFD ,FD_CLOEXEC );if (ops->flags &DEVOPS_FLAG_NEED_GNTDEV ) { - xendev->gnttabdev =xen_xc_gnttab_open (NULL ,0 ); -if (xendev->gnttabdev ==XC_HANDLER_INITIAL_VALUE ) { + xendev->gnttabdev =xengnttab_open (NULL ,0 ); +if (xendev->gnttabdev ==NULL ) {xen_be_printf (NULL ,0 ,"can't open gnttab device\n" );xenevtchn_close (xendev->evtchndev);g_free (xendev);return NULL ; } }else { - xendev->gnttabdev =XC_HANDLER_INITIAL_VALUE ; + xendev->gnttabdev =NULL ; }QTAILQ_INSERT_TAIL (&xendevs, xendev, next);
@@ -309,8 +309,8 @@ static struct XenDevice *xen_be_del_xendev(int dom, int dev)if (xendev->evtchndev !=NULL ) {xenevtchn_close (xendev->evtchndev); } -if (xendev->gnttabdev !=XC_HANDLER_INITIAL_VALUE ) { -xc_gnttab_close (xendev->gnttabdev); +if (xendev->gnttabdev !=NULL ) { +xengnttab_close (xendev->gnttabdev); }QTAILQ_REMOVE (&xendevs, xendev, next);
include/hw/xen/xen_backend.h +1 -1
@@ -47,7 +47,7 @@ struct XenDevice {int local_port;xenevtchn_handle *evtchndev; -XenGnttab gnttabdev; +xengnttab_handle *gnttabdev;struct XenDevOps *ops;QTAILQ_ENTRY (XenDevice) next;
include/hw/xen/xen_common.h +32 -10
68 lines not on this page · raw message
Signature · 1 line
2.1.4
Re: [PATCH QEMU-XEN v5 3/9] xen: Switch to libxengnttab interface for compat shims.
Quoted 17 lines · Ian Campbell
In Xen 4.7 we are refactoring parts libxenctrl into a number of separate libraries which will provide backward and forward API and ABI compatiblity.
One such library will be libxengnttab which provides access to grant tables.
In preparation for this switch the compatibility layer in
xen_common.h(which support building with older versions of Xen) to use what will be the new library API. This means that the gnttab shim will disappear for versions of Xen which include libxengnttab.To simplify things for the <= 4.0.0 support we wrap the int fd in a malloc(sizeof int) such that the handle is always a pointer. This leads to less typedef headaches and the need for
XC_HANDLER_INITIAL_VALUEetc for these interfaces.
Quoted 4 lines
Note that this patch does not add any support for actually using libxengnttab, it just adjusts the existing shims.
Signed-off-by Ian Campbell <[email protected]>
Quoted 365 lines
v4: Ran checkpatch, fixed all errors
Allocate correct size for handle (i.e. not size of the ptr) Rebase onto "xen_console: correctly cleanup primary console on teardown."v5: Rebase over
b4f72e31b924"hw/net/xen_nic.c: Free 'netdev->txs' when map 'netdev->rxs' fails" which added a newgnttab_munmap.--- hw/block/xen_disk.c | 38 ++++++++++++++++++++------------------ hw/char/xen_console.c | 4 ++-- hw/net/xen_nic.c | 18 +++++++++--------- hw/xen/xen_backend.c | 10 +++++----- include/hw/xen/xen_backend.h | 2 +- include/hw/xen/xen_common.h | 42 ++++++++++++++++++++++++++++++++---------- 6 files changed, 69 insertions(+), 45 deletions(-)hw/block/xen_disk.c +20
-18@@ -173,11 +173,11 @@ static gint int_cmp(gconstpointer a, gconstpointer b, gpointer user_data)static void destroy_grant (gpointer pgnt) {PersistentGrant *grant = pgnt; -XenGnttab gnt = grant->blkdev->xendev.gnttabdev; +xengnttab_handle *gnt = grant->blkdev->xendev.gnttabdev; -if (xc_gnttab_munmap (gnt, grant->page,1 ) !=0 ) { +if (xengnttab_munmap (gnt, grant->page,1 ) !=0 ) {xen_be_printf (&grant->blkdev->xendev,0 , -"xc_gnttab_munmap failed: %s\n" , +"xengnttab_munmap failed: %s\n" ,strerror (errno)); } grant->blkdev->persistent_gnt_count--;@@ -190,11 +190,11 @@ static void remove_persistent_region(gpointer data, gpointer dev) {PersistentRegion *region = data;struct XenBlkDev *blkdev = dev; -XenGnttab gnt = blkdev->xendev.gnttabdev; +xengnttab_handle *gnt = blkdev->xendev.gnttabdev; -if (xc_gnttab_munmap (gnt, region->addr, region->num) !=0 ) { +if (xengnttab_munmap (gnt, region->addr, region->num) !=0 ) {xen_be_printf (&blkdev->xendev,0 , -"xc_gnttab_munmap region %p failed: %s\n" , +"xengnttab_munmap region %p failed: %s\n" , region->addr,strerror (errno)); } xen_be_printf(&blkdev->xendev, 3,@@ -329,7 +329,7 @@ err:static void ioreq_unmap (struct ioreq *ioreq) { -XenGnttab gnt = ioreq->blkdev->xendev.gnttabdev; +xengnttab_handle *gnt = ioreq->blkdev->xendev.gnttabdev;int i;if (ioreq->num_unmap ==0 || ioreq->mapped ==0 ) {@@ -339,8 +339,9 @@ static void ioreq_unmap(struct ioreq *ioreq)if (!ioreq->pages) {return ; } -if (xc_gnttab_munmap (gnt, ioreq->pages, ioreq->num_unmap) !=0 ) { -xen_be_printf (&ioreq->blkdev->xendev,0 ,"xc_gnttab_munmap failed: %s\n" , +if (xengnttab_munmap (gnt, ioreq->pages, ioreq->num_unmap) !=0 ) { +xen_be_printf (&ioreq->blkdev->xendev,0 , +"xengnttab_munmap failed: %s\n" ,strerror (errno)); } ioreq->blkdev->cnt_map -= ioreq->num_unmap;@@ -350,8 +351,9 @@ static void ioreq_unmap(struct ioreq *ioreq)if (!ioreq->page[i]) {continue ; } -if (xc_gnttab_munmap (gnt, ioreq->page[i],1 ) !=0 ) { -xen_be_printf (&ioreq->blkdev->xendev,0 ,"xc_gnttab_munmap failed: %s\n" , +if (xengnttab_munmap (gnt, ioreq->page[i],1 ) !=0 ) { +xen_be_printf (&ioreq->blkdev->xendev,0 , +"xengnttab_munmap failed: %s\n" ,strerror (errno)); } ioreq->blkdev->cnt_map--;@@ -363,7 +365,7 @@ static void ioreq_unmap(struct ioreq *ioreq)static int ioreq_map (struct ioreq *ioreq) { -XenGnttab gnt = ioreq->blkdev->xendev.gnttabdev; +xengnttab_handle *gnt = ioreq->blkdev->xendev.gnttabdev;uint32_t domids[BLKIF_MAX_SEGMENTS_PER_REQUEST ];uint32_t refs[BLKIF_MAX_SEGMENTS_PER_REQUEST ];void *page[BLKIF_MAX_SEGMENTS_PER_REQUEST ];@@ -414,7 +416,7 @@ static int ioreq_map(struct ioreq *ioreq) }if (batch_maps && new_maps) { - ioreq->pages =xc_gnttab_map_grant_refs + ioreq->pages =xengnttab_map_grant_refs (gnt, new_maps, domids, refs, ioreq->prot);if (ioreq->pages ==NULL ) { xen_be_printf(&ioreq->blkdev->xendev, 0,@@ -430,7 +432,7 @@ static int ioreq_map(struct ioreq *ioreq) ioreq->blkdev->cnt_map += new_maps; }else if (new_maps) {for (i =0 ; i < new_maps; i++) { - ioreq->page[i] =xc_gnttab_map_grant_ref + ioreq->page[i] =xengnttab_map_grant_ref (gnt, domids[i], refs[i], ioreq->prot);if (ioreq->page[i] ==NULL ) { xen_be_printf(&ioreq->blkdev->xendev, 0,@@ -763,9 +765,9 @@ static void blk_alloc(struct XenDevice *xendev)if (xen_mode !=XEN_EMULATE ) { batch_maps =1 ; } -if (xc_gnttab_set_max_grants (xendev->gnttabdev, +if (xengnttab_set_max_grants (xendev->gnttabdev,MAX_GRANTS (max_requests,BLKIF_MAX_SEGMENTS_PER_REQUEST )) <0 ) { -xen_be_printf (xendev,0 ,"xc_gnttab_set_max_grants failed: %s\n" , +xen_be_printf (xendev,0 ,"xengnttab_set_max_grants failed: %s\n" ,strerror (errno)); } }@@ -972,7 +974,7 @@ static int blk_connect(struct XenDevice *xendev) } } - blkdev->sring =xc_gnttab_map_grant_ref (blkdev->xendev.gnttabdev, + blkdev->sring =xengnttab_map_grant_ref (blkdev->xendev.gnttabdev, blkdev->xendev.dom, blkdev->ring_ref,PROT_READ |PROT_WRITE );@@ -1037,7 +1039,7 @@ static void blk_disconnect(struct XenDevice *xendev)xen_be_unbind_evtchn (&blkdev->xendev);if (blkdev->sring) { -xc_gnttab_munmap (blkdev->xendev.gnttabdev, blkdev->sring,1 ); +xengnttab_munmap (blkdev->xendev.gnttabdev, blkdev->sring,1 ); blkdev->cnt_map--; blkdev->sring =NULL ; }hw/char/xen_console.c +2
-2@@ -233,7 +233,7 @@ static int con_initialise(struct XenDevice *xendev)PROT_READ |PROT_WRITE , con->ring_ref); }else { - con->sring =xc_gnttab_map_grant_ref (xendev->gnttabdev, con->xendev.dom, + con->sring =xengnttab_map_grant_ref (xendev->gnttabdev, con->xendev.dom, con->ring_ref,PROT_READ |PROT_WRITE ); }@@ -275,7 +275,7 @@ static void con_disconnect(struct XenDevice *xendev)if (!xendev->dev) {munmap (con->sring,XC_PAGE_SIZE ); }else { -xc_gnttab_munmap (xendev->gnttabdev, con->sring,1 ); +xengnttab_munmap (xendev->gnttabdev, con->sring,1 ); } con->sring =NULL ; }hw/net/xen_nic.c +9
-9@@ -168,7 +168,7 @@ static void net_tx_packets(struct XenNetDev *netdev) (txreq.flags & NETTXF_more_data) ?" more_data" :"" , (txreq.flags & NETTXF_extra_info) ? " extra_info" : ""); - page =xc_gnttab_map_grant_ref (netdev->xendev.gnttabdev, + page =xengnttab_map_grant_ref (netdev->xendev.gnttabdev, netdev->xendev.dom, txreq.gref,PROT_READ );if (page ==NULL ) {@@ -190,7 +190,7 @@ static void net_tx_packets(struct XenNetDev *netdev)qemu_send_packet (qemu_get_queue (netdev->nic), page + txreq.offset, txreq.size); } -xc_gnttab_munmap (netdev->xendev.gnttabdev, page,1 ); +xengnttab_munmap (netdev->xendev.gnttabdev, page,1 );net_tx_response (netdev, &txreq,NETIF_RSP_OKAY ); }if (!netdev->tx_work) {@@ -260,7 +260,7 @@ static ssize_t net_rx_packet(NetClientState *nc, const uint8_t *buf, size_t sizememcpy (&rxreq,RING_GET_REQUEST (&netdev->rx_ring, rc),sizeof (rxreq)); netdev->rx_ring.req_cons = ++rc; - page =xc_gnttab_map_grant_ref (netdev->xendev.gnttabdev, + page =xengnttab_map_grant_ref (netdev->xendev.gnttabdev, netdev->xendev.dom, rxreq.gref,PROT_WRITE );if (page ==NULL ) {@@ -270,7 +270,7 @@ static ssize_t net_rx_packet(NetClientState *nc, const uint8_t *buf, size_t sizereturn -1 ; }memcpy (page +NET_IP_ALIGN , buf, size); -xc_gnttab_munmap (netdev->xendev.gnttabdev, page,1 ); +xengnttab_munmap (netdev->xendev.gnttabdev, page,1 );net_rx_response (netdev, &rxreq,NETIF_RSP_OKAY ,NET_IP_ALIGN , size,0 );return size;@@ -342,19 +342,19 @@ static int net_connect(struct XenDevice *xendev)return -1 ; } - netdev->txs =xc_gnttab_map_grant_ref (netdev->xendev.gnttabdev, + netdev->txs =xengnttab_map_grant_ref (netdev->xendev.gnttabdev, netdev->xendev.dom, netdev->tx_ring_ref,PROT_READ |PROT_WRITE );if (!netdev->txs) {return -1 ; } - netdev->rxs =xc_gnttab_map_grant_ref (netdev->xendev.gnttabdev, + netdev->rxs =xengnttab_map_grant_ref (netdev->xendev.gnttabdev, netdev->xendev.dom, netdev->rx_ring_ref,PROT_READ |PROT_WRITE );if (!netdev->rxs) { -xc_gnttab_munmap (netdev->xendev.gnttabdev, netdev->txs,1 ); +xengnttab_munmap (netdev->xendev.gnttabdev, netdev->txs,1 ); netdev->txs =NULL ;return -1 ; }@@ -379,11 +379,11 @@ static void net_disconnect(struct XenDevice *xendev)xen_be_unbind_evtchn (&netdev->xendev);if (netdev->txs) { -xc_gnttab_munmap (netdev->xendev.gnttabdev, netdev->txs,1 ); +xengnttab_munmap (netdev->xendev.gnttabdev, netdev->txs,1 ); netdev->txs =NULL ; }if (netdev->rxs) { -xc_gnttab_munmap (netdev->xendev.gnttabdev, netdev->rxs,1 ); +xengnttab_munmap (netdev->xendev.gnttabdev, netdev->rxs,1 ); netdev->rxs =NULL ; } }hw/xen/xen_backend.c +5
-5@@ -252,15 +252,15 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev,fcntl (xenevtchn_fd (xendev->evtchndev),F_SETFD ,FD_CLOEXEC );if (ops->flags &DEVOPS_FLAG_NEED_GNTDEV ) { - xendev->gnttabdev =xen_xc_gnttab_open (NULL ,0 ); -if (xendev->gnttabdev ==XC_HANDLER_INITIAL_VALUE ) { + xendev->gnttabdev =xengnttab_open (NULL ,0 ); +if (xendev->gnttabdev ==NULL ) {xen_be_printf (NULL ,0 ,"can't open gnttab device\n" );xenevtchn_close (xendev->evtchndev);g_free (xendev);return NULL ; } }else { - xendev->gnttabdev =XC_HANDLER_INITIAL_VALUE ; + xendev->gnttabdev =NULL ; }QTAILQ_INSERT_TAIL (&xendevs, xendev, next);@@ -309,8 +309,8 @@ static struct XenDevice *xen_be_del_xendev(int dom, int dev)if (xendev->evtchndev !=NULL ) {xenevtchn_close (xendev->evtchndev); } -if (xendev->gnttabdev !=XC_HANDLER_INITIAL_VALUE ) { -xc_gnttab_close (xendev->gnttabdev); +if (xendev->gnttabdev !=NULL ) { +xengnttab_close (xendev->gnttabdev); }QTAILQ_REMOVE (&xendevs, xendev, next);include/hw/xen/xen_backend.h +1
-1@@ -47,7 +47,7 @@ struct XenDevice {int local_port;xenevtchn_handle *evtchndev; -XenGnttab gnttabdev; +xengnttab_handle *gnttabdev;struct XenDevOps *ops;QTAILQ_ENTRY (XenDevice) next;include/hw/xen/xen_common.h +32
-10@@ -40,7 +40,7 @@ static inline void *xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot,typedef int XenXC ;typedef int xenevtchn_handle ; -typedef int XenGnttab ; +typedef int xengnttab_handle ;# define XC_INTERFACE_FMT "%i"# define XC_HANDLER_INITIAL_VALUE -1@@ -72,11 +72,31 @@ static inline int xenevtchn_close(xenevtchn_handle *h)#define xenevtchn_unmask (h, p) xc_evtchn_unmask(*h, p)#define xenevtchn_unbind (h, p) xc_evtchn_unmask(*h, p) -static inline XenGnttab xen_xc_gnttab_open (void *logger, -unsigned int open_flags) +static inline xengnttab_handle *xengnttab_open (void *logger, +unsigned int open_flags) { -return xc_gnttab_open (); +xengnttab_handle *h =malloc (sizeof (*h)); +if (!h) { +return NULL ; + } + *h =xc_gnttab_open (); +if (*h ==-1 ) { +free (h); + h =NULL ; + } +return h; } +static inline int xengnttab_close (xengnttab_handle *h) +{ +int rc =xc_gnttab_close (*h); +free (h); +return rc; +} +#define xengnttab_set_max_grants (h, n) xc_gnttab_set_max_grants(*h, n) +#define xengnttab_map_grant_ref (h, d, r, p) xc_gnttab_map_grant_ref(*h, d, r, p) +#define xengnttab_map_grant_refs (h, c, d, r, p) \ + xc_gnttab_map_grant_refs(*h, c, d, r, p) +#define xengnttab_munmap (h, a, n) xc_gnttab_munmap(*h, a, n)static inline XenXC xen_xc_interface_open (void *logger,void *dombuild_logger,unsigned int open_flags)@@ -130,7 +150,7 @@ static inline void xs_close(struct xs_handle *xsh)typedef xc_interface *XenXC ;typedef xc_evtchn xenevtchn_handle ; -typedef xc_gnttab *XenGnttab ; +typedef xc_gnttab xengnttab_handle ;# define XC_INTERFACE_FMT "%p"# define XC_HANDLER_INITIAL_VALUE NULL@@ -144,11 +164,13 @@ typedef xc_gnttab *XenGnttab;#define xenevtchn_unmask (h, p) xc_evtchn_unmask(h, p)#define xenevtchn_unbind (h, p) xc_evtchn_unbind(h, p) -static inline XenGnttab xen_xc_gnttab_open (void *logger, -unsigned int open_flags) -{ -return xc_gnttab_open (logger, open_flags); -} +#define xengnttab_open (l, f) xc_gnttab_open(l, f) +#define xengnttab_close (h) xc_gnttab_close(h) +#define xengnttab_set_max_grants (h, n) xc_gnttab_set_max_grants(h, n) +#define xengnttab_map_grant_ref (h, d, r, p) xc_gnttab_map_grant_ref(h, d, r, p) +#define xengnttab_munmap (h, a, n) xc_gnttab_munmap(h, a, n) +#define xengnttab_map_grant_refs (h, c, d, r, p) \ + xc_gnttab_map_grant_refs(h, c, d, r, p)static inline XenXC xen_xc_interface_open (void *logger,void *dombuild_logger,unsigned int open_flags)Signature · 1 line
2.1.4
Re: [Qemu-devel] [PATCH QEMU-XEN v5 3/9] xen: Switch to libxengnttab interface for compat shims.
In reply to Ian CampbellQuoted 17 lines · Ian Campbell
In Xen 4.7 we are refactoring parts libxenctrl into a number of separate libraries which will provide backward and forward API and ABI compatiblity.
One such library will be libxengnttab which provides access to grant tables.
In preparation for this switch the compatibility layer in
xen_common.h(which support building with older versions of Xen) to use what will be the new library API. This means that the gnttab shim will disappear for versions of Xen which include libxengnttab.To simplify things for the <= 4.0.0 support we wrap the int fd in a malloc(sizeof int) such that the handle is always a pointer. This leads to less typedef headaches and the need for
XC_HANDLER_INITIAL_VALUEetc for these interfaces.
Quoted 4 lines
Note that this patch does not add any support for actually using libxengnttab, it just adjusts the existing shims.
Signed-off-by Ian Campbell <[email protected]>
Quoted 365 lines
v4: Ran checkpatch, fixed all errors
Allocate correct size for handle (i.e. not size of the ptr) Rebase onto "xen_console: correctly cleanup primary console on teardown."v5: Rebase over
b4f72e31b924"hw/net/xen_nic.c: Free 'netdev->txs' when map 'netdev->rxs' fails" which added a newgnttab_munmap.--- hw/block/xen_disk.c | 38 ++++++++++++++++++++------------------ hw/char/xen_console.c | 4 ++-- hw/net/xen_nic.c | 18 +++++++++--------- hw/xen/xen_backend.c | 10 +++++----- include/hw/xen/xen_backend.h | 2 +- include/hw/xen/xen_common.h | 42 ++++++++++++++++++++++++++++++++---------- 6 files changed, 69 insertions(+), 45 deletions(-)hw/block/xen_disk.c +20
-18@@ -173,11 +173,11 @@ static gint int_cmp(gconstpointer a, gconstpointer b, gpointer user_data)static void destroy_grant (gpointer pgnt) {PersistentGrant *grant = pgnt; -XenGnttab gnt = grant->blkdev->xendev.gnttabdev; +xengnttab_handle *gnt = grant->blkdev->xendev.gnttabdev; -if (xc_gnttab_munmap (gnt, grant->page,1 ) !=0 ) { +if (xengnttab_munmap (gnt, grant->page,1 ) !=0 ) {xen_be_printf (&grant->blkdev->xendev,0 , -"xc_gnttab_munmap failed: %s\n" , +"xengnttab_munmap failed: %s\n" ,strerror (errno)); } grant->blkdev->persistent_gnt_count--;@@ -190,11 +190,11 @@ static void remove_persistent_region(gpointer data, gpointer dev) {PersistentRegion *region = data;struct XenBlkDev *blkdev = dev; -XenGnttab gnt = blkdev->xendev.gnttabdev; +xengnttab_handle *gnt = blkdev->xendev.gnttabdev; -if (xc_gnttab_munmap (gnt, region->addr, region->num) !=0 ) { +if (xengnttab_munmap (gnt, region->addr, region->num) !=0 ) {xen_be_printf (&blkdev->xendev,0 , -"xc_gnttab_munmap region %p failed: %s\n" , +"xengnttab_munmap region %p failed: %s\n" , region->addr,strerror (errno)); } xen_be_printf(&blkdev->xendev, 3,@@ -329,7 +329,7 @@ err:static void ioreq_unmap (struct ioreq *ioreq) { -XenGnttab gnt = ioreq->blkdev->xendev.gnttabdev; +xengnttab_handle *gnt = ioreq->blkdev->xendev.gnttabdev;int i;if (ioreq->num_unmap ==0 || ioreq->mapped ==0 ) {@@ -339,8 +339,9 @@ static void ioreq_unmap(struct ioreq *ioreq)if (!ioreq->pages) {return ; } -if (xc_gnttab_munmap (gnt, ioreq->pages, ioreq->num_unmap) !=0 ) { -xen_be_printf (&ioreq->blkdev->xendev,0 ,"xc_gnttab_munmap failed: %s\n" , +if (xengnttab_munmap (gnt, ioreq->pages, ioreq->num_unmap) !=0 ) { +xen_be_printf (&ioreq->blkdev->xendev,0 , +"xengnttab_munmap failed: %s\n" ,strerror (errno)); } ioreq->blkdev->cnt_map -= ioreq->num_unmap;@@ -350,8 +351,9 @@ static void ioreq_unmap(struct ioreq *ioreq)if (!ioreq->page[i]) {continue ; } -if (xc_gnttab_munmap (gnt, ioreq->page[i],1 ) !=0 ) { -xen_be_printf (&ioreq->blkdev->xendev,0 ,"xc_gnttab_munmap failed: %s\n" , +if (xengnttab_munmap (gnt, ioreq->page[i],1 ) !=0 ) { +xen_be_printf (&ioreq->blkdev->xendev,0 , +"xengnttab_munmap failed: %s\n" ,strerror (errno)); } ioreq->blkdev->cnt_map--;@@ -363,7 +365,7 @@ static void ioreq_unmap(struct ioreq *ioreq)static int ioreq_map (struct ioreq *ioreq) { -XenGnttab gnt = ioreq->blkdev->xendev.gnttabdev; +xengnttab_handle *gnt = ioreq->blkdev->xendev.gnttabdev;uint32_t domids[BLKIF_MAX_SEGMENTS_PER_REQUEST ];uint32_t refs[BLKIF_MAX_SEGMENTS_PER_REQUEST ];void *page[BLKIF_MAX_SEGMENTS_PER_REQUEST ];@@ -414,7 +416,7 @@ static int ioreq_map(struct ioreq *ioreq) }if (batch_maps && new_maps) { - ioreq->pages =xc_gnttab_map_grant_refs + ioreq->pages =xengnttab_map_grant_refs (gnt, new_maps, domids, refs, ioreq->prot);if (ioreq->pages ==NULL ) { xen_be_printf(&ioreq->blkdev->xendev, 0,@@ -430,7 +432,7 @@ static int ioreq_map(struct ioreq *ioreq) ioreq->blkdev->cnt_map += new_maps; }else if (new_maps) {for (i =0 ; i < new_maps; i++) { - ioreq->page[i] =xc_gnttab_map_grant_ref + ioreq->page[i] =xengnttab_map_grant_ref (gnt, domids[i], refs[i], ioreq->prot);if (ioreq->page[i] ==NULL ) { xen_be_printf(&ioreq->blkdev->xendev, 0,@@ -763,9 +765,9 @@ static void blk_alloc(struct XenDevice *xendev)if (xen_mode !=XEN_EMULATE ) { batch_maps =1 ; } -if (xc_gnttab_set_max_grants (xendev->gnttabdev, +if (xengnttab_set_max_grants (xendev->gnttabdev,MAX_GRANTS (max_requests,BLKIF_MAX_SEGMENTS_PER_REQUEST )) <0 ) { -xen_be_printf (xendev,0 ,"xc_gnttab_set_max_grants failed: %s\n" , +xen_be_printf (xendev,0 ,"xengnttab_set_max_grants failed: %s\n" ,strerror (errno)); } }@@ -972,7 +974,7 @@ static int blk_connect(struct XenDevice *xendev) } } - blkdev->sring =xc_gnttab_map_grant_ref (blkdev->xendev.gnttabdev, + blkdev->sring =xengnttab_map_grant_ref (blkdev->xendev.gnttabdev, blkdev->xendev.dom, blkdev->ring_ref,PROT_READ |PROT_WRITE );@@ -1037,7 +1039,7 @@ static void blk_disconnect(struct XenDevice *xendev)xen_be_unbind_evtchn (&blkdev->xendev);if (blkdev->sring) { -xc_gnttab_munmap (blkdev->xendev.gnttabdev, blkdev->sring,1 ); +xengnttab_munmap (blkdev->xendev.gnttabdev, blkdev->sring,1 ); blkdev->cnt_map--; blkdev->sring =NULL ; }hw/char/xen_console.c +2
-2@@ -233,7 +233,7 @@ static int con_initialise(struct XenDevice *xendev)PROT_READ |PROT_WRITE , con->ring_ref); }else { - con->sring =xc_gnttab_map_grant_ref (xendev->gnttabdev, con->xendev.dom, + con->sring =xengnttab_map_grant_ref (xendev->gnttabdev, con->xendev.dom, con->ring_ref,PROT_READ |PROT_WRITE ); }@@ -275,7 +275,7 @@ static void con_disconnect(struct XenDevice *xendev)if (!xendev->dev) {munmap (con->sring,XC_PAGE_SIZE ); }else { -xc_gnttab_munmap (xendev->gnttabdev, con->sring,1 ); +xengnttab_munmap (xendev->gnttabdev, con->sring,1 ); } con->sring =NULL ; }hw/net/xen_nic.c +9
-9@@ -168,7 +168,7 @@ static void net_tx_packets(struct XenNetDev *netdev) (txreq.flags & NETTXF_more_data) ?" more_data" :"" , (txreq.flags & NETTXF_extra_info) ? " extra_info" : ""); - page =xc_gnttab_map_grant_ref (netdev->xendev.gnttabdev, + page =xengnttab_map_grant_ref (netdev->xendev.gnttabdev, netdev->xendev.dom, txreq.gref,PROT_READ );if (page ==NULL ) {@@ -190,7 +190,7 @@ static void net_tx_packets(struct XenNetDev *netdev)qemu_send_packet (qemu_get_queue (netdev->nic), page + txreq.offset, txreq.size); } -xc_gnttab_munmap (netdev->xendev.gnttabdev, page,1 ); +xengnttab_munmap (netdev->xendev.gnttabdev, page,1 );net_tx_response (netdev, &txreq,NETIF_RSP_OKAY ); }if (!netdev->tx_work) {@@ -260,7 +260,7 @@ static ssize_t net_rx_packet(NetClientState *nc, const uint8_t *buf, size_t sizememcpy (&rxreq,RING_GET_REQUEST (&netdev->rx_ring, rc),sizeof (rxreq)); netdev->rx_ring.req_cons = ++rc; - page =xc_gnttab_map_grant_ref (netdev->xendev.gnttabdev, + page =xengnttab_map_grant_ref (netdev->xendev.gnttabdev, netdev->xendev.dom, rxreq.gref,PROT_WRITE );if (page ==NULL ) {@@ -270,7 +270,7 @@ static ssize_t net_rx_packet(NetClientState *nc, const uint8_t *buf, size_t sizereturn -1 ; }memcpy (page +NET_IP_ALIGN , buf, size); -xc_gnttab_munmap (netdev->xendev.gnttabdev, page,1 ); +xengnttab_munmap (netdev->xendev.gnttabdev, page,1 );net_rx_response (netdev, &rxreq,NETIF_RSP_OKAY ,NET_IP_ALIGN , size,0 );return size;@@ -342,19 +342,19 @@ static int net_connect(struct XenDevice *xendev)return -1 ; } - netdev->txs =xc_gnttab_map_grant_ref (netdev->xendev.gnttabdev, + netdev->txs =xengnttab_map_grant_ref (netdev->xendev.gnttabdev, netdev->xendev.dom, netdev->tx_ring_ref,PROT_READ |PROT_WRITE );if (!netdev->txs) {return -1 ; } - netdev->rxs =xc_gnttab_map_grant_ref (netdev->xendev.gnttabdev, + netdev->rxs =xengnttab_map_grant_ref (netdev->xendev.gnttabdev, netdev->xendev.dom, netdev->rx_ring_ref,PROT_READ |PROT_WRITE );if (!netdev->rxs) { -xc_gnttab_munmap (netdev->xendev.gnttabdev, netdev->txs,1 ); +xengnttab_munmap (netdev->xendev.gnttabdev, netdev->txs,1 ); netdev->txs =NULL ;return -1 ; }@@ -379,11 +379,11 @@ static void net_disconnect(struct XenDevice *xendev)xen_be_unbind_evtchn (&netdev->xendev);if (netdev->txs) { -xc_gnttab_munmap (netdev->xendev.gnttabdev, netdev->txs,1 ); +xengnttab_munmap (netdev->xendev.gnttabdev, netdev->txs,1 ); netdev->txs =NULL ; }if (netdev->rxs) { -xc_gnttab_munmap (netdev->xendev.gnttabdev, netdev->rxs,1 ); +xengnttab_munmap (netdev->xendev.gnttabdev, netdev->rxs,1 ); netdev->rxs =NULL ; } }hw/xen/xen_backend.c +5
-5@@ -252,15 +252,15 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev,fcntl (xenevtchn_fd (xendev->evtchndev),F_SETFD ,FD_CLOEXEC );if (ops->flags &DEVOPS_FLAG_NEED_GNTDEV ) { - xendev->gnttabdev =xen_xc_gnttab_open (NULL ,0 ); -if (xendev->gnttabdev ==XC_HANDLER_INITIAL_VALUE ) { + xendev->gnttabdev =xengnttab_open (NULL ,0 ); +if (xendev->gnttabdev ==NULL ) {xen_be_printf (NULL ,0 ,"can't open gnttab device\n" );xenevtchn_close (xendev->evtchndev);g_free (xendev);return NULL ; } }else { - xendev->gnttabdev =XC_HANDLER_INITIAL_VALUE ; + xendev->gnttabdev =NULL ; }QTAILQ_INSERT_TAIL (&xendevs, xendev, next);@@ -309,8 +309,8 @@ static struct XenDevice *xen_be_del_xendev(int dom, int dev)if (xendev->evtchndev !=NULL ) {xenevtchn_close (xendev->evtchndev); } -if (xendev->gnttabdev !=XC_HANDLER_INITIAL_VALUE ) { -xc_gnttab_close (xendev->gnttabdev); +if (xendev->gnttabdev !=NULL ) { +xengnttab_close (xendev->gnttabdev); }QTAILQ_REMOVE (&xendevs, xendev, next);include/hw/xen/xen_backend.h +1
-1@@ -47,7 +47,7 @@ struct XenDevice {int local_port;xenevtchn_handle *evtchndev; -XenGnttab gnttabdev; +xengnttab_handle *gnttabdev;struct XenDevOps *ops;QTAILQ_ENTRY (XenDevice) next;include/hw/xen/xen_common.h +32
-10@@ -40,7 +40,7 @@ static inline void *xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot,typedef int XenXC ;typedef int xenevtchn_handle ; -typedef int XenGnttab ; +typedef int xengnttab_handle ;# define XC_INTERFACE_FMT "%i"# define XC_HANDLER_INITIAL_VALUE -1@@ -72,11 +72,31 @@ static inline int xenevtchn_close(xenevtchn_handle *h)#define xenevtchn_unmask (h, p) xc_evtchn_unmask(*h, p)#define xenevtchn_unbind (h, p) xc_evtchn_unmask(*h, p) -static inline XenGnttab xen_xc_gnttab_open (void *logger, -unsigned int open_flags) +static inline xengnttab_handle *xengnttab_open (void *logger, +unsigned int open_flags) { -return xc_gnttab_open (); +xengnttab_handle *h =malloc (sizeof (*h)); +if (!h) { +return NULL ; + } + *h =xc_gnttab_open (); +if (*h ==-1 ) { +free (h); + h =NULL ; + } +return h; } +static inline int xengnttab_close (xengnttab_handle *h) +{ +int rc =xc_gnttab_close (*h); +free (h); +return rc; +} +#define xengnttab_set_max_grants (h, n) xc_gnttab_set_max_grants(*h, n) +#define xengnttab_map_grant_ref (h, d, r, p) xc_gnttab_map_grant_ref(*h, d, r, p) +#define xengnttab_map_grant_refs (h, c, d, r, p) \ + xc_gnttab_map_grant_refs(*h, c, d, r, p) +#define xengnttab_munmap (h, a, n) xc_gnttab_munmap(*h, a, n)static inline XenXC xen_xc_interface_open (void *logger,void *dombuild_logger,unsigned int open_flags)@@ -130,7 +150,7 @@ static inline void xs_close(struct xs_handle *xsh)typedef xc_interface *XenXC ;typedef xc_evtchn xenevtchn_handle ; -typedef xc_gnttab *XenGnttab ; +typedef xc_gnttab xengnttab_handle ;# define XC_INTERFACE_FMT "%p"# define XC_HANDLER_INITIAL_VALUE NULL@@ -144,11 +164,13 @@ typedef xc_gnttab *XenGnttab;#define xenevtchn_unmask (h, p) xc_evtchn_unmask(h, p)#define xenevtchn_unbind (h, p) xc_evtchn_unbind(h, p) -static inline XenGnttab xen_xc_gnttab_open (void *logger, -unsigned int open_flags) -{ -return xc_gnttab_open (logger, open_flags); -} +#define xengnttab_open (l, f) xc_gnttab_open(l, f) +#define xengnttab_close (h) xc_gnttab_close(h) +#define xengnttab_set_max_grants (h, n) xc_gnttab_set_max_grants(h, n) +#define xengnttab_map_grant_ref (h, d, r, p) xc_gnttab_map_grant_ref(h, d, r, p) +#define xengnttab_munmap (h, a, n) xc_gnttab_munmap(h, a, n) +#define xengnttab_map_grant_refs (h, c, d, r, p) \ + xc_gnttab_map_grant_refs(h, c, d, r, p)static inline XenXC xen_xc_interface_open (void *logger,void *dombuild_logger,unsigned int open_flags)Signature · 1 line
2.1.4
PATCH v5 4/9 xen: Switch uses of xc_map_foreign_range into xc_map_foreign_bulk
In reply to Ian CampbellIn Xen 4.7 we are refactoring parts libxenctrl into a number of separate libraries which will provide backward and forward API and ABI compatiblity.
One such library will be libxenforeignmemory which provides access to privileged foreign mappings and which will provide an interface equivalent to xc_map_foreign_bulk.
In preparation for this switch all uses of xc_map_foreign_range to xc_map_foreign_bulk. This is trivial because size was always XC_PAGE_SIZE so the necessary adjustments are trivial:
* Pass &mfn (an array of length 1) instead of mfn. The function takes a pointer to const, so there is no possibily of mfn changing due to this change.
* Add a local err variable to receive the errors and pass &err (again, an array of length 1)
* Adjust any existing logging to include err too
* Pass nr_pages=1 instead of size=XC_PAGE_SIZE
There is one wrinkle in xen_console.c:con_initialise() where con->ring_ref is an int but can in some code paths (when !xendev->dev) be treated as an mfn. I think this is an existing latent truncation hazard on platforms where xen_pfn_t is 64-bit and int is 32-bit (e.g. amd64, both arm* variants). I'm unsure under what circumstances xendev->dev can be NULL or if anything elsewhere ensures the value fits into an int. For now I just use a temporary xen_pfn_t to in effect upcast the pointer from int* to xen_pfn_t*.
---
v4: Ran checkpatch, fixed all errors
Mention the const-ness of the mfn array in the commit log
--- hw/char/xen_console.c | 9 +++++---- hw/display/xenfb.c | 6 +++--- xen-hvm.c | 30 ++++++++++++++++-------------- 3 files changed, 24 insertions(+), 21 deletions(-)
hw/char/xen_console.c +5 -4
@@ -219,6 +219,7 @@ static int con_initialise(struct XenDevice *xendev) { struct XenConsole *con = container_of(xendev, struct XenConsole, xendev);int limit; +int err;if (xenstore_read_int (con->console,"ring-ref" , &con->ring_ref) ==-1 )return -1 ;
@@ -228,10 +229,10 @@ static int con_initialise(struct XenDevice *xendev) con->buffer.max_capacity = limit;if (!xendev->dev) { - con->sring =xc_map_foreign_range (xen_xc, con->xendev.dom, -XC_PAGE_SIZE , -PROT_READ |PROT_WRITE , - con->ring_ref); +xen_pfn_t mfn = con->ring_ref; + con->sring =xc_map_foreign_bulk (xen_xc, con->xendev.dom, +PROT_READ |PROT_WRITE , + &mfn, &err,1 ); }else { con->sring = xengnttab_map_grant_ref(xendev->gnttabdev, con->xendev.dom, con->ring_ref,
hw/display/xenfb.c +3 -3
@@ -96,6 +96,7 @@ struct XenFB {static int common_bind (struct common *c) {uint64_t mfn; +int err;if (xenstore_read_fe_uint64 (&c->xendev,"page-ref" , &mfn) ==-1 )return -1 ;
@@ -104,9 +105,8 @@ static int common_bind(struct common *c)if (xenstore_read_fe_int (&c->xendev,"event-channel" , &c->xendev.remote_port) ==-1 )return -1 ; - c->page =xc_map_foreign_range (xen_xc, c->xendev.dom, -XC_PAGE_SIZE , -PROT_READ |PROT_WRITE , mfn); + c->page =xc_map_foreign_bulk (xen_xc, c->xendev.dom, +PROT_READ |PROT_WRITE , &mfn, &err,1 );if (c->page ==NULL )return -1 ;
xen-hvm.c +16 -14
@@ -1193,7 +1193,7 @@ static void xen_wakeup_notifier(Notifier *notifier, void *data)int xen_hvm_init (PCMachineState *pcms,MemoryRegion **ram_memory) { -int i, rc; +int i, rc, map_err;xen_pfn_t ioreq_pfn;xen_pfn_t bufioreq_pfn;evtchn_port_t bufioreq_evtchn;
@@ -1240,33 +1240,35 @@ int xen_hvm_init(PCMachineState *pcms,DPRINTF ("buffered io page at pfn %lx\n" , bufioreq_pfn);DPRINTF ("buffered io evtchn is %x\n" , bufioreq_evtchn); - state->shared_page =xc_map_foreign_range (xen_xc, xen_domid,XC_PAGE_SIZE , -PROT_READ |PROT_WRITE , ioreq_pfn); + state->shared_page =xc_map_foreign_bulk (xen_xc, xen_domid, +PROT_READ |PROT_WRITE , + &ioreq_pfn, &map_err,1 );if (state->shared_page ==NULL ) { -hw_error ("map shared IO page returned error %d handle=" XC_INTERFACE_FMT , - errno, xen_xc); +hw_error ( +"map shared IO page returned error %d(%d) handle=" XC_INTERFACE_FMT , + errno, map_err, xen_xc); } rc =xen_get_vmport_regs_pfn (xen_xc, xen_domid, &ioreq_pfn);if (!rc) {DPRINTF ("shared vmport page at pfn %lx\n" , ioreq_pfn); state->shared_vmport_page = -xc_map_foreign_range (xen_xc, xen_domid,XC_PAGE_SIZE , -PROT_READ |PROT_WRITE , ioreq_pfn); +xc_map_foreign_bulk (xen_xc, xen_domid,PROT_READ |PROT_WRITE , + &ioreq_pfn, &map_err,1 );if (state->shared_vmport_page ==NULL ) { -hw_error ("map shared vmport IO page returned error %d handle=" -XC_INTERFACE_FMT , errno, xen_xc); +hw_error ("map shared vmport IO page returned error %d (%d) handle=" +XC_INTERFACE_FMT , errno, map_err, xen_xc); } }else if (rc != -ENOSYS ) {hw_error ("get vmport regs pfn returned error %d, rc=%d" , errno, rc); } - state->buffered_io_page =xc_map_foreign_range (xen_xc, xen_domid, -XC_PAGE_SIZE , -PROT_READ |PROT_WRITE , - bufioreq_pfn); + state->buffered_io_page =xc_map_foreign_bulk (xen_xc, xen_domid, +PROT_READ |PROT_WRITE , + &bufioreq_pfn, + &map_err,1 );if (state->buffered_io_page ==NULL ) { -hw_error ("map buffered IO page returned error %d" , errno); +hw_error ("map buffered IO page returned error %d (%d)" , errno, map_err); }/* Note: cpus is empty at this point in init */
Signature · 1 line
2.1.4
PATCH v5 5/9 xen: Switch uses of xc_map_foreign_pages into xc_map_foreign_bulk
In reply to Ian CampbellIn Xen 4.7 we are refactoring parts libxenctrl into a number of separate libraries which will provide backward and forward API and ABI compatiblity.
One such library will be libxenforeignmemory which provides access to privileged foreign mappings and which will provide an interface equivalent to xc_map_foreign_bulk.
In preparation for this switch both uses of xc_map_foreign_pages (which both happen to be in xenfb_map_fb) to xc_map_foreign_bulk. This simply requires allocating and passing a new err array (the same one for both calls).
---
v4: Fix indentation
--- hw/display/xenfb.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
hw/display/xenfb.c +7 -4
@@ -433,6 +433,7 @@ static int xenfb_map_fb(struct XenFB *xenfb)int n_fbdirs;xen_pfn_t *pgmfns =NULL ;xen_pfn_t *fbmfns =NULL ; +int *errs =NULL ;void *map, *pd;int mode, ret =-1 ;
@@ -492,17 +493,18 @@ static int xenfb_map_fb(struct XenFB *xenfb) pgmfns =g_malloc0 (sizeof (xen_pfn_t) * n_fbdirs); fbmfns =g_malloc0 (sizeof (xen_pfn_t) * xenfb->fbpages); + errs =g_malloc0 (sizeof (int ) * n_fbdirs);xenfb_copy_mfns (mode, n_fbdirs, pgmfns, pd); - map =xc_map_foreign_pages (xen_xc, xenfb->c.xendev.dom, -PROT_READ , pgmfns, n_fbdirs); + map =xc_map_foreign_bulk (xen_xc, xenfb->c.xendev.dom, +PROT_READ , pgmfns, errs, n_fbdirs);if (map ==NULL ) goto out;xenfb_copy_mfns (mode, xenfb->fbpages, fbmfns, map);munmap (map, n_fbdirs *XC_PAGE_SIZE ); - xenfb->pixels =xc_map_foreign_pages (xen_xc, xenfb->c.xendev.dom, -PROT_READ , fbmfns, xenfb->fbpages); + xenfb->pixels =xc_map_foreign_bulk (xen_xc, xenfb->c.xendev.dom, +PROT_READ , fbmfns, errs, xenfb->fbpages);if (xenfb->pixels ==NULL ) goto out;
@@ -511,6 +513,7 @@ static int xenfb_map_fb(struct XenFB *xenfb) out:g_free (pgmfns);g_free (fbmfns); +g_free (errs);return ret; }
Signature · 1 line
2.1.4
PATCH v5 6/9 xen: Switch uses of xc_map_foreign_bulk to use libxenforeignmemory API.
In reply to Ian CampbellIn Xen 4.7 we are refactoring parts libxenctrl into a number of separate libraries which will provide backward and forward API and ABI compatiblity.
One such library will be libxenforeignmemory which provides access to privileged foreign mappings and which will provide an interface equivalent to xc_map_foreign_bulk.
In preparation for adding support for libxenforeignmemory add support to the <=4.0 and <=4.6 compat code in xen_common.h to allow us to switch to using the new API. These shims will disappear for versions of Xen which include libxenforeignmemory.
Since libxenforeignmemory will have its own handle type but for <= 4.6 the functionality is provided by using a libxenctrl handle we introduce a new global xen_fmem alongside the existing xen_xc. In fact we make xen_fmem a pointer to the existing xen_xc, which then works correctly with both <=4.0 (xc handle is an int) and <=4.6 (xc handle is a pointer). In the latter case xen_fmem is actually a double indirect pointer, but it all falls out in the wash.
Unlike libxenctrl libxenforeignmemory has an explicit unmap function, rather than just specifying that munmap should be used, so the unmap paths are updated to use xenforeignmemory_unmap, which is a shim for munmap on these versions of xen. The mappings in xen-hvm.c do not appear to be unmapped (which makes sense for a qemu-dm process)
In fb_disconnect this results in a change from simply mmap over the existing mapping (with an implicit munmap) to expliclty unmapping with xenforeignmemory_unmap and then mapping the required anonymous memory in the same hole. I don't think this is a problem since any other thread which was racily touching this region would already be running the risk of hitting the mapping halfway through the call. If this is thought to be a problem then we could consider adding an extra API to the libxenforeignmemory interface to replace a foreign mapping with anonymous shared memory, but I'd prefer not to.
---
I noticed in xen_console.c that the decision to use a foreign privileged memory mapping vs a grant dev is made using different variables in con_initialise vs con_disconnect. The former uses xendev->dev while the latter uses xendev->gnttabdev. Is this a latent bug?
v4: Rebase onto "xen_console: correctly cleanup primary console on
teardown."
xenforeignmemory_unmap takes pages not bytes
Compat wrapper for xenforeignmemory_open instead of ifdef in code.
Run check patch and fix most issues. I did not fix:
ERROR: do not initialise globals to 0 or NULL
+xenforeignmemory_handle *xen_fmem = NULL;
=> This is consistent with all of the existing declarations.
ERROR: need consistent spacing around '*' (ctx:WxV) +typedef xc_interface *xenforeignmemory_handle;
=> I think this is a false +ve since this is a pointer "*" not a multiple "*".
--- hw/char/xen_console.c | 8 ++++---- hw/display/xenfb.c | 15 ++++++++------- hw/xen/xen_backend.c | 3 ++- include/hw/xen/xen_backend.h | 1 + include/hw/xen/xen_common.h | 12 ++++++++++++ xen-common.c | 6 ++++++ xen-hvm.c | 18 +++++++++--------- xen-mapcache.c | 6 +++--- 8 files changed, 45 insertions(+), 24 deletions(-)
hw/char/xen_console.c +4 -4
@@ -230,9 +230,9 @@ static int con_initialise(struct XenDevice *xendev)if (!xendev->dev) {xen_pfn_t mfn = con->ring_ref; - con->sring =xc_map_foreign_bulk (xen_xc, con->xendev.dom, -PROT_READ |PROT_WRITE , - &mfn, &err,1 ); + con->sring =xenforeignmemory_map (xen_fmem, con->xendev.dom, +PROT_READ |PROT_WRITE , + &mfn, &err,1 ); }else { con->sring = xengnttab_map_grant_ref(xendev->gnttabdev, con->xendev.dom, con->ring_ref,
@@ -274,7 +274,7 @@ static void con_disconnect(struct XenDevice *xendev)if (con->sring) {if (!xendev->dev) { -munmap (con->sring,XC_PAGE_SIZE ); +xenforeignmemory_unmap (xen_fmem, con->sring,1 ); }else {xengnttab_munmap (xendev->gnttabdev, con->sring,1 ); }
hw/display/xenfb.c +8 -7
@@ -105,8 +105,8 @@ static int common_bind(struct common *c)if (xenstore_read_fe_int (&c->xendev,"event-channel" , &c->xendev.remote_port) ==-1 )return -1 ; - c->page =xc_map_foreign_bulk (xen_xc, c->xendev.dom, -PROT_READ |PROT_WRITE , &mfn, &err,1 ); + c->page =xenforeignmemory_map (xen_fmem, c->xendev.dom, +PROT_READ |PROT_WRITE , &mfn, &err,1 );if (c->page ==NULL )return -1 ;
@@ -121,7 +121,7 @@ static void common_unbind(struct common *c) {xen_be_unbind_evtchn (&c->xendev);if (c->page) { -munmap (c->page,XC_PAGE_SIZE ); +xenforeignmemory_unmap (xen_fmem, c->page,1 ); c->page =NULL ; } }
@@ -496,14 +496,14 @@ static int xenfb_map_fb(struct XenFB *xenfb) errs =g_malloc0 (sizeof (int ) * n_fbdirs);xenfb_copy_mfns (mode, n_fbdirs, pgmfns, pd); - map =xc_map_foreign_bulk (xen_xc, xenfb->c.xendev.dom, -PROT_READ , pgmfns, errs, n_fbdirs); + map =xenforeignmemory_map (xen_fmem, xenfb->c.xendev.dom, +PROT_READ , pgmfns, errs, n_fbdirs);if (map ==NULL ) goto out;xenfb_copy_mfns (mode, xenfb->fbpages, fbmfns, map); -munmap (map, n_fbdirs *XC_PAGE_SIZE ); +xenforeignmemory_unmap (xen_fmem, map, n_fbdirs); - xenfb->pixels =xc_map_foreign_bulk (xen_xc, xenfb->c.xendev.dom, + xenfb->pixels =xenforeignmemory_map (xen_fmem, xenfb->c.xendev.dom,PROT_READ , fbmfns, errs, xenfb->fbpages);if (xenfb->pixels ==NULL ) goto out;
@@ -912,6 +912,7 @@ static void fb_disconnect(struct XenDevice *xendev)* Replacing the framebuffer with anonymous shared memory * instead. This releases the guest pages and keeps qemu happy. */ +xenforeignmemory_unmap (xen_fmem, fb->pixels, fb->fbpages); fb->pixels =mmap (fb->pixels, fb->fbpages *XC_PAGE_SIZE ,PROT_READ |PROT_WRITE ,MAP_SHARED |MAP_ANON ,-1 ,0 );
hw/xen/xen_backend.c +2 -1
@@ -45,6 +45,7 @@/* public */ XenXC xen_xc =XC_HANDLER_INITIAL_VALUE ; +xenforeignmemory_handle *xen_fmem =NULL ;struct xs_handle *xenstore =NULL ;const char *xen_protocol;
@@ -717,7 +718,7 @@ int xen_be_init(void)qemu_set_fd_handler (xs_fileno (xenstore), xenstore_update,NULL ,NULL ); -if (xen_xc ==XC_HANDLER_INITIAL_VALUE ) { +if (xen_xc ==XC_HANDLER_INITIAL_VALUE || xen_fmem ==NULL ) {/* Check if xen_init() have been called */ goto err; }
include/hw/xen/xen_backend.h +1 -0
@@ -57,6 +57,7 @@ struct XenDevice {/* variables */ extern XenXC xen_xc; +extern xenforeignmemory_handle *xen_fmem;extern struct xs_handle *xenstore;extern const char *xen_protocol;
include/hw/xen/xen_common.h +12 -0
@@ -41,6 +41,7 @@ static inline void *xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot,typedef int XenXC ;typedef int xenevtchn_handle ;typedef int xengnttab_handle ; +typedef int xenforeignmemory_handle ;# define XC_INTERFACE_FMT "%i"# define XC_HANDLER_INITIAL_VALUE -1
@@ -104,6 +105,11 @@ static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger,return xc_interface_open (); } +#define xenforeignmemory_open (l, f) &xen_xc +#define xenforeignmemory_map (h, d, p, a, e, n) \ + xc_map_foreign_bulk(*h, d, p, a, e, n) +#define xenforeignmemory_unmap (h, p, s) munmap(p, s * XC_PAGE_SIZE) +static inline int xc_fd (int xen_xc) {return xen_xc;
@@ -149,6 +155,7 @@ static inline void xs_close(struct xs_handle *xsh)#else typedef xc_interface *XenXC ; +typedef xc_interface *xenforeignmemory_handle ;typedef xc_evtchn xenevtchn_handle ;typedef xc_gnttab xengnttab_handle ;
@@ -178,6 +185,11 @@ static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger,return xc_interface_open (logger, dombuild_logger, open_flags); } +#define xenforeignmemory_open (l, f) &xen_xc +#define xenforeignmemory_map (h, d, p, a, e, n) \ + xc_map_foreign_bulk(*h, d, p, a, e, n) +#define xenforeignmemory_unmap (h, p, s) munmap(p, s * XC_PAGE_SIZE) +/* FIXME There is now way to have the xen fd */ static inline int xc_fd (xc_interface *xen_xc) {
xen-common.c +6 -0
@@ -118,6 +118,12 @@ static int xen_init(MachineState *ms)xen_be_printf (NULL ,0 ,"can't open xen interface\n" );return -1 ; } + xen_fmem =xenforeignmemory_open (0 ,0 ); +if (xen_fmem ==NULL ) { +xen_be_printf (NULL ,0 ,"can't open xen fmem interface\n" ); +xc_interface_close (xen_xc); +return -1 ; + }qemu_add_vm_change_state_handler (xen_change_state_handler,NULL );global_state_set_optional ();
xen-hvm.c +9 -9
@@ -1240,9 +1240,9 @@ int xen_hvm_init(PCMachineState *pcms,DPRINTF ("buffered io page at pfn %lx\n" , bufioreq_pfn);DPRINTF ("buffered io evtchn is %x\n" , bufioreq_evtchn); - state->shared_page =xc_map_foreign_bulk (xen_xc, xen_domid, -PROT_READ |PROT_WRITE , - &ioreq_pfn, &map_err,1 ); + state->shared_page =xenforeignmemory_map (xen_fmem, xen_domid, +PROT_READ |PROT_WRITE , + &ioreq_pfn, &map_err,1 );if (state->shared_page ==NULL ) { hw_error( "map shared IO page returned error %d(%d) handle=" XC_INTERFACE_FMT,
@@ -1253,8 +1253,8 @@ int xen_hvm_init(PCMachineState *pcms,if (!rc) {DPRINTF ("shared vmport page at pfn %lx\n" , ioreq_pfn); state->shared_vmport_page = -xc_map_foreign_bulk (xen_xc, xen_domid,PROT_READ |PROT_WRITE , - &ioreq_pfn, &map_err,1 ); +xenforeignmemory_map (xen_fmem, xen_domid,PROT_READ |PROT_WRITE , + &ioreq_pfn, &map_err,1 );if (state->shared_vmport_page ==NULL ) {hw_error ("map shared vmport IO page returned error %d (%d) handle=" XC_INTERFACE_FMT , errno, map_err, xen_xc);
@@ -1263,10 +1263,10 @@ int xen_hvm_init(PCMachineState *pcms,hw_error ("get vmport regs pfn returned error %d, rc=%d" , errno, rc); } - state->buffered_io_page =xc_map_foreign_bulk (xen_xc, xen_domid, -PROT_READ |PROT_WRITE , - &bufioreq_pfn, - &map_err,1 ); + state->buffered_io_page =xenforeignmemory_map (xen_fmem, xen_domid, +PROT_READ |PROT_WRITE , + &bufioreq_pfn, + &map_err,1 );if (state->buffered_io_page ==NULL ) {hw_error ("map buffered IO page returned error %d (%d)" , errno, map_err); }
xen-mapcache.c +3 -3
@@ -176,10 +176,10 @@ static void xen_remap_bucket(MapCacheEntry *entry, pfns[i] = (address_index << (MCACHE_BUCKET_SHIFT -XC_PAGE_SHIFT )) + i; } - vaddr_base =xc_map_foreign_bulk (xen_xc, xen_domid,PROT_READ |PROT_WRITE , - pfns, err, nb_pfn); + vaddr_base =xenforeignmemory_map (xen_fmem, xen_domid,PROT_READ |PROT_WRITE , + pfns, err, nb_pfn);if (vaddr_base ==NULL ) { -perror ("xc_map_foreign_bulk" ); +perror ("xenforeignmemory_map" );exit (-1 ); }
Signature · 1 line
2.1.4
PATCH v5 6/9 xen: Switch uses of xc_map_foreign_bulk to use libxenforeignmemory API.
In reply to Ian CampbellIn Xen 4.7 we are refactoring parts libxenctrl into a number of separate libraries which will provide backward and forward API and ABI compatiblity.
One such library will be libxenforeignmemory which provides access to privileged foreign mappings and which will provide an interface equivalent to xc_map_foreign_bulk.
In preparation for adding support for libxenforeignmemory add support to the <=4.0 and <=4.6 compat code in xen_common.h to allow us to switch to using the new API. These shims will disappear for versions of Xen which include libxenforeignmemory.
Since libxenforeignmemory will have its own handle type but for <= 4.6 the functionality is provided by using a libxenctrl handle we introduce a new global xen_fmem alongside the existing xen_xc. In fact we make xen_fmem a pointer to the existing xen_xc, which then works correctly with both <=4.0 (xc handle is an int) and <=4.6 (xc handle is a pointer). In the latter case xen_fmem is actually a double indirect pointer, but it all falls out in the wash.
Unlike libxenctrl libxenforeignmemory has an explicit unmap function, rather than just specifying that munmap should be used, so the unmap paths are updated to use xenforeignmemory_unmap, which is a shim for munmap on these versions of xen. The mappings in xen-hvm.c do not appear to be unmapped (which makes sense for a qemu-dm process)
In fb_disconnect this results in a change from simply mmap over the existing mapping (with an implicit munmap) to expliclty unmapping with xenforeignmemory_unmap and then mapping the required anonymous memory in the same hole. I don't think this is a problem since any other thread which was racily touching this region would already be running the risk of hitting the mapping halfway through the call. If this is thought to be a problem then we could consider adding an extra API to the libxenforeignmemory interface to replace a foreign mapping with anonymous shared memory, but I'd prefer not to.
---
I noticed in xen_console.c that the decision to use a foreign privileged memory mapping vs a grant dev is made using different variables in con_initialise vs con_disconnect. The former uses xendev->dev while the latter uses xendev->gnttabdev. Is this a latent bug?
v4: Rebase onto "xen_console: correctly cleanup primary console on
teardown."
xenforeignmemory_unmap takes pages not bytes
Compat wrapper for xenforeignmemory_open instead of ifdef in code.
Run check patch and fix most issues. I did not fix:
ERROR: do not initialise globals to 0 or NULL
+xenforeignmemory_handle *xen_fmem = NULL;
=> This is consistent with all of the existing declarations.
ERROR: need consistent spacing around '*' (ctx:WxV) +typedef xc_interface *xenforeignmemory_handle;
=> I think this is a false +ve since this is a pointer "*" not a multiple "*".
--- hw/char/xen_console.c | 8 ++++---- hw/display/xenfb.c | 15 ++++++++------- hw/xen/xen_backend.c | 3 ++- include/hw/xen/xen_backend.h | 1 + include/hw/xen/xen_common.h | 12 ++++++++++++ xen-common.c | 6 ++++++ xen-hvm.c | 18 +++++++++--------- xen-mapcache.c | 6 +++--- 8 files changed, 45 insertions(+), 24 deletions(-)
hw/char/xen_console.c +4 -4
@@ -230,9 +230,9 @@ static int con_initialise(struct XenDevice *xendev)if (!xendev->dev) {xen_pfn_t mfn = con->ring_ref; - con->sring =xc_map_foreign_bulk (xen_xc, con->xendev.dom, -PROT_READ |PROT_WRITE , - &mfn, &err,1 ); + con->sring =xenforeignmemory_map (xen_fmem, con->xendev.dom, +PROT_READ |PROT_WRITE , + &mfn, &err,1 ); }else { con->sring = xengnttab_map_grant_ref(xendev->gnttabdev, con->xendev.dom, con->ring_ref,
@@ -274,7 +274,7 @@ static void con_disconnect(struct XenDevice *xendev)if (con->sring) {if (!xendev->dev) { -munmap (con->sring,XC_PAGE_SIZE ); +xenforeignmemory_unmap (xen_fmem, con->sring,1 ); }else {xengnttab_munmap (xendev->gnttabdev, con->sring,1 ); }
hw/display/xenfb.c +8 -7
@@ -105,8 +105,8 @@ static int common_bind(struct common *c)if (xenstore_read_fe_int (&c->xendev,"event-channel" , &c->xendev.remote_port) ==-1 )return -1 ; - c->page =xc_map_foreign_bulk (xen_xc, c->xendev.dom, -PROT_READ |PROT_WRITE , &mfn, &err,1 ); + c->page =xenforeignmemory_map (xen_fmem, c->xendev.dom, +PROT_READ |PROT_WRITE , &mfn, &err,1 );if (c->page ==NULL )return -1 ;
@@ -121,7 +121,7 @@ static void common_unbind(struct common *c) {xen_be_unbind_evtchn (&c->xendev);if (c->page) { -munmap (c->page,XC_PAGE_SIZE ); +xenforeignmemory_unmap (xen_fmem, c->page,1 ); c->page =NULL ; } }
@@ -496,14 +496,14 @@ static int xenfb_map_fb(struct XenFB *xenfb) errs =g_malloc0 (sizeof (int ) * n_fbdirs);xenfb_copy_mfns (mode, n_fbdirs, pgmfns, pd); - map =xc_map_foreign_bulk (xen_xc, xenfb->c.xendev.dom, -PROT_READ , pgmfns, errs, n_fbdirs); + map =xenforeignmemory_map (xen_fmem, xenfb->c.xendev.dom, +PROT_READ , pgmfns, errs, n_fbdirs);if (map ==NULL ) goto out;xenfb_copy_mfns (mode, xenfb->fbpages, fbmfns, map); -munmap (map, n_fbdirs *XC_PAGE_SIZE ); +xenforeignmemory_unmap (xen_fmem, map, n_fbdirs); - xenfb->pixels =xc_map_foreign_bulk (xen_xc, xenfb->c.xendev.dom, + xenfb->pixels =xenforeignmemory_map (xen_fmem, xenfb->c.xendev.dom,PROT_READ , fbmfns, errs, xenfb->fbpages);if (xenfb->pixels ==NULL ) goto out;
@@ -912,6 +912,7 @@ static void fb_disconnect(struct XenDevice *xendev)* Replacing the framebuffer with anonymous shared memory * instead. This releases the guest pages and keeps qemu happy. */ +xenforeignmemory_unmap (xen_fmem, fb->pixels, fb->fbpages); fb->pixels =mmap (fb->pixels, fb->fbpages *XC_PAGE_SIZE ,PROT_READ |PROT_WRITE ,MAP_SHARED |MAP_ANON ,-1 ,0 );
hw/xen/xen_backend.c +2 -1
@@ -45,6 +45,7 @@/* public */ XenXC xen_xc =XC_HANDLER_INITIAL_VALUE ; +xenforeignmemory_handle *xen_fmem =NULL ;struct xs_handle *xenstore =NULL ;const char *xen_protocol;
@@ -717,7 +718,7 @@ int xen_be_init(void)qemu_set_fd_handler (xs_fileno (xenstore), xenstore_update,NULL ,NULL ); -if (xen_xc ==XC_HANDLER_INITIAL_VALUE ) { +if (xen_xc ==XC_HANDLER_INITIAL_VALUE || xen_fmem ==NULL ) {/* Check if xen_init() have been called */ goto err; }
include/hw/xen/xen_backend.h +1 -0
@@ -57,6 +57,7 @@ struct XenDevice {/* variables */ extern XenXC xen_xc; +extern xenforeignmemory_handle *xen_fmem;extern struct xs_handle *xenstore;extern const char *xen_protocol;
include/hw/xen/xen_common.h +12 -0
@@ -41,6 +41,7 @@ static inline void *xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot,typedef int XenXC ;typedef int xenevtchn_handle ;typedef int xengnttab_handle ; +typedef int xenforeignmemory_handle ;# define XC_INTERFACE_FMT "%i"# define XC_HANDLER_INITIAL_VALUE -1
@@ -104,6 +105,11 @@ static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger,return xc_interface_open (); } +#define xenforeignmemory_open (l, f) &xen_xc +#define xenforeignmemory_map (h, d, p, a, e, n) \ + xc_map_foreign_bulk(*h, d, p, a, e, n) +#define xenforeignmemory_unmap (h, p, s) munmap(p, s * XC_PAGE_SIZE) +static inline int xc_fd (int xen_xc) {return xen_xc;
@@ -149,6 +155,7 @@ static inline void xs_close(struct xs_handle *xsh)#else typedef xc_interface *XenXC ; +typedef xc_interface *xenforeignmemory_handle ;typedef xc_evtchn xenevtchn_handle ;typedef xc_gnttab xengnttab_handle ;
@@ -178,6 +185,11 @@ static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger,return xc_interface_open (logger, dombuild_logger, open_flags); } +#define xenforeignmemory_open (l, f) &xen_xc +#define xenforeignmemory_map (h, d, p, a, e, n) \ + xc_map_foreign_bulk(*h, d, p, a, e, n) +#define xenforeignmemory_unmap (h, p, s) munmap(p, s * XC_PAGE_SIZE) +/* FIXME There is now way to have the xen fd */ static inline int xc_fd (xc_interface *xen_xc) {
xen-common.c +6 -0
@@ -118,6 +118,12 @@ static int xen_init(MachineState *ms)xen_be_printf (NULL ,0 ,"can't open xen interface\n" );return -1 ; } + xen_fmem =xenforeignmemory_open (0 ,0 ); +if (xen_fmem ==NULL ) { +xen_be_printf (NULL ,0 ,"can't open xen fmem interface\n" ); +xc_interface_close (xen_xc); +return -1 ; + }qemu_add_vm_change_state_handler (xen_change_state_handler,NULL );global_state_set_optional ();
xen-hvm.c +9 -9
@@ -1240,9 +1240,9 @@ int xen_hvm_init(PCMachineState *pcms,DPRINTF ("buffered io page at pfn %lx\n" , bufioreq_pfn);DPRINTF ("buffered io evtchn is %x\n" , bufioreq_evtchn); - state->shared_page =xc_map_foreign_bulk (xen_xc, xen_domid, -PROT_READ |PROT_WRITE , - &ioreq_pfn, &map_err,1 ); + state->shared_page =xenforeignmemory_map (xen_fmem, xen_domid, +PROT_READ |PROT_WRITE , + &ioreq_pfn, &map_err,1 );if (state->shared_page ==NULL ) { hw_error( "map shared IO page returned error %d(%d) handle=" XC_INTERFACE_FMT,
@@ -1253,8 +1253,8 @@ int xen_hvm_init(PCMachineState *pcms,if (!rc) {DPRINTF ("shared vmport page at pfn %lx\n" , ioreq_pfn); state->shared_vmport_page = -xc_map_foreign_bulk (xen_xc, xen_domid,PROT_READ |PROT_WRITE , - &ioreq_pfn, &map_err,1 ); +xenforeignmemory_map (xen_fmem, xen_domid,PROT_READ |PROT_WRITE , + &ioreq_pfn, &map_err,1 );if (state->shared_vmport_page ==NULL ) {hw_error ("map shared vmport IO page returned error %d (%d) handle=" XC_INTERFACE_FMT , errno, map_err, xen_xc);
@@ -1263,10 +1263,10 @@ int xen_hvm_init(PCMachineState *pcms,hw_error ("get vmport regs pfn returned error %d, rc=%d" , errno, rc); } - state->buffered_io_page =xc_map_foreign_bulk (xen_xc, xen_domid, -PROT_READ |PROT_WRITE , - &bufioreq_pfn, - &map_err,1 ); + state->buffered_io_page =xenforeignmemory_map (xen_fmem, xen_domid, +PROT_READ |PROT_WRITE , + &bufioreq_pfn, + &map_err,1 );if (state->buffered_io_page ==NULL ) {hw_error ("map buffered IO page returned error %d (%d)" , errno, map_err); }
xen-mapcache.c +3 -3
@@ -176,10 +176,10 @@ static void xen_remap_bucket(MapCacheEntry *entry, pfns[i] = (address_index << (MCACHE_BUCKET_SHIFT -XC_PAGE_SHIFT )) + i; } - vaddr_base =xc_map_foreign_bulk (xen_xc, xen_domid,PROT_READ |PROT_WRITE , - pfns, err, nb_pfn); + vaddr_base =xenforeignmemory_map (xen_fmem, xen_domid,PROT_READ |PROT_WRITE , + pfns, err, nb_pfn);if (vaddr_base ==NULL ) { -perror ("xc_map_foreign_bulk" ); +perror ("xenforeignmemory_map" );exit (-1 ); }
Signature · 1 line
2.1.4
PATCH v5 7/9 xen: Use stable library interfaces when they are available.
In reply to Ian CampbellIn Xen 4.7 we are refactoring parts libxenctrl into a number of separate libraries which will provide backward and forward API and ABI compatiblity.
Specifically libxenevtchn, libxengnttab and libxenforeignmemory.
Previous patches have already laid the groundwork for using these by switching the existing compatibility shims to reflect the intefaces to these libraries.
So all which remains is to update configure to detect the libraries and enable their use. Although they are notionally independent we take an all or nothing approach to the three libraries since they were added at the same time.
The only non-obvious bit is that we now open a proper xenforeignmemory handle for xen_fmem instead of reusing the xen_xc handle.
Build tested with 4.0 .. 4.6 (inclusive) and the patches targetting 4.7 which adds these libraries.
---
v5: Remove ifdef check when undeffing the compat stuff.
s/now way/no way/
v4: xenforeignmemory_open is now a compat wrapper, so no ifdef.
Simplify configury by asserting that interface version 470 will always have the libraries (lack of them makes it 460).
Ran checkpatch and fixed everything except:
ERROR: need consistent spacing around '*' (ctx:WxV) +typedef xc_interface *XenXC;
Which I think is a false +ve.
Simpler configure stuff
--- configure | 55 +++++++++++++++++++++++++++++++++++++++++++++ include/hw/xen/xen_common.h | 36 +++++++++++++++++++++++++++-- 2 files changed, 89 insertions(+), 2 deletions(-)
configure +55 -0
@@ -1898,6 +1898,7 @@ fi if test "$xen" != "no" ; then xen_libs="-lxenstore -lxenctrl -lxenguest" + xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn" # First we test whether Xen headers and libraries are available. # If no, we are done and there is no Xen support.
@@ -1920,6 +1921,57 @@ EOF # Xen unstable elif cat > $TMPC <<EOF && +/* + * If we have stable libs the we don't want the libxc compat + * layers, regardless of what CFLAGS we may have been given. + */ +#undef XC_WANT_COMPAT_EVTCHN_API +#undef XC_WANT_COMPAT_GNTTAB_API +#undef XC_WANT_COMPAT_MAP_FOREIGN_API +#include <xenctrl.h> +#include <xenstore.h> +#include <xenevtchn.h> +#include <xengnttab.h> +#include <xenforeignmemory.h> +#include <stdint.h> +#include <xen/hvm/hvm_info_table.h> +#if !defined(HVM_MAX_VCPUS) +# error HVM_MAX_VCPUS not defined +#endif +int main(void) { + xc_interface *xc; + xenforeignmemory_handle *xfmem; + xenevtchn_handle *xe; + xengnttab_handle *xg; + + xs_daemon_open(); + + 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_inject_msi(xc, 0, 0xf0000000, 0x00000000); + xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL); + + xfmem = xenforeignmemory_open(0, 0); + xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0); + + xe = xenevtchn_open(0, 0); + xenevtchn_fd(xe); + + xg = xengnttab_open(0, 0); + xengnttab_map_grant_ref(xg, 0, 0, 0); + + return 0; +} +EOF + compile_prog "" "$xen_libs $xen_stable_libs" + then + xen_ctrl_version=470 + xen=yes + + # Xen 4.6 + elif + cat > $TMPC <<EOF && #include <xenctrl.h> #include <xenstore.h> #include <stdint.h>
@@ -2096,6 +2148,9 @@ EOF fi if test "$xen" = yes; then + if test $xen_ctrl_version -ge 470 ; then + libs_softmmu="$xen_stable_libs $libs_softmmu" + fi libs_softmmu="$xen_libs $libs_softmmu" fi fi
include/hw/xen/xen_common.h +34 -2
@@ -6,6 +6,15 @@#include <stddef.h> #include <inttypes.h> +/* +* If we have new enough libxenctrl then we do not want/need these compat +* interfaces, despite what the user supplied cflags might say. They +* must be undefined before including xenctrl.h +*/ +#undef XC_WANT_COMPAT_EVTCHN_API +#undef XC_WANT_COMPAT_GNTTAB_API +#undef XC_WANT_COMPAT_MAP_FOREIGN_API +#include <xenctrl.h> #if CONFIG_XEN_CTRL_INTERFACE_VERSION <420 # include <xs.h>
@@ -151,8 +160,8 @@ static inline void xs_close(struct xs_handle *xsh) } -/* Xen 4.1 */ -#else +/* Xen 4.1 thru 4.6 */ +#elif CONFIG_XEN_CTRL_INTERFACE_VERSION < 470typedef xc_interface *XenXC ;typedef xc_interface *xenforeignmemory_handle ;
@@ -190,11 +199,34 @@ static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, xc_map_foreign_bulk(*h, d, p, a, e, n)#define xenforeignmemory_unmap (h, p, s) munmap(p, s * XC_PAGE_SIZE) +/* FIXME There is no way to have the xen fd */ +static inline int xc_fd (xc_interface *xen_xc) +{ +return -1 ; +} +#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 470 */ + +typedef xc_interface *XenXC ; + +# define XC_INTERFACE_FMT "%p" +# define XC_HANDLER_INITIAL_VALUE NULL + +#include <xenevtchn.h> +#include <xengnttab.h> +#include <xenforeignmemory.h> + +static inline XenXC xen_xc_interface_open (void *logger,void *dombuild_logger, +unsigned int open_flags) +{ +return xc_interface_open (logger, dombuild_logger, open_flags); +} +/* FIXME There is now way to have the xen fd */ static inline int xc_fd (xc_interface *xen_xc) {return -1 ; } +#endif /* Xen before 4.2 */
Signature · 1 line
2.1.4
PATCH v5 7/9 xen: Use stable library interfaces when they are available.
In reply to Ian CampbellIn Xen 4.7 we are refactoring parts libxenctrl into a number of separate libraries which will provide backward and forward API and ABI compatiblity.
Specifically libxenevtchn, libxengnttab and libxenforeignmemory.
Previous patches have already laid the groundwork for using these by switching the existing compatibility shims to reflect the intefaces to these libraries.
So all which remains is to update configure to detect the libraries and enable their use. Although they are notionally independent we take an all or nothing approach to the three libraries since they were added at the same time.
The only non-obvious bit is that we now open a proper xenforeignmemory handle for xen_fmem instead of reusing the xen_xc handle.
Build tested with 4.0 .. 4.6 (inclusive) and the patches targetting 4.7 which adds these libraries.
---
v5: Remove ifdef check when undeffing the compat stuff.
s/now way/no way/
v4: xenforeignmemory_open is now a compat wrapper, so no ifdef.
Simplify configury by asserting that interface version 470 will always have the libraries (lack of them makes it 460).
Ran checkpatch and fixed everything except:
ERROR: need consistent spacing around '*' (ctx:WxV) +typedef xc_interface *XenXC;
Which I think is a false +ve.
Simpler configure stuff
--- configure | 55 +++++++++++++++++++++++++++++++++++++++++++++ include/hw/xen/xen_common.h | 36 +++++++++++++++++++++++++++-- 2 files changed, 89 insertions(+), 2 deletions(-)
configure +55 -0
@@ -1898,6 +1898,7 @@ fi if test "$xen" != "no" ; then xen_libs="-lxenstore -lxenctrl -lxenguest" + xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn" # First we test whether Xen headers and libraries are available. # If no, we are done and there is no Xen support.
@@ -1920,6 +1921,57 @@ EOF # Xen unstable elif cat > $TMPC <<EOF && +/* + * If we have stable libs the we don't want the libxc compat + * layers, regardless of what CFLAGS we may have been given. + */ +#undef XC_WANT_COMPAT_EVTCHN_API +#undef XC_WANT_COMPAT_GNTTAB_API +#undef XC_WANT_COMPAT_MAP_FOREIGN_API +#include <xenctrl.h> +#include <xenstore.h> +#include <xenevtchn.h> +#include <xengnttab.h> +#include <xenforeignmemory.h> +#include <stdint.h> +#include <xen/hvm/hvm_info_table.h> +#if !defined(HVM_MAX_VCPUS) +# error HVM_MAX_VCPUS not defined +#endif +int main(void) { + xc_interface *xc; + xenforeignmemory_handle *xfmem; + xenevtchn_handle *xe; + xengnttab_handle *xg; + + xs_daemon_open(); + + 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_inject_msi(xc, 0, 0xf0000000, 0x00000000); + xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL); + + xfmem = xenforeignmemory_open(0, 0); + xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0); + + xe = xenevtchn_open(0, 0); + xenevtchn_fd(xe); + + xg = xengnttab_open(0, 0); + xengnttab_map_grant_ref(xg, 0, 0, 0); + + return 0; +} +EOF + compile_prog "" "$xen_libs $xen_stable_libs" + then + xen_ctrl_version=470 + xen=yes + + # Xen 4.6 + elif + cat > $TMPC <<EOF && #include <xenctrl.h> #include <xenstore.h> #include <stdint.h>
@@ -2096,6 +2148,9 @@ EOF fi if test "$xen" = yes; then + if test $xen_ctrl_version -ge 470 ; then + libs_softmmu="$xen_stable_libs $libs_softmmu" + fi libs_softmmu="$xen_libs $libs_softmmu" fi fi
include/hw/xen/xen_common.h +34 -2
@@ -6,6 +6,15 @@#include <stddef.h> #include <inttypes.h> +/* +* If we have new enough libxenctrl then we do not want/need these compat +* interfaces, despite what the user supplied cflags might say. They +* must be undefined before including xenctrl.h +*/ +#undef XC_WANT_COMPAT_EVTCHN_API +#undef XC_WANT_COMPAT_GNTTAB_API +#undef XC_WANT_COMPAT_MAP_FOREIGN_API +#include <xenctrl.h> #if CONFIG_XEN_CTRL_INTERFACE_VERSION <420 # include <xs.h>
@@ -151,8 +160,8 @@ static inline void xs_close(struct xs_handle *xsh) } -/* Xen 4.1 */ -#else +/* Xen 4.1 thru 4.6 */ +#elif CONFIG_XEN_CTRL_INTERFACE_VERSION < 470typedef xc_interface *XenXC ;typedef xc_interface *xenforeignmemory_handle ;
@@ -190,11 +199,34 @@ static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, xc_map_foreign_bulk(*h, d, p, a, e, n)#define xenforeignmemory_unmap (h, p, s) munmap(p, s * XC_PAGE_SIZE) +/* FIXME There is no way to have the xen fd */ +static inline int xc_fd (xc_interface *xen_xc) +{ +return -1 ; +} +#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 470 */ + +typedef xc_interface *XenXC ; + +# define XC_INTERFACE_FMT "%p" +# define XC_HANDLER_INITIAL_VALUE NULL + +#include <xenevtchn.h> +#include <xengnttab.h> +#include <xenforeignmemory.h> + +static inline XenXC xen_xc_interface_open (void *logger,void *dombuild_logger, +unsigned int open_flags) +{ +return xc_interface_open (logger, dombuild_logger, open_flags); +} +/* FIXME There is now way to have the xen fd */ static inline int xc_fd (xc_interface *xen_xc) {return -1 ; } +#endif /* Xen before 4.2 */
Signature · 1 line
2.1.4
Re: [PATCH QEMU-XEN v5 7/9] xen: Use stable library interfaces when they are available.
Quoted 15 lines · Ian Campbell
In Xen 4.7 we are refactoring parts libxenctrl into a number of separate libraries which will provide backward and forward API and ABI compatiblity.
Specifically libxenevtchn, libxengnttab and libxenforeignmemory.
Previous patches have already laid the groundwork for using these by switching the existing compatibility shims to reflect the intefaces to these libraries.
So all which remains is to update configure to detect the libraries and enable their use. Although they are notionally independent we take an all or nothing approach to the three libraries since they were added at the same time.
Quoted 7 lines
The only non-obvious bit is that we now open a proper xenforeignmemory handle for
xen_fmeminstead of reusing thexen_xchandle.Build tested with 4.0 .. 4.6 (inclusive) and the patches targetting 4.7 which adds these libraries.
Signed-off-by Ian Campbell <[email protected]>
Two formatting issues below:
Quoted 92 lines
v5: Remove ifdef check when undeffing the compat stuff.
s/now way/no way/v4:
xenforeignmemory_openis now a compat wrapper, so no ifdef.Simplify configury by asserting that interface version 470 will always have the libraries (lack of them makes it 460).
Ran checkpatch and fixed everything except:
ERROR: need consistent spacing around '*' (ctx:WxV) +typedef
xc_interface*XenXC;Which I think is a false +ve.
Simpler configure stuff
--- configure | 55 +++++++++++++++++++++++++++++++++++++++++++++ include/hw/xen/xen_common.h | 36 +++++++++++++++++++++++++++-- 2 files changed, 89 insertions(+), 2 deletions(-)configure +52
-0@@ -1898,6 +1898,7 @@ fi if test "$xen" != "no" ; then xen_libs="-lxenstore -lxenctrl -lxenguest" + xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn" # First we test whether Xen headers and libraries are available. # If no, we are done and there is no Xen support.@@ -1920,6 +1921,57 @@ EOF # Xen unstable elif cat > $TMPC <<EOF && +/* + * If we have stable libs the we don't want the libxc compat + * layers, regardless of what CFLAGS we may have been given. + */ +#undef XC_WANT_COMPAT_EVTCHN_API +#undef XC_WANT_COMPAT_GNTTAB_API +#undef XC_WANT_COMPAT_MAP_FOREIGN_API +#include <xenctrl.h> +#include <xenstore.h> +#include <xenevtchn.h> +#include <xengnttab.h> +#include <xenforeignmemory.h> +#include <stdint.h> +#include <xen/hvm/hvm_info_table.h> +#if !defined(HVM_MAX_VCPUS) +# error HVM_MAX_VCPUS not defined +#endif +int main(void) { + xc_interface *xc; + xenforeignmemory_handle *xfmem; + xenevtchn_handle *xe; + xengnttab_handle *xg; + + xs_daemon_open(); + + 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_inject_msi(xc, 0, 0xf0000000, 0x00000000); + xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL); + + xfmem = xenforeignmemory_open(0, 0); + xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0); + + xe = xenevtchn_open(0, 0); + xenevtchn_fd(xe); + + xg = xengnttab_open(0, 0); + xengnttab_map_grant_ref(xg, 0, 0, 0); + + return 0; +} +EOF + compile_prog "" "$xen_libs $xen_stable_libs" + then + xen_ctrl_version=470 + xen=yes + + # Xen 4.6 + elif + cat > $TMPC <<EOF && #include <xenctrl.h> #include <xenstore.h> #include <stdint.h>
configure EOF · line 2152
Quoted 5 lines
configure +2
-0@@ -2096,6 +2148,9 @@ EOF fi if test "$xen" = yes; then + if test $xen_ctrl_version -ge 470 ; then + libs_softmmu="$xen_stable_libs $libs_softmmu"
tab
Quoted 57 lines
configure +1
-0+ fi libs_softmmu="$xen_libs $libs_softmmu" fi fiinclude/hw/xen/xen_common.h +29
-2@@ -6,6 +6,15 @@#include <stddef.h> #include <inttypes.h> +/* +* If we have new enough libxenctrl then we do not want/need these compat +* interfaces, despite what the user supplied cflags might say. They +* must be undefined before including xenctrl.h +*/ +#undef XC_WANT_COMPAT_EVTCHN_API +#undef XC_WANT_COMPAT_GNTTAB_API +#undef XC_WANT_COMPAT_MAP_FOREIGN_API +#include <xenctrl.h> #if CONFIG_XEN_CTRL_INTERFACE_VERSION <420 # include <xs.h> @@ -151,8 +160,8 @@ static inline void xs_close(struct xs_handle *xsh) } -/* Xen 4.1 */ -#else +/* Xen 4.1 thru 4.6 */ +#elif CONFIG_XEN_CTRL_INTERFACE_VERSION < 470typedef xc_interface *XenXC ;typedef xc_interface *xenforeignmemory_handle ;@@ -190,11 +199,34 @@ static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, xc_map_foreign_bulk(*h, d, p, a, e, n)#define xenforeignmemory_unmap (h, p, s) munmap(p, s * XC_PAGE_SIZE) +/* FIXME There is no way to have the xen fd */ +static inline int xc_fd (xc_interface *xen_xc) +{ +return -1 ; +} +#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 470 */ + +typedef xc_interface *XenXC ; + +# define XC_INTERFACE_FMT "%p" +# define XC_HANDLER_INITIAL_VALUE NULL + +#include <xenevtchn.h> +#include <xengnttab.h> +#include <xenforeignmemory.h> + +static inline XenXC xen_xc_interface_open (void *logger,void *dombuild_logger, +unsigned int open_flags)
include/hw/xen/xen_common.h static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, · line 229
Quoted 10 lines
include/hw/xen/xen_common.h +5
-0+{ +return xc_interface_open (logger, dombuild_logger, open_flags); +} +/* FIXME There is now way to have the xen fd */ static inline int xc_fd (xc_interface *xen_xc) {return -1 ; } +
stray line
Quoted 6 lines
include/hw/xen/xen_common.h +0
-0#endif /* Xen before 4.2 */ Signature · 1 line
2.1.4
Re: [Qemu-devel] [PATCH QEMU-XEN v5 7/9] xen: Use stable library interfaces when they are available.
In reply to Ian CampbellQuoted 15 lines · Ian Campbell
In Xen 4.7 we are refactoring parts libxenctrl into a number of separate libraries which will provide backward and forward API and ABI compatiblity.
Specifically libxenevtchn, libxengnttab and libxenforeignmemory.
Previous patches have already laid the groundwork for using these by switching the existing compatibility shims to reflect the intefaces to these libraries.
So all which remains is to update configure to detect the libraries and enable their use. Although they are notionally independent we take an all or nothing approach to the three libraries since they were added at the same time.
Quoted 7 lines
The only non-obvious bit is that we now open a proper xenforeignmemory handle for
xen_fmeminstead of reusing thexen_xchandle.Build tested with 4.0 .. 4.6 (inclusive) and the patches targetting 4.7 which adds these libraries.
Signed-off-by Ian Campbell <[email protected]>
Two formatting issues below:
Quoted 92 lines
v5: Remove ifdef check when undeffing the compat stuff.
s/now way/no way/v4:
xenforeignmemory_openis now a compat wrapper, so no ifdef.Simplify configury by asserting that interface version 470 will always have the libraries (lack of them makes it 460).
Ran checkpatch and fixed everything except:
ERROR: need consistent spacing around '*' (ctx:WxV) +typedef
xc_interface*XenXC;Which I think is a false +ve.
Simpler configure stuff
--- configure | 55 +++++++++++++++++++++++++++++++++++++++++++++ include/hw/xen/xen_common.h | 36 +++++++++++++++++++++++++++-- 2 files changed, 89 insertions(+), 2 deletions(-)configure +52
-0@@ -1898,6 +1898,7 @@ fi if test "$xen" != "no" ; then xen_libs="-lxenstore -lxenctrl -lxenguest" + xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn" # First we test whether Xen headers and libraries are available. # If no, we are done and there is no Xen support.@@ -1920,6 +1921,57 @@ EOF # Xen unstable elif cat > $TMPC <<EOF && +/* + * If we have stable libs the we don't want the libxc compat + * layers, regardless of what CFLAGS we may have been given. + */ +#undef XC_WANT_COMPAT_EVTCHN_API +#undef XC_WANT_COMPAT_GNTTAB_API +#undef XC_WANT_COMPAT_MAP_FOREIGN_API +#include <xenctrl.h> +#include <xenstore.h> +#include <xenevtchn.h> +#include <xengnttab.h> +#include <xenforeignmemory.h> +#include <stdint.h> +#include <xen/hvm/hvm_info_table.h> +#if !defined(HVM_MAX_VCPUS) +# error HVM_MAX_VCPUS not defined +#endif +int main(void) { + xc_interface *xc; + xenforeignmemory_handle *xfmem; + xenevtchn_handle *xe; + xengnttab_handle *xg; + + xs_daemon_open(); + + 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_inject_msi(xc, 0, 0xf0000000, 0x00000000); + xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL); + + xfmem = xenforeignmemory_open(0, 0); + xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0); + + xe = xenevtchn_open(0, 0); + xenevtchn_fd(xe); + + xg = xengnttab_open(0, 0); + xengnttab_map_grant_ref(xg, 0, 0, 0); + + return 0; +} +EOF + compile_prog "" "$xen_libs $xen_stable_libs" + then + xen_ctrl_version=470 + xen=yes + + # Xen 4.6 + elif + cat > $TMPC <<EOF && #include <xenctrl.h> #include <xenstore.h> #include <stdint.h>
configure EOF · line 2152
Quoted 5 lines
configure +2
-0@@ -2096,6 +2148,9 @@ EOF fi if test "$xen" = yes; then + if test $xen_ctrl_version -ge 470 ; then + libs_softmmu="$xen_stable_libs $libs_softmmu"
tab
Quoted 57 lines
configure +1
-0+ fi libs_softmmu="$xen_libs $libs_softmmu" fi fiinclude/hw/xen/xen_common.h +29
-2@@ -6,6 +6,15 @@#include <stddef.h> #include <inttypes.h> +/* +* If we have new enough libxenctrl then we do not want/need these compat +* interfaces, despite what the user supplied cflags might say. They +* must be undefined before including xenctrl.h +*/ +#undef XC_WANT_COMPAT_EVTCHN_API +#undef XC_WANT_COMPAT_GNTTAB_API +#undef XC_WANT_COMPAT_MAP_FOREIGN_API +#include <xenctrl.h> #if CONFIG_XEN_CTRL_INTERFACE_VERSION <420 # include <xs.h> @@ -151,8 +160,8 @@ static inline void xs_close(struct xs_handle *xsh) } -/* Xen 4.1 */ -#else +/* Xen 4.1 thru 4.6 */ +#elif CONFIG_XEN_CTRL_INTERFACE_VERSION < 470typedef xc_interface *XenXC ;typedef xc_interface *xenforeignmemory_handle ;@@ -190,11 +199,34 @@ static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, xc_map_foreign_bulk(*h, d, p, a, e, n)#define xenforeignmemory_unmap (h, p, s) munmap(p, s * XC_PAGE_SIZE) +/* FIXME There is no way to have the xen fd */ +static inline int xc_fd (xc_interface *xen_xc) +{ +return -1 ; +} +#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 470 */ + +typedef xc_interface *XenXC ; + +# define XC_INTERFACE_FMT "%p" +# define XC_HANDLER_INITIAL_VALUE NULL + +#include <xenevtchn.h> +#include <xengnttab.h> +#include <xenforeignmemory.h> + +static inline XenXC xen_xc_interface_open (void *logger,void *dombuild_logger, +unsigned int open_flags)
include/hw/xen/xen_common.h static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, · line 229
Quoted 10 lines
include/hw/xen/xen_common.h +5
-0+{ +return xc_interface_open (logger, dombuild_logger, open_flags); +} +/* FIXME There is now way to have the xen fd */ static inline int xc_fd (xc_interface *xen_xc) {return -1 ; } +
stray line
Quoted 6 lines
include/hw/xen/xen_common.h +0
-0#endif /* Xen before 4.2 */ Signature · 1 line
2.1.4
PATCH v5 8/9 xen: domainbuild: reopen libxenctrl interface after forking for domain watcher.
In reply to Ian CampbellUsing an existing libxenctrl handle after a fork was never particularly safe (especially if foreign mappings existed at the time of the fork) and the xc fd has been unavailable for many releases.
Reopen the handle after fork and therefore do away with xc_fd().
---
The fact that xc_fd hasn't been useful since at least Xen 4.1 makes me question the utility of this domainbuild in QEMU. Perhaps we should just nuke it?
--- hw/xenpv/xen_domainbuild.c | 9 ++++++--- include/hw/xen/xen_common.h | 17 ----------------- 2 files changed, 6 insertions(+), 20 deletions(-)
hw/xenpv/xen_domainbuild.c +6 -3
@@ -174,12 +174,15 @@ static int xen_domain_watcher(void)for (i =3 ; i < n; i++) {if (i == fd[0 ])continue ; -if (i ==xc_fd (xen_xc)) { -continue ; - }close (i); } +/* +* Reopen xc interface, since the original is unsafe after fork +* and was closed above. +*/ + xen_xc =xc_interface_open (0 ,0 ,0 ); +/* ignore term signals */ signal (SIGINT ,SIG_IGN );signal (SIGTERM ,SIG_IGN );
include/hw/xen/xen_common.h +0 -17
@@ -119,12 +119,6 @@ static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, xc_map_foreign_bulk(*h, d, p, a, e, n)#define xenforeignmemory_unmap (h, p, s) munmap(p, s * XC_PAGE_SIZE) -static inline int xc_fd (int xen_xc) -{ -return xen_xc; -} - -static inline int xc_domain_populate_physmap_exact (XenXC xc_handle,uint32_t domid,unsigned long nr_extents,unsigned int extent_order,unsigned int mem_flags,xen_pfn_t *extent_start)
@@ -199,11 +193,6 @@ static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, xc_map_foreign_bulk(*h, d, p, a, e, n)#define xenforeignmemory_unmap (h, p, s) munmap(p, s * XC_PAGE_SIZE) -/* FIXME There is no way to have the xen fd */ -static inline int xc_fd (xc_interface *xen_xc) -{ -return -1 ; -}#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 470 */ typedef xc_interface *XenXC ;
@@ -221,12 +210,6 @@ static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, return xc_interface_open(logger, dombuild_logger, open_flags); } -/* FIXME There is now way to have the xen fd */ -static inline int xc_fd (xc_interface *xen_xc) -{ -return -1 ; -} -#endif /* Xen before 4.2 */
Signature · 1 line
2.1.4
PATCH v5 9/9 xen: make it possible to build without the Xen PV domain builder
In reply to Ian CampbellUntil the previous patch this relied on xc_fd(), which was only implemented for Xen 4.0 and earlier.
Given this wasn't working since Xen 4.0 I have marked this as disabled by default.
Removing this support drops the use of a bunch of symbols from libxenctrl, specifically:
- xc_domain_create
- xc_domain_destroy
- xc_domain_getinfo
- xc_domain_max_vcpus
- xc_domain_setmaxmem
- xc_domain_unpause
- xc_evtchn_alloc_unbound
- xc_linux_build
This is another step towards only using Xen libraries which provide a stable inteface.
---
v5: XEN_CREATE entirely wihtin CONFIG_XEN_PV_DOMAIN_BUILD ifdef.
Simplify configure'ry.
v4: Fixed all checkpatch errors.
Disabled by default.
--- configure | 15 +++++++++++++++ hw/xenpv/Makefile.objs | 4 +++- hw/xenpv/xen_machine_pv.c | 15 +++++++++++---- 3 files changed, 29 insertions(+), 5 deletions(-)
configure +15 -0
@@ -247,6 +247,7 @@ vnc_jpeg="" vnc_png="" xen="" xen_ctrl_version="" +xen_pv_domain_build="no" xen_pci_passthrough="" linux_aio="" cap_ng=""
@@ -917,6 +918,10 @@ for opt do ;; --enable-xen-pci-passthrough) xen_pci_passthrough="yes" ;; + --disable-xen-pv-domain-build) xen_pv_domain_build="no" + ;; + --enable-xen-pv-domain-build) xen_pv_domain_build="yes" + ;; --disable-brlapi) brlapi="no" ;; --enable-brlapi) brlapi="yes"
@@ -2172,6 +2177,12 @@ if test "$xen_pci_passthrough" != "no"; then fi fi +if test "$xen_pv_domain_build" = "yes" && + test "$xen" != "yes"; then + error_exit "User requested Xen PV domain builder support" \ + "which requires Xen support." +fi + ########################################## # libtool probe
@@ -4762,6 +4773,7 @@ fi echo "xen support $xen" if test "$xen" = "yes" ; then echo "xen ctrl version $xen_ctrl_version" + echo "pv dom build $xen_pv_domain_build" fi echo "brlapi support $brlapi" echo "bluez support $bluez"
@@ -5130,6 +5142,9 @@ fi if test "$xen" = "yes" ; then echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak + if test "$xen_pv_domain_build" = "yes" ; then + echo "CONFIG_XEN_PV_DOMAIN_BUILD=y" >> $config_host_mak + fi fi if test "$linux_aio" = "yes" ; then echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
hw/xenpv/Makefile.objs +3 -1
@@ -1,2 +1,4 @@ # Xen PV machine support -obj-$(CONFIG_XEN) += xen_domainbuild.o xen_machine_pv.o +obj-$(CONFIG_XEN) += xen_machine_pv.o +# Xen PV machine builder support +obj-$(CONFIG_XEN_PV_DOMAIN_BUILD) += xen_domainbuild.o
hw/xenpv/xen_machine_pv.c +11 -4
@@ -30,9 +30,6 @@static void xen_init_pv (MachineState *machine) { -const char *kernel_filename = machine->kernel_filename; -const char *kernel_cmdline = machine->kernel_cmdline; -const char *initrd_filename = machine->initrd_filename;DriveInfo *dinfo;int i;
@@ -46,17 +43,27 @@ static void xen_init_pv(MachineState *machine)case XEN_ATTACH :/* nothing to do, xend handles everything */ break ; -case XEN_CREATE : +#ifdef CONFIG_XEN_PV_DOMAIN_BUILD +case XEN_CREATE : { +const char *kernel_filename = machine->kernel_filename; +const char *kernel_cmdline = machine->kernel_cmdline; +const char *initrd_filename = machine->initrd_filename;if (xen_domain_build_pv (kernel_filename, initrd_filename, kernel_cmdline) <0 ) {fprintf (stderr,"xen pv domain creation failed\n" );exit (1 ); }break ; + } +#endif case XEN_EMULATE :fprintf (stderr,"xen emulation not implemented (yet)\n" );exit (1 );break ; +default : +fprintf (stderr,"unhandled xen_mode %d\n" , xen_mode); +exit (1 ); +break ; }xen_be_register ("console" , &xen_console_ops);
Signature · 1 line
2.1.4
Re: [PATCH QEMU-XEN v5 9/9] xen: make it possible to build without the Xen PV domain builder
Quoted 18 lines · Ian Campbell
Until the previous patch this relied on
xc_fd(), which was only implemented for Xen 4.0 and earlier.Given this wasn't working since Xen 4.0 I have marked this as disabled by default.
Removing this support drops the use of a bunch of symbols from libxenctrl, specifically:
-
xc_domain_create
-xc_domain_destroy
-xc_domain_getinfo
-xc_domain_max_vcpus
-xc_domain_setmaxmem
-xc_domain_unpause
-xc_evtchn_alloc_unbound
-xc_linux_build
Quoted 4 lines
This is another step towards only using Xen libraries which provide a stable inteface.
Signed-off-by Ian Campbell <[email protected]>
Quoted 121 lines
v5:
XEN_CREATEentirely wihtinCONFIG_XEN_PV_DOMAIN_BUILDifdef.
Simplify configure'ry.v4: Fixed all checkpatch errors.
Disabled by default.--- configure | 15 +++++++++++++++ hw/xenpv/Makefile.objs | 4 +++- hw/xenpv/xen_machine_pv.c | 15 +++++++++++---- 3 files changed, 29 insertions(+), 5 deletions(-)configure +15
-0@@ -247,6 +247,7 @@ vnc_jpeg="" vnc_png="" xen="" xen_ctrl_version="" +xen_pv_domain_build="no" xen_pci_passthrough="" linux_aio="" cap_ng=""@@ -917,6 +918,10 @@ for opt do ;; --enable-xen-pci-passthrough) xen_pci_passthrough="yes" ;; + --disable-xen-pv-domain-build) xen_pv_domain_build="no" + ;; + --enable-xen-pv-domain-build) xen_pv_domain_build="yes" + ;; --disable-brlapi) brlapi="no" ;; --enable-brlapi) brlapi="yes"@@ -2172,6 +2177,12 @@ if test "$xen_pci_passthrough" != "no"; then fi fi +if test "$xen_pv_domain_build" = "yes" && + test "$xen" != "yes"; then + error_exit "User requested Xen PV domain builder support" \ + "which requires Xen support." +fi + ########################################## # libtool probe@@ -4762,6 +4773,7 @@ fi echo "xen support $xen" if test "$xen" = "yes" ; then echo "xen ctrl version $xen_ctrl_version" + echo "pv dom build $xen_pv_domain_build" fi echo "brlapi support $brlapi" echo "bluez support $bluez"@@ -5130,6 +5142,9 @@ fi if test "$xen" = "yes" ; then echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak + if test "$xen_pv_domain_build" = "yes" ; then + echo "CONFIG_XEN_PV_DOMAIN_BUILD=y" >> $config_host_mak + fi fi if test "$linux_aio" = "yes" ; then echo "CONFIG_LINUX_AIO=y" >> $config_host_makhw/xenpv/Makefile.objs +3
-1@@ -1,2 +1,4 @@ # Xen PV machine support -obj-$(CONFIG_XEN) += xen_domainbuild.o xen_machine_pv.o +obj-$(CONFIG_XEN) += xen_machine_pv.o +# Xen PV machine builder support +obj-$(CONFIG_XEN_PV_DOMAIN_BUILD) += xen_domainbuild.ohw/xenpv/xen_machine_pv.c +11
-4@@ -30,9 +30,6 @@static void xen_init_pv (MachineState *machine) { -const char *kernel_filename = machine->kernel_filename; -const char *kernel_cmdline = machine->kernel_cmdline; -const char *initrd_filename = machine->initrd_filename;DriveInfo *dinfo;int i;@@ -46,17 +43,27 @@ static void xen_init_pv(MachineState *machine)case XEN_ATTACH :/* nothing to do, xend handles everything */ break ; -case XEN_CREATE : +#ifdef CONFIG_XEN_PV_DOMAIN_BUILD +case XEN_CREATE : { +const char *kernel_filename = machine->kernel_filename; +const char *kernel_cmdline = machine->kernel_cmdline; +const char *initrd_filename = machine->initrd_filename;if (xen_domain_build_pv (kernel_filename, initrd_filename, kernel_cmdline) <0 ) {fprintf (stderr,"xen pv domain creation failed\n" );exit (1 ); }break ; + } +#endif case XEN_EMULATE :fprintf (stderr,"xen emulation not implemented (yet)\n" );exit (1 );break ; +default : +fprintf (stderr,"unhandled xen_mode %d\n" , xen_mode); +exit (1 ); +break ; }xen_be_register ("console" , &xen_console_ops);Signature · 1 line
2.1.4
Re: [Qemu-devel] [PATCH QEMU-XEN v5 9/9] xen: make it possible to build without the Xen PV domain builder
In reply to Ian CampbellQuoted 18 lines · Ian Campbell
Until the previous patch this relied on
xc_fd(), which was only implemented for Xen 4.0 and earlier.Given this wasn't working since Xen 4.0 I have marked this as disabled by default.
Removing this support drops the use of a bunch of symbols from libxenctrl, specifically:
-
xc_domain_create
-xc_domain_destroy
-xc_domain_getinfo
-xc_domain_max_vcpus
-xc_domain_setmaxmem
-xc_domain_unpause
-xc_evtchn_alloc_unbound
-xc_linux_build
Quoted 4 lines
This is another step towards only using Xen libraries which provide a stable inteface.
Signed-off-by Ian Campbell <[email protected]>
Quoted 121 lines
v5:
XEN_CREATEentirely wihtinCONFIG_XEN_PV_DOMAIN_BUILDifdef.
Simplify configure'ry.v4: Fixed all checkpatch errors.
Disabled by default.--- configure | 15 +++++++++++++++ hw/xenpv/Makefile.objs | 4 +++- hw/xenpv/xen_machine_pv.c | 15 +++++++++++---- 3 files changed, 29 insertions(+), 5 deletions(-)configure +15
-0@@ -247,6 +247,7 @@ vnc_jpeg="" vnc_png="" xen="" xen_ctrl_version="" +xen_pv_domain_build="no" xen_pci_passthrough="" linux_aio="" cap_ng=""@@ -917,6 +918,10 @@ for opt do ;; --enable-xen-pci-passthrough) xen_pci_passthrough="yes" ;; + --disable-xen-pv-domain-build) xen_pv_domain_build="no" + ;; + --enable-xen-pv-domain-build) xen_pv_domain_build="yes" + ;; --disable-brlapi) brlapi="no" ;; --enable-brlapi) brlapi="yes"@@ -2172,6 +2177,12 @@ if test "$xen_pci_passthrough" != "no"; then fi fi +if test "$xen_pv_domain_build" = "yes" && + test "$xen" != "yes"; then + error_exit "User requested Xen PV domain builder support" \ + "which requires Xen support." +fi + ########################################## # libtool probe@@ -4762,6 +4773,7 @@ fi echo "xen support $xen" if test "$xen" = "yes" ; then echo "xen ctrl version $xen_ctrl_version" + echo "pv dom build $xen_pv_domain_build" fi echo "brlapi support $brlapi" echo "bluez support $bluez"@@ -5130,6 +5142,9 @@ fi if test "$xen" = "yes" ; then echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak + if test "$xen_pv_domain_build" = "yes" ; then + echo "CONFIG_XEN_PV_DOMAIN_BUILD=y" >> $config_host_mak + fi fi if test "$linux_aio" = "yes" ; then echo "CONFIG_LINUX_AIO=y" >> $config_host_makhw/xenpv/Makefile.objs +3
-1@@ -1,2 +1,4 @@ # Xen PV machine support -obj-$(CONFIG_XEN) += xen_domainbuild.o xen_machine_pv.o +obj-$(CONFIG_XEN) += xen_machine_pv.o +# Xen PV machine builder support +obj-$(CONFIG_XEN_PV_DOMAIN_BUILD) += xen_domainbuild.ohw/xenpv/xen_machine_pv.c +11
-4@@ -30,9 +30,6 @@static void xen_init_pv (MachineState *machine) { -const char *kernel_filename = machine->kernel_filename; -const char *kernel_cmdline = machine->kernel_cmdline; -const char *initrd_filename = machine->initrd_filename;DriveInfo *dinfo;int i;@@ -46,17 +43,27 @@ static void xen_init_pv(MachineState *machine)case XEN_ATTACH :/* nothing to do, xend handles everything */ break ; -case XEN_CREATE : +#ifdef CONFIG_XEN_PV_DOMAIN_BUILD +case XEN_CREATE : { +const char *kernel_filename = machine->kernel_filename; +const char *kernel_cmdline = machine->kernel_cmdline; +const char *initrd_filename = machine->initrd_filename;if (xen_domain_build_pv (kernel_filename, initrd_filename, kernel_cmdline) <0 ) {fprintf (stderr,"xen pv domain creation failed\n" );exit (1 ); }break ; + } +#endif case XEN_EMULATE :fprintf (stderr,"xen emulation not implemented (yet)\n" );exit (1 );break ; +default : +fprintf (stderr,"unhandled xen_mode %d\n" , xen_mode); +exit (1 ); +break ; }xen_be_register ("console" , &xen_console_ops);Signature · 1 line
2.1.4
v5 cover Begin to disentangle libxenctrl and provide some stable libraries
In reply to Ian CampbellWe intend to stabilise some parts of the libxenctrl interface by splitting out some functionality into separate stable libraries.
This is the qemu-xen-traditional part of the first phase of that change.
This mail is (or is intended to be) a reply to a "0/<VARIOUS>" super-intro mail covering all of the related patch series and which contains more details.
Ian Campbell (5):
qemu-xen-traditional: Use xentoollog as a separate library
qemu-xen-traditional: Use libxenevtchn
qemu-xen-traditional: Use libxengnttab
qemu-xen-traditional: Add libxencall to rpath-link
qemu-xen-traditional: Add libxenforeignmemory to rpath-link
hw/xen_backend.c | 30 +++++++++++++++--------------- hw/xen_backend.h | 4 ++-- hw/xen_common.h | 2 ++ hw/xen_console.c | 4 ++-- hw/xen_disk.c | 24 ++++++++++++------------ i386-dm/helper2.c | 19 ++++++++++--------- xen-hooks.mak | 9 +++++++++ 7 files changed, 52 insertions(+), 40 deletions(-)
Signature · 1 line
2.1.4