[PATCH v4 06/20] module: check module wasn't already initialized

Oleinik, Alexander posted 20 patches 6 years, 3 months ago
There is a newer version of this series
[PATCH v4 06/20] module: check module wasn't already initialized
Posted by Oleinik, Alexander 6 years, 3 months ago
From: Alexander Oleinik <alxndr@bu.edu>

The virtual-device fuzzer must initialize QOM, prior to running
vl:qemu_init, so that it can use the qos_graph to identify the arguments
required to initialize a guest for libqos-assisted fuzzing. This change
prevents errors when vl:qemu_init tries to (re)initialize the previously
initialized QOM module.

Signed-off-by: Alexander Oleinik <alxndr@bu.edu>
---
 util/module.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/util/module.c b/util/module.c
index e9fe3e5422..841e490e06 100644
--- a/util/module.c
+++ b/util/module.c
@@ -30,6 +30,7 @@ typedef struct ModuleEntry
 typedef QTAILQ_HEAD(, ModuleEntry) ModuleTypeList;
 
 static ModuleTypeList init_type_list[MODULE_INIT_MAX];
+static bool modules_init_done[MODULE_INIT_MAX];
 
 static ModuleTypeList dso_init_list;
 
@@ -91,11 +92,17 @@ void module_call_init(module_init_type type)
     ModuleTypeList *l;
     ModuleEntry *e;
 
+    if (modules_init_done[type]) {
+        return;
+    }
+
     l = find_type(type);
 
     QTAILQ_FOREACH(e, l, node) {
         e->init();
     }
+
+    modules_init_done[type] = true;
 }
 
 #ifdef CONFIG_MODULES
-- 
2.23.0


Re: [PATCH v4 06/20] module: check module wasn't already initialized
Posted by Stefan Hajnoczi 6 years, 3 months ago
On Wed, Oct 30, 2019 at 02:49:52PM +0000, Oleinik, Alexander wrote:
> From: Alexander Oleinik <alxndr@bu.edu>
> 
> The virtual-device fuzzer must initialize QOM, prior to running
> vl:qemu_init, so that it can use the qos_graph to identify the arguments
> required to initialize a guest for libqos-assisted fuzzing. This change
> prevents errors when vl:qemu_init tries to (re)initialize the previously
> initialized QOM module.
> 
> Signed-off-by: Alexander Oleinik <alxndr@bu.edu>
> ---
>  util/module.c | 7 +++++++
>  1 file changed, 7 insertions(+)

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Re: [PATCH v4 06/20] module: check module wasn't already initialized
Posted by Darren Kenny 6 years, 3 months ago
On Wed, Oct 30, 2019 at 02:49:52PM +0000, Oleinik, Alexander wrote:
>From: Alexander Oleinik <alxndr@bu.edu>
>
>The virtual-device fuzzer must initialize QOM, prior to running
>vl:qemu_init, so that it can use the qos_graph to identify the arguments
>required to initialize a guest for libqos-assisted fuzzing. This change
>prevents errors when vl:qemu_init tries to (re)initialize the previously
>initialized QOM module.
>
>Signed-off-by: Alexander Oleinik <alxndr@bu.edu>

My only question here really is whether there is any possibility of
the list of any given module type being modified later, if so this
might break things if attempts are made to re-init modules.

In that case, this test might be more correctly belong in the
module's own init() function instead.

Assuming for now that it is the correct place to do it, unless
someone can say otherwise:

Reviewed-by: Darren Kenny <darren.kenny@oracle.com>

>---
> util/module.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
>diff --git a/util/module.c b/util/module.c
>index e9fe3e5422..841e490e06 100644
>--- a/util/module.c
>+++ b/util/module.c
>@@ -30,6 +30,7 @@ typedef struct ModuleEntry
> typedef QTAILQ_HEAD(, ModuleEntry) ModuleTypeList;
>
> static ModuleTypeList init_type_list[MODULE_INIT_MAX];
>+static bool modules_init_done[MODULE_INIT_MAX];
>
> static ModuleTypeList dso_init_list;
>
>@@ -91,11 +92,17 @@ void module_call_init(module_init_type type)
>     ModuleTypeList *l;
>     ModuleEntry *e;
>
>+    if (modules_init_done[type]) {
>+        return;
>+    }
>+
>     l = find_type(type);
>
>     QTAILQ_FOREACH(e, l, node) {
>         e->init();
>     }
>+
>+    modules_init_done[type] = true;
> }
>
> #ifdef CONFIG_MODULES
>-- 
>2.23.0
>
>