qemu-devel.nongnu.org archive mirror
 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).