All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support
@ 2013-09-13  9:59 Fam Zheng
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 1/8] ui/Makefile.objs: delete unnecessary cocoa.o dependency Fam Zheng
                   ` (8 more replies)
  0 siblings, 9 replies; 17+ messages in thread
From: Fam Zheng @ 2013-09-13  9:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, pbonzini, vilanova, rth

This series implements feature of shared object building as described in:

http://wiki.qemu.org/Features/Modules

The main idea behind modules is to isolate dependencies on third party
libraries from qemu executables, such as libglusterfs or librbd, so that the
end users can install core qemu package with fewer dependencies.  And only for
those who want to use particular modules, need they install qemu-foo
sub-package, which in turn requires libbar and libbiz packages.

It's implemented in three steps:

1. The first patches fix current build system to correctly handle nested
   variables and object specific options:

    [01/08] ui/Makefile.objs: delete unnecessary cocoa.o dependency
    [02/08] make.rule: fix $(obj) to a real relative path
    [03/08] rule.mak: allow per object cflags and libs

2. The Makefile changes adds necessary options and rules to build DSO objects:

    [04/08] build-sys: introduce common-obj-m and block-obj-m for DSO

3. The next patch adds code to load modules from installed directory:

    [05/08] module: implement module loading

A few more changes are following to complete it:

    [06/08] Makefile: install modules with "make install"
    [07/08] .gitignore: ignore module related files (dll, so, mo)

In the end of series, the block drivers are converted:

    [08/08] block: convert block drivers linked with libs to modules


v9: Address Daniel's comment with patch 05:
    Drop readdir().
    Squash module whitelist changes to module loading patch.

v8: This version introduces two runtime loading checks:
    * Module init function no longer with __attribute__((constructor)), and
      mangled with per configure fingerprint. See patch 05.
    * Module whitelist as configure option.

    [04] Link libqemustub.a to DSO. (iscsi needs qemu_get_vm_name).
         Fix single object module link.
         Fix extract-libs to also extract .o libs that'd be expanded later from
         .mo.
    [05] Add init function name mangling.
    [06] New.
    [07] Fix typo in "make install". [Daniel]


Fam Zheng (7):
  make.rule: fix $(obj) to a real relative path
  rule.mak: allow per object cflags and libs
  build-sys: introduce common-obj-m and block-obj-m for DSO
  module: implement module loading
  Makefile: install modules with "make install"
  .gitignore: ignore module related files (dll, so, mo)
  block: convert block drivers linked with libs to modules

Peter Maydell (1):
  ui/Makefile.objs: delete unnecessary cocoa.o dependency

 .gitignore            |  3 ++
 Makefile              | 31 ++++++++++++++++++-
 Makefile.objs         | 18 ++---------
 Makefile.target       | 21 ++++++++++---
 block.c               |  1 +
 block/Makefile.objs   | 11 ++++++-
 configure             | 85 +++++++++++++++++++++++++++++++++++----------------
 include/qemu/module.h | 23 ++++++++++++++
 rules.mak             | 84 ++++++++++++++++++++++++++++++++++++++++++--------
 scripts/create_config | 21 +++++++++++++
 ui/Makefile.objs      |  2 --
 util/module.c         | 74 ++++++++++++++++++++++++++++++++++++++++++++
 vl.c                  |  2 ++
 13 files changed, 314 insertions(+), 62 deletions(-)

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v9 1/8] ui/Makefile.objs: delete unnecessary cocoa.o dependency
  2013-09-13  9:59 [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support Fam Zheng
@ 2013-09-13  9:59 ` Fam Zheng
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 2/8] make.rule: fix $(obj) to a real relative path Fam Zheng
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 17+ messages in thread
From: Fam Zheng @ 2013-09-13  9:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, pbonzini, vilanova, rth

From: Peter Maydell <peter.maydell@linaro.org>

Delete an unnecessary dependency for cocoa.o; we already have
a general rule that tells Make that we can build a .o file
from a .m source using an ObjC compiler, so this specific
rule is unnecessary. Further, it is using the dubious construct
"$(SRC_PATH)/$(obj)" to get at the source directory, which will
break when $(obj) is redefined as part of the preparation for
per-object library support.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Fam Zheng <famz@redhat.com>
---
 ui/Makefile.objs | 2 --
 1 file changed, 2 deletions(-)

diff --git a/ui/Makefile.objs b/ui/Makefile.objs
index 6ddc0de..f33be47 100644
--- a/ui/Makefile.objs
+++ b/ui/Makefile.objs
@@ -17,6 +17,4 @@ common-obj-$(CONFIG_GTK) += gtk.o x_keymap.o
 
 $(obj)/sdl.o $(obj)/sdl_zoom.o: QEMU_CFLAGS += $(SDL_CFLAGS) 
 
-$(obj)/cocoa.o: $(SRC_PATH)/$(obj)/cocoa.m
-
 $(obj)/gtk.o: QEMU_CFLAGS += $(GTK_CFLAGS) $(VTE_CFLAGS)
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v9 2/8] make.rule: fix $(obj) to a real relative path
  2013-09-13  9:59 [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support Fam Zheng
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 1/8] ui/Makefile.objs: delete unnecessary cocoa.o dependency Fam Zheng
@ 2013-09-13  9:59 ` Fam Zheng
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 3/8] rule.mak: allow per object cflags and libs Fam Zheng
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 17+ messages in thread
From: Fam Zheng @ 2013-09-13  9:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, pbonzini, vilanova, rth

Makefile.target includes rule.mak and unnested common-obj-y, then prefix
them with '../', this will ignore object specific QEMU_CFLAGS in subdir
Makefile.objs:

    $(obj)/curl.o: QEMU_CFLAGS += $(CURL_CFLAGS)

Because $(obj) here is './block', instead of '../block'. This doesn't
hurt compiling because we basically build all .o from top Makefile,
before entering Makefile.target, but it will affact arriving per-object
libs support.

The starting point of $(obj) is passed in as argument of unnest-vars, as
well as nested variables, so that different Makefiles can pass in a
right value.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 Makefile        | 14 ++++++++++++++
 Makefile.objs   | 16 +---------------
 Makefile.target | 17 +++++++++++++----
 configure       |  1 +
 rules.mak       | 14 +++++++++-----
 5 files changed, 38 insertions(+), 24 deletions(-)

diff --git a/Makefile b/Makefile
index 806946e..a23b95c 100644
--- a/Makefile
+++ b/Makefile
@@ -115,6 +115,16 @@ defconfig:
 
 ifneq ($(wildcard config-host.mak),)
 include $(SRC_PATH)/Makefile.objs
+endif
+
+dummy := $(call unnest-vars,, \
+                stub-obj-y \
+                util-obj-y \
+                qga-obj-y \
+                block-obj-y \
+                common-obj-y)
+
+ifneq ($(wildcard config-host.mak),)
 include $(SRC_PATH)/tests/Makefile
 endif
 ifeq ($(CONFIG_SMARTCARD_NSS),y)
@@ -123,6 +133,10 @@ endif
 
 all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all
 
+vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
+
+vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
+
 config-host.h: config-host.h-timestamp
 config-host.h-timestamp: config-host.mak
 qemu-options.def: $(SRC_PATH)/qemu-options.hx
diff --git a/Makefile.objs b/Makefile.objs
index f46a4cd..4f7a364 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -41,7 +41,7 @@ libcacard-y += libcacard/vcardt.o
 # single QEMU executable should support all CPUs and machines.
 
 ifeq ($(CONFIG_SOFTMMU),y)
-common-obj-y = $(block-obj-y) blockdev.o blockdev-nbd.o block/
+common-obj-y = blockdev.o blockdev-nbd.o block/
 common-obj-y += net/
 common-obj-y += readline.o
 common-obj-y += qdev-monitor.o device-hotplug.o
@@ -109,17 +109,3 @@ version-lobj-$(CONFIG_WIN32) += $(BUILD_DIR)/version.lo
 # FIXME: a few definitions from qapi-types.o/qapi-visit.o are needed
 # by libqemuutil.a.  These should be moved to a separate .json schema.
 qga-obj-y = qga/ qapi-types.o qapi-visit.o
-
-vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
-
-vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
-
-QEMU_CFLAGS+=$(GLIB_CFLAGS)
-
-nested-vars += \
-	stub-obj-y \
-	util-obj-y \
-	qga-obj-y \
-	block-obj-y \
-	common-obj-y
-dummy := $(call unnest-vars)
diff --git a/Makefile.target b/Makefile.target
index 9a49852..87906ea 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -143,13 +143,22 @@ endif # CONFIG_SOFTMMU
 # Workaround for http://gcc.gnu.org/PR55489, see configure.
 %/translate.o: QEMU_CFLAGS += $(TRANSLATE_OPT_CFLAGS)
 
-nested-vars += obj-y
+dummy := $(call unnest-vars,,obj-y)
 
-# This resolves all nested paths, so it must come last
+# we are making another call to unnest-vars with different vars, protect obj-y,
+# it can be overriden in subdir Makefile.objs
+obj-y-save := $(obj-y)
+
+block-obj-y :=
+common-obj-y :=
 include $(SRC_PATH)/Makefile.objs
+dummy := $(call unnest-vars,..,block-obj-y common-obj-y)
+
+# Now restore obj-y
+obj-y := $(obj-y-save)
+
+all-obj-y = $(obj-y) $(common-obj-y) $(block-obj-y)
 
-all-obj-y = $(obj-y)
-all-obj-y += $(addprefix ../, $(common-obj-y))
 
 ifndef CONFIG_HAIKU
 LIBS+=-lm
diff --git a/configure b/configure
index e989609..cc3cd4d 100755
--- a/configure
+++ b/configure
@@ -2251,6 +2251,7 @@ fi
 if $pkg_config --atleast-version=$glib_req_ver gthread-2.0; then
     glib_cflags=`$pkg_config --cflags gthread-2.0`
     glib_libs=`$pkg_config --libs gthread-2.0`
+    CFLAGS="$glib_cflags $CFLAGS"
     LIBS="$glib_libs $LIBS"
     libs_qga="$glib_libs $libs_qga"
 else
diff --git a/rules.mak b/rules.mak
index 4499745..0c5125d 100644
--- a/rules.mak
+++ b/rules.mak
@@ -103,9 +103,6 @@ clean: clean-timestamp
 
 # magic to descend into other directories
 
-obj := .
-old-nested-dirs :=
-
 define push-var
 $(eval save-$2-$1 = $(value $1))
 $(eval $1 :=)
@@ -119,9 +116,11 @@ endef
 
 define unnest-dir
 $(foreach var,$(nested-vars),$(call push-var,$(var),$1/))
-$(eval obj := $(obj)/$1)
+$(eval obj-parent-$1 := $(obj))
+$(eval obj := $(if $(obj),$(obj)/$1,$1))
 $(eval include $(SRC_PATH)/$1/Makefile.objs)
-$(eval obj := $(patsubst %/$1,%,$(obj)))
+$(eval obj := $(obj-parent-$1))
+$(eval obj-parent-$1 := )
 $(foreach var,$(nested-vars),$(call pop-var,$(var),$1/))
 endef
 
@@ -136,7 +135,12 @@ $(if $(nested-dirs),
 endef
 
 define unnest-vars
+$(eval obj := $1)
+$(eval nested-vars := $2)
+$(eval old-nested-dirs := )
 $(call unnest-vars-1)
+$(if $1,$(foreach v,$(nested-vars),$(eval \
+	$v := $(addprefix $1/,$($v)))))
 $(foreach var,$(nested-vars),$(eval $(var) := $(filter-out %/, $($(var)))))
 $(shell mkdir -p $(sort $(foreach var,$(nested-vars),$(dir $($(var))))))
 $(foreach var,$(nested-vars), $(eval \
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v9 3/8] rule.mak: allow per object cflags and libs
  2013-09-13  9:59 [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support Fam Zheng
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 1/8] ui/Makefile.objs: delete unnecessary cocoa.o dependency Fam Zheng
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 2/8] make.rule: fix $(obj) to a real relative path Fam Zheng
@ 2013-09-13  9:59 ` Fam Zheng
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 4/8] build-sys: introduce common-obj-m and block-obj-m for DSO Fam Zheng
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 17+ messages in thread
From: Fam Zheng @ 2013-09-13  9:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, pbonzini, vilanova, rth

