All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/7] build some devices as modules.
@ 2020-06-04 13:16 Gerd Hoffmann
  2020-06-04 13:16 ` [PATCH v2 1/7] qdev: add support for device module loading Gerd Hoffmann
                   ` (6 more replies)
  0 siblings, 7 replies; 10+ messages in thread
From: Gerd Hoffmann @ 2020-06-04 13:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: dinechin, Paolo Bonzini, Daniel P. Berrangé,
	Eduardo Habkost, Gerd Hoffmann

Specifically devices which depend on shared libraries,
to reduce the runtime dependencies of core qemu.

v2:
 - better commit messages.
 - add some more devices.
 - general tidy up.

Gerd Hoffmann (7):
  qdev: add support for device module loading
  build: fix device module builds
  ccid: build smartcard as module
  usb: build usb-redir as module
  vga: build qxl as module
  vga: build virtio-gpu only once
  vga: build virtio-gpu as module

 Makefile.objs            |  1 +
 Makefile.target          |  7 +++++
 include/hw/qdev-core.h   |  3 ++
 include/qemu/module.h    |  1 +
 hw/core/qdev.c           | 61 ++++++++++++++++++++++++++++++++++++++++
 qdev-monitor.c           |  5 ++++
 qom/qom-qmp-cmds.c       |  1 +
 stubs/hw-module.c        |  6 ++++
 hw/Makefile.objs         |  2 ++
 hw/display/Makefile.objs | 28 ++++++++++--------
 hw/usb/Makefile.objs     | 13 ++++++---
 stubs/Makefile.objs      |  1 +
 12 files changed, 114 insertions(+), 15 deletions(-)
 create mode 100644 stubs/hw-module.c

-- 
2.18.4



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

* [PATCH v2 1/7] qdev: add support for device module loading
  2020-06-04 13:16 [PATCH v2 0/7] build some devices as modules Gerd Hoffmann
