Begin to disentangle libxenctrl and provide some stable libraries
RFC PATCH 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.
As a proof of concept these three intertangled series[0] splits out the xentoollog and event channel device interfaces.
Still to come would be at least the grant table interfaces and a basic hypercall making facility (including the buffers etc), followed by libraries for specific out of tree purposes (device model, kexec).
The new libraries use linker version-scripts to hopefully make future ABI changes be possible in a compatible way.
I decided to move the event channel functions into a new namespace (xenevtchn_*) in order to provide a clean break from the old unstable interfaces to the new stable ones. I've updated all the in tree callers and qemu-trad and provided a compat shim in libxenctrl for other out of tree users (which is used for qemu-upstream). My hope is that this can be removed sooner rather than later. I intend to do the same for the other interfaces. I haven't done this for the xentoollog stuff since it already had a separate namespace.
I mulled over putting everything into tools/libs/FOO instead of tools/libxenFOO, I didn't but I could if people think it is worthwhile. Eventually I'd like to split libxc into libxenguest and libxenctrl to cut down on the amount of strange cross talk...
As part of this change I've begun to get rid of the osdep interface layer, since it is obsolete and just gets in the way. IIRC there were some tricks being played to use this on rumpkernels to mix and match facilities from xc_minios.c and xc_netbsd.c. Once the hypercall calling and grant interfaces are in separate libraries are split this would become easier since each library can independently choose the desired backend.
The whole thing has been build tested on Linux and stubdoms, but not FreeBSD, NetBSD or Solaris. It's certainly not impossible that I've not got the #includes in the new files quite right.
Ian.
[0] There are 3 series, against xen.git, mini-os.git and qemu-xen-trad.git. The patches against xen.git point to the patches in the other two trees with instructions to update the relevant Config.mk field. The perils of changing unstable interfaces...
RFC PATCH 1/6 tools: Refactor "xentoollog" into its own library
In 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.
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.
--- .gitignore | 1 + stubdom/Makefile | 20 +++- stubdom/grub/Makefile | 1 + tools/Makefile | 3 + tools/Rules.mk | 15 ++- tools/libxc/Makefile | 7 +- tools/libxc/include/xentoollog.h | 137 --------------------- tools/libxc/xtl_core.c | 84 ------------- tools/libxc/xtl_logger_stdio.c | 190 ------------------------------ tools/libxentoollog/Makefile | 59 ++++++++++ tools/libxentoollog/include/xentoollog.h | 137 +++++++++++++++++++++ tools/libxentoollog/libxentoollog.map | 12 ++ tools/libxentoollog/xtl_core.c | 84 +++++++++++++ tools/libxentoollog/xtl_logger_stdio.c | 190 ++++++++++++++++++++++++++++++ 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 +- 20 files changed, 548 insertions(+), 448 deletions(-) delete mode 100644 tools/libxc/include/xentoollog.h delete mode 100644 tools/libxc/xtl_core.c delete mode 100644 tools/libxc/xtl_logger_stdio.c create mode 100644 tools/libxentoollog/Makefile create mode 100644 tools/libxentoollog/include/xentoollog.h create mode 100644 tools/libxentoollog/libxentoollog.map create mode 100644 tools/libxentoollog/xtl_core.c create mode 100644 tools/libxentoollog/xtl_logger_stdio.c
.gitignore +1 -0
@@ -59,6 +59,7 @@ stubdom/gcc-* stubdom/include stubdom/ioemu stubdom/xenstore +stubdom/libxentoollog-* stubdom/libxc-* stubdom/lwip-* stubdom/mini-os-*
stubdom/Makefile +19 -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 libxentoollog-$(XEN_TARGET_ARCH) + [ -h libxentoollog-$(XEN_TARGET_ARCH)/Makefile ] || ( cd libxentoollog-$(XEN_TARGET_ARCH) && \ + ln -sf $(XEN_ROOT)/tools/libxentoollog/include/*.h . && \ + ln -sf $(XEN_ROOT)/tools/libxentoollog/*.c . && \ + ln -sf $(XEN_ROOT)/tools/libxentoollog/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: libxentoollog-$(XEN_TARGET_ARCH)/libxentoollog.a +libxentoollog-$(XEN_TARGET_ARCH)/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 libxentoollog-$(XEN_TARGET_ARCH) + +####### # 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)
@@ -519,6 +535,7 @@ clean: $(MAKE) -C vtpmmgr clean rm -fr grub-$(XEN_TARGET_ARCH) rm -f $(STUBDOMPATH) + [ ! -e libxentoollog-$(XEN_TARGET_ARCH)/Makefile ] || $(MAKE) DESTDIR= -C libxentoollog-$(XEN_TARGET_ARCH) 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
@@ -529,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 libxentoollog-$(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/libxentoollog/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 += libxentoollog 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/libxentoollog/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/libxentoollog \ $(QEMU_UPSTREAM_RPATH)" \ --bindir=$(LIBEXEC_BIN) \ --datadir=$(SHAREDIR)/qemu-xen \
tools/Rules.mk +10 -5
@@ -10,6 +10,7 @@ export _INSTALL := $(INSTALL) INSTALL = $(XEN_ROOT)/tools/cross-install XEN_INCLUDE = $(XEN_ROOT)/tools/include +XEN_LIBXENTOOLLOG = $(XEN_ROOT)/tools/libxentoollog XEN_LIBXC = $(XEN_ROOT)/tools/libxc XEN_XENLIGHT = $(XEN_ROOT)/tools/libxl XEN_XENSTORE = $(XEN_ROOT)/tools/xenstore
@@ -34,9 +35,13 @@ INSTALL_SHLIB = : install-shlib-unsupported-fail SYMLINK_SHLIB = : symlink-shlib-unsupported-fail endif -CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_xeninclude) -LDLIBS_libxenctrl = $(XEN_LIBXC)/libxenctrl$(libextension) -SHLIB_libxenctrl = -Wl,-rpath-link=$(XEN_LIBXC) +CFLAGS_libxentoollog = -I$(XEN_LIBXENTOOLLOG)/include $(CFLAGS_xeninclude) +LDLIBS_libxentoollog = $(XEN_LIBXENTOOLLOG)/libxentoollog$(libextension) +SHLIB_libxentoollog = -Wl,-rpath-link=$(XEN_LIBXENTOOLLOG) + +CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_libxentoollog) $(CFLAGS_xeninclude) +LDLIBS_libxenctrl = $(SHLIB_libxentoollog) $(XEN_LIBXC)/libxenctrl$(libextension) +SHLIB_libxenctrl = $(SHLIB_libxentoollog) -Wl,-rpath-link=$(XEN_LIBXC) CFLAGS_libxenguest = -I$(XEN_LIBXC)/include $(CFLAGS_xeninclude) LDLIBS_libxenguest = $(XEN_LIBXC)/libxenguest$(libextension)
@@ -48,11 +53,11 @@ SHLIB_libxenstore = -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) +SHLIB_libxenstat = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -Wl,-rpath-link=$(XEN_LIBXENSTAT) CFLAGS_libxenvchan = -I$(XEN_LIBVCHAN) LDLIBS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -L$(XEN_LIBVCHAN) -lxenvchan -SHLIB_libxenvchan = -Wl,-rpath-link=$(XEN_LIBVCHAN) +SHLIB_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -Wl,-rpath-link=$(XEN_LIBVCHAN) ifeq ($(debug),y) # Disable optimizations and enable debugging information for macros
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
@@ -115,6 +113,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))
@@ -168,7 +167,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)
@@ -211,7 +210,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/libxc/include/xentoollog.h deleted +0 -137
137 lines not on this page · raw message
tools/libxc/xtl_core.c deleted +0 -84
84 lines not on this page · raw message
tools/libxc/xtl_logger_stdio.c deleted +0 -190
190 lines not on this page · raw message
tools/libxentoollog/Makefile new file +59 -0
59 lines not on this page · raw message
tools/libxentoollog/include/xentoollog.h new file +137 -0
137 lines not on this page · raw message
tools/libxentoollog/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/libxentoollog/xtl_core.c new file +84 -0
84 lines not on this page · raw message
tools/libxentoollog/xtl_logger_stdio.c new file +190 -0
190 lines not on this page · raw message
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)
@@ -132,7 +133,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.
@@ -236,19 +237,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/libxentoollog/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('../../../libxentoollog/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/libxentoollog" 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
1.7.10.4
Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library
Quoted 9 lines · Ian Campbell
tools/libxentoollog/include/xentoollog.h new file +9
-0+ +#define XTL_NEW_LOGGER (LOGGER ,buffer) ({ \ + xentoollog_logger_##LOGGER *new_consumer; \ + \ + (buffer).vtable.vmessage = LOGGER##_vmessage; \ + (buffer).vtable.progress = LOGGER##_progress; \ + (buffer).vtable.destroy = LOGGER##_destroy; \ + \ + new_consumer = malloc(sizeof(*new_consumer)); \
tools/libxentoollog/include/xentoollog.h line 134
Quoted 10 lines
tools/libxentoollog/include/xentoollog.h new file +10
-0+if (!new_consumer) { \ +xtl_log ((xentoollog_logger *)&buffer, \ +XTL_CRITICAL , errno,"xtl" , \ +"failed to allocate memory for new message logger" ); \ + }else { \ + *new_consumer = buffer; \ + } \ + \ + new_consumer; \ +});
This macro should be ditched.
It is a gnu-ism which shouldn't be present in the public library header, violates several principles of least supprise, and can literally only be used by its sole user in xtl_logger_stdio.c because of its internal expectations of xentoollog_logger_stdiostream. (Its sole user could do the above in a cleaner manner anyway.)
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.)
As another thought, it would also be a good time to sort out a consistent coding style, although that doesn't necessarily need to be folded into the split-out patch. The current source is very mixed when it comes to coding style.
~Andrew
Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library
Quoted 23 lines · Andrew Cooper
Quoted 9 lines · Ian Campbell
tools/libxentoollog/include/xentoollog.h new file +9
-0+ +#define XTL_NEW_LOGGER (LOGGER ,buffer) ({ \ + xentoollog_logger_##LOGGER *new_consumer; \ + \ + (buffer).vtable.vmessage = LOGGER##_vmessage; \ + (buffer).vtable.progress = LOGGER##_progress; \ + (buffer).vtable.destroy = LOGGER##_destroy; \ + \ + new_consumer = malloc(sizeof(*new_consumer)); \tools/libxentoollog/include/xentoollog.h line 134
Quoted 10 lines
tools/libxentoollog/include/xentoollog.h new file +10
-0+if (!new_consumer) { \ +xtl_log ((xentoollog_logger *)&buffer, \ +XTL_CRITICAL , errno,"xtl" , \ +"failed to allocate memory for new message logger" ); \ + }else { \ + *new_consumer = buffer; \ + } \ + \ + new_consumer; \ +});This macro should be ditched.
Quoted 5 lines
It is a gnu-ism which shouldn't be present in the public library header, violates several principles of least supprise, and can literally only be used by its sole user in
xtl_logger_stdio.cbecause of its internal expectations ofxentoollog_logger_stdiostream. (Its sole user could do the above in a cleaner manner anyway.)
Ian? Do you agree?
Quoted 4 lines
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.)
Shall we just follow what we do for xen/include/public i.e.
$(CC) -x c -ansi -Wall -Werror
? It seems sensible that the two should follow similar rules.
Or if not shall we change the requirements for xen/include/public to match? (Jan CCd for comments)
Quoted 4 lines
As another thought, it would also be a good time to sort out a consistent coding style, although that doesn't necessarily need to be folded into the split-out patch. The current source is very mixed when it comes to coding style.
True, but this is already quite a big job, with lots of moving parts already. If I find time I could do a pass, but I don't think it is super ciritical
Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library
Quoted 7 lines
Quoted 1 line
Quoted 1 line · On 11.06.15 at 13:35, <[email protected]> wrote:
Quoted 4 lines · Andrew Cooper
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.)
Quoted 6 lines
Shall we just follow what we do for xen/include/public i.e.
$(CC) -x c -ansi -Wall -Werror? It seems sensible that the two should follow similar rules.
Or if not shall we change the requirements for xen/include/public to match? (Jan CCd for comments)
We certainly shouldn't weaken what we do for the public headers. How far standard compliance matters for the library interface headers I really don't know.
Jan
Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library
Quoted 11 lines · Jan Beulich
Quoted 11 lines
Quoted 1 line
Quoted 1 line · On 11.06.15 at 13:35, <[email protected]> wrote:
Quoted 4 lines · Andrew Cooper
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.)Shall we just follow what we do for xen/include/public i.e.
$(CC) -x c -ansi -Wall -Werror? It seems sensible that the two should follow similar rules.
Quoted 6 lines
Quoted 2 lines
Or if not shall we change the requirements for xen/include/public to match? (Jan CCd for comments)
We certainly shouldn't weaken what we do for the public headers. How far standard compliance matters for the library interface headers I really don't know.
Actually, since -ansi is the same as -std=c89 I don't think there is a practical difference between the two.
Ian.
Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library
In reply to Andrew CooperAndrew Cooper writes ("Re: [Xen-devel] [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library"):
Quoted 12 lines · Ian Campbell
Quoted 11 lines
tools/libxentoollog/include/xentoollog.h new file +11
-0+ +#define XTL_NEW_LOGGER (LOGGER ,buffer) ({ \ + xentoollog_logger_##LOGGER *new_consumer; \ + \ + (buffer).vtable.vmessage = LOGGER##_vmessage; \ + (buffer).vtable.progress = LOGGER##_progress; \ + (buffer).vtable.destroy = LOGGER##_destroy; \ + \ + new_consumer = malloc(sizeof(*new_consumer)); \ + if (!new_consumer) { \ + xtl_log((xentoollog_logger*)&buffer, \
Quoted 8 lines
tools/libxentoollog/include/xentoollog.h line 134
Quoted 8 lines
tools/libxentoollog/include/xentoollog.h new file +8
-0+XTL_CRITICAL , errno,"xtl" , \ + "failed to allocate memory for new message logger"); \ + }else { \ + *new_consumer = buffer; \ + } \ + \ + new_consumer; \ +});
Ian Campbell just pointed me at this.
Quoted 3 lines
This macro should be ditched.
It is a gnu-ism which shouldn't be present in the public library header,
Do you mean that statement expressions (originally a GNU extension) should be avoided in tools code ? A quick git-grep discovered that xenctrl already contains numerous statement expressions.
Quoted 1 line
violates several principles of least supprise,
This is just invective.
Quoted 4 lines
and can literally only be
used by its sole user inxtl_logger_stdio.cbecause of its internal expectations ofxentoollog_logger_stdiostream. (Its sole user could do the above in a cleaner manner anyway.)
There is only one place in tree that calls this because there are only two in-tree loggers and the other one (tools/ocaml/libs/xentoollog/xentoollog_stubs.c) chose not to use it. It seems to me that stub_xtl_create_logger could use this macro.
Quoted 4 lines
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.)
-pedantic is certainly a bad idea.
Quoted 4 lines
As another thought, it would also be a good time to sort out a consistent coding style, although that doesn't necessarily need to be folded into the split-out patch. The current source is very mixed when it comes to coding style.
This sounds like it's going to lead to a lot of bikeshedding. If there are components with internally inconsistent coding styles that should be fixed. But I don't think it is a good idea to go around reformatting areas that are coherent to make them like other areas which are differently coherent.
Ian.
Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library
Quoted 23 lines · Ian Jackson
Andrew Cooper writes ("Re: [Xen-devel] [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library"):
Quoted 12 lines · Ian Campbell
Quoted 11 lines
tools/libxentoollog/include/xentoollog.h new file +11
-0+ +#define XTL_NEW_LOGGER (LOGGER ,buffer) ({ \ + xentoollog_logger_##LOGGER *new_consumer; \ + \ + (buffer).vtable.vmessage = LOGGER##_vmessage; \ + (buffer).vtable.progress = LOGGER##_progress; \ + (buffer).vtable.destroy = LOGGER##_destroy; \ + \ + new_consumer = malloc(sizeof(*new_consumer)); \ + if (!new_consumer) { \ + xtl_log((xentoollog_logger*)&buffer, \Quoted 8 lines
tools/libxentoollog/include/xentoollog.h line 134
Quoted 8 lines
tools/libxentoollog/include/xentoollog.h new file +8
-0+XTL_CRITICAL , errno,"xtl" , \ + "failed to allocate memory for new message logger"); \ + }else { \ + *new_consumer = buffer; \ + } \ + \ + new_consumer; \ +});Ian Campbell just pointed me at this.
Quoted 6 lines
Quoted 3 lines
This macro should be ditched.
It is a gnu-ism which shouldn't be present in the public library header,
Do you mean that statement expressions (originally a GNU extension) should be avoided in tools code ? A quick git-grep discovered that xenctrl already contains numerous statement expressions.
It is fine (in principle) to be used internally. Not in a public header for what is supposed to be a clean API.
Quoted 3 lines
Quoted 2 lines
violates several principles of least supprise,
This is just invective.
/me googles and discovered a new word. I stand by my statement.
It requires the user to embed one structure inside another structure (with half a undocumented magic name), under a specific undocumented field name, and have three functions (with half undocumented magic names) in scope with undocumented types. It also mandates an original copy of the half-magically-named struct in scope to be partially initialised, just to have another copy created in the heap.
The error handling is also broken; It will follow a wild function pointer, if vtable is not the first element in the structure (again undocumented).
This macro is not fit for any purpose it attempts to perform.
https://github.com/xenserver/xen-4.5.pg/blob/master/master/xenguest.patch#L609
is the correct way to use a setup like this, even if it does require embedding other data alongside it.
Quoted 9 lines
Quoted 5 lines
and can literally only be
used by its sole user inxtl_logger_stdio.cbecause of its internal expectations ofxentoollog_logger_stdiostream. (Its sole user could do the above in a cleaner manner anyway.)There is only one place in tree that calls this because there are only two in-tree loggers and the other one (
tools/ocaml/libs/xentoollog/xentoollog_stubs.c) chose not to use it. It seems to me thatstub_xtl_create_loggercould use this macro.
Or better yet, ditch it completely.
All that needs to happen is for struct xentoollog_logger to have the three function pointers filled in appropriately. This in turn does not mandate that the structure is allocated from the heap, or the prescribed layout/naming scheme.
Quoted 6 lines
Quoted 5 lines
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.)-pedantic is certainly a bad idea.
Pedantic is absolutely the correct answer. It will cause gcc to reject any non C compliant statements.
The APIs of each of these new libraries should be just as usable on windows systems as Linux systems.
~Andrew
Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library
Andrew Cooper writes ("Re: [Xen-devel] [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library"):
Quoted 7 lines · Ian Jackson
Quoted 3 lines
Do you mean that statement expressions (originally a GNU extension) should be avoided in tools code ? A quick git-grep discovered that xenctrl already contains numerous statement expressions.
It is fine (in principle) to be used internally. Not in a public header for what is supposed to be a clean API.
I don't understand why this distinction is relevant. Either the compiler supports it, or it doesn't.
Quoted 4 lines
Quoted 2 lines
Quoted 1 line
violates several principles of least supprise,
This is just invective.
/me googles and discovered a new word. I stand by my statement.
Well, if you feel so strongly, I won't object to a patch to remove it.
Quoted 8 lines
Quoted 5 lines
Quoted 4 lines
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.)-pedantic is certainly a bad idea.
Pedantic is absolutely the correct answer. It will cause gcc to reject any non C compliant statements.
No, that is not what -pedantic does. Please RTFM.
Ian.
Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library
Quoted 9 lines · Ian Jackson
Andrew Cooper writes ("Re: [Xen-devel] [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library"):
Quoted 6 lines · Ian Jackson
Quoted 3 lines
Do you mean that statement expressions (originally a GNU extension) should be avoided in tools code ? A quick git-grep discovered that xenctrl already contains numerous statement expressions.
It is fine (in principle) to be used internally. Not in a public header for what is supposed to be a clean API.
I don't understand why this distinction is relevant. Either the compiler supports it, or it doesn't.
There shouldn't be items in a public header which can't be used by all compilers which might want to compile it.
GCC is not the only compiler liable to encounter this new header file.
Quoted 5 lines
Quoted 4 lines
Quoted 3 lines
Quoted 2 lines
violates several principles of least supprise,
This is just invective.
/me googles and discovered a new word. I stand by my statement.
Well, if you feel so strongly, I won't object to a patch to remove it.
This is exactly why I raise the point now when the ABI is deliberately changing. Having said that, it was previously in libxc so anything went. I would be happy to submit a patch either to libxc now, or to libxentoollog later.
Quoted 9 lines
Quoted 8 lines
Quoted 6 lines
Quoted 5 lines
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.)-pedantic is certainly a bad idea.
Pedantic is absolutely the correct answer. It will cause gcc to reject any non C compliant statements.
No, that is not what -pedantic does. Please RTFM.
Please explain why you believe it to be unsuitable? It is not perfect, but is far better than nothing.
~Andrew
Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library
Quoted 18 lines · Andrew Cooper
Quoted 11 lines · Ian Jackson
Andrew Cooper writes ("Re: [Xen-devel] [PATCH RFC tools 1/6] tools:
Refactor "xentoollog" into its own library"):Quoted 7 lines · Ian Jackson
Quoted 3 lines
Do you mean that statement expressions (originally a GNU extension) should be avoided in tools code ? A quick git-grep discovered that xenctrl already contains numerous statement expressions.
It is fine (in principle) to be used internally. Not in a public header
for what is supposed to be a clean API.I don't understand why this distinction is relevant. Either the compiler supports it, or it doesn't.
There shouldn't be items in a public header which can't be used by all compilers which might want to compile it.
GCC is not the only compiler liable to encounter this new header file.
[...]
Quoted 2 lines
Please explain why you believe it to be unsuitable? It is not perfect, but is far better than nothing.
It's a #define, so unless the including application actually uses it the compiler proper (as opposed to cpp) will never see it.
Ian.
RFC PATCH 2/6 tools: Link in-tree libvchan users against libxenvchan.so
In reply to Ian CampbellAs with other in-tree users avoid -L + -l.
--- tools/Rules.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/Rules.mk +1 -1
@@ -56,7 +56,7 @@ LDLIBS_libxenstat = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBXENSTAT)/ SHLIB_libxenstat = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -Wl,-rpath-link=$(XEN_LIBXENSTAT) CFLAGS_libxenvchan = -I$(XEN_LIBVCHAN) -LDLIBS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -L$(XEN_LIBVCHAN) -lxenvchan +LDLIBS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBVCHAN)/libxenvchan$(libextension) SHLIB_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -Wl,-rpath-link=$(XEN_LIBVCHAN) ifeq ($(debug),y)
Signature · 1 line
1.7.10.4
RFC PATCH 3/6 tools: Do not add top-level tools dir to include path
In reply to Ian CampbellInstead switch to an explicit -include $(XEN_ROOT)/tools/config.h to pickup config.h.
Most places already do this, fixup the rest.
--- tools/libfsimage/ext2fs-lib/Makefile | 4 ++-- tools/libfsimage/ext2fs-lib/ext2fs-lib.c | 3 --- tools/misc/Makefile | 4 +++- tools/misc/gtraceview.c | 3 --- tools/ocaml/xenstored/Makefile | 3 ++- tools/ocaml/xenstored/systemd_stubs.c | 1 - tools/xenstat/xentop/Makefile | 4 ++-- tools/xenstat/xentop/xentop.c | 3 --- tools/xenstore/Makefile | 3 ++- tools/xenstore/xenstored_core.c | 1 - 10 files changed, 11 insertions(+), 18 deletions(-)
tools/libfsimage/ext2fs-lib/Makefile +2 -2
@@ -6,8 +6,8 @@ FS = ext2fs-lib FS_LIBDEPS = $(EXTFS_LIBS) -# Include configure output (config.h) to headers search path -CFLAGS += -I$(XEN_ROOT)/tools +# Include configure output (config.h) +CFLAGS += -include $(XEN_ROOT)/tools/config.h .PHONY: all all: fs-all
tools/libfsimage/ext2fs-lib/ext2fs-lib.c +0 -3
@@ -21,9 +21,6 @@* Use is subject to license terms. */ -/* Include output from configure */ -#include <config.h> -#include <fsimage_plugin.h> #include INCLUDE_EXTFS_H #include <errno.h>
tools/misc/Makefile +3 -1
@@ -1,7 +1,9 @@ XEN_ROOT=$(CURDIR)/../.. include $(XEN_ROOT)/tools/Rules.mk -CFLAGS += -Werror -I$(XEN_ROOT)/tools +CFLAGS += -Werror +# Include configure output (config.h) +CFLAGS += -include $(XEN_ROOT)/tools/config.h CFLAGS += $(CFLAGS_libxenctrl) CFLAGS += $(CFLAGS_xeninclude) CFLAGS += $(CFLAGS_libxenstore)
tools/misc/gtraceview.c +0 -3
@@ -16,9 +16,6 @@* Place - Suite 330, Boston, MA 02111-1307 USA. */ -/* Include output from configure */ -#include <config.h> -#include <stdio.h> #include <stdlib.h> #include <string.h>
tools/ocaml/xenstored/Makefile +2 -1
@@ -2,7 +2,8 @@ XEN_ROOT = $(CURDIR)/../../.. OCAML_TOPLEVEL = $(CURDIR)/.. include $(OCAML_TOPLEVEL)/common.make -CFLAGS += -I$(XEN_ROOT)/tools/ +# Include configure output (config.h) +CFLAGS += -include $(XEN_ROOT)/tools/config.h CFLAGS-$(CONFIG_SYSTEMD) += $(SYSTEMD_CFLAGS) LDFLAGS-$(CONFIG_SYSTEMD) += $(SYSTEMD_LIBS)
tools/ocaml/xenstored/systemd_stubs.c +0 -1
@@ -22,7 +22,6 @@#include <caml/custom.h> #include <caml/signals.h> #include <caml/fail.h> -#include <config.h> #if defined(HAVE_SYSTEMD )
tools/xenstat/xentop/Makefile +2 -2
@@ -22,8 +22,8 @@ CFLAGS += -DGCC_PRINTF -Werror $(CFLAGS_libxenstat) LDLIBS += $(LDLIBS_libxenstat) $(CURSES_LIBS) $(TINFO_LIBS) $(SOCKET_LIBS) -lm -lyajl CFLAGS += -DHOST_$(XEN_OS) -# Include configure output (config.h) to headers search path -CFLAGS += -I$(XEN_ROOT)/tools +# Include configure output (config.h) +CFLAGS += -include $(XEN_ROOT)/tools/config.h LDFLAGS += $(APPEND_LDFLAGS) .PHONY: all
tools/xenstat/xentop/xentop.c +0 -3
@@ -19,9 +19,6 @@* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* Include output from configure */ -#include <config.h> -/* get curses header from configure */ #include INCLUDE_CURSES_H
tools/xenstore/Makefile +2 -1
@@ -6,7 +6,8 @@ MINOR = 3 CFLAGS += -Werror CFLAGS += -I. -CFLAGS += -I$(XEN_ROOT)/tools/ +# Include configure output (config.h) +CFLAGS += -include $(XEN_ROOT)/tools/config.h CFLAGS += -I./include CFLAGS += $(CFLAGS_libxenctrl) CFLAGS += -DXEN_LIB_STORED="\"$(XEN_LIB_STORED)\""
tools/xenstore/xenstored_core.c +0 -1
@@ -40,7 +40,6 @@#include <signal.h> #include <assert.h> #include <setjmp.h> -#include <config.h> #include "utils.h" #include "list.h"
Signature · 1 line
1.7.10.4
RFC PATCH 4/6 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.
For now only evtchn is done as a PoC, other sub-APIs will follow.
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.
Build tested for Linux and stubdom, but not FreeBSd, NetBSD or Solaris.
--- 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
@@ -118,7 +118,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
@@ -52,7 +52,6 @@enum xc_osdep_type {XC_OSDEP_PRIVCMD , -XC_OSDEP_EVTCHN ,XC_OSDEP_GNTTAB ,XC_OSDEP_GNTSHR , };
@@ -91,21 +90,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
@@ -120,7 +120,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" ; }
@@ -253,20 +252,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
@@ -124,6 +124,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,
@@ -447,3 +454,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
1.7.10.4
RFC PATCH 5/6 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, which is used by qemu-xen for the time being.
The dynamic osdep mechanism from libxc is not preserved, the alternative backend (a xen-api/xapi shim) is no longer around. (Nested virt probably suffices for this use case now).
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
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.
Build tested with Linux and mini-os/stubdom, but not FreeBSD, NetBSD or Solaris.
---
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.
--- .gitignore | 1 + docs/misc/libxenctrl-functions.pandoc | 9 +- stubdom/Makefile | 19 +- tools/Makefile | 6 +- tools/Rules.mk | 19 +- tools/console/Makefile | 2 + tools/console/daemon/io.c | 43 +++-- 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 | 10 +- 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/libxenevtchn/Makefile | 65 +++++++ tools/libxenevtchn/core.c | 60 ++++++ tools/libxenevtchn/freebsd.c | 122 ++++++++++++ tools/libxenevtchn/include/xenevtchn.h | 154 +++++++++++++++ tools/libxenevtchn/libxenevtchn.map | 14 ++ tools/libxenevtchn/linux.c | 133 +++++++++++++ tools/libxenevtchn/minios.c | 257 +++++++++++++++++++++++++ tools/libxenevtchn/netbsd.c | 132 +++++++++++++ tools/libxenevtchn/private.h | 15 ++ tools/libxenevtchn/solaris.c | 120 ++++++++++++ tools/libxl/Makefile | 5 +- tools/libxl/libxl.c | 2 +- tools/libxl/libxl_dom.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 | 2 + tools/xentrace/xentrace.c | 13 +- 57 files changed, 1413 insertions(+), 920 deletions(-) create mode 100644 tools/libxc/include/xenctrl_compat.h create mode 100644 tools/libxc/xc_evtchn_compat.c create mode 100644 tools/libxenevtchn/Makefile create mode 100644 tools/libxenevtchn/core.c create mode 100644 tools/libxenevtchn/freebsd.c create mode 100644 tools/libxenevtchn/include/xenevtchn.h create mode 100644 tools/libxenevtchn/libxenevtchn.map create mode 100644 tools/libxenevtchn/linux.c create mode 100644 tools/libxenevtchn/minios.c create mode 100644 tools/libxenevtchn/netbsd.c create mode 100644 tools/libxenevtchn/private.h create mode 100644 tools/libxenevtchn/solaris.c
.gitignore +1 -0
@@ -60,6 +60,7 @@ stubdom/include stubdom/ioemu stubdom/xenstore stubdom/libxentoollog-* +stubdom/libxenevtchn-* stubdom/libxc-* stubdom/lwip-* stubdom/mini-os-*
docs/misc/libxenctrl-functions.pandoc +6 -3
@@ -1009,9 +1009,6 @@ Gathered by: - xc_pfn_to_mfn - xc_query_page_offline_status - xc_read_image - - xc_suspend_evtchn_init_exclusive - - xc_suspend_evtchn_init_sane - - xc_suspend_evtchn_release - xc_try_bzip2_decode - xc_try_lz4_decode - _xc_try_lzma_decode
@@ -1019,6 +1016,12 @@ Gathered by: - xc_try_lzo1x_decode - xc_try_xz_decode +Use privcmd and evtchn device handles: + + - xc_suspend_evtchn_init_exclusive. Used by xen-hptool and libxl. + - xc_suspend_evtchn_init_sane. Unused + - xc_suspend_evtchn_release. Used by xen-hptool and libxl. + # Symbols used by qemu $ nm tools/qemu-xen-dir-remote/i386-softmmu/qemu-system-i386 | grep \\bU.xc_
stubdom/Makefile +18 -1
@@ -318,6 +318,12 @@ mk-headers-$(XEN_TARGET_ARCH): $(IOEMU_LINKFARM_TARGET) ln -sf $(XEN_ROOT)/tools/libxentoollog/include/*.h . && \ ln -sf $(XEN_ROOT)/tools/libxentoollog/*.c . && \ ln -sf $(XEN_ROOT)/tools/libxentoollog/Makefile . ) + mkdir -p libxenevtchn-$(XEN_TARGET_ARCH)/include + [ -h libxenevtchn-$(XEN_TARGET_ARCH)/Makefile ] || ( cd libxenevtchn-$(XEN_TARGET_ARCH) && \ + ln -sf $(XEN_ROOT)/tools/libxenevtchn/*.h . && \ + ln -sf $(XEN_ROOT)/tools/libxenevtchn/include/*.h include/ && \ + ln -sf $(XEN_ROOT)/tools/libxenevtchn/*.c . && \ + ln -sf $(XEN_ROOT)/tools/libxenevtchn/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 @@ libxentoollog-$(XEN_TARGET_ARCH)/libxentoollog.a: $(NEWLIB_STAMPFILE) CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= -C libxentoollog-$(XEN_TARGET_ARCH) ####### +# libxenevtchn +####### + +.PHONY: libxenevtchn +libxenevtchn: libxenevtchn-$(XEN_TARGET_ARCH)/libxenevtchn.a +libxenevtchn-$(XEN_TARGET_ARCH)/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 libxenevtchn-$(XEN_TARGET_ARCH) + +####### # 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 +5 -1
@@ -4,6 +4,7 @@ include $(XEN_ROOT)/tools/Rules.mk SUBDIRS-y := SUBDIRS-y += include SUBDIRS-y += libxentoollog +SUBDIRS-y += libxenevtchn SUBDIRS-y += libxc SUBDIRS-$(FLASK_ENABLE) += flask SUBDIRS-y += xenstore
@@ -248,8 +249,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/libxentoollog/include \ + -I$(XEN_ROOT)/tools/libxenevtchn/include \ -I$(XEN_ROOT)/tools/libxc/include \ -I$(XEN_ROOT)/tools/xenstore/include \ -I$(XEN_ROOT)/tools/xenstore/compat/include \
@@ -257,6 +260,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/libxentoollog \ + -Wl,-rpath-link=$(XEN_ROOT)/tools/libxenevtchn \ $(QEMU_UPSTREAM_RPATH)" \ --bindir=$(LIBEXEC_BIN) \ --datadir=$(SHAREDIR)/qemu-xen \
tools/Rules.mk +12 -7
@@ -11,6 +11,7 @@ INSTALL = $(XEN_ROOT)/tools/cross-install XEN_INCLUDE = $(XEN_ROOT)/tools/include XEN_LIBXENTOOLLOG = $(XEN_ROOT)/tools/libxentoollog +XEN_LIBXENEVTCHN = $(XEN_ROOT)/tools/libxenevtchn XEN_LIBXC = $(XEN_ROOT)/tools/libxc XEN_XENLIGHT = $(XEN_ROOT)/tools/libxl XEN_XENSTORE = $(XEN_ROOT)/tools/xenstore
@@ -39,13 +40,17 @@ CFLAGS_libxentoollog = -I$(XEN_LIBXENTOOLLOG)/include $(CFLAGS_xeninclude) LDLIBS_libxentoollog = $(XEN_LIBXENTOOLLOG)/libxentoollog$(libextension) SHLIB_libxentoollog = -Wl,-rpath-link=$(XEN_LIBXENTOOLLOG) +CFLAGS_libxenevtchn = -I$(XEN_LIBXENEVTCHN)/include $(CFLAGS_xeninclude) +LDLIBS_libxenevtchn = $(XEN_LIBXENEVTCHN)/libxenevtchn$(libextension) +SHLIB_libxenevtchn = -Wl,-rpath-link=$(XEN_LIBXENEVTCHN) + CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_libxentoollog) $(CFLAGS_xeninclude) -LDLIBS_libxenctrl = $(SHLIB_libxentoollog) $(XEN_LIBXC)/libxenctrl$(libextension) -SHLIB_libxenctrl = $(SHLIB_libxentoollog) -Wl,-rpath-link=$(XEN_LIBXC) +LDLIBS_libxenctrl = $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn) $(XEN_LIBXC)/libxenctrl$(libextension) +SHLIB_libxenctrl = $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn) -Wl,-rpath-link=$(XEN_LIBXC) -CFLAGS_libxenguest = -I$(XEN_LIBXC)/include $(CFLAGS_xeninclude) -LDLIBS_libxenguest = $(XEN_LIBXC)/libxenguest$(libextension) -SHLIB_libxenguest = -Wl,-rpath-link=L$(XEN_LIBXC) +CFLAGS_libxenguest = -I$(XEN_LIBXC)/include $(CFLAGS_libxenevtchn) $(CFLAGS_xeninclude) +LDLIBS_libxenguest = $(SHLIB_libxenevtchn) $(XEN_LIBXC)/libxenguest$(libextension) +SHLIB_libxenguest = $(SHLIB_libxenevtchn) -Wl,-rpath-link=L$(XEN_LIBXC) CFLAGS_libxenstore = -I$(XEN_XENSTORE)/include $(CFLAGS_xeninclude) LDLIBS_libxenstore = $(XEN_XENSTORE)/libxenstore$(libextension)
@@ -56,8 +61,8 @@ LDLIBS_libxenstat = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBXENSTAT)/ SHLIB_libxenstat = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -Wl,-rpath-link=$(XEN_LIBXENSTAT) CFLAGS_libxenvchan = -I$(XEN_LIBVCHAN) -LDLIBS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBVCHAN)/libxenvchan$(libextension) -SHLIB_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -Wl,-rpath-link=$(XEN_LIBVCHAN) +LDLIBS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libxenevtchn) $(XEN_LIBVCHAN)/libxenvchan$(libextension) +SHLIB_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libxenevtchn) -Wl,-rpath-link=$(XEN_LIBVCHAN) ifeq ($(debug),y) # Disable optimizations and enable debugging information for macros
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/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
@@ -217,25 +217,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 ;
@@ -347,26 +347,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
@@ -106,7 +106,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 ; }
@@ -195,10 +195,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 ; }
@@ -351,7 +351,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)
@@ -373,8 +373,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
@@ -45,6 +45,7 @@#include <xen/io/libxenvchan.h> #include <xen/sys/evtchn.h> +#include <xenevtchn.h> #include <xenctrl.h> struct libxenvchan_ring {
@@ -72,7 +73,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
@@ -47,6 +47,7 @@ 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_MiniOS) += xc_minios.c +CTRL_SRCS-y += xc_evtchn_compat.c GUEST_SRCS-y := GUEST_SRCS-y += xg_private.c xc_suspend.c
@@ -114,6 +115,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))
@@ -167,7 +169,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)
@@ -210,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) $(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
@@ -233,7 +235,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 +6 -4
@@ -23,6 +23,8 @@#ifndef XENGUEST_H #define XENGUEST_H +#include <xenevtchn.h> +#define XC_NUMA_NO_NODE (~0U)#define XCFLAGS_LIVE (1 << 0)
@@ -281,18 +283,18 @@ int xc_hvm_build_target_mem(xc_interface *xch,* 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
@@ -301,7 +303,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
@@ -252,46 +252,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
@@ -124,13 +124,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
@@ -17,6 +17,8 @@#include <unistd.h> #include <fcntl.h> +#include <xenevtchn.h> +#include "xc_private.h" #include "xenguest.h"
@@ -125,12 +127,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;
@@ -138,7 +140,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 ;
@@ -146,16 +148,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 ;
@@ -165,7 +167,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;
@@ -185,7 +187,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/libxenevtchn/Makefile new file +65 -0
65 lines not on this page · raw message
tools/libxenevtchn/core.c new file +60 -0
60 lines not on this page · raw message
tools/libxenevtchn/freebsd.c new file +122 -0
122 lines not on this page · raw message
tools/libxenevtchn/include/xenevtchn.h new file +154 -0
154 lines not on this page · raw message
tools/libxenevtchn/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/libxenevtchn/linux.c new file +133 -0
133 lines not on this page · raw message
tools/libxenevtchn/minios.c new file +257 -0
257 lines not on this page · raw message
tools/libxenevtchn/netbsd.c new file +132 -0
132 lines not on this page · raw message
tools/libxenevtchn/private.h new file +15 -0
@@ -0,0 +1,15 @@ +#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
tools/libxenevtchn/solaris.c new file +120 -0
120 lines not on this page · raw message
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)
@@ -142,7 +143,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
@@ -178,7 +178,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_dispose (&ctx->poller_app);assert (LIBXL_LIST_EMPTY (&ctx->pollers_event));
tools/libxl/libxl_dom.c +2 -2
@@ -1424,9 +1424,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); goto err; }
tools/libxl/libxl_event.c +7 -7
@@ -705,7 +705,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 ;
@@ -731,20 +731,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 );
@@ -754,7 +754,7 @@ int libxl__ctx_evtchn_init(libxl__gc *gc) {return 0 ; out: -xc_evtchn_close (xce); +xenevtchn_close (xce);return rc; }
@@ -776,14 +776,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
@@ -46,6 +46,7 @@#include <sys/file.h> #include <sys/ioctl.h> +#include <xenevtchn.h> #include <xenstore.h> #include <xenctrl.h> #include <xenguest.h>
@@ -377,7 +378,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;
@@ -829,7 +830,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 -CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_xeninclude) +CFLAGS += $(CFLAGS_libxenevtchn) $(CFLAGS_xeninclude) OBJS = xeneventchn INTF = $(foreach obj, $(OBJS),$(obj).cmi) LIBS = xeneventchn.cma xeneventchn.cmxa -LIBS_xeneventchn = $(LDLIBS_libxenctrl) +LIBS_xeneventchn = $(LDLIBS_libxenevtchn) all: $(INTF) $(LIBS) $(PROGRAMS)
tools/ocaml/libs/eventchn/xeneventchn_stubs.c +10 -10
@@ -24,7 +24,7 @@#include <xen/sysctl.h> #include <xen/xen.h> #include <xen/sys/evtchn.h> -#include <xenctrl.h> +#include <xenevtchn.h> #define CAML_NAME_SPACE #include <caml/mlvalues.h>
@@ -34,14 +34,14 @@#include <caml/callback.h> #include <caml/fail.h> -#define _H (__h) ((xc_evtchn *)(__h)) +#define _H (__h) ((xenevtchn_handle *)(__h)) CAMLprim value stub_eventchn_init(void) {CAMLparam0 ();CAMLlocal1 (result); -xc_evtchn *xce =xc_evtchn_open (NULL ,XC_OPENFLAG_NON_REENTRANT ); +xenevtchn_handle *xce =xenevtchn_open (NULL ,0 );if (xce ==NULL )caml_failwith ("open failed" );
@@ -55,7 +55,7 @@ CAMLprim value stub_eventchn_fd(value xce)CAMLlocal1 (result);int fd; - fd =xc_evtchn_fd (_H (xce)); + fd =xenevtchn_fd (_H (xce));if (fd ==-1 )caml_failwith ("evtchn fd failed" );
@@ -69,7 +69,7 @@ CAMLprim value stub_eventchn_notify(value xce, value port)CAMLparam2 (xce, port);int rc; - rc =xc_evtchn_notify (_H (xce),Int_val (port)); + rc =xenevtchn_notify (_H (xce),Int_val (port));if (rc ==-1 )caml_failwith ("evtchn notify failed" );
@@ -83,7 +83,7 @@ CAMLprim value stub_eventchn_bind_interdomain(value xce, value domid,CAMLlocal1 (port);evtchn_port_or_error_t rc; - rc =xc_evtchn_bind_interdomain (_H (xce),Int_val (domid),Int_val (remote_port)); + rc =xenevtchn_bind_interdomain (_H (xce),Int_val (domid),Int_val (remote_port));if (rc ==-1 )caml_failwith ("evtchn bind_interdomain failed" ); port =Val_int (rc);
@@ -97,7 +97,7 @@ CAMLprim value stub_eventchn_bind_dom_exc_virq(value xce)CAMLlocal1 (port);evtchn_port_or_error_t rc; - rc =xc_evtchn_bind_virq (_H (xce),VIRQ_DOM_EXC ); + rc =xenevtchn_bind_virq (_H (xce),VIRQ_DOM_EXC );if (rc ==-1 )caml_failwith ("evtchn bind_dom_exc_virq failed" ); port =Val_int (rc);
@@ -110,7 +110,7 @@ CAMLprim value stub_eventchn_unbind(value xce, value port)CAMLparam2 (xce, port);int rc; - rc =xc_evtchn_unbind (_H (xce),Int_val (port)); + rc =xenevtchn_unbind (_H (xce),Int_val (port));if (rc ==-1 )caml_failwith ("evtchn unbind failed" );
@@ -123,7 +123,7 @@ CAMLprim value stub_eventchn_pending(value xce)CAMLlocal1 (result);evtchn_port_or_error_t port; - port =xc_evtchn_pending (_H (xce)); + port =xenevtchn_pending (_H (xce));if (port ==-1 )caml_failwith ("evtchn pending failed" ); result =Val_int (port);
@@ -137,7 +137,7 @@ CAMLprim value stub_eventchn_unmask(value xce, value _port)evtchn_port_t port; port =Int_val (_port); -if (xc_evtchn_unmask (_H (xce), port)) +if (xenevtchn_unmask (_H (xce), port))caml_failwith ("evtchn unmask failed" );CAMLreturn (Val_unit); }
tools/python/setup.py +6 -1
@@ -8,13 +8,18 @@ extra_compile_args = [ "-fno-strict-aliasing", "-Werror" ] PATH_XEN = XEN_ROOT + "/tools/include" PATH_LIBXENTOOLLOG = XEN_ROOT + "/tools/libxentoollog" +PATH_LIBXENEVTCHN = XEN_ROOT + "/tools/libxenevtchn" PATH_LIBXC = XEN_ROOT + "/tools/libxc"
Lines of this file are not shown. View the raw message.
The rest of this diff is not shown. View the raw message.
Signature · 1 line
1.7.10.4
Part of the diff is not shown here. View the raw message.
Re: [PATCH RFC tools 5/6] tools: Refactor /dev/xen/evtchn wrappers into libxenevtchn.
Quoted 17 lines · Ian Campbell
libxenevtchn 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, which is used by qemu-xen for the time being.The dynamic osdep mechanism from libxc is not preserved, the alternative backend (a xen-api/xapi shim) is no longer around. (Nested virt probably suffices for this use case now).
Quoted 5 lines
This leaves a few event channel related functions which go via privcmd (EVTCHNOP) rather than ioctls on the
/dev/xen/evtchndevice in libxenctrl. Specifically:-
xc_evtchn_alloc_unbound
I was about to complain that this is important functionality for this new lib, but the library provides the more useful xenevtchn_bind_unbound_port() instead. Might be worth mentioning this in the commit.
David
Re: [PATCH RFC tools 5/6] tools: Refactor /dev/xen/evtchn wrappers into libxenevtchn.
Quoted 22 lines · David Vrabel
Quoted 21 lines · Ian Campbell
libxenevtchn 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, which is used by qemu-xen for the time being.The dynamic osdep mechanism from libxc is not preserved, the alternative backend (a xen-api/xapi shim) is no longer around. (Nested virt probably suffices for this use case now).
This leaves a few event channel related functions which go via privcmd (EVTCHNOP) rather than ioctls on the
/dev/xen/evtchndevice in libxenctrl. Specifically:
Quoted 6 lines
Quoted 1 line
-
xc_evtchn_alloc_unboundI was about to complain that this is important functionality for this new lib, but the library provides the more useful
xenevtchn_bind_unbound_port()instead. Might be worth mentioning this in the commit.
Yes, I hadn't realised the two were redundant in that way. I'll mention it.
Perhaps we should even consider removing xc_evtchn_alloc_unbound? Other then the language bindings I can't see an in tree user apart from the language bindings. I suspect the user was xend.
Ian.
Re: [PATCH RFC tools 5/6] tools: Refactor /dev/xen/evtchn wrappers into libxenevtchn.
In reply to Ian CampbellQuoted 41 lines · Ian Campbell
libxenevtchn 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, which is used by qemu-xen for the time being.The dynamic osdep mechanism from libxc is not preserved, the alternative backend (a xen-api/xapi shim) is no longer around. (Nested virt probably suffices for this use case now).
This leaves a few event channel related functions which go via privcmd (EVTCHNOP) rather than ioctls on the
/dev/xen/evtchndevice in libxenctrl. Specifically:-
xc_evtchn_alloc_unbound
-xc_evtchn_reset
-xc_evtchn_statusThese 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.cbut 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.
Build tested with Linux and mini-os/stubdom, but not FreeBSD, NetBSD or Solaris.
Signed-off-by Ian Campbell <[email protected]>---
Quoted 7 lines
Must be applied with:
- "qemu-xen-traditional: Use libxenevtchn" and a corresponding
QEMU_TAGupdate folded here.
- "mini-os: Include libxenevtchn with libxc"" and a corresponding bump toMINIOS_UPSTREAM_REVISIONfolded in here.
---
As we are taking the hit of updating all in-tree users, and providing a compat shim, can we take the opportunity to make amends to the ABI.
For xenevtchn, it is never realistically going to gain logging. It seems like it would be a good idea to ditch all knowledge of xentoollog from the new library, as the cost is just dropping one parameter in the callsites.
~Andrew
Re: [PATCH RFC tools 5/6] tools: Refactor /dev/xen/evtchn wrappers into libxenevtchn.
Quoted 44 lines · Andrew Cooper
Quoted 43 lines · Ian Campbell
libxenevtchn 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, which is used by qemu-xen for the time being.The dynamic osdep mechanism from libxc is not preserved, the alternative backend (a xen-api/xapi shim) is no longer around. (Nested virt probably suffices for this use case now).
This leaves a few event channel related functions which go via privcmd (EVTCHNOP) rather than ioctls on the
/dev/xen/evtchndevice in libxenctrl. Specifically:-
xc_evtchn_alloc_unbound
-xc_evtchn_reset
-xc_evtchn_statusThese 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.cbut 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.
Build tested with Linux and mini-os/stubdom, but not FreeBSD, NetBSD or Solaris.
Signed-off-by Ian Campbell <[email protected]>---
Must be applied with:
Quoted 8 lines
Quoted 5 lines
- "qemu-xen-traditional: Use libxenevtchn" and a corresponding
QEMU_TAGupdate folded here.
- "mini-os: Include libxenevtchn with libxc"" and a corresponding bump toMINIOS_UPSTREAM_REVISIONfolded in here.
---As we are taking the hit of updating all in-tree users, and providing a compat shim, can we take the opportunity to make amends to the ABI.
Yes, we should in general take the opportunity.
In particular fixing the error reporting behaviour would be a very good idea...
Quoted 1 line
For xenevtchn, it is never realistically going to gain logging.
I thought about this but I wasn't sure and at least the Solaris backend does log (or tries to, who knows if it works!).
Quoted 4 lines
It
seems like it would be a good idea to ditch all knowledge of xentoollog from the new library, as the cost is just dropping one parameter in the callsites.
I don't think the overhead of an extra NULL is worth it, and it's possible something might want to log there in the future.
Ian.
RFC PATCH 6/6 Cleanup SHLIBDEPS
In reply to Ian Campbell--- tools/Rules.mk | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-)
tools/Rules.mk +15 -10
@@ -45,24 +45,28 @@ LDLIBS_libxenevtchn = $(XEN_LIBXENEVTCHN)/libxenevtchn$(libextension) SHLIB_libxenevtchn = -Wl,-rpath-link=$(XEN_LIBXENEVTCHN) CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_libxentoollog) $(CFLAGS_xeninclude) -LDLIBS_libxenctrl = $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn) $(XEN_LIBXC)/libxenctrl$(libextension) -SHLIB_libxenctrl = $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn) -Wl,-rpath-link=$(XEN_LIBXC) +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_libxenevtchn) $(CFLAGS_xeninclude) -LDLIBS_libxenguest = $(SHLIB_libxenevtchn) $(XEN_LIBXC)/libxenguest$(libextension) -SHLIB_libxenguest = $(SHLIB_libxenevtchn) -Wl,-rpath-link=L$(XEN_LIBXC) +SHDEPS_libxenguest = $(SHLIB_libxenevtchn) +LDLIBS_libxenguest = $(SHDEPS_libxenguest) $(XEN_LIBXC)/libxenguest$(libextension) +SHLIB_libxenguest = $(SHDEPS_libxenguest) -Wl,-rpath-link=L$(XEN_LIBXC) CFLAGS_libxenstore = -I$(XEN_XENSTORE)/include $(CFLAGS_xeninclude) LDLIBS_libxenstore = $(XEN_XENSTORE)/libxenstore$(libextension) SHLIB_libxenstore = -Wl,-rpath-link=$(XEN_XENSTORE) CFLAGS_libxenstat = -I$(XEN_LIBXENSTAT) -LDLIBS_libxenstat = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBXENSTAT)/libxenstat$(libextension) -SHLIB_libxenstat = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -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) $(SHLIB_libxenevtchn) $(XEN_LIBVCHAN)/libxenvchan$(libextension) -SHLIB_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libxenevtchn) -Wl,-rpath-link=$(XEN_LIBVCHAN) +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) ifeq ($(debug),y) # Disable optimizations and enable debugging information for macros
@@ -84,8 +88,9 @@ 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
1.7.10.4
RFC PATCH 1/2 qemu-xen-traditional: Use xentoollog as a separate library
In reply to Ian CampbellThis has been split out of libxenctrl, so the build needs to be able to find the header and the library. QEMU does not use xtl_* itself so -rpath-link is sufficient to allow linking to libxenctrl.so (which links against libxentoollog).
--- xen-hooks.mak | 2 ++ 1 file changed, 2 insertions(+)
xen-hooks.mak +2 -0
@@ -1,3 +1,4 @@ +CPPFLAGS+= -I$(XEN_ROOT)/tools/libxentoollog/include CPPFLAGS+= -I$(XEN_ROOT)/tools/libxc/include CPPFLAGS+= -I$(XEN_ROOT)/tools/xenstore/include CPPFLAGS+= -I$(XEN_ROOT)/tools/include
@@ -19,6 +20,7 @@ CFLAGS += $(CMDLINE_CFLAGS) LIBS += -L$(XEN_ROOT)/tools/libxc -lxenctrl -lxenguest LIBS += -L$(XEN_ROOT)/tools/xenstore -lxenstore +LIBS += -Wl,-rpath-link=$(XEN_ROOT)/tools/libxentoollog LDFLAGS := $(CFLAGS) $(LDFLAGS)
Signature · 1 line
1.7.10.4
Re: [PATCH RFC qemu-trad 1/2] qemu-xen-traditional: Use xentoollog as a separate library
Ian Campbell writes ("[PATCH RFC qemu-trad 1/2] qemu-xen-traditional: Use xentoollog as a separate library"):
Quoted 4 lines
This has been split out of libxenctrl, so the build needs to be able to find the header and the library. QEMU does not use xtl_* itself so -rpath-link is sufficient to allow linking to libxenctrl.so (which links against libxentoollog).
I guess this is harmless to apply right away ?
Ian.
Re: [PATCH RFC qemu-trad 1/2] qemu-xen-traditional: Use xentoollog as a separate library
Quoted 9 lines · Ian Jackson
Ian Campbell writes ("[PATCH RFC qemu-trad 1/2] qemu-xen-traditional: Use xentoollog as a separate library"):
Quoted 4 lines
This has been split out of libxenctrl, so the build needs to be able to find the header and the library. QEMU does not use xtl_* itself so -rpath-link is sufficient to allow linking to libxenctrl.so (which links against libxentoollog).
Acked-by Ian Jackson <[email protected]>I guess this is harmless to apply right away ?
I suppose so, although the paths it references won't actually exist until later
Ian.
RFC PATCH 1/2 mini-os: Include libxentoollog with libxc
In reply to Ian Campbelllibxentoollog has just been split out from libxc. From mini-os's point of view we don't care about the distinction, so keep things simple by just including libxentoollog if libxc is enabled.
--- Makefile | 1 + 1 file changed, 1 insertion(+)
Makefile +1 -0
@@ -165,6 +165,7 @@ OBJS := $(filter-out $(OBJ_DIR)/lwip%.o $(LWO), $(OBJS)) ifeq ($(libc),y) ifeq ($(CONFIG_XC),y) +APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libxentoollog-$(MINIOS_TARGET_ARCH) -whole-archive -lxentoollog -no-whole-archive APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libxc-$(MINIOS_TARGET_ARCH) -whole-archive -lxenguest -lxenctrl -no-whole-archive endif APP_LDLIBS += -lpci
Signature · 1 line
1.7.10.4
RFC PATCH 2/2 qemu-xen-traditional: Use libxenevtchn
In reply to Ian Campbell/dev/xen/evtchn related wrappers have been moved out of libxenctrl into their own library.
Note that i386-dm/helper2.c's xc_interface * was always really an xc_evtchn *, it's just they used to be typedefs to the same thing...
--- hw/xen_backend.c | 26 +++++++++++++------------- hw/xen_backend.h | 2 +- hw/xen_common.h | 1 + i386-dm/helper2.c | 19 ++++++++++--------- xen-hooks.mak | 2 ++ 5 files changed, 27 insertions(+), 23 deletions(-)
hw/xen_backend.c +13 -13
@@ -208,19 +208,19 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev, xendev->debug = debug; xendev->local_port =-1 ; - xendev->evtchndev =xc_evtchn_open (NULL ,0 ); + xendev->evtchndev =xenevtchn_open (NULL ,0 );if (xendev->evtchndev ==NULL ) {xen_be_printf (NULL ,0 ,"can't open evtchn device\n" );qemu_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 =xc_gnttab_open (NULL ,0 );if (xendev->gnttabdev ==NULL ) {xen_be_printf (NULL ,0 ,"can't open gnttab device\n" ); -xc_evtchn_close (xendev->evtchndev); +xenevtchn_close (xendev->evtchndev);qemu_free (xendev);return NULL ; }
@@ -268,7 +268,7 @@ static struct XenDevice *xen_be_del_xendev(int dom, int dev) }if (xendev->evtchndev !=NULL ) -xc_evtchn_close (xendev->evtchndev); +xenevtchn_close (xendev->evtchndev);if (xendev->gnttabdev !=NULL )xc_gnttab_close (xendev->gnttabdev);
@@ -630,13 +630,13 @@ 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);
@@ -683,14 +683,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 ; }
@@ -699,15 +699,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); }/*
hw/xen_backend.h +1 -1
@@ -44,7 +44,7 @@ struct XenDevice {int remote_port;int local_port; -xc_evtchn *evtchndev; +xenevtchn_handle *evtchndev;xc_gnttab *gnttabdev;struct XenDevOps *ops;
hw/xen_common.h +1 -0
@@ -4,6 +4,7 @@#include <stddef.h> #include <inttypes.h> +#include <xenevtchn.h> #include <xenctrl.h> #include <xenstore.h> #include <xen/io/xenbus.h>
i386-dm/helper2.c +10 -9
@@ -48,6 +48,7 @@#include <limits.h> #include <fcntl.h> +#include <xenevtchn.h> #include <xenctrl.h> #include <xen/hvm/ioreq.h> #include <xen/hvm/hvm_info_table.h>
@@ -104,7 +105,7 @@ buffered_iopage_t *buffered_io_page = NULL;QEMUTimer *buffered_io_timer;/* the evtchn fd for polling */ -xc_interface *xce_handle =NULL ; +xenevtchn_handle *xce_handle =NULL ;/* which vcpu we are serving */ int send_vcpu =0 ;
@@ -141,7 +142,7 @@ CPUX86State *cpu_x86_init(const char *cpu_model) cpu_single_env = env; - xce_handle =xc_evtchn_open (NULL ,0 ); + xce_handle =xenevtchn_open (NULL ,0 );if (xce_handle ==NULL ) {perror ("open" );return NULL ;
@@ -149,7 +150,7 @@ CPUX86State *cpu_x86_init(const char *cpu_model)/* FIXME: how about if we overflow the page here? */ for (i =0 ; i < vcpus; i++) { - rc =xc_evtchn_bind_interdomain ( + rc =xenevtchn_bind_interdomain ( xce_handle, domid, shared_page->vcpu_ioreq[i].vp_eport);if (rc ==-1 ) {fprintf (logfile,"bind interdomain ioctl error %d\n" , errno);
@@ -164,7 +165,7 @@ CPUX86State *cpu_x86_init(const char *cpu_model) errno);return NULL ; } - rc =xc_evtchn_bind_interdomain (xce_handle, domid, (uint32_t )bufioreq_evtchn); + rc =xenevtchn_bind_interdomain (xce_handle, domid, (uint32_t )bufioreq_evtchn);if (rc ==-1 ) {fprintf (logfile,"bind interdomain ioctl error %d\n" , errno);return NULL ;
@@ -278,7 +279,7 @@ static ioreq_t *cpu_get_ioreq(void)int i;evtchn_port_t port; - port =xc_evtchn_pending (xce_handle); + port =xenevtchn_pending (xce_handle);if (port == bufioreq_local_port) {qemu_mod_timer (buffered_io_timer,BUFFER_IO_MAX_DELAY +qemu_get_clock (rt_clock));
@@ -296,7 +297,7 @@ static ioreq_t *cpu_get_ioreq(void) }// unmask the wanted port again -xc_evtchn_unmask (xce_handle, port); +xenevtchn_unmask (xce_handle, port);//get the io packet from shared memory send_vcpu = i;
@@ -531,7 +532,7 @@ static void handle_buffered_io(void *opaque) BUFFER_IO_MAX_DELAY + qemu_get_clock(rt_clock)); }else {qemu_del_timer (buffered_io_timer); -xc_evtchn_unmask (xce_handle, bufioreq_local_port); +xenevtchn_unmask (xce_handle, bufioreq_local_port); } }
@@ -575,7 +576,7 @@ static void cpu_handle_ioreq(void *opaque) } req->state =STATE_IORESP_READY ; -xc_evtchn_notify (xce_handle, ioreq_local_port[send_vcpu]); +xenevtchn_notify (xce_handle, ioreq_local_port[send_vcpu]); } }
@@ -584,7 +585,7 @@ int xen_pause_requested;int main_loop (void ) {CPUState *env = cpu_single_env; -int evtchn_fd = xce_handle ==NULL ?-1 :xc_evtchn_fd (xce_handle); +int evtchn_fd = xce_handle ==NULL ?-1 :xenevtchn_fd (xce_handle);char *qemu_file;fd_set fds;
xen-hooks.mak +2 -0
@@ -1,4 +1,5 @@ CPPFLAGS+= -I$(XEN_ROOT)/tools/libxentoollog/include +CPPFLAGS+= -I$(XEN_ROOT)/tools/libxenevtchn/include CPPFLAGS+= -I$(XEN_ROOT)/tools/libxc/include CPPFLAGS+= -I$(XEN_ROOT)/tools/xenstore/include CPPFLAGS+= -I$(XEN_ROOT)/tools/include
@@ -18,6 +19,7 @@ endif CFLAGS += $(CMDLINE_CFLAGS) +LIBS += -L$(XEN_ROOT)/tools/libxenevtchn -lxenevtchn LIBS += -L$(XEN_ROOT)/tools/libxc -lxenctrl -lxenguest LIBS += -L$(XEN_ROOT)/tools/xenstore -lxenstore LIBS += -Wl,-rpath-link=$(XEN_ROOT)/tools/libxentoollog
Signature · 1 line
1.7.10.4
RFC PATCH 2/2 mini-os: Include libxenevtchn with libxc
In reply to Ian Campbelllibxenevtchn has just been split out from libxc. From mini-os's point of view we don't care about the distinction, so keep things simple by just including libxenevtchn if libxc is enabled.
--- Makefile | 1 + 1 file changed, 1 insertion(+)
Makefile +1 -0
@@ -166,6 +166,7 @@ OBJS := $(filter-out $(OBJ_DIR)/lwip%.o $(LWO), $(OBJS)) ifeq ($(libc),y) ifeq ($(CONFIG_XC),y) APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libxentoollog-$(MINIOS_TARGET_ARCH) -whole-archive -lxentoollog -no-whole-archive +APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libxenevtchn-$(MINIOS_TARGET_ARCH) -whole-archive -lxenevtchn -no-whole-archive APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libxc-$(MINIOS_TARGET_ARCH) -whole-archive -lxenguest -lxenctrl -no-whole-archive endif APP_LDLIBS += -lpci
Signature · 1 line
1.7.10.4
Ian Campbell writes ("[PATCH RFC 0/6+2+2] Begin to disentangle libxenctrl and provide some stable libraries"):
Quoted 1 line
[stuff]
Most of this looks good to me.
Quoted 4 lines
As part of this change I've begun to get rid of the osdep interface layer, since it is obsolete and just gets in the way. IIRC there were some tricks being played to use this on rumpkernels to mix and match facilities from
xc_minios.candxc_netbsd.c.
Replacing those tricks with appropriate #ifdefs would be fine.
Ian.
Quoted 12 lines · Ian Jackson
Ian Campbell writes ("[PATCH RFC 0/6+2+2] Begin to disentangle libxenctrl and provide some stable libraries"):
Quoted 1 line
[stuff]
Most of this looks good to me.
Quoted 4 lines
As part of this change I've begun to get rid of the osdep interface layer, since it is obsolete and just gets in the way. IIRC there were some tricks being played to use this on rumpkernels to mix and match facilities from
xc_minios.candxc_netbsd.c.Replacing those tricks with appropriate #ifdefs would be fine.
FYI I think I will write more glue code to make rump kernel to just use netbsd code, because they don't want to expose underlying minios functionalities to application level.
Wei.
Quoted 1 line
Ian.
Quoted 11 lines · Wei Liu
Quoted 10 lines · Ian Jackson
Ian Campbell writes ("[PATCH RFC 0/6+2+2] Begin to disentangle libxenctrl and provide some stable libraries"):
Quoted 1 line
[stuff]
Most of this looks good to me.
Quoted 4 lines
As part of this change I've begun to get rid of the osdep interface layer, since it is obsolete and just gets in the way. IIRC there were some tricks being played to use this on rumpkernels to mix and match facilities from
xc_minios.candxc_netbsd.c.
Quoted 6 lines
Quoted 2 lines
Replacing those tricks with appropriate #ifdefs would be fine.
FYI I think I will write more glue code to make rump kernel to just use netbsd code, because they don't want to expose underlying minios functionalities to application level.
It's not so much that we outright "don't want to" as "prefer not to". If there's a strong reason, e.g. a measurably significant performance improvement, then we can talk. However, anything calling past the libc interface is dipping into internal interfaces. We make no guarantee about internal interface stability.
One good summary of 8 years of rump kernel development would be "lack of compartmentalization always comes back to bite you", so IMO it's better to conceptually maintain separation even where not enforced by a MMU and just make everything go through the guaranteed-stable syscall interfaces.