Adds extract-libs in LINK to expand any "per object libs", the syntax to define
such a libs options is like:

        foo.o-libs := $(CURL_LIBS)

in block/Makefile.objs.

Similarly,

        foo.o-cflags := $(FOO_CFLAGS)

is also supported.

"foo.o" must be listed a nested var (e.g. common-obj-y) to make the
option variables effective.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 rules.mak | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/rules.mak b/rules.mak
index 0c5125d..355c275 100644
--- a/rules.mak
+++ b/rules.mak
@@ -17,15 +17,17 @@ QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(*D)/$(*F).d
 # Same as -I$(SRC_PATH) -I., but for the nested source/object directories
 QEMU_INCLUDES += -I$(<D) -I$(@D)
 
+extract-libs = $(strip $(foreach o,$1,$($o-libs)))
+
 %.o: %.c
-	$(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<,"  CC    $(TARGET_DIR)$@")
+	$(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) -c -o $@ $<,"  CC    $(TARGET_DIR)$@")
 %.o: %.rc
 	$(call quiet-command,$(WINDRES) -I. -o $@ $<,"  RC    $(TARGET_DIR)$@")
 
 ifeq ($(LIBTOOL),)
 LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
        $(sort $(filter %.o, $1)) $(filter-out %.o, $1) $(version-obj-y) \
-       $(LIBS),"  LINK  $(TARGET_DIR)$@")
+       $(call extract-libs,$^) $(LIBS),"  LINK  $(TARGET_DIR)$@")
 else
 LIBTOOL += $(if $(V),,--quiet)
 %.lo: %.c
@@ -41,7 +43,7 @@ LINK = $(call quiet-command,\
        $(sort $(filter %.o, $1)) $(filter-out %.o, $1) \
        $(if $(filter %.lo %.la,$^),$(version-lobj-y),$(version-obj-y)) \
        $(if $(filter %.lo %.la,$^),$(LIBTOOLFLAGS)) \
-       $(LIBS),$(if $(filter %.lo %.la,$^),"lt LINK ", "  LINK  ")"$(TARGET_DIR)$@")
+       $(call extract-libs,$^) $(LIBS),$(if $(filter %.lo %.la,$^),"lt LINK ", "  LINK  ")"$(TARGET_DIR)$@")
 endif
 
 %.asm: %.S
@@ -114,11 +116,22 @@ $(eval $1 = $(value save-$2-$1) $$(subdir-$2-$1))
 $(eval save-$2-$1 :=)
 endef
 
+define fix-obj-vars
+$(foreach v,$($1), \
+	$(if $($v-cflags), \
+		$(eval $2$v-cflags := $($v-cflags)) \
+		$(eval $v-cflags := )) \
+	$(if $($v-libs), \
+		$(eval $2$v-libs := $($v-libs)) \
+		$(eval $v-libs := )))
+endef
+
 define unnest-dir
 $(foreach var,$(nested-vars),$(call push-var,$(var),$1/))
 $(eval obj-parent-$1 := $(obj))
 $(eval obj := $(if $(obj),$(obj)/$1,$1))
 $(eval include $(SRC_PATH)/$1/Makefile.objs)
+$(foreach v,$(nested-vars),$(call fix-obj-vars,$v,$(if $(obj),$(obj)/)))
 $(eval obj := $(obj-parent-$1))
 $(eval obj-parent-$1 := )
 $(foreach var,$(nested-vars),$(call pop-var,$(var),$1/))
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v9 4/8] build-sys: introduce common-obj-m and block-obj-m for DSO
  2013-09-13  9:59 [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support Fam Zheng
                   ` (2 preceding siblings ...)
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 3/8] rule.mak: allow per object cflags and libs Fam Zheng
@ 2013-09-13  9:59 ` Fam Zheng
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 5/8] module: implement module loading Fam Zheng
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 17+ messages in thread
From: Fam Zheng @ 2013-09-13  9:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, pbonzini, vilanova, rth

Add necessary rules and flags for shared object generation.
$(common-obj-m) will include $(block-obj-m), like $(common-obj-y) does
for $(block-obj-y). The new rules introduced here are:

0) For all %.so compiling:

    QEMU_CFLAGS += -fPIC

1) %.o in $(common-obj-m) is compiled to %.o, then linked to %.so.

2) %.mo in $(common-obj-m) is the placeholder for %.so for pattern
matching in Makefile. It's linked to "-shared" with all its dependencies
(multiple *.o) as input. Which means the list of depended objects must
be specified in each sub-Makefile.objs:

    foo.mo-objs := bar.o baz.o qux.o

in the same style with foo.o-cflags and foo.o-libs. The objects here
will be prefixed with "$(obj)/" if it's a subdirectory Makefile.objs.

Also introduce --enable-modules in configure, the option will enable
support of shared object build. Otherwise objects are static linked to
executables.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 Makefile        | 10 ++++++++--
 Makefile.objs   |  2 ++
 Makefile.target |  6 +++++-
 configure       | 14 ++++++++++++++
 rules.mak       | 54 +++++++++++++++++++++++++++++++++++++++++++++---------
 5 files changed, 74 insertions(+), 12 deletions(-)

diff --git a/Makefile b/Makefile
index a23b95c..ef76967 100644
--- a/Makefile
+++ b/Makefile
@@ -122,7 +122,9 @@ dummy := $(call unnest-vars,, \
                 util-obj-y \
                 qga-obj-y \
                 block-obj-y \
-                common-obj-y)
+                block-obj-m \
+                common-obj-y \
+                common-obj-m)
 
 ifneq ($(wildcard config-host.mak),)
 include $(SRC_PATH)/tests/Makefile