@ 2020-06-04 13:16 ` Gerd Hoffmann
  2020-06-04 13:47   ` BALATON Zoltan
  2020-06-04 13:16 ` [PATCH v2 2/7] build: fix device module builds Gerd Hoffmann
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 10+ messages in thread
From: Gerd Hoffmann @ 2020-06-04 13:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: dinechin, Paolo Bonzini, Daniel P. Berrangé,
	Eduardo Habkost, Gerd Hoffmann

When compiling devices as modules we'll need some infrastrtucture to
actually load those modules if needed.  This patch adds it.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 include/hw/qdev-core.h |  3 +++
 include/qemu/module.h  |  1 +
 hw/core/qdev.c         | 50 ++++++++++++++++++++++++++++++++++++++++++
 qdev-monitor.c         |  5 +++++
 qom/qom-qmp-cmds.c     |  1 +
 stubs/hw-module.c      |  6 +++++
 stubs/Makefile.objs    |  1 +
 7 files changed, 67 insertions(+)
 create mode 100644 stubs/hw-module.c

diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index b870b279661a..a96c890bb95b 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -552,4 +552,7 @@ void device_listener_unregister(DeviceListener *listener);
  */
 bool qdev_should_hide_device(QemuOpts *opts);
 
+void qdev_module_load_type(const char *type);
+void qdev_module_load_all(void);
+
 #endif
diff --git a/include/qemu/module.h b/include/qemu/module.h
index 011ae1ae7605..077a6b09bca7 100644
--- a/include/qemu/module.h
+++ b/include/qemu/module.h
@@ -64,6 +64,7 @@ typedef enum {
 #define block_module_load_one(lib) module_load_one("block-", lib)
 #define ui_module_load_one(lib) module_load_one("ui-", lib)
 #define audio_module_load_one(lib) module_load_one("audio-", lib)
+#define hw_module_load_one(lib) module_load_one("hw-", lib)
 
 void register_module_init(void (*fn)(void), module_init_type type);
 void register_dso_module_init(void (*fn)(void), module_init_type type);
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 9e5538aeaebd..7177798840d4 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -146,10 +146,60 @@ DeviceState *qdev_create(BusState *bus, const char *name)
     return dev;
 }
 
+/*
+ * Building devices modular is mostly useful in case they have
+ * dependencies to external libraries.  Which is the case for very few
+ * devices.  So with the expecration that this will be rather the
+ * exception than to rule go with a simple hardcoded list for now ...
+ */
+static struct {
+    const char *type;
+    const char *mod;
+} const hwmodules[] = {
+};
+
+static bool qdev_module_loaded_all;
+
+void qdev_module_load_type(const char *type)
+{
+    int i;
+
+    if (qdev_module_loaded_all) {
+        return;
+    }
+    for (i = 0; i < ARRAY_SIZE(hwmodules); i++) {
+        if (strcmp(hwmodules[i].type, type) == 0) {
+            hw_module_load_one(hwmodules[i].mod);
+            return;
+        }
+    }
+}
+
+void qdev_module_load_all(void)
+{
+    int i;
+
+    if (qdev_module_loaded_all) {
+        return;
+    }
+    for (i = 0; i < ARRAY_SIZE(hwmodules); i++) {
+        if (i > 0 && strcmp(hwmodules[i - 1].mod,
+                            hwmodules[i].mod) == 0) {
+            /* one module implementing multiple devices -> load only once */
+            continue;
+        }
+        hw_module_load_one(hwmodules[i].mod);
+    }
+    qdev_module_loaded_all = true;
+}
+
 DeviceState *qdev_try_create(BusState *bus, const char *type)
 {
     DeviceState *dev;
 
+    if (object_class_by_name(type) == NULL) {
+        qdev_module_load_type(type);
+    }
     if (object_class_by_name(type) == NULL) {
         return NULL;
     }
diff --git a/qdev-monitor.c b/qdev-monitor.c
index a4735d3bb190..55dddeb2f978 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -147,6 +147,7 @@ static void qdev_print_devinfos(bool show_no_user)
     int i;
     bool cat_printed;
 
+    qdev_module_load_all();
     list = object_class_get_list_sorted(TYPE_DEVICE, false);
 
     for (i = 0; i <= DEVICE_CATEGORY_MAX; i++) {
@@ -224,6 +225,10 @@ static DeviceClass *qdev_get_device_class(const char **driver, Error **errp)
             oc = object_class_by_name(*driver);
         }
     }
+    if (!oc) {
+        qdev_module_load_type(*driver);
+        oc = object_class_by_name(*driver);
+    }
 
     if (!object_class_dynamic_cast(oc, TYPE_DEVICE)) {
         if (*driver != original_name) {
diff --git a/qom/qom-qmp-cmds.c b/qom/qom-qmp-cmds.c
index c5249e44d020..fe48cd2f9cf0 100644
--- a/qom/qom-qmp-cmds.c
+++ b/qom/qom-qmp-cmds.c
@@ -116,6 +116,7 @@ ObjectTypeInfoList *qmp_qom_list_types(bool has_implements,
 {
     ObjectTypeInfoList *ret = NULL;
 
+    qdev_module_load_all();
     object_class_foreach(qom_list_types_tramp, implements, abstract, &ret);
 
     return ret;
diff --git a/stubs/hw-module.c b/stubs/hw-module.c
new file mode 100644
index 000000000000..1c312d2fc2b3
--- /dev/null
+++ b/stubs/hw-module.c
@@ -0,0 +1,6 @@
+#include "qemu/osdep.h"
+#include "hw/qdev-core.h"
+
+void qdev_module_load_all(void)
+{
+}
diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs
index 6a9e3135e8f9..a4eb96514ddc 100644
--- a/stubs/Makefile.objs
+++ b/stubs/Makefile.objs
@@ -44,4 +44,5 @@ stub-obj-y += pci-host-piix.o
 stub-obj-y += ram-block.o
 stub-obj-y += ramfb.o
 stub-obj-y += fw_cfg.o
+stub-obj-y += hw-module.o
 stub-obj-$(CONFIG_SOFTMMU) += semihost.o
-- 
2.18.4



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

* [PATCH v2 2/7] build: fix device module builds
  2020-06-04 13:16 [PATCH v2 0/7] build some devices as modules Gerd Hoffmann
  2020-06-04 13:16 ` [PATCH v2 1/7] qdev: add support for device module loading Gerd Hoffmann
@ 2020-06-04 13:16 ` Gerd Hoffmann
  2020-06-04 13:16 ` [PATCH v2 3/7] ccid: build smartcard as module Gerd Hoffmann
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Gerd Hoffmann @ 2020-06-04 13:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: dinechin, Paolo Bonzini, Daniel P. Berrangé,
	Eduardo Habkost, Gerd Hoffmann

See comment.  Feels quite hackish.  Better ideas anyone?

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 Makefile.target | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/Makefile.target b/Makefile.target
index 8ed1eba95b9c..c70325df5796 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -179,6 +179,13 @@ endif # CONFIG_SOFTMMU
 dummy := $(call unnest-vars,,obj-y)
 all-obj-y := $(obj-y)
 
