On 09.11.2021 20:46, Paolo Bonzini wrote:
On 11/9/21 08:23, Denis Plotnikov wrote:
Ping ping!
Looks good, but can you explain why it's okay to call it before
qemu_chr_cleanup() and user_creatable_cleanup()?
I think a better solution to the ordering problem would be:
qemu_chr_cleanup();
user_creatable_cleanup();
flush_rcu();
monitor_cleanup();
I agree, this looks better
with something like this:
diff --git a/chardev/char-fe.c b/chardev/char-fe.c
index 7789f7be9c..f0c3ea5447 100644
--- a/chardev/char-fe.c
+++ b/chardev/char-fe.c
@@ -195,6 +195,7 @@ bool qemu_chr_fe_init(CharBackend *b,
int tag = 0;
if (s) {
+ object_ref(OBJECT(s));
if (CHARDEV_IS_MUX(s)) {
MuxChardev *d = MUX_CHARDEV(s);
@@ -241,6 +242,7 @@ void qemu_chr_fe_deinit(CharBackend *b, bool del)
} else {
object_unref(obj);
}
+ object_unref(obj);
}
b->chr = NULL;
}
to keep the chardev live between qemu_chr_cleanup() and
monitor_cleanup().
but frankly speaking I don't understand why we have to do ref/unref in
char-fe interface functions, instead of just ref/uref-ing monitor's char
device directly like this:
diff --git a/monitor/monitor.c b/monitor/monitor.c
index 21c7a68758f5..3692a8e15268 100644
--- a/monitor/monitor.c
+++ b/monitor/monitor.c
@@ -611,6 +611,7 @@ void monitor_data_destroy(Monitor *mon)
{
g_free(mon->mon_cpu_path);
qemu_chr_fe_deinit(&mon->chr, false);
+ object_unref(OBJECT(&mon->chr));
if (monitor_is_qmp(mon)) {
monitor_data_destroy_qmp(container_of(mon, MonitorQMP, common));
} else {
@@ -737,6 +738,7 @@ int monitor_init(MonitorOptions *opts, bool
allow_hmp, Error **errp)
error_propagate(errp, local_err);
return -1;
}
+ object_ref(OBJECT(chr));
return 0;
}
May be this shows the intentions better?
Denis
Paolo