@@ -131,7 +133,7 @@ ifeq ($(CONFIG_SMARTCARD_NSS),y)
 include $(SRC_PATH)/libcacard/Makefile
 endif
 
-all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all
+all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all modules
 
 vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
 
@@ -249,6 +251,10 @@ clean:
 	rm -f qemu-options.def
 	find . -name '*.[oda]' -type f -exec rm -f {} +
 	find . -name '*.l[oa]' -type f -exec rm -f {} +
+	find . -name '*.so' -type f -exec rm -f {} +
+	find . -name '*.mo' -type f -exec rm -f {} +
+	find . -name '*.dll' -type f -exec rm -f {} +
+
 	rm -f $(TOOLS) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
 	rm -Rf .libs
 	rm -f qemu-img-cmds.h
diff --git a/Makefile.objs b/Makefile.objs
index 4f7a364..023166b 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -19,6 +19,8 @@ block-obj-y += qemu-coroutine.o qemu-coroutine-lock.o qemu-coroutine-io.o
 block-obj-y += qemu-coroutine-sleep.o
 block-obj-y += coroutine-$(CONFIG_COROUTINE_BACKEND).o
 
+block-obj-m = block/
+
 ifeq ($(CONFIG_VIRTIO)$(CONFIG_VIRTFS)$(CONFIG_PCI),yyy)
 # Lots of the fsdev/9pcode is pulled in by vl.c via qemu_fsdev_add.
 # only pull in the actual virtio-9p device if we also enabled virtio.
diff --git a/Makefile.target b/Makefile.target
index 87906ea..7fb9e4d 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -152,7 +152,11 @@ obj-y-save := $(obj-y)
 block-obj-y :=
 common-obj-y :=
 include $(SRC_PATH)/Makefile.objs
-dummy := $(call unnest-vars,..,block-obj-y common-obj-y)
+dummy := $(call unnest-vars,.., \
+               block-obj-y \
+               block-obj-m \
+               common-obj-y \
+               common-obj-m)
 
 # Now restore obj-y
 obj-y := $(obj-y-save)
diff --git a/configure b/configure
index cc3cd4d..5bc7256 100755
--- a/configure
+++ b/configure
@@ -190,6 +190,9 @@ mingw32="no"
 gcov="no"
 gcov_tool="gcov"
 EXESUF=""
+DSOSUF=".so"
+LDFLAGS_SHARED="-shared"
+modules="no"
 prefix="/usr/local"
 mandir="\${prefix}/share/man"
 datadir="\${prefix}/share"
@@ -485,6 +488,7 @@ OpenBSD)
 Darwin)
   bsd="yes"
   darwin="yes"
+  LDFLAGS_SHARED="-bundle"
   if [ "$cpu" = "x86_64" ] ; then
     QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
     LDFLAGS="-arch x86_64 $LDFLAGS"
@@ -584,6 +588,7 @@ fi
 
 if test "$mingw32" = "yes" ; then
   EXESUF=".exe"
+  DSOSUF=".dll"
   QEMU_CFLAGS="-DWIN32_LEAN_AND_MEAN -DWINVER=0x501 $QEMU_CFLAGS"
   # enable C99/POSIX format strings (needs mingw32-runtime 3.15 or later)
   QEMU_CFLAGS="-D__USE_MINGW_ANSI_STDIO=1 $QEMU_CFLAGS"
@@ -646,6 +651,8 @@ for opt do
   ;;
   --disable-debug-info)
   ;;
+  --enable-modules) modules="yes"
+  ;;
   --cpu=*)
   ;;
   --target-list=*) target_list="$optarg"
@@ -1048,6 +1055,7 @@ echo "  --libdir=PATH            install libraries in PATH"
 echo "  --sysconfdir=PATH        install config in PATH$confsuffix"
 echo "  --localstatedir=PATH     install local state in PATH (set at runtime on win32)"
 echo "  --with-confsuffix=SUFFIX suffix for QEMU data inside datadir and sysconfdir [$confsuffix]"
+echo "  --enable-modules         enable modules support"
 echo "  --enable-debug-tcg       enable TCG debugging"
 echo "  --disable-debug-tcg      disable TCG debugging (default)"
 echo "  --enable-debug-info       enable debugging information (default)"
@@ -3572,6 +3580,7 @@ echo "python            $python"
 if test "$slirp" = "yes" ; then
     echo "smbd              $smbd"
 fi
+echo "module support    $modules"
 echo "host CPU          $cpu"
 echo "host big endian   $bigendian"
 echo "target list       $target_list"
@@ -3689,6 +3698,9 @@ echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
 
 echo "ARCH=$ARCH" >> $config_host_mak
 
+if test "$modules" = "yes"; then
+  echo "CONFIG_MODULES=y" >> $config_host_mak
+fi
 case "$cpu" in
   arm|i386|x86_64|x32|ppc|aarch64)
     # The TCG interpreter currently does not support ld/st optimization.
@@ -4175,6 +4187,8 @@ echo "LIBTOOLFLAGS=$LIBTOOLFLAGS" >> $config_host_mak
 echo "LIBS+=$LIBS" >> $config_host_mak
 echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
 echo "EXESUF=$EXESUF" >> $config_host_mak
+echo "DSOSUF=$DSOSUF" >> $config_host_mak
+echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak
 echo "LIBS_QGA+=$libs_qga" >> $config_host_mak
 echo "POD2MAN=$POD2MAN" >> $config_host_mak
 echo "TRANSLATE_OPT_CFLAGS=$TRANSLATE_OPT_CFLAGS" >> $config_host_mak
diff --git a/rules.mak b/rules.mak
index 355c275..43a502e 100644
--- a/rules.mak
+++ b/rules.mak
@@ -17,7 +17,11 @@ QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(*D)/$(*F).d
 # Same as -I$(SRC_PATH) -I., but for the nested source/object directories
 QEMU_INCLUDES += -I$(<D) -I$(@D)
 
-extract-libs = $(strip $(foreach o,$1,$($o-libs)))
+extract-libs = $(strip $(sort $(foreach o,$1,$($o-libs)) \
+                       $(foreach o,$(call expand-objs,$1),$($o-libs))))
+expand-objs = $(strip $(sort $(filter %.o,$1)) \
+                  $(foreach o,$(filter %.mo,$1),$($o-objs)) \
+                  $(filter-out %.o %.mo,$1))
 
 %.o: %.c
 	$(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) -c -o $@ $<,"  CC    $(TARGET_DIR)$@")
@@ -26,8 +30,8 @@ extract-libs = $(strip $(foreach o,$1,$($o-libs)))
 
 ifeq ($(LIBTOOL),)
 LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
-       $(sort $(filter %.o, $1)) $(filter-out %.o, $1) $(version-obj-y) \
-       $(call extract-libs,$^) $(LIBS),"  LINK  $(TARGET_DIR)$@")
+       $(call expand-objs,$1) $(version-obj-y) \
+       $(call extract-libs,$1) $(LIBS),"  LINK  $(TARGET_DIR)$@")
 else
 LIBTOOL += $(if $(V),,--quiet)
 %.lo: %.c
@@ -38,12 +42,12 @@ LIBTOOL += $(if $(V),,--quiet)
 	$(call quiet-command,$(LIBTOOL) --mode=compile --tag=CC dtrace -o $@ -G -s $<, " lt GEN $(TARGET_DIR)$@")
 
 LINK = $(call quiet-command,\
-       $(if $(filter %.lo %.la,$^),$(LIBTOOL) --mode=link --tag=CC \
+       $(if $(filter %.lo %.la,$1),$(LIBTOOL) --mode=link --tag=CC \
        )$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
-       $(sort $(filter %.o, $1)) $(filter-out %.o, $1) \
-       $(if $(filter %.lo %.la,$^),$(version-lobj-y),$(version-obj-y)) \
-       $(if $(filter %.lo %.la,$^),$(LIBTOOLFLAGS)) \
-       $(call extract-libs,$^) $(LIBS),$(if $(filter %.lo %.la,$^),"lt LINK ", "  LINK  ")"$(TARGET_DIR)$@")
+       $(call expand-objs,$1) \
+       $(if $(filter %.lo %.la,$1),$(version-lobj-y),$(version-obj-y)) \
+       $(if $(filter %.lo %.la,$1),$(LIBTOOLFLAGS)) \
+       $(call extract-libs,$1) $(LIBS),$(if $(filter %.lo %.la,$1),"lt LINK ", "  LINK  ")"$(TARGET_DIR)$@")
 endif
 
 %.asm: %.S
@@ -58,6 +62,17 @@ endif
 %.o: %.dtrace
 	$(call quiet-command,dtrace -o $@ -G -s $<, "  GEN   $(TARGET_DIR)$@")
 