+#
+# common-obj-m has some crap here, probably as side effect from
+# filling obj-y.  Clear it.  Fixes suspious dependency errors when
+# building devices as modules.
+#
+common-obj-m :=
+
 include $(SRC_PATH)/Makefile.objs
 dummy := $(call unnest-vars,.., \
                authz-obj-y \
-- 
2.18.4



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

* [PATCH v2 3/7] ccid: build smartcard as module
  2020-06-04 13:16 [PATCH v2 0/7] build some devices as modules Gerd Hoffmann
  2020-06-04 13:16 ` [PATCH v2 1/7] qdev: add support for device module loading Gerd Hoffmann
  2020-06-04 13:16 ` [PATCH v2 2/7] build: fix device module builds Gerd Hoffmann
@ 2020-06-04 13:16 ` Gerd Hoffmann
  2020-06-04 13:16 ` [PATCH v2 4/7] usb: build usb-redir " Gerd Hoffmann
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Gerd Hoffmann @ 2020-06-04 13:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: dinechin, Paolo Bonzini, Daniel P. Berrangé,
	Eduardo Habkost, Gerd Hoffmann

Drops libcacard.so dependency from core qemu.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 Makefile.objs        | 1 +
 hw/core/qdev.c       | 2 ++
 hw/Makefile.objs     | 1 +
 hw/usb/Makefile.objs | 4 +++-
 4 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/Makefile.objs b/Makefile.objs
index 99774cfd2545..28c165c0e623 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -59,6 +59,7 @@ common-obj-y += migration/
 common-obj-y += audio/
 common-obj-m += audio/
 common-obj-y += hw/
+common-obj-m += hw/
 
 common-obj-y += replay/
 
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 7177798840d4..36c301750c31 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -156,6 +156,8 @@ static struct {
     const char *type;
     const char *mod;
 } const hwmodules[] = {
+    { .type = "ccid-card-passthru",    .mod = "usb-smartcard"         },
+    { .type = "ccid-card-emulated",    .mod = "usb-smartcard"         },
 };
 
 static bool qdev_module_loaded_all;
diff --git a/hw/Makefile.objs b/hw/Makefile.objs
index 660e2b437348..71843591fe43 100644
--- a/hw/Makefile.objs
+++ b/hw/Makefile.objs
@@ -43,4 +43,5 @@ devices-dirs-y += smbios/
 endif
 
 common-obj-y += $(devices-dirs-y)
+common-obj-m += usb/
 obj-y += $(devices-dirs-y)
diff --git a/hw/usb/Makefile.objs b/hw/usb/Makefile.objs
index 66835e5bf732..d8e340cd0748 100644
--- a/hw/usb/Makefile.objs
+++ b/hw/usb/Makefile.objs
@@ -28,11 +28,13 @@ common-obj-$(CONFIG_USB_NETWORK)      += dev-network.o
 
 ifeq ($(CONFIG_USB_SMARTCARD),y)
 common-obj-y                          += dev-smartcard-reader.o
-common-obj-$(CONFIG_SMARTCARD)        += smartcard.mo
+ifeq ($(CONFIG_SMARTCARD),y)
+common-obj-m                          += smartcard.mo
 smartcard.mo-objs := ccid-card-passthru.o ccid-card-emulated.o
 smartcard.mo-cflags := $(SMARTCARD_CFLAGS)
 smartcard.mo-libs := $(SMARTCARD_LIBS)
 endif
+endif
 
 ifeq ($(CONFIG_POSIX),y)
 common-obj-$(CONFIG_USB_STORAGE_MTP)  += dev-mtp.o
-- 
2.18.4



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

* [PATCH v2 4/7] usb: build usb-redir as module
  2020-06-04 13:16 [PATCH v2 0/7] build some devices as modules Gerd Hoffmann
                   ` (2 preceding siblings ...)
  2020-06-04 13:16 ` [PATCH v2 3/7] ccid: build smartcard as module Gerd Hoffmann
@ 2020-06-04 13:16 ` Gerd Hoffmann
  2020-06-04 13:16 ` [PATCH v2 5/7] vga: build qxl " Gerd Hoffmann
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Gerd Hoffmann @ 2020-06-04 13:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: dinechin, Paolo Bonzini, Daniel P. Berrangé,
	Eduardo Habkost, Gerd Hoffmann

Drops libusbredirparser.so dependency from core qemu.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/core/qdev.c       | 1 +
 hw/usb/Makefile.objs | 9 ++++++---
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 36c301750c31..cab971758b26 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -158,6 +158,7 @@ static struct {
 } const hwmodules[] = {
     { .type = "ccid-card-passthru",    .mod = "usb-smartcard"         },
     { .type = "ccid-card-emulated",    .mod = "usb-smartcard"         },
+    { .type = "usb-redir",             .mod = "usb-redirect"          },
 };
 
 static bool qdev_module_loaded_all;
diff --git a/hw/usb/Makefile.objs b/hw/usb/Makefile.objs
index d8e340cd0748..5619a3b23981 100644
--- a/hw/usb/Makefile.objs
+++ b/hw/usb/Makefile.objs
@@ -42,9 +42,12 @@ endif
 
 # usb redirection
 ifeq ($(CONFIG_USB),y)
-common-obj-$(CONFIG_USB_REDIR) += redirect.o quirks.o
-redirect.o-cflags = $(USB_REDIR_CFLAGS)
-redirect.o-libs = $(USB_REDIR_LIBS)
+ifeq ($(CONFIG_USB-REDIR),y)
+common-obj-m += redirect.mo
+redirect.mo-objs = redirect.o quirks.o
+redirect.mo-cflags = $(USB_REDIR_CFLAGS)
+redirect.mo-libs = $(USB_REDIR_LIBS)
+endif
 endif
 
 # usb pass-through
-- 
2.18.4



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

* [PATCH v2 5/7] vga: build qxl as module
  2020-06-04 13:16 [PATCH v2 0/7] build some devices as modules Gerd Hoffmann
                   ` (3 preceding siblings ...)
  2020-06-04 13:16 ` [PATCH v2 4/7] usb: build usb-redir " Gerd Hoffmann
@ 2020-06-04 13:16 ` Gerd Hoffmann
  2020-06-04 13:16 ` [PATCH v2 6/7] vga: build virtio-gpu only once Gerd Hoffmann
  2020-06-04 13:16 ` [PATCH v2 7/7] vga: build virtio-gpu as module Gerd Hoffmann
  6 siblings, 0 replies; 10+ messages in thread
From: Gerd Hoffmann @ 2020-06-04 13:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: dinechin, Paolo Bonzini, Daniel P. Berrangé,
	Eduardo Habkost, Gerd Hoffmann

First step in making spice support modular.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/core/qdev.c           | 2 ++
 hw/Makefile.objs         | 1 +
 hw/display/Makefile.objs | 5 ++++-
 3 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index cab971758b26..70cf84bb67d0 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -159,6 +159,8 @@ static struct {
     { .type = "ccid-card-passthru",    .mod = "usb-smartcard"         },
     { .type = "ccid-card-emulated",    .mod = "usb-smartcard"         },
     { .type = "usb-redir",             .mod = "usb-redirect"          },
+    { .type = "qxl-vga",               .mod = "display-qxl"           },
+    { .type = "qxl",                   .mod = "display-qxl"           },
 };
 
 static bool qdev_module_loaded_all;
diff --git a/hw/Makefile.objs b/hw/Makefile.objs
index 71843591fe43..fd6519e8af3f 100644
--- a/hw/Makefile.objs
+++ b/hw/Makefile.objs
@@ -43,5 +43,6 @@ devices-dirs-y += smbios/
 endif
 
 common-obj-y += $(devices-dirs-y)
+common-obj-m += display/
 common-obj-m += usb/
 obj-y += $(devices-dirs-y)
diff --git a/hw/display/Makefile.objs b/hw/display/Makefile.objs
index 77a7d622bd2d..76b3571e4902 100644
--- a/hw/display/Makefile.objs
+++ b/hw/display/Makefile.objs
@@ -44,7 +44,10 @@ common-obj-$(CONFIG_ARTIST) += artist.o
 
 obj-$(CONFIG_VGA) += vga.o
 
-common-obj-$(CONFIG_QXL) += qxl.o qxl-logger.o qxl-render.o
+ifeq ($(CONFIG_QXL),y)
+common-obj-m += qxl.mo
+qxl.mo-objs = qxl.o qxl-logger.o qxl-render.o
+endif
 
 obj-$(CONFIG_VIRTIO_GPU) += virtio-gpu-base.o virtio-gpu.o virtio-gpu-3d.o
 obj-$(CONFIG_VHOST_USER_GPU) += vhost-user-gpu.o
-- 
2.18.4



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

* [PATCH v2 6/7] vga: build virtio-gpu only once
  2020-06-04 13:16 [PATCH v2 0/7] build some devices as modules Gerd Hoffmann
                   ` (4 preceding siblings ...)
  2020-06-04 13:16 ` [PATCH v2 5/7] vga: build qxl " Gerd Hoffmann
@ 2020-06-04 13:16 ` Gerd Hoffmann
  2020-06-04 13:23   ` Philippe Mathieu-Daudé
  2020-06-04 13:16 ` [PATCH v2 7/7] vga: build virtio-gpu as module Gerd Hoffmann
  6 siblings, 1 reply; 10+ messages in thread
From: Gerd Hoffmann @ 2020-06-04 13:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: dinechin, Paolo Bonzini, Daniel P. Berrangé,
	Eduardo Habkost, Gerd Hoffmann

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/display/Makefile.objs | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/hw/display/Makefile.objs b/hw/display/Makefile.objs
index 76b3571e4902..d619594ad4d3 100644
--- a/hw/display/Makefile.objs
+++ b/hw/display/Makefile.objs
@@ -49,12 +49,12 @@ common-obj-m += qxl.mo
 qxl.mo-objs = qxl.o qxl-logger.o qxl-render.o
 endif
 
-obj-$(CONFIG_VIRTIO_GPU) += virtio-gpu-base.o virtio-gpu.o virtio-gpu-3d.o
-obj-$(CONFIG_VHOST_USER_GPU) += vhost-user-gpu.o
-obj-$(call land,$(CONFIG_VIRTIO_GPU),$(CONFIG_VIRTIO_PCI)) += virtio-gpu-pci.o
-obj-$(call land,$(CONFIG_VHOST_USER_GPU),$(CONFIG_VIRTIO_PCI)) += vhost-user-gpu-pci.o
-obj-$(CONFIG_VIRTIO_VGA) += virtio-vga.o
-obj-$(CONFIG_VHOST_USER_VGA) += vhost-user-vga.o
+common-obj-$(CONFIG_VIRTIO_GPU) += virtio-gpu-base.o virtio-gpu.o virtio-gpu-3d.o
+common-obj-$(CONFIG_VHOST_USER_GPU) += vhost-user-gpu.o
+common-obj-$(call land,$(CONFIG_VIRTIO_GPU),$(CONFIG_VIRTIO_PCI)) += virtio-gpu-pci.o
+common-obj-$(call land,$(CONFIG_VHOST_USER_GPU),$(CONFIG_VIRTIO_PCI)) += vhost-user-gpu-pci.o
+common-obj-$(CONFIG_VIRTIO_VGA) += virtio-vga.o
+common-obj-$(CONFIG_VHOST_USER_VGA) += vhost-user-vga.o
 virtio-gpu.o-cflags := $(VIRGL_CFLAGS)
 virtio-gpu.o-libs += $(VIRGL_LIBS)
 virtio-gpu-3d.o-cflags := $(VIRGL_CFLAGS)
-- 
2.18.4



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

* [PATCH v2 7/7] vga: build virtio-gpu as module
  2020-06-04 13:16 [PATCH v2 0/7] build some devices as modules Gerd Hoffmann
                   ` (5 preceding siblings ...)
  2020-06-04 13:16 ` [PATCH v2 6/7] vga: build virtio-gpu only once Gerd Hoffmann
@ 2020-06-04 13:16 ` Gerd Hoffmann
  6 siblings, 0 replies; 10+ messages in thread
From: Gerd Hoffmann @ 2020-06-04 13:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: dinechin, Paolo Bonzini, Daniel P. Berrangé,
	Eduardo Habkost, Gerd Hoffmann

Drops libvirglrenderer.so dependency from core qemu.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/core/qdev.c           |  6 ++++++
 hw/display/Makefile.objs | 23 +++++++++++++----------
 2 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 70cf84bb67d0..bc4485e93675 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -161,6 +161,12 @@ static struct {
     { .type = "usb-redir",             .mod = "usb-redirect"          },
     { .type = "qxl-vga",               .mod = "display-qxl"           },
     { .type = "qxl",                   .mod = "display-qxl"           },
+    { .type = "virtio-gpu-device",     .mod = "display-virtio-gpu"    },
+    { .type = "virtio-gpu-pci",        .mod = "display-virtio-gpu"    },
+    { .type = "virtio-vga",            .mod = "display-virtio-gpu"    },
+    { .type = "vhost-user-gpu-device", .mod = "display-virtio-gpu"    },
+    { .type = "vhost-user-gpu-pci",    .mod = "display-virtio-gpu"    },
+    { .type = "vhost-user-vga",        .mod = "display-virtio-gpu"    },
 };
 
 static bool qdev_module_loaded_all;
diff --git a/hw/display/Makefile.objs b/hw/display/Makefile.objs
index d619594ad4d3..e907f3182b0c 100644
--- a/hw/display/Makefile.objs
+++ b/hw/display/Makefile.objs
@@ -49,16 +49,19 @@ common-obj-m += qxl.mo
 qxl.mo-objs = qxl.o qxl-logger.o qxl-render.o
 endif
 
-common-obj-$(CONFIG_VIRTIO_GPU) += virtio-gpu-base.o virtio-gpu.o virtio-gpu-3d.o
-common-obj-$(CONFIG_VHOST_USER_GPU) += vhost-user-gpu.o
-common-obj-$(call land,$(CONFIG_VIRTIO_GPU),$(CONFIG_VIRTIO_PCI)) += virtio-gpu-pci.o
-common-obj-$(call land,$(CONFIG_VHOST_USER_GPU),$(CONFIG_VIRTIO_PCI)) += vhost-user-gpu-pci.o
-common-obj-$(CONFIG_VIRTIO_VGA) += virtio-vga.o
-common-obj-$(CONFIG_VHOST_USER_VGA) += vhost-user-vga.o
-virtio-gpu.o-cflags := $(VIRGL_CFLAGS)
-virtio-gpu.o-libs += $(VIRGL_LIBS)
-virtio-gpu-3d.o-cflags := $(VIRGL_CFLAGS)
-virtio-gpu-3d.o-libs += $(VIRGL_LIBS)
+ifeq ($(CONFIG_VIRTIO_GPU),y)
+common-obj-m += virtio-gpu.mo
+virtio-gpu-obj-$(CONFIG_VIRTIO_GPU) += virtio-gpu-base.o virtio-gpu.o virtio-gpu-3d.o
+virtio-gpu-obj-$(CONFIG_VHOST_USER_GPU) += vhost-user-gpu.o
+virtio-gpu-obj-$(call land,$(CONFIG_VIRTIO_GPU),$(CONFIG_VIRTIO_PCI)) += virtio-gpu-pci.o
+virtio-gpu-obj-$(call land,$(CONFIG_VHOST_USER_GPU),$(CONFIG_VIRTIO_PCI)) += vhost-user-gpu-pci.o
+virtio-gpu-obj-$(CONFIG_VIRTIO_VGA) += virtio-vga.o
+virtio-gpu-obj-$(CONFIG_VHOST_USER_VGA) += vhost-user-vga.o
+virtio-gpu.mo-objs := $(virtio-gpu-obj-y)
+virtio-gpu.mo-cflags := $(VIRGL_CFLAGS)
+virtio-gpu.mo-libs := $(VIRGL_LIBS)
+endif
+
 common-obj-$(CONFIG_DPCD) += dpcd.o
 common-obj-$(CONFIG_XLNX_ZYNQMP_ARM) += xlnx_dp.o
 
-- 
2.18.4



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

* Re: [PATCH v2 6/7] vga: build virtio-gpu only once
  2020-06-04 13:16 ` [PATCH v2 6/7] vga: build virtio-gpu only once Gerd Hoffmann
@ 2020-06-04 13:23   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 10+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-06-04 13:23 UTC (permalink / raw)
  To: Gerd Hoffmann, qemu-devel
  Cc: dinechin, Paolo Bonzini, Daniel P. Berrangé, Eduardo Habkost

On 6/4/20 3:16 PM, Gerd Hoffmann wrote:
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  hw/display/Makefile.objs | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/hw/display/Makefile.objs b/hw/display/Makefile.objs
> index 76b3571e4902..d619594ad4d3 100644
> --- a/hw/display/Makefile.objs
> +++ b/hw/display/Makefile.objs
> @@ -49,12 +49,12 @@ common-obj-m += qxl.mo
>  qxl.mo-objs = qxl.o qxl-logger.o qxl-render.o
>  endif
>  
> -obj-$(CONFIG_VIRTIO_GPU) += virtio-gpu-base.o virtio-gpu.o virtio-gpu-3d.o
> -obj-$(CONFIG_VHOST_USER_GPU) += vhost-user-gpu.o
> -obj-$(call land,$(CONFIG_VIRTIO_GPU),$(CONFIG_VIRTIO_PCI)) += virtio-gpu-pci.o
> -obj-$(call land,$(CONFIG_VHOST_USER_GPU),$(CONFIG_VIRTIO_PCI)) += vhost-user-gpu-pci.o
> -obj-$(CONFIG_VIRTIO_VGA) += virtio-vga.o
> -obj-$(CONFIG_VHOST_USER_VGA) += vhost-user-vga.o
> +common-obj-$(CONFIG_VIRTIO_GPU) += virtio-gpu-base.o virtio-gpu.o virtio-gpu-3d.o
> +common-obj-$(CONFIG_VHOST_USER_GPU) += vhost-user-gpu.o
> +common-obj-$(call land,$(CONFIG_VIRTIO_GPU),$(CONFIG_VIRTIO_PCI)) += virtio-gpu-pci.o
> +common-obj-$(call land,$(CONFIG_VHOST_USER_GPU),$(CONFIG_VIRTIO_PCI)) += vhost-user-gpu-pci.o
> +common-obj-$(CONFIG_VIRTIO_VGA) += virtio-vga.o
> +common-obj-$(CONFIG_VHOST_USER_VGA) += vhost-user-vga.o
>  virtio-gpu.o-cflags := $(VIRGL_CFLAGS)
>  virtio-gpu.o-libs += $(VIRGL_LIBS)
>  virtio-gpu-3d.o-cflags := $(VIRGL_CFLAGS)
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>



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

* Re: [PATCH v2 1/7] qdev: add support for device module loading
  2020-06-04 13:16 ` [PATCH v2 1/7] qdev: add support for device module loading Gerd Hoffmann
@ 2020-06-04 13:47   ` BALATON Zoltan
  0 siblings, 0 replies; 10+ messages in thread
From: BALATON Zoltan @ 2020-06-04 13:47 UTC (permalink / raw)
  To: Gerd Hoffmann
  Cc: dinechin, Paolo Bonzini, Daniel P. Berrangé,
	qemu-devel, Eduardo Habkost

On Thu, 4 Jun 2020, Gerd Hoffmann wrote:
> When compiling devices as modules we'll need some infrastrtucture to
> actually load those modules if needed.  This patch adds it.
>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
> include/hw/qdev-core.h |  3 +++
> include/qemu/module.h  |  1 +
> hw/core/qdev.c         | 50 ++++++++++++++++++++++++++++++++++++++++++
> qdev-monitor.c         |  5 +++++
> qom/qom-qmp-cmds.c     |  1 +
> stubs/hw-module.c      |  6 +++++
> stubs/Makefile.objs    |  1 +
> 7 files changed, 67 insertions(+)
> create mode 100644 stubs/hw-module.c
>
> diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> index b870b279661a..a96c890bb95b 100644
> --- a/include/hw/qdev-core.h
> +++ b/include/hw/qdev-core.h
> @@ -552,4 +552,7 @@ void device_listener_unregister(DeviceListener *listener);
>  */
> bool qdev_should_hide_device(QemuOpts *opts);
>
> +void qdev_module_load_type(const char *type);
> +void qdev_module_load_all(void);
> +
> #endif
> diff --git a/include/qemu/module.h b/include/qemu/module.h
> index 011ae1ae7605..077a6b09bca7 100644
> --- a/include/qemu/module.h
> +++ b/include/qemu/module.h
> @@ -64,6 +64,7 @@ typedef enum {
> #define block_module_load_one(lib) module_load_one("block-", lib)
> #define ui_module_load_one(lib) module_load_one("ui-", lib)
> #define audio_module_load_one(lib) module_load_one("audio-", lib)
> +#define hw_module_load_one(lib) module_load_one("hw-", lib)
>
> void register_module_init(void (*fn)(void), module_init_type type);
> void register_dso_module_init(void (*fn)(void), module_init_type type);
> diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> index 9e5538aeaebd..7177798840d4 100644
> --- a/hw/core/qdev.c
> +++ b/hw/core/qdev.c
> @@ -146,10 +146,60 @@ DeviceState *qdev_create(BusState *bus, const char *name)
>     return dev;
> }
>
> +/*
> + * Building devices modular is mostly useful in case they have
> + * dependencies to external libraries.  Which is the case for very few
> + * devices.  So with the expecration that this will be rather the

Typo: "expectation"

Regards,
BALATON Zoltan

> + * exception than to rule go with a simple hardcoded list for now ...
> + */
> +static struct {
> +    const char *type;
> +    const char *mod;
> +} const hwmodules[] = {
> +};
> +
> +static bool qdev_module_loaded_all;
> +
> +void qdev_module_load_type(const char *type)
> +{
> +    int i;
> +
> +    if (qdev_module_loaded_all) {
> +        return;
> +    }
> +    for (i = 0; i < ARRAY_SIZE(hwmodules); i++) {
> +        if (strcmp(hwmodules[i].type, type) == 0) {
> +            hw_module_load_one(hwmodules[i].mod);
> +            return;
> +        }
> +    }
> +}
> +
> +void qdev_module_load_all(void)
> +{
> +    int i;
> +
> +    if (qdev_module_loaded_all) {
> +        return;
> +    }
> +    for (i = 0; i < ARRAY_SIZE(hwmodules); i++) {
> +        if (i > 0 && strcmp(hwmodules[i - 1].mod,
> +                            hwmodules[i].mod) == 0) {
> +            /* one module implementing multiple devices -> load only once */
> +            continue;
> +        }
> +        hw_module_load_one(hwmodules[i].mod);
> +    }
> +    qdev_module_loaded_all = true;
> +}
> +
> DeviceState *qdev_try_create(BusState *bus, const char *type)
> {
>     DeviceState *dev;
>
> +    if (object_class_by_name(type) == NULL) {
> +        qdev_module_load_type(type);
> +    }
>     if (object_class_by_name(type) == NULL) {
>         return NULL;
>     }
> diff --git a/qdev-monitor.c b/qdev-monitor.c
> index a4735d3bb190..55dddeb2f978 100644
> --- a/qdev-monitor.c
> +++ b/qdev-monitor.c
> @@ -147,6 +147,7 @@ static void qdev_print_devinfos(bool show_no_user)
>     int i;
>     bool cat_printed;
>
> +    qdev_module_load_all();
>     list = object_class_get_list_sorted(TYPE_DEVICE, false);
>
>     for (i = 0; i <= DEVICE_CATEGORY_MAX; i++) {
> @@ -224,6 +225,10 @@ static DeviceClass *qdev_get_device_class(const char **driver, Error **errp)
>             oc = object_class_by_name(*driver);
>         }
>     }
> +    if (!oc) {
> +        qdev_module_load_type(*driver);
> +        oc = object_class_by_name(*driver);
> +    }
>
>     if (!object_class_dynamic_cast(oc, TYPE_DEVICE)) {
>         if (*driver != original_name) {
> diff --git a/qom/qom-qmp-cmds.c b/qom/qom-qmp-cmds.c
> index c5249e44d020..fe48cd2f9cf0 100644
> --- a/qom/qom-qmp-cmds.c
> +++ b/qom/qom-qmp-cmds.c
> @@ -116,6 +116,7 @@ ObjectTypeInfoList *qmp_qom_list_types(bool has_implements,
> {
>     ObjectTypeInfoList *ret = NULL;
>
> +    qdev_module_load_all();
>     object_class_foreach(qom_list_types_tramp, implements, abstract, &ret);
>
>     return ret;
> diff --git a/stubs/hw-module.c b/stubs/hw-module.c
> new file mode 100644
> index 000000000000..1c312d2fc2b3
> --- /dev/null
> +++ b/stubs/hw-module.c
> @@ -0,0 +1,6 @@
> +#include "qemu/osdep.h"
> +#include "hw/qdev-core.h"
> +
> +void qdev_module_load_all(void)
> +{
> +}
> diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs
> index 6a9e3135e8f9..a4eb96514ddc 100644
> --- a/stubs/Makefile.objs
> +++ b/stubs/Makefile.objs
> @@ -44,4 +44,5 @@ stub-obj-y += pci-host-piix.o
> stub-obj-y += ram-block.o
> stub-obj-y += ramfb.o
> stub-obj-y += fw_cfg.o
> +stub-obj-y += hw-module.o
> stub-obj-$(CONFIG_SOFTMMU) += semihost.o
>


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

end of thread, other threads:[~2020-06-04 13:49 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-04 13:16 [PATCH v2 0/7] build some devices as modules Gerd Hoffmann
2020-06-04 13:16 ` [PATCH v2 1/7] qdev: add support for device module loading Gerd Hoffmann
2020-06-04 13:47   ` BALATON Zoltan
2020-06-04 13:16 ` [PATCH v2 2/7] build: fix device module builds Gerd Hoffmann
2020-06-04 13:16 ` [PATCH v2 3/7] ccid: build smartcard as module Gerd Hoffmann
2020-06-04 13:16 ` [PATCH v2 4/7] usb: build usb-redir " Gerd Hoffmann
2020-06-04 13:16 ` [PATCH v2 5/7] vga: build qxl " Gerd Hoffmann
2020-06-04 13:16 ` [PATCH v2 6/7] vga: build virtio-gpu only once Gerd Hoffmann
2020-06-04 13:23   ` Philippe Mathieu-Daudé
2020-06-04 13:16 ` [PATCH v2 7/7] vga: build virtio-gpu as module Gerd Hoffmann

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.