+%$(DSOSUF): QEMU_CFLAGS += -fPIC
+%$(DSOSUF): LDFLAGS += $(LDFLAGS_SHARED)
+%$(DSOSUF): %.mo libqemustub.a
+	$(call LINK,$^)
+
+.PHONY: modules
+modules:
+
+%.mo:
+	$(call quiet-command,touch $@,"  GEN   $(TARGET_DIR)$@")
+
 %$(EXESUF): %.o
 	$(call LINK,$^)
 
@@ -123,7 +138,10 @@ $(foreach v,$($1), \
 		$(eval $v-cflags := )) \
 	$(if $($v-libs), \
 		$(eval $2$v-libs := $($v-libs)) \
-		$(eval $v-libs := )))
+		$(eval $v-libs := )) \
+	$(if $($v-objs), \
+		$(eval $2$v-objs := $(addprefix $2,$($v-objs))) \
+		$(eval $v-objs := )))
 endef
 
 define unnest-dir
@@ -147,6 +165,15 @@ $(if $(nested-dirs),
   $(call unnest-vars-1))
 endef
 
+define add-modules
+$(foreach o,$(filter %.o,$($1)),
+	$(eval $(patsubst %.o,%.mo,$o): $o) \
+	$(eval $(patsubst %.o,%.mo,$o)-objs := $o))
+$(foreach o,$(filter %.mo,$($1)),$(eval \
+    $o: $($o-objs)))
+$(eval modules-m += $(patsubst %.o,%.mo,$($1)))
+endef
+
 define unnest-vars
 $(eval obj := $1)
 $(eval nested-vars := $2)
@@ -158,4 +185,13 @@ $(foreach var,$(nested-vars),$(eval $(var) := $(filter-out %/, $($(var)))))
 $(shell mkdir -p $(sort $(foreach var,$(nested-vars),$(dir $($(var))))))
 $(foreach var,$(nested-vars), $(eval \
   -include $(addsuffix *.d, $(sort $(dir $($(var)))))))
+$(foreach v,$(filter %-m,$(nested-vars)), \
+    $(call add-modules,$v))
+
+$(if $(CONFIG_MODULES), \
+    $(eval modules: $(patsubst %.mo,%$(DSOSUF),$(modules-m))), \
+    $(foreach v,$(filter %-m,$(nested-vars)), \
+        $(eval $(patsubst %-m,%-y,$v) += $($v)) \
+        $(eval $v := )))
+
 endef
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v9 5/8] module: implement module loading
  2013-09-13  9:59 [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support Fam Zheng
                   ` (3 preceding siblings ...)
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 4/8] build-sys: introduce common-obj-m and block-obj-m for DSO Fam Zheng
@ 2013-09-13  9:59 ` Fam Zheng
  2013-09-13 14:07   ` Daniel P. Berrange
  2013-09-13 14:52   ` Richard Henderson
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 6/8] Makefile: install modules with "make install" Fam Zheng
                   ` (3 subsequent siblings)
  8 siblings, 2 replies; 17+ messages in thread
From: Fam Zheng @ 2013-09-13  9:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, pbonzini, vilanova, rth

Added three types of modules:

    typedef enum {
        MODULE_LOAD_BLOCK = 0,
        MODULE_LOAD_UI,
        MODULE_LOAD_NET,
        MODULE_LOAD_MAX,
    } module_load_type;

and their loading function:

    void module_load(module_load_type).

which loads whitelisted ".so" files in a subdir under configured
${MODDIR}, e.g.  "/usr/lib/qemu/block". Modules of each type should be
loaded in respective subsystem initialization code.

The init function of dynamic module is no longer with
__attribute__((constructor)) as static linked version, and need to be
explicitly called once loaded. The function name is mangled with per
configure fingerprint as:

    init_$(date +%s$$$RANDOM)

Which is known to module_load function, and the loading fails if this
symbol is not there. With this, modules built from a different
tree/version/configure will not be loaded.

The module loading code requires gmodule-2.0.

Configure option "--enable-modules=L" can be used to restrict qemu to
only build/load some whitelisted modules.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 Makefile              |  3 +++
 block.c               |  1 +
 configure             | 43 ++++++++++++++++++++++--------
 include/qemu/module.h | 23 ++++++++++++++++
 rules.mak             |  9 +++++--
 scripts/create_config | 21 +++++++++++++++
 util/module.c         | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++
 vl.c                  |  2 ++
 8 files changed, 163 insertions(+), 13 deletions(-)

diff --git a/Makefile b/Makefile
index ef76967..766b309 100644
--- a/Makefile
+++ b/Makefile
@@ -196,6 +196,9 @@ Makefile: $(version-obj-y) $(version-lobj-y)
 libqemustub.a: $(stub-obj-y)
 libqemuutil.a: $(util-obj-y) qapi-types.o qapi-visit.o
 
+default-whitelist = $(foreach o,$(modules-m),"$(notdir $(basename $o))",) NULL
+util/module.o-cflags = -D'CONFIG_MODULE_WHITELIST=$(default-whitelist)'
+
 ######################################################################
 
 qemu-img.o: qemu-img-cmds.h
diff --git a/block.c b/block.c
index 26639e8..16ceaaf 100644
--- a/block.c
+++ b/block.c
@@ -4008,6 +4008,7 @@ BlockDriverAIOCB *bdrv_aio_discard(BlockDriverState *bs,
 
 void bdrv_init(void)
 {
+    module_load(MODULE_LOAD_BLOCK);
     module_call_init(MODULE_INIT_BLOCK);
 }
 
diff --git a/configure b/configure
index 5bc7256..05aa964 100755
--- a/configure
+++ b/configure
@@ -199,6 +199,7 @@ datadir="\${prefix}/share"
 qemu_docdir="\${prefix}/share/doc/qemu"
 bindir="\${prefix}/bin"
 libdir="\${prefix}/lib"
+moddir="\${prefix}/lib/qemu"
 libexecdir="\${prefix}/libexec"
 includedir="\${prefix}/include"
 sysconfdir="\${prefix}/etc"
@@ -651,7 +652,9 @@ for opt do
   ;;
   --disable-debug-info)
   ;;
-  --enable-modules) modules="yes"
+  --enable-modules|--enable-modules=*)
+      modules="yes"
+      module_list=`echo "$optarg" | sed -e 's/,/ /g'`
   ;;
   --cpu=*)
   ;;
@@ -676,6 +679,8 @@ for opt do
   ;;
   --libdir=*) libdir="$optarg"
   ;;
+  --moddir=*) moddir="$optarg"
+  ;;
   --libexecdir=*) libexecdir="$optarg"
   ;;
   --includedir=*) includedir="$optarg"
@@ -1052,10 +1057,13 @@ echo "  --datadir=PATH           install firmware in PATH$confsuffix"
 echo "  --docdir=PATH            install documentation in PATH$confsuffix"
 echo "  --bindir=PATH            install binaries in PATH"
 echo "  --libdir=PATH            install libraries in PATH"
+echo "  --moddir=PATH            install modules in PATH"
 echo "  --sysconfdir=PATH        install config in PATH$confsuffix"
 echo "  --localstatedir=PATH     install local state in PATH (set at runtime on win32)"
 echo "  --with-confsuffix=SUFFIX suffix for QEMU data inside datadir and sysconfdir [$confsuffix]"
-echo "  --enable-modules         enable modules support"
+echo "  --enable-modules         enable modules support and whitelist all modules"
+echo "  --enable-modules=L       enable modules and provide a whitelist"
+echo "                           Available modules: curl iscsi gluster ssh rbd"
 echo "  --enable-debug-tcg       enable TCG debugging"
 echo "  --disable-debug-tcg      disable TCG debugging (default)"
 echo "  --enable-debug-info       enable debugging information (default)"
@@ -2256,15 +2264,19 @@ if test "$mingw32" = yes; then
 else
     glib_req_ver=2.12
 fi
-if $pkg_config --atleast-version=$glib_req_ver gthread-2.0; then
-    glib_cflags=`$pkg_config --cflags gthread-2.0`
-    glib_libs=`$pkg_config --libs gthread-2.0`
-    CFLAGS="$glib_cflags $CFLAGS"
-    LIBS="$glib_libs $LIBS"
-    libs_qga="$glib_libs $libs_qga"
-else
-    error_exit "glib-$glib_req_ver required to compile QEMU"
-fi
+
+for i in gthread-2.0 gmodule-2.0; do
+    if $pkg_config --atleast-version=$glib_req_ver $i; then
+        glib_cflags=`$pkg_config --cflags $i`
+        glib_libs=`$pkg_config --libs $i`
+        CFLAGS="$glib_cflags $CFLAGS"
+        LIBS="$glib_libs $LIBS"
+        libs_qga="$glib_libs $libs_qga"
+    else
+        error_exit "glib-$glib_req_ver required to compile QEMU"
+    fi
+done
+
 
 ##########################################
 # pixman support probe
@@ -3557,6 +3569,7 @@ echo "Install prefix    $prefix"
 echo "BIOS directory    `eval echo $qemu_datadir`"
 echo "binary directory  `eval echo $bindir`"
 echo "library directory `eval echo $libdir`"
+echo "module directory  `eval echo $moddir`"
 echo "libexec directory `eval echo $libexecdir`"
 echo "include directory `eval echo $includedir`"
 echo "config directory  `eval echo $sysconfdir`"
@@ -3581,6 +3594,9 @@ if test "$slirp" = "yes" ; then
     echo "smbd              $smbd"
 fi
 echo "module support    $modules"
+if test -n "$module_list"; then
+    echo "module whitelist  $module_list"
+fi
 echo "host CPU          $cpu"
 echo "host big endian   $bigendian"
 echo "target list       $target_list"
@@ -3680,6 +3696,7 @@ echo all: >> $config_host_mak
 echo "prefix=$prefix" >> $config_host_mak
 echo "bindir=$bindir" >> $config_host_mak
 echo "libdir=$libdir" >> $config_host_mak
+echo "moddir=$moddir" >> $config_host_mak
 echo "libexecdir=$libexecdir" >> $config_host_mak
 echo "includedir=$includedir" >> $config_host_mak
 echo "mandir=$mandir" >> $config_host_mak
@@ -3698,8 +3715,12 @@ echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
 
 echo "ARCH=$ARCH" >> $config_host_mak
 
+echo "CONFIG_FINGERPRINT=$(date +%s$$$RANDOM)" >> $config_host_mak
 if test "$modules" = "yes"; then
   echo "CONFIG_MODULES=y" >> $config_host_mak
+  if test -n "$module_list"; then
+      echo "CONFIG_MODULE_WHITELIST=$module_list" >> $config_host_mak
+  fi
 fi
 case "$cpu" in
   arm|i386|x86_64|x32|ppc|aarch64)
diff --git a/include/qemu/module.h b/include/qemu/module.h
index c4ccd57..6458d8f 100644
--- a/include/qemu/module.h
+++ b/include/qemu/module.h
@@ -14,11 +14,25 @@
 #ifndef QEMU_MODULE_H
 #define QEMU_MODULE_H
 
+#ifdef BUILD_DSO
+
+/* For error message, this function is an identification of qemu module */
+void qemu_module_do_init(void (*init)(void));
+
+/* To restrict loading of arbitrary DSO, The init function name is changed per
+ * "./configure" to refuse unknown DSO file */
+void DSO_INIT_FUN(void);
+
+#define module_init(function, type)                                         \
+void qemu_module_do_init(void (*init)(void)) { init(); }                    \
+void DSO_INIT_FUN(void) { qemu_module_do_init(function); }
+#else
 /* This should not be used directly.  Use block_init etc. instead.  */
 #define module_init(function, type)                                         \
 static void __attribute__((constructor)) do_qemu_init_ ## function(void) {  \
     register_module_init(function, type);                                   \
 }
+#endif
 
 typedef enum {
     MODULE_INIT_BLOCK,
@@ -37,4 +51,13 @@ void register_module_init(void (*fn)(void), module_init_type type);
 
 void module_call_init(module_init_type type);
 
+typedef enum {
+    MODULE_LOAD_BLOCK = 0,
+    MODULE_LOAD_UI,
+    MODULE_LOAD_NET,
+    MODULE_LOAD_MAX,
+} module_load_type;
+
+void module_load(module_load_type type);
+
 #endif
diff --git a/rules.mak b/rules.mak
index 43a502e..e5529da 100644
--- a/rules.mak
+++ b/rules.mak
@@ -62,7 +62,7 @@ endif
 %.o: %.dtrace
 	$(call quiet-command,dtrace -o $@ -G -s $<, "  GEN   $(TARGET_DIR)$@")
 
-%$(DSOSUF): QEMU_CFLAGS += -fPIC
+%$(DSOSUF): QEMU_CFLAGS += -fPIC -DBUILD_DSO
 %$(DSOSUF): LDFLAGS += $(LDFLAGS_SHARED)
 %$(DSOSUF): %.mo libqemustub.a
 	$(call LINK,$^)
@@ -165,13 +165,18 @@ $(if $(nested-dirs),
   $(call unnest-vars-1))
 endef
 
+is-whitelisted = $(if $(CONFIG_MODULE_WHITELIST),$(strip \
+    $(filter $(CONFIG_MODULE_WHITELIST),$(basename $(notdir $1)))),\
+	yes)
 define add-modules
 $(foreach o,$(filter %.o,$($1)),
 	$(eval $(patsubst %.o,%.mo,$o): $o) \
 	$(eval $(patsubst %.o,%.mo,$o)-objs := $o))
 $(foreach o,$(filter %.mo,$($1)),$(eval \
     $o: $($o-objs)))
-$(eval modules-m += $(patsubst %.o,%.mo,$($1)))
+$(eval t := $(patsubst %.o,%.mo,$($1)))
+$(foreach o,$t,$(if $(call is-whitelisted,$o),$(eval \
+	modules-m += $o)))
 endef
 
 define unnest-vars
diff --git a/scripts/create_config b/scripts/create_config
index b1adbf5..ab430c7 100755
--- a/scripts/create_config
+++ b/scripts/create_config
@@ -26,6 +26,24 @@ case $line in
     # save for the next definitions
     prefix=${line#*=}
     ;;
+ moddir=*)
+    eval "moddir=\"${line#*=}\""
+    echo "#define CONFIG_MODDIR \"$moddir\""
+    ;;
+ CONFIG_FINGERPRINT=*)
+    echo "#define DSO_INIT_FUN init_${line#*=}"
+    echo "#define DSO_INIT_FUN_STR \"init_${line#*=}\""
+    ;;
+ CONFIG_MODULES=*)
+    echo "#define CONFIG_MODULES \"${line#*=}\""
+    ;;
+ CONFIG_MODULE_WHITELIST=*)
+    echo "#define CONFIG_MODULE_WHITELIST\\"
+    for mod in ${line#*=}; do
+      echo "    \"${mod}\",\\"
+    done
+    echo "    NULL"
+    ;;
  CONFIG_AUDIO_DRIVERS=*)
     drivers=${line#*=}
     echo "#define CONFIG_AUDIO_DRIVERS \\"
@@ -104,6 +122,9 @@ case $line in
     value=${line#*=}
     echo "#define $name $value"
     ;;
+ DSOSUF=*)
+    echo "#define HOST_DSOSUF \"${line#*=}\""
+    ;;
 esac
 
 done # read
diff --git a/util/module.c b/util/module.c
index 7acc33d..1f38311 100644
--- a/util/module.c
+++ b/util/module.c
@@ -13,6 +13,7 @@
  * GNU GPL, version 2 or (at your option) any later version.
  */
 
+#include <gmodule.h>
 #include "qemu-common.h"
 #include "qemu/queue.h"
 #include "qemu/module.h"
@@ -79,3 +80,76 @@ void module_call_init(module_init_type type)
         e->init();
     }
 }
+
+#ifdef CONFIG_MODULES
+static void module_load_file(const char *fname)
+{
+    GModule *g_module;
+    void (*init_fun)(void);
+    const char *dsosuf = HOST_DSOSUF;
+    int len = strlen(fname);
+    int suf_len = strlen(dsosuf);
+
+    if (len <= suf_len || strcmp(&fname[len - suf_len], dsosuf)) {
+        /* wrong suffix */
+        return;
+    }
+    g_module = g_module_open(fname, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
+    if (!g_module) {
+        fprintf(stderr, "Failed to open module file %s\n",
+                g_module_error());
+        return;
+    }
+    if (!g_module_symbol(g_module, DSO_INIT_FUN_STR, (gpointer *)&init_fun)) {
+        fprintf(stderr, "Failed to initialize module: %s\n",
+                fname);
+        /* Print some info if this is a QEMU module (but from different build),
+         * this will make debugging user problems easier. */
+        if (g_module_symbol(g_module, "qemu_module_do_init",
+                            (gpointer *)&init_fun)) {
+            fprintf(stderr,
+                    "Note: only modules from the same build can be loaded.\n");
+        }
+        g_module_close(g_module);
+        return;
+    }
+    init_fun();
+}
+#endif
+
+void module_load(module_load_type type)
+{
+#ifdef CONFIG_MODULES
+    const char *path;
+    char *fname = NULL;
+    const char **mp;
+    const char *module_whitelist[] = {
+        CONFIG_MODULE_WHITELIST
+    };
+
+    if (!g_module_supported()) {
+        return;
+    }
+
+    switch (type) {
+    case MODULE_LOAD_BLOCK:
+        path = CONFIG_MODDIR "/block/";
+        break;
+    case MODULE_LOAD_UI:
+        path = CONFIG_MODDIR "/ui/";
+        break;
+    case MODULE_LOAD_NET:
+        path = CONFIG_MODDIR "/net/";
+        break;
+    default:
+        return;
+    }
+
+    for (mp = &module_whitelist[0]; *mp; mp++) {
+        fname = g_strdup_printf("%s%s" HOST_DSOSUF, path, *mp);
+        module_load_file(fname);
+        g_free(fname);
+    }
+
+#endif
+}
diff --git a/vl.c b/vl.c
index b4b119a..659e53a 100644
--- a/vl.c
+++ b/vl.c
@@ -2940,6 +2940,8 @@ int main(int argc, char **argv, char **envp)
 #endif
     }
 
+    module_load(MODULE_LOAD_UI);
+    module_load(MODULE_LOAD_NET);
     module_call_init(MODULE_INIT_QOM);
 
     qemu_add_opts(&qemu_drive_opts);
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v9 6/8] Makefile: install modules with "make install"
  2013-09-13  9:59 [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support Fam Zheng
                   ` (4 preceding siblings ...)
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 5/8] module: implement module loading Fam Zheng
@ 2013-09-13  9:59 ` Fam Zheng
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 7/8] .gitignore: ignore module related files (dll, so, mo) Fam Zheng
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 17+ messages in thread
From: Fam Zheng @ 2013-09-13  9:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, pbonzini, vilanova, rth

Install all the subdirs for modules under configure option "moddir".

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 Makefile | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/Makefile b/Makefile
index 766b309..72addda 100644
--- a/Makefile
+++ b/Makefile
@@ -363,6 +363,12 @@ install-datadir install-localstatedir
 ifneq ($(TOOLS),)
 	$(INSTALL_PROG) $(STRIP_OPT) $(TOOLS) "$(DESTDIR)$(bindir)"
 endif
+ifneq ($(CONFIG_MODULES),)
+	for s in $(patsubst %.mo,%$(DSOSUF),$(modules-m)); do \
+		$(INSTALL_DIR) "$(DESTDIR)$(moddir)/$$(dirname $$s)"; \
+		$(INSTALL_PROG) $(STRIP_OPT) $$s "$(DESTDIR)$(moddir)/$$(dirname $$s)"; \
+	done
+endif
 ifneq ($(HELPERS-y),)
 	$(INSTALL_DIR) "$(DESTDIR)$(libexecdir)"
 	$(INSTALL_PROG) $(STRIP_OPT) $(HELPERS-y) "$(DESTDIR)$(libexecdir)"
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v9 7/8] .gitignore: ignore module related files (dll, so, mo)
  2013-09-13  9:59 [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support Fam Zheng
                   ` (5 preceding siblings ...)
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 6/8] Makefile: install modules with "make install" Fam Zheng
@ 2013-09-13  9:59 ` Fam Zheng
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 8/8] block: convert block drivers linked with libs to modules Fam Zheng
  2013-09-13 11:31 ` [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support Peter Maydell
  8 siblings, 0 replies; 17+ messages in thread
From: Fam Zheng @ 2013-09-13  9:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, pbonzini, vilanova, rth

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 .gitignore | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/.gitignore b/.gitignore
index d2c5c2f..4d0ac09 100644
--- a/.gitignore
+++ b/.gitignore
@@ -63,6 +63,9 @@ fsdev/virtfs-proxy-helper.pod
 *.cp
 *.dvi
 *.exe
+*.dll
+*.so
+*.mo
 *.fn
 *.ky
 *.log
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v9 8/8] block: convert block drivers linked with libs to modules
  2013-09-13  9:59 [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support Fam Zheng
                   ` (6 preceding siblings ...)
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 7/8] .gitignore: ignore module related files (dll, so, mo) Fam Zheng
@ 2013-09-13  9:59 ` Fam Zheng
  2013-09-13 11:31 ` [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support Peter Maydell
  8 siblings, 0 replies; 17+ messages in thread
From: Fam Zheng @ 2013-09-13  9:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, famz, mjt, alex, pbonzini, vilanova, rth

The converted block drivers are:

    curl
    iscsi
    rbd
    ssh
    glusterfs

no longer adds flags and libs for them to global variables, instead
create config-host.mak variables like FOO_CFLAGS and FOO_LIBS, which is
used as per object cflags and libs.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 block/Makefile.objs | 11 ++++++++++-
 configure           | 33 +++++++++++++++------------------
 2 files changed, 25 insertions(+), 19 deletions(-)

diff --git a/block/Makefile.objs b/block/Makefile.objs
index 3bb85b5..f98d379 100644
--- a/block/Makefile.objs
+++ b/block/Makefile.objs
@@ -23,4 +23,13 @@ common-obj-y += commit.o
 common-obj-y += mirror.o
 common-obj-y += backup.o
 
-$(obj)/curl.o: QEMU_CFLAGS+=$(CURL_CFLAGS)
+iscsi.o-cflags     := $(LIBISCSI_CFLAGS)
+iscsi.o-libs       := $(LIBISCSI_LIBS)
+curl.o-cflags      := $(CURL_CFLAGS)
+curl.o-libs        := $(CURL_LIBS)
+rbd.o-cflags       := $(RBD_CFLAGS)
+rbd.o-libs         := $(RBD_LIBS)
+gluster.o-cflags   := $(GLUSTERFS_CFLAGS)
+gluster.o-libs     := $(GLUSTERFS_LIBS)
+ssh.o-cflags       := $(LIBSSH2_CFLAGS)
+ssh.o-libs         := $(LIBSSH2_LIBS)
diff --git a/configure b/configure
index 05aa964..6854b34 100755
--- a/configure
+++ b/configure
@@ -2225,8 +2225,6 @@ EOF
   curl_libs=`$curlconfig --libs 2>/dev/null`
   if compile_prog "$curl_cflags" "$curl_libs" ; then
     curl=yes
-    libs_tools="$curl_libs $libs_tools"
-    libs_softmmu="$curl_libs $libs_softmmu"
   else
     if test "$curl" = "yes" ; then
       feature_not_found "curl"
@@ -2386,8 +2384,6 @@ EOF
   rbd_libs="-lrbd -lrados"
   if compile_prog "" "$rbd_libs" ; then
     rbd=yes
-    libs_tools="$rbd_libs $libs_tools"
-    libs_softmmu="$rbd_libs $libs_softmmu"
   else
     if test "$rbd" = "yes" ; then
       feature_not_found "rados block device"
@@ -2404,9 +2400,6 @@ if test "$libssh2" != "no" ; then
     libssh2_cflags=`$pkg_config libssh2 --cflags`
     libssh2_libs=`$pkg_config libssh2 --libs`
     libssh2=yes
-    libs_tools="$libssh2_libs $libs_tools"
-    libs_softmmu="$libssh2_libs $libs_softmmu"
-    QEMU_CFLAGS="$QEMU_CFLAGS $libssh2_cflags"
   else
     if test "$libssh2" = "yes" ; then
       error_exit "libssh2 >= $min_libssh2_version required for --enable-libssh2"
@@ -2622,9 +2615,6 @@ if test "$glusterfs" != "no" ; then
     glusterfs="yes"
     glusterfs_cflags=`$pkg_config --cflags glusterfs-api`
     glusterfs_libs=`$pkg_config --libs glusterfs-api`
-    CFLAGS="$CFLAGS $glusterfs_cflags"
-    libs_tools="$glusterfs_libs $libs_tools"
-    libs_softmmu="$glusterfs_libs $libs_softmmu"
     if $pkg_config --atleast-version=5 glusterfs-api; then
       glusterfs_discard="yes"
     fi
@@ -2992,11 +2982,9 @@ EOF
     libiscsi="yes"
     libiscsi_cflags=$($pkg_config --cflags libiscsi)
     libiscsi_libs=$($pkg_config --libs libiscsi)
-    CFLAGS="$CFLAGS $libiscsi_cflags"
-    LIBS="$LIBS $libiscsi_libs"
   elif compile_prog "" "-liscsi" ; then
     libiscsi="yes"
-    LIBS="$LIBS -liscsi"
+    libiscsi_libs="-liscsi"
   else
     if test "$libiscsi" = "yes" ; then
       feature_not_found "libiscsi"
@@ -3918,8 +3906,9 @@ if test "$bswap_h" = "yes" ; then
   echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
 fi
 if test "$curl" = "yes" ; then
-  echo "CONFIG_CURL=y" >> $config_host_mak
+  echo "CONFIG_CURL=m" >> $config_host_mak
   echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
+  echo "CURL_LIBS=$curl_libs" >> $config_host_mak
 fi
 if test "$brlapi" = "yes" ; then
   echo "CONFIG_BRLAPI=y" >> $config_host_mak
@@ -4008,7 +3997,9 @@ if test "$glx" = "yes" ; then
 fi
 
 if test "$libiscsi" = "yes" ; then
-  echo "CONFIG_LIBISCSI=y" >> $config_host_mak
+  echo "CONFIG_LIBISCSI=m" >> $config_host_mak
+  echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
+  echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
 fi
 
 if test "$seccomp" = "yes"; then
@@ -4029,7 +4020,9 @@ if test "$qom_cast_debug" = "yes" ; then
   echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
 fi
 if test "$rbd" = "yes" ; then
-  echo "CONFIG_RBD=y" >> $config_host_mak
+  echo "CONFIG_RBD=m" >> $config_host_mak
+  echo "RBD_CFLAGS=$rbd_cflags" >> $config_host_mak
+  echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
 fi
 
 echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
@@ -4067,7 +4060,9 @@ if test "$getauxval" = "yes" ; then
 fi
 
 if test "$glusterfs" = "yes" ; then
-  echo "CONFIG_GLUSTERFS=y" >> $config_host_mak
+  echo "CONFIG_GLUSTERFS=m" >> $config_host_mak
+  echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
+  echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
 fi
 
 if test "$glusterfs_discard" = "yes" ; then
@@ -4075,7 +4070,9 @@ if test "$glusterfs_discard" = "yes" ; then
 fi
 
 if test "$libssh2" = "yes" ; then
-  echo "CONFIG_LIBSSH2=y" >> $config_host_mak
+  echo "CONFIG_LIBSSH2=m" >> $config_host_mak
+  echo "LIBSSH2_CFLAGS=$libssh2_cflags" >> $config_host_mak
+  echo "LIBSSH2_LIBS=$libssh2_libs" >> $config_host_mak
 fi
 
 if test "$virtio_blk_data_plane" = "yes" ; then
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support
  2013-09-13  9:59 [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support Fam Zheng
                   ` (7 preceding siblings ...)
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 8/8] block: convert block drivers linked with libs to modules Fam Zheng
@ 2013-09-13 11:31 ` Peter Maydell
  2013-09-16  1:32   ` Fam Zheng
  8 siblings, 1 reply; 17+ messages in thread
From: Peter Maydell @ 2013-09-13 11:31 UTC (permalink / raw)
  To: Fam Zheng
  Cc: Michael Tokarev, QEMU Developers, Alex Bligh, Paolo Bonzini,
	Lluís Vilanova, Richard Henderson

On 13 September 2013 10:59, Fam Zheng <famz@redhat.com> wrote:
> This series implements feature of shared object building as described in:
>
> http://wiki.qemu.org/Features/Modules

This doesn't seem to apply to master:

cam-vm-266:precise:qemu$ patches apply
id:1379066356-14986-1-git-send-email-famz@redhat.com
Applying: ui/Makefile.objs: delete unnecessary cocoa.o dependency
Applying: make.rule: fix $(obj) to a real relative path
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging rules.mak
Auto-merging configure
Auto-merging Makefile.objs
CONFLICT (content): Merge conflict in Makefile.objs
Auto-merging Makefile
Failed to merge in the changes.
Patch failed at 0002 make.rule: fix $(obj) to a real relative path
When you have resolved this problem run "git am --resolved".
If you would prefer to skip this patch, instead run "git am --skip".
To restore the original branch and stop patching run "git am --abort".

Can you rebase?

thanks
-- PMM

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Qemu-devel] [PATCH v9 5/8] module: implement module loading
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 5/8] module: implement module loading Fam Zheng
@ 2013-09-13 14:07   ` Daniel P. Berrange
  2013-09-16  1:30     ` Fam Zheng
  2013-09-13 14:52   ` Richard Henderson
  1 sibling, 1 reply; 17+ messages in thread
From: Daniel P. Berrange @ 2013-09-13 14:07 UTC (permalink / raw)
  To: Fam Zheng; +Cc: peter.maydell, mjt, qemu-devel, alex, pbonzini, vilanova, rth

On Fri, Sep 13, 2013 at 05:59:13PM +0800, Fam Zheng wrote:
> +void module_load(module_load_type type)
> +{
> +#ifdef CONFIG_MODULES
> +    const char *path;
> +    char *fname = NULL;
> +    const char **mp;
> +    const char *module_whitelist[] = {
> +        CONFIG_MODULE_WHITELIST
> +    };
> +
> +    if (!g_module_supported()) {
> +        return;
> +    }
> +
> +    switch (type) {
> +    case MODULE_LOAD_BLOCK:
> +        path = CONFIG_MODDIR "/block/";
> +        break;
> +    case MODULE_LOAD_UI:
> +        path = CONFIG_MODDIR "/ui/";
> +        break;
> +    case MODULE_LOAD_NET:
> +        path = CONFIG_MODDIR "/net/";
> +        break;
> +    default:
> +        return;
> +    }
> +
> +    for (mp = &module_whitelist[0]; *mp; mp++) {
> +        fname = g_strdup_printf("%s%s" HOST_DSOSUF, path, *mp);
> +        module_load_file(fname);
> +        g_free(fname);
> +    }

You need a separate whitelist for block, ui, net, etc. This code just
spews errors to stderr.

Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/ui/iscsi.so: cannot open shared object file: No such file or directory
Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/ui/curl.so: cannot open shared object file: No such file or directory
Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/ui/rbd.so: cannot open shared object file: No such file or directory
Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/ui/gluster.so: cannot open shared object file: No such file or directory
Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/ui/ssh.so: cannot open shared object file: No such file or directory
Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/net/iscsi.so: cannot open shared object file: No such file or directory
Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/net/curl.so: cannot open shared object file: No such file or directory
Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/net/rbd.so: cannot open shared object file: No such file or directory
Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/net/gluster.so: cannot open shared object file: No such file or directory
Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/net/ssh.so: cannot open shared object file: No such file or directory

was this even tested before being posted ?

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Qemu-devel] [PATCH v9 5/8] module: implement module loading
  2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 5/8] module: implement module loading Fam Zheng
  2013-09-13 14:07   ` Daniel P. Berrange
@ 2013-09-13 14:52   ` Richard Henderson
  2013-09-13 16:20     ` Michael Tokarev
  2013-09-16  1:41     ` Fam Zheng
  1 sibling, 2 replies; 17+ messages in thread
From: Richard Henderson @ 2013-09-13 14:52 UTC (permalink / raw)
  To: Fam Zheng; +Cc: peter.maydell, mjt, qemu-devel, alex, pbonzini, vilanova

On 09/13/2013 02:59 AM, Fam Zheng wrote:
> +    const char *module_whitelist[] = {
> +        CONFIG_MODULE_WHITELIST
> +    };

  static const char * const module_whitelist[] = ...

> +    switch (type) {
> +    case MODULE_LOAD_BLOCK:
> +        path = CONFIG_MODDIR "/block/";
> +        break;
> +    case MODULE_LOAD_UI:
> +        path = CONFIG_MODDIR "/ui/";
> +        break;
> +    case MODULE_LOAD_NET:
> +        path = CONFIG_MODDIR "/net/";
> +        break;

Also, separate the whitelists by type.  I.e.

  static const char * const modules_block[] = ...
  static const char * const modules_ui[] = ...
  static const char * const modules_net[] = ...

  switch (type) {
  case MODULE_LOAD_BLOCK:
    list = modules_block;
    n = ARRAY_SIZE(modules_block);
    break;
  ...
  }

No need for null termination of the array, as you're currently using.

> +    for (mp = &module_whitelist[0]; *mp; mp++) {
> +        fname = g_strdup_printf("%s%s" HOST_DSOSUF, path, *mp);
> +        module_load_file(fname);
> +        g_free(fname);
> +    }

Why this bizzare mix of g_strdup_printf and compile-time string concatenation?
 Certainly you could have arranged for HOST_DSOSUF to be built into the module
name as seen in the arrays.

Then we're back to the subdirectory vs filename prefix and CONFIG_MODDIR vs any
of several module search path options, the debate of which I don't believe has
concluded.


r~

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Qemu-devel] [PATCH v9 5/8] module: implement module loading
  2013-09-13 14:52   ` Richard Henderson
@ 2013-09-13 16:20     ` Michael Tokarev
  2013-09-13 19:43       ` Richard Henderson
  2013-09-16  1:41     ` Fam Zheng
  1 sibling, 1 reply; 17+ messages in thread
From: Michael Tokarev @ 2013-09-13 16:20 UTC (permalink / raw)
  To: Richard Henderson
  Cc: peter.maydell, qemu-devel, alex, pbonzini, Fam Zheng, vilanova

13.09.2013 18:52, Richard Henderson wrote:

> Also, separate the whitelists by type.  I.e.

What for?

Thanks,

/mjt

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Qemu-devel] [PATCH v9 5/8] module: implement module loading
  2013-09-13 16:20     ` Michael Tokarev
@ 2013-09-13 19:43       ` Richard Henderson
  0 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-09-13 19:43 UTC (permalink / raw)
  To: Michael Tokarev
  Cc: peter.maydell, qemu-devel, alex, pbonzini, Fam Zheng, vilanova

On 09/13/2013 09:20 AM, Michael Tokarev wrote:
> 13.09.2013 18:52, Richard Henderson wrote:
> 
>> Also, separate the whitelists by type.  I.e.
> 
> What for?

We are talking about a function whose interface is to
only load modules of a particular type, right?

Given that we know the set of all modules, and the type
to which it belongs, how can it not be most efficient
to separate them into different lists, to avoid having
to perform some kind of runtime test on each module?


r~

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Qemu-devel] [PATCH v9 5/8] module: implement module loading
  2013-09-13 14:07   ` Daniel P. Berrange
@ 2013-09-16  1:30     ` Fam Zheng
  0 siblings, 0 replies; 17+ messages in thread
From: Fam Zheng @ 2013-09-16  1:30 UTC (permalink / raw)
  To: Daniel P. Berrange
  Cc: peter.maydell, mjt, qemu-devel, alex, pbonzini, vilanova, rth

On Fri, 09/13 15:07, Daniel P. Berrange wrote:
> On Fri, Sep 13, 2013 at 05:59:13PM +0800, Fam Zheng wrote:
> > +void module_load(module_load_type type)
> > +{
> > +#ifdef CONFIG_MODULES
> > +    const char *path;
> > +    char *fname = NULL;
> > +    const char **mp;
> > +    const char *module_whitelist[] = {
> > +        CONFIG_MODULE_WHITELIST
> > +    };
> > +
> > +    if (!g_module_supported()) {
> > +        return;
> > +    }
> > +
> > +    switch (type) {
> > +    case MODULE_LOAD_BLOCK:
> > +        path = CONFIG_MODDIR "/block/";
> > +        break;
> > +    case MODULE_LOAD_UI:
> > +        path = CONFIG_MODDIR "/ui/";
> > +        break;
> > +    case MODULE_LOAD_NET:
> > +        path = CONFIG_MODDIR "/net/";
> > +        break;
> > +    default:
> > +        return;
> > +    }
> > +
> > +    for (mp = &module_whitelist[0]; *mp; mp++) {
> > +        fname = g_strdup_printf("%s%s" HOST_DSOSUF, path, *mp);
> > +        module_load_file(fname);
> > +        g_free(fname);
> > +    }
> 
> You need a separate whitelist for block, ui, net, etc. This code just
> spews errors to stderr.
> 
> Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/ui/iscsi.so: cannot open shared object file: No such file or directory
> Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/ui/curl.so: cannot open shared object file: No such file or directory
> Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/ui/rbd.so: cannot open shared object file: No such file or directory
> Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/ui/gluster.so: cannot open shared object file: No such file or directory
> Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/ui/ssh.so: cannot open shared object file: No such file or directory
> Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/net/iscsi.so: cannot open shared object file: No such file or directory
> Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/net/curl.so: cannot open shared object file: No such file or directory
> Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/net/rbd.so: cannot open shared object file: No such file or directory
> Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/net/gluster.so: cannot open shared object file: No such file or directory
> Failed to open module file /home/berrange/usr/qemu-git-mod/lib/qemu/net/ssh.so: cannot open shared object file: No such file or directory
> 

Given that we should accept non-existence of a whitelisted module (i.e. user
didn't install it), I think it's these -ENOENT error messges are unnecessary.

Fam

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support
  2013-09-13 11:31 ` [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support Peter Maydell
@ 2013-09-16  1:32   ` Fam Zheng
  0 siblings, 0 replies; 17+ messages in thread
From: Fam Zheng @ 2013-09-16  1:32 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Michael Tokarev, QEMU Developers, Alex Bligh, Paolo Bonzini,
	Lluís Vilanova, Richard Henderson

On Fri, 09/13 12:31, Peter Maydell wrote:
> On 13 September 2013 10:59, Fam Zheng <famz@redhat.com> wrote:
> > This series implements feature of shared object building as described in:
> >
> > http://wiki.qemu.org/Features/Modules
> 
> This doesn't seem to apply to master:
> 
> cam-vm-266:precise:qemu$ patches apply
> id:1379066356-14986-1-git-send-email-famz@redhat.com
> Applying: ui/Makefile.objs: delete unnecessary cocoa.o dependency
> Applying: make.rule: fix $(obj) to a real relative path
> Using index info to reconstruct a base tree...
> Falling back to patching base and 3-way merge...
> Auto-merging rules.mak
> Auto-merging configure
> Auto-merging Makefile.objs
> CONFLICT (content): Merge conflict in Makefile.objs
> Auto-merging Makefile
> Failed to merge in the changes.
> Patch failed at 0002 make.rule: fix $(obj) to a real relative path
> When you have resolved this problem run "git am --resolved".
> If you would prefer to skip this patch, instead run "git am --skip".
> To restore the original branch and stop patching run "git am --abort".
> 
> Can you rebase?
> 
Sure. Looks like master is changed during all these 9 revisions.

Thanks,
Fam

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Qemu-devel] [PATCH v9 5/8] module: implement module loading
  2013-09-13 14:52   ` Richard Henderson
  2013-09-13 16:20     ` Michael Tokarev
@ 2013-09-16  1:41     ` Fam Zheng
  1 sibling, 0 replies; 17+ messages in thread
From: Fam Zheng @ 2013-09-16  1:41 UTC (permalink / raw)
  To: Richard Henderson
  Cc: peter.maydell, mjt, qemu-devel, alex, pbonzini, vilanova

On Fri, 09/13 07:52, Richard Henderson wrote:
> On 09/13/2013 02:59 AM, Fam Zheng wrote:
> > +    const char *module_whitelist[] = {
> > +        CONFIG_MODULE_WHITELIST
> > +    };
> 
>   static const char * const module_whitelist[] = ...
> 

OK, thanks.


> > +    switch (type) {
> > +    case MODULE_LOAD_BLOCK:
> > +        path = CONFIG_MODDIR "/block/";
> > +        break;
> > +    case MODULE_LOAD_UI:
> > +        path = CONFIG_MODDIR "/ui/";
> > +        break;
> > +    case MODULE_LOAD_NET:
> > +        path = CONFIG_MODDIR "/net/";
> > +        break;
> 
> Also, separate the whitelists by type.  I.e.
> 
>   static const char * const modules_block[] = ...
>   static const char * const modules_ui[] = ...
>   static const char * const modules_net[] = ...
> 
>   switch (type) {
>   case MODULE_LOAD_BLOCK:
>     list = modules_block;
>     n = ARRAY_SIZE(modules_block);
>     break;
>   ...
>   }
> 
> No need for null termination of the array, as you're currently using.
> 

It's that I'd like to be consistent with block whitelist code style as in
bdrv_is_whitelisted().

> > +    for (mp = &module_whitelist[0]; *mp; mp++) {
> > +        fname = g_strdup_printf("%s%s" HOST_DSOSUF, path, *mp);
> > +        module_load_file(fname);
> > +        g_free(fname);
> > +    }
> 
> Why this bizzare mix of g_strdup_printf and compile-time string concatenation?
>  Certainly you could have arranged for HOST_DSOSUF to be built into the module
> name as seen in the arrays.
> 
> Then we're back to the subdirectory vs filename prefix and CONFIG_MODDIR vs any
> of several module search path options, the debate of which I don't believe has
> concluded.
> 

Perhaps using module type as prefix and building into whitelist can save us
creating subdirs for each type and also the separation of the list as you
suggested above:

    switch (type) {
    case MODULE_LOAD_BLOCK:
        prefix = "block-";
        break;
        ...
    }

    for (mp = &module_whitelist[0]; *mp; mp++) {
        if (!strncmp(prefix, *mp, sizeof(prefix))) {
            /* load */
        }
    }

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2013-09-16  1:42 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-09-13  9:59 [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support Fam Zheng
2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 1/8] ui/Makefile.objs: delete unnecessary cocoa.o dependency Fam Zheng
2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 2/8] make.rule: fix $(obj) to a real relative path Fam Zheng
2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 3/8] rule.mak: allow per object cflags and libs Fam Zheng
2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 4/8] build-sys: introduce common-obj-m and block-obj-m for DSO Fam Zheng
2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 5/8] module: implement module loading Fam Zheng
2013-09-13 14:07   ` Daniel P. Berrange
2013-09-16  1:30     ` Fam Zheng
2013-09-13 14:52   ` Richard Henderson
2013-09-13 16:20     ` Michael Tokarev
2013-09-13 19:43       ` Richard Henderson
2013-09-16  1:41     ` Fam Zheng
2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 6/8] Makefile: install modules with "make install" Fam Zheng
2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 7/8] .gitignore: ignore module related files (dll, so, mo) Fam Zheng
2013-09-13  9:59 ` [Qemu-devel] [PATCH v9 8/8] block: convert block drivers linked with libs to modules Fam Zheng
2013-09-13 11:31 ` [Qemu-devel] [PATCH v9 0/8] Shared Library Module Support Peter Maydell
2013-09-16  1:32   ` Fam Zheng

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.