All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL v2 00/12] Option patches
@ 2018-10-05 12:28 Marc-André Lureau
  2018-10-05 12:28 ` [Qemu-devel] [PULL v2 01/12] qdev-monitor: print help to stdout Marc-André Lureau
                   ` (12 more replies)
  0 siblings, 13 replies; 14+ messages in thread
From: Marc-André Lureau @ 2018-10-05 12:28 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

The following changes since commit b8e5671a8cd196e7262802ca895bf87d50416989:

  Merge remote-tracking branch 'remotes/elmarco/tags/chardev-pull-request' into staging (2018-10-03 14:07:49 +0100)

are available in the Git repository at:

  https://github.com/elmarco/qemu.git tags/option-pull-request

for you to fetch changes up to 1195fa2b08d98ab503155c5cee8831d1ef91aac5:

  vl: list user creatable properties when 'help' is argument (2018-10-05 16:27:09 +0400)

----------------------------------------------------------------
CLI help improvements

PULLv2:
 - fix uninitialized "seentype" variable in qom-test

----------------------------------------------------------------

Marc-André Lureau (12):
  qdev-monitor: print help to stdout
  cutils: add qemu_pstrcmp0()
  qemu-option: add help fallback to print the list of options
  qemu-option: improve qemu_opts_print_help() output
  qom/object: fix iterating properties over a class
  qom/object: register 'type' property as class property
  tests/qom-proplist: check duplicate "bv" property registration failed
  tests/qom-proplist: check properties are not listed multiple times
  tests/qom-proplist: check class properties iterator
  vl: handle -object help
  hostmem: add some properties description
  vl: list user creatable properties when 'help' is argument

 include/monitor/monitor.h  |  3 ++
 include/qemu/cutils.h      | 12 +++++++
 backends/hostmem-memfd.c   |  9 +++++
 backends/hostmem.c         | 14 ++++++++
 monitor.c                  | 16 +++++++--
 qdev-monitor.c             | 32 ++++++++++-------
 qom/object.c               |  9 ++---
 qom/object_interfaces.c    |  6 ++--
 tests/check-qom-proplist.c | 58 ++++++++++++++++++++-----------
 util/cutils.c              |  5 +++
 util/qemu-option.c         | 71 +++++++++++++++++++++++++++++++-------
 vl.c                       | 53 ++++++++++++++++++++++++++--
 12 files changed, 228 insertions(+), 60 deletions(-)

-- 
2.19.0.271.gfe8321ec05

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

* [Qemu-devel] [PULL v2 01/12] qdev-monitor: print help to stdout
  2018-10-05 12:28 [Qemu-devel] [PULL v2 00/12] Option patches Marc-André Lureau
@ 2018-10-05 12:28 ` Marc-André Lureau
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 02/12] cutils: add qemu_pstrcmp0() Marc-André Lureau
                   ` (11 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Marc-André Lureau @ 2018-10-05 12:28 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

qdev_device_help() is used from command line "-device help", or from
HMP "device_add". If used from command line, print help to stdout
(it is only printed on explicit demand).

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 include/monitor/monitor.h |  3 +++
 monitor.c                 | 16 +++++++++++++---
 qdev-monitor.c            | 32 +++++++++++++++++++-------------
 3 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
index 2ef5e04b37..6fd2c53b09 100644
--- a/include/monitor/monitor.h
+++ b/include/monitor/monitor.h
@@ -47,4 +47,7 @@ int monitor_fdset_dup_fd_add(int64_t fdset_id, int dup_fd);
 void monitor_fdset_dup_fd_remove(int dup_fd);
 int monitor_fdset_dup_fd_find(int dup_fd);
 
+void monitor_vfprintf(FILE *stream,
+                      const char *fmt, va_list ap) GCC_FMT_ATTR(2, 0);
+
 #endif /* MONITOR_H */
diff --git a/monitor.c b/monitor.c
index c4677b502b..b9258a7438 100644
--- a/monitor.c
+++ b/monitor.c
@@ -4493,19 +4493,29 @@ static void monitor_readline_flush(void *opaque)
 }
 
 /*
- * Print to current monitor if we have one, else to stderr.
+ * Print to current monitor if we have one, else to stream.
  * TODO should return int, so callers can calculate width, but that
  * requires surgery to monitor_vprintf().  Left for another day.
  */
-void error_vprintf(const char *fmt, va_list ap)
+void monitor_vfprintf(FILE *stream, const char *fmt, va_list ap)
 {
     if (cur_mon && !monitor_cur_is_qmp()) {
         monitor_vprintf(cur_mon, fmt, ap);
     } else {
-        vfprintf(stderr, fmt, ap);
+        vfprintf(stream, fmt, ap);
     }
 }
 
+/*
+ * Print to current monitor if we have one, else to stderr.
+ * TODO should return int, so callers can calculate width, but that
+ * requires surgery to monitor_vprintf().  Left for another day.
+ */
+void error_vprintf(const char *fmt, va_list ap)
+{
+    monitor_vfprintf(stderr, fmt, ap);
+}
+
 void error_vprintf_unless_qmp(const char *fmt, va_list ap)
 {
     if (cur_mon && !monitor_cur_is_qmp()) {
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 61e0300991..802c18a74e 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -104,22 +104,31 @@ static bool qdev_class_has_alias(DeviceClass *dc)
     return (qdev_class_get_alias(dc) != NULL);
 }
 
+static void out_printf(const char *fmt, ...)
+{
+    va_list ap;
+
+    va_start(ap, fmt);
+    monitor_vfprintf(stdout, fmt, ap);
+    va_end(ap);
+}
+
 static void qdev_print_devinfo(DeviceClass *dc)
 {
-    error_printf("name \"%s\"", object_class_get_name(OBJECT_CLASS(dc)));
+    out_printf("name \"%s\"", object_class_get_name(OBJECT_CLASS(dc)));
     if (dc->bus_type) {
-        error_printf(", bus %s", dc->bus_type);
+        out_printf(", bus %s", dc->bus_type);
     }
     if (qdev_class_has_alias(dc)) {
-        error_printf(", alias \"%s\"", qdev_class_get_alias(dc));
+        out_printf(", alias \"%s\"", qdev_class_get_alias(dc));
     }
     if (dc->desc) {
-        error_printf(", desc \"%s\"", dc->desc);
+        out_printf(", desc \"%s\"", dc->desc);
     }
     if (!dc->user_creatable) {
-        error_printf(", no-user");
+        out_printf(", no-user");
     }
-    error_printf("\n");
+    out_printf("\n");
 }
 
 static void qdev_print_devinfos(bool show_no_user)
@@ -155,8 +164,7 @@ static void qdev_print_devinfos(bool show_no_user)
                 continue;
             }
             if (!cat_printed) {
-                error_printf("%s%s devices:\n", i ? "\n" : "",
-                             cat_name[i]);
+                out_printf("%s%s devices:\n", i ? "\n" : "", cat_name[i]);
                 cat_printed = true;
             }
             qdev_print_devinfo(dc);
@@ -278,13 +286,11 @@ int qdev_device_help(QemuOpts *opts)
     }
 
     for (prop = prop_list; prop; prop = prop->next) {
-        error_printf("%s.%s=%s", driver,
-                     prop->value->name,
-                     prop->value->type);
+        out_printf("%s.%s=%s", driver, prop->value->name, prop->value->type);
         if (prop->value->has_description) {
-            error_printf(" (%s)\n", prop->value->description);
+            out_printf(" (%s)\n", prop->value->description);
         } else {
-            error_printf("\n");
+            out_printf("\n");
         }
     }
 
-- 
2.19.0.271.gfe8321ec05

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

* [Qemu-devel] [PULL v2 02/12] cutils: add qemu_pstrcmp0()
  2018-10-05 12:28 [Qemu-devel] [PULL v2 00/12] Option patches Marc-André Lureau
  2018-10-05 12:28 ` [Qemu-devel] [PULL v2 01/12] qdev-monitor: print help to stdout Marc-André Lureau
@ 2018-10-05 12:29 ` Marc-André Lureau
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 03/12] qemu-option: add help fallback to print the list of options Marc-André Lureau
                   ` (10 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Marc-André Lureau @ 2018-10-05 12:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

A char** variant of g_strcmp0().

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
---
 include/qemu/cutils.h | 12 ++++++++++++
 util/cutils.c         |  5 +++++
 2 files changed, 17 insertions(+)

diff --git a/include/qemu/cutils.h b/include/qemu/cutils.h
index 47aaa3b0b9..7071bfe2d4 100644
--- a/include/qemu/cutils.h
+++ b/include/qemu/cutils.h
@@ -169,4 +169,16 @@ bool test_buffer_is_zero_next_accel(void);
 int uleb128_encode_small(uint8_t *out, uint32_t n);
 int uleb128_decode_small(const uint8_t *in, uint32_t *n);
 
+/**
+ * qemu_pstrcmp0:
+ * @str1: a non-NULL pointer to a C string (*str1 can be NULL)
+ * @str2: a non-NULL pointer to a C string (*str2 can be NULL)
+ *
+ * Compares *str1 and *str2 with g_strcmp0().
+ *
+ * Returns: an integer less than, equal to, or greater than zero, if
+ * *str1 is <, == or > than *str2.
+ */
+int qemu_pstrcmp0(const char **str1, const char **str2);
+
 #endif
diff --git a/util/cutils.c b/util/cutils.c
index 9205e09031..698bd315bd 100644
--- a/util/cutils.c
+++ b/util/cutils.c
@@ -769,3 +769,8 @@ char *size_to_str(uint64_t val)
 
     return g_strdup_printf("%0.3g %sB", (double)val / div, suffixes[i]);
 }
+
+int qemu_pstrcmp0(const char **str1, const char **str2)
+{
+    return g_strcmp0(*str1, *str2);
+}
-- 
2.19.0.271.gfe8321ec05

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

* [Qemu-devel] [PULL v2 03/12] qemu-option: add help fallback to print the list of options
  2018-10-05 12:28 [Qemu-devel] [PULL v2 00/12] Option patches Marc-André Lureau
  2018-10-05 12:28 ` [Qemu-devel] [PULL v2 01/12] qdev-monitor: print help to stdout Marc-André Lureau
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 02/12] cutils: add qemu_pstrcmp0() Marc-André Lureau
@ 2018-10-05 12:29 ` Marc-André Lureau
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 04/12] qemu-option: improve qemu_opts_print_help() output Marc-André Lureau
                   ` (9 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Marc-André Lureau @ 2018-10-05 12:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

QDev options accept 'help' (or '?', but that's problematic with shell
globbing) in the list of parameters, which is handy to list the
available options.

Unfortunately, this isn't built in QemuOpts. qemu_opts_parse_noisily()
seems to be the common path for command line options, so place a
fallback to print help, listing the available options.

This is quite handy, for example with qemu "-spice help".

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 util/qemu-option.c | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/util/qemu-option.c b/util/qemu-option.c
index 01886efe90..557b6c6626 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -486,7 +486,7 @@ int qemu_opt_unset(QemuOpts *opts, const char *name)
 }
 
 static void opt_set(QemuOpts *opts, const char *name, char *value,
-                    bool prepend, Error **errp)
+                    bool prepend, bool *invalidp, Error **errp)
 {
     QemuOpt *opt;
     const QemuOptDesc *desc;
@@ -496,6 +496,9 @@ static void opt_set(QemuOpts *opts, const char *name, char *value,
     if (!desc && !opts_accepts_any(opts)) {
         g_free(value);
         error_setg(errp, QERR_INVALID_PARAMETER, name);
+        if (invalidp) {
+            *invalidp = true;
+        }
         return;
     }
 
@@ -519,7 +522,7 @@ static void opt_set(QemuOpts *opts, const char *name, char *value,
 void qemu_opt_set(QemuOpts *opts, const char *name, const char *value,
                   Error **errp)
 {
-    opt_set(opts, name, g_strdup(value), false, errp);
+    opt_set(opts, name, g_strdup(value), false, NULL, errp);
 }
 
 void qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val,
@@ -750,7 +753,8 @@ void qemu_opts_print(QemuOpts *opts, const char *separator)
 }
 
 static void opts_do_parse(QemuOpts *opts, const char *params,
-                          const char *firstname, bool prepend, Error **errp)
+                          const char *firstname, bool prepend,
+                          bool *invalidp, Error **errp)
 {
     char *option = NULL;
     char *value = NULL;
@@ -785,7 +789,7 @@ static void opts_do_parse(QemuOpts *opts, const char *params,
         }
         if (strcmp(option, "id") != 0) {
             /* store and parse */
-            opt_set(opts, option, value, prepend, &local_err);
+            opt_set(opts, option, value, prepend, invalidp, &local_err);
             value = NULL;
             if (local_err) {
                 error_propagate(errp, local_err);
@@ -814,11 +818,12 @@ static void opts_do_parse(QemuOpts *opts, const char *params,
 void qemu_opts_do_parse(QemuOpts *opts, const char *params,
                        const char *firstname, Error **errp)
 {
-    opts_do_parse(opts, params, firstname, false, errp);
+    opts_do_parse(opts, params, firstname, false, NULL, errp);
 }
 
 static QemuOpts *opts_parse(QemuOptsList *list, const char *params,
-                            bool permit_abbrev, bool defaults, Error **errp)
+                            bool permit_abbrev, bool defaults,
+                            bool *invalidp, Error **errp)
 {
     const char *firstname;
     char *id = NULL;
@@ -850,7 +855,7 @@ static QemuOpts *opts_parse(QemuOptsList *list, const char *params,
         return NULL;
     }
 
-    opts_do_parse(opts, params, firstname, defaults, &local_err);
+    opts_do_parse(opts, params, firstname, defaults, invalidp, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
         qemu_opts_del(opts);
@@ -870,7 +875,7 @@ static QemuOpts *opts_parse(QemuOptsList *list, const char *params,
 QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params,
                           bool permit_abbrev, Error **errp)
 {
-    return opts_parse(list, params, permit_abbrev, false, errp);
+    return opts_parse(list, params, permit_abbrev, false, NULL, errp);
 }
 
 /**
@@ -886,10 +891,16 @@ QemuOpts *qemu_opts_parse_noisily(QemuOptsList *list, const char *params,
 {
     Error *err = NULL;
     QemuOpts *opts;
+    bool invalidp = false;
 
-    opts = opts_parse(list, params, permit_abbrev, false, &err);
+    opts = opts_parse(list, params, permit_abbrev, false, &invalidp, &err);
     if (err) {
-        error_report_err(err);
+        if (invalidp && has_help_option(params)) {
+            qemu_opts_print_help(list);
+            error_free(err);
+        } else {
+            error_report_err(err);
+        }
     }
     return opts;
 }
@@ -899,7 +910,7 @@ void qemu_opts_set_defaults(QemuOptsList *list, const char *params,
 {
     QemuOpts *opts;
 
-    opts = opts_parse(list, params, permit_abbrev, true, NULL);
+    opts = opts_parse(list, params, permit_abbrev, true, NULL, NULL);
     assert(opts);
 }
 
-- 
2.19.0.271.gfe8321ec05

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

* [Qemu-devel] [PULL v2 04/12] qemu-option: improve qemu_opts_print_help() output
  2018-10-05 12:28 [Qemu-devel] [PULL v2 00/12] Option patches Marc-André Lureau
                   ` (2 preceding siblings ...)
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 03/12] qemu-option: add help fallback to print the list of options Marc-André Lureau
@ 2018-10-05 12:29 ` Marc-André Lureau
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 05/12] qom/object: fix iterating properties over a class Marc-André Lureau
                   ` (8 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Marc-André Lureau @ 2018-10-05 12:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

Modify qemu_opts_print_help():
- to print expected argument type
- skip description if not available
- sort lines
- prefix with the list name (like qdev, to avoid confusion)
- drop 16-chars alignment, use a '-' as seperator for option name and
  description

For ex, "-spice help" output is changed from:

port             No description available
tls-port         No description available
addr             No description available
[...]
gl               No description available
rendernode       No description available

to:

spice.addr=str
spice.agent-mouse=bool (on/off)
spice.disable-agent-file-xfer=bool (on/off)
[...]
spice.x509-key-password=str
spice.zlib-glz-wan-compression=str

"qemu-img create -f qcow2 -o help", changed from:

size             Virtual disk size
compat           Compatibility level (0.10 or 1.1)
backing_file     File name of a base image
[...]
lazy_refcounts   Postpone refcount updates
refcount_bits    Width of a reference count entry in bits

to:

backing_file=str - File name of a base image
backing_fmt=str - Image format of the base image
cluster_size=size - qcow2 cluster size
[...]
refcount_bits=num - Width of a reference count entry in bits
size=size - Virtual disk size

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 util/qemu-option.c | 38 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 36 insertions(+), 2 deletions(-)

diff --git a/util/qemu-option.c b/util/qemu-option.c
index 557b6c6626..9a5f263294 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -208,17 +208,51 @@ out:
     return result;
 }
 
+static const char *opt_type_to_string(enum QemuOptType type)
+{
+    switch (type) {
+    case QEMU_OPT_STRING:
+        return "str";
+    case QEMU_OPT_BOOL:
+        return "bool (on/off)";
+    case QEMU_OPT_NUMBER:
+        return "num";
+    case QEMU_OPT_SIZE:
+        return "size";
+    }
+
+    g_assert_not_reached();
+}
+
 void qemu_opts_print_help(QemuOptsList *list)
 {
     QemuOptDesc *desc;
+    int i;
+    GPtrArray *array = g_ptr_array_new();
 
     assert(list);
     desc = list->desc;
     while (desc && desc->name) {
-        printf("%-16s %s\n", desc->name,
-               desc->help ? desc->help : "No description available");
+        GString *str = g_string_new(NULL);
+        if (list->name) {
+            g_string_append_printf(str, "%s.", list->name);
+        }
+        g_string_append_printf(str, "%s=%s", desc->name,
+                               opt_type_to_string(desc->type));
+        if (desc->help) {
+            g_string_append_printf(str, " - %s", desc->help);
+        }
+        g_ptr_array_add(array, g_string_free(str, false));
         desc++;
     }
+
+    g_ptr_array_sort(array, (GCompareFunc)qemu_pstrcmp0);
+    for (i = 0; i < array->len; i++) {
+        printf("%s\n", (char *)array->pdata[i]);
+    }
+    g_ptr_array_set_free_func(array, g_free);
+    g_ptr_array_free(array, true);
+
 }
 /* ------------------------------------------------------------------ */
 
-- 
2.19.0.271.gfe8321ec05

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

* [Qemu-devel] [PULL v2 05/12] qom/object: fix iterating properties over a class
  2018-10-05 12:28 [Qemu-devel] [PULL v2 00/12] Option patches Marc-André Lureau
                   ` (3 preceding siblings ...)
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 04/12] qemu-option: improve qemu_opts_print_help() output Marc-André Lureau
@ 2018-10-05 12:29 ` Marc-André Lureau
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 06/12] qom/object: register 'type' property as class property Marc-André Lureau
                   ` (7 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Marc-André Lureau @ 2018-10-05 12:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

object_class_property_iter_init() starts from the given class, so the
next class should continue with the parent class.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
---
 qom/object.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/qom/object.c b/qom/object.c
index 9222b23172..9eaf08a53c 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1115,7 +1115,7 @@ void object_class_property_iter_init(ObjectPropertyIterator *iter,
                                      ObjectClass *klass)
 {
     g_hash_table_iter_init(&iter->iter, klass->properties);
-    iter->nextclass = klass;
+    iter->nextclass = object_class_get_parent(klass);
 }
 
 ObjectProperty *object_class_property_find(ObjectClass *klass, const char *name,
-- 
2.19.0.271.gfe8321ec05

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

* [Qemu-devel] [PULL v2 06/12] qom/object: register 'type' property as class property
  2018-10-05 12:28 [Qemu-devel] [PULL v2 00/12] Option patches Marc-André Lureau
                   ` (4 preceding siblings ...)
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 05/12] qom/object: fix iterating properties over a class Marc-André Lureau
@ 2018-10-05 12:29 ` Marc-André Lureau
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 07/12] tests/qom-proplist: check duplicate "bv" property registration failed Marc-André Lureau
                   ` (6 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Marc-André Lureau @ 2018-10-05 12:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

Let's save a few byte in each object instance.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
---
 qom/object.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/qom/object.c b/qom/object.c
index 9eaf08a53c..547dcf97c3 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -2430,9 +2430,10 @@ void object_class_property_set_description(ObjectClass *klass,
     op->description = g_strdup(description);
 }
 
-static void object_instance_init(Object *obj)
+static void object_class_init(ObjectClass *klass, void *data)
 {
-    object_property_add_str(obj, "type", qdev_get_type, NULL, NULL);
+    object_class_property_add_str(klass, "type", qdev_get_type,
+                                  NULL, &error_abort);
 }
 
 static void register_types(void)
@@ -2446,7 +2447,7 @@ static void register_types(void)
     static TypeInfo object_info = {
         .name = TYPE_OBJECT,
         .instance_size = sizeof(Object),
-        .instance_init = object_instance_init,
+        .class_init = object_class_init,
         .abstract = true,
     };
 
-- 
2.19.0.271.gfe8321ec05

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

* [Qemu-devel] [PULL v2 07/12] tests/qom-proplist: check duplicate "bv" property registration failed
  2018-10-05 12:28 [Qemu-devel] [PULL v2 00/12] Option patches Marc-André Lureau
                   ` (5 preceding siblings ...)
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 06/12] qom/object: register 'type' property as class property Marc-André Lureau
@ 2018-10-05 12:29 ` Marc-André Lureau
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 08/12] tests/qom-proplist: check properties are not listed multiple times Marc-André Lureau
                   ` (5 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Marc-André Lureau @ 2018-10-05 12:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

"bv" is already a class property.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
---
 tests/check-qom-proplist.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c
index 92898e1520..0f6d9c1ce3 100644
--- a/tests/check-qom-proplist.c
+++ b/tests/check-qom-proplist.c
@@ -125,10 +125,13 @@ static char *dummy_get_sv(Object *obj,
 
 static void dummy_init(Object *obj)
 {
+    Error *err = NULL;
+
     object_property_add_bool(obj, "bv",
                              dummy_get_bv,
                              dummy_set_bv,
-                             NULL);
+                             &err);
+    error_free_or_abort(&err);
 }
 
 
-- 
2.19.0.271.gfe8321ec05

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

* [Qemu-devel] [PULL v2 08/12] tests/qom-proplist: check properties are not listed multiple times
  2018-10-05 12:28 [Qemu-devel] [PULL v2 00/12] Option patches Marc-André Lureau
                   ` (6 preceding siblings ...)
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 07/12] tests/qom-proplist: check duplicate "bv" property registration failed Marc-André Lureau
@ 2018-10-05 12:29 ` Marc-André Lureau
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 09/12] tests/qom-proplist: check class properties iterator Marc-André Lureau
                   ` (4 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Marc-André Lureau @ 2018-10-05 12:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

And factor out a common function used by the follow class properties
iterator test.

Fix uninitialized "seentype" variable.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
---
 tests/check-qom-proplist.c | 44 +++++++++++++++++++++-----------------
 1 file changed, 24 insertions(+), 20 deletions(-)

diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c
index 0f6d9c1ce3..2c07719607 100644
--- a/tests/check-qom-proplist.c
+++ b/tests/check-qom-proplist.c
@@ -520,32 +520,19 @@ static void test_dummy_getenum(void)
 }
 
 
-static void test_dummy_iterator(void)
+static void test_dummy_prop_iterator(ObjectPropertyIterator *iter)
 {
-    Object *parent = object_get_objects_root();
-    DummyObject *dobj = DUMMY_OBJECT(
-        object_new_with_props(TYPE_DUMMY,
-                              parent,
-                              "dummy0",
-                              &error_abort,
-                              "bv", "yes",
-                              "sv", "Hiss hiss hiss",
-                              "av", "platypus",
-                              NULL));
-
+    bool seenbv = false, seensv = false, seenav = false, seentype = false;
     ObjectProperty *prop;
-    ObjectPropertyIterator iter;
-    bool seenbv = false, seensv = false, seenav = false, seentype;
 
-    object_property_iter_init(&iter, OBJECT(dobj));
-    while ((prop = object_property_iter_next(&iter))) {
-        if (g_str_equal(prop->name, "bv")) {
+    while ((prop = object_property_iter_next(iter))) {
+        if (!seenbv && g_str_equal(prop->name, "bv")) {
             seenbv = true;
-        } else if (g_str_equal(prop->name, "sv")) {
+        } else if (!seensv && g_str_equal(prop->name, "sv")) {
             seensv = true;
-        } else if (g_str_equal(prop->name, "av")) {
+        } else if (!seenav && g_str_equal(prop->name, "av")) {
             seenav = true;
-        } else if (g_str_equal(prop->name, "type")) {
+        } else if (!seentype && g_str_equal(prop->name, "type")) {
             /* This prop comes from the base Object class */
             seentype = true;
         } else {
@@ -557,7 +544,24 @@ static void test_dummy_iterator(void)
     g_assert(seenav);
     g_assert(seensv);
     g_assert(seentype);
+}
 
+static void test_dummy_iterator(void)
+{
+    Object *parent = object_get_objects_root();
+    DummyObject *dobj = DUMMY_OBJECT(
+        object_new_with_props(TYPE_DUMMY,
+                              parent,
+                              "dummy0",
+                              &error_abort,
+                              "bv", "yes",
+                              "sv", "Hiss hiss hiss",
+                              "av", "platypus",
+                              NULL));
+    ObjectPropertyIterator iter;
+
+    object_property_iter_init(&iter, OBJECT(dobj));
+    test_dummy_prop_iterator(&iter);
     object_unparent(OBJECT(dobj));
 }
 
-- 
2.19.0.271.gfe8321ec05

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

* [Qemu-devel] [PULL v2 09/12] tests/qom-proplist: check class properties iterator
  2018-10-05 12:28 [Qemu-devel] [PULL v2 00/12] Option patches Marc-André Lureau
                   ` (7 preceding siblings ...)
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 08/12] tests/qom-proplist: check properties are not listed multiple times Marc-André Lureau
@ 2018-10-05 12:29 ` Marc-André Lureau
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 10/12] vl: handle -object help Marc-André Lureau
                   ` (3 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Marc-André Lureau @ 2018-10-05 12:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

This test failed before "fix iterating properties over a class".

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
---
 tests/check-qom-proplist.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c
index 2c07719607..a8b2958e6e 100644
--- a/tests/check-qom-proplist.c
+++ b/tests/check-qom-proplist.c
@@ -565,6 +565,14 @@ static void test_dummy_iterator(void)
     object_unparent(OBJECT(dobj));
 }
 
+static void test_dummy_class_iterator(void)
+{
+    ObjectPropertyIterator iter;
+    ObjectClass *klass = object_class_by_name(TYPE_DUMMY);
+
+    object_class_property_iter_init(&iter, klass);
+    test_dummy_prop_iterator(&iter);
+}
 
 static void test_dummy_delchild(void)
 {
@@ -636,6 +644,7 @@ int main(int argc, char **argv)
     g_test_add_func("/qom/proplist/badenum", test_dummy_badenum);
     g_test_add_func("/qom/proplist/getenum", test_dummy_getenum);
     g_test_add_func("/qom/proplist/iterator", test_dummy_iterator);
+    g_test_add_func("/qom/proplist/class_iterator", test_dummy_class_iterator);
     g_test_add_func("/qom/proplist/delchild", test_dummy_delchild);
     g_test_add_func("/qom/resolve/partial", test_qom_partial_path);
 
-- 
2.19.0.271.gfe8321ec05

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

* [Qemu-devel] [PULL v2 10/12] vl: handle -object help
  2018-10-05 12:28 [Qemu-devel] [PULL v2 00/12] Option patches Marc-André Lureau
                   ` (8 preceding siblings ...)
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 09/12] tests/qom-proplist: check class properties iterator Marc-André Lureau
@ 2018-10-05 12:29 ` Marc-André Lureau
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 11/12] hostmem: add some properties description Marc-André Lureau
                   ` (2 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Marc-André Lureau @ 2018-10-05 12:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

List the user creatable objects.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
---
 vl.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/vl.c b/vl.c
index a867c9c4d9..f254b99bdb 100644
--- a/vl.c
+++ b/vl.c
@@ -2698,6 +2698,19 @@ static int machine_set_property(void *opaque,
  */
 static bool object_create_initial(const char *type)
 {
+    if (is_help_option(type)) {
+        GSList *l, *list;
+
+        printf("List of user creatable objects:\n");
+        list = object_class_get_list_sorted(TYPE_USER_CREATABLE, false);
+        for (l = list; l != NULL; l = l->next) {
+            ObjectClass *oc = OBJECT_CLASS(l->data);
+            printf("%s\n", object_class_get_name(oc));
+        }
+        g_slist_free(list);
+        exit(0);
+    }
+
     if (g_str_equal(type, "rng-egd") ||
         g_str_has_prefix(type, "pr-manager-")) {
         return false;
-- 
2.19.0.271.gfe8321ec05

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

* [Qemu-devel] [PULL v2 11/12] hostmem: add some properties description
  2018-10-05 12:28 [Qemu-devel] [PULL v2 00/12] Option patches Marc-André Lureau
                   ` (9 preceding siblings ...)
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 10/12] vl: handle -object help Marc-André Lureau
@ 2018-10-05 12:29 ` Marc-André Lureau
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 12/12] vl: list user creatable properties when 'help' is argument Marc-André Lureau
  2018-10-08 10:10 ` [Qemu-devel] [PULL v2 00/12] Option patches Peter Maydell
  12 siblings, 0 replies; 14+ messages in thread
From: Marc-André Lureau @ 2018-10-05 12:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
---
 backends/hostmem-memfd.c |  9 +++++++++
 backends/hostmem.c       | 14 ++++++++++++++
 2 files changed, 23 insertions(+)

diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c
index 3800bd07b6..b6836b28e5 100644
--- a/backends/hostmem-memfd.c
+++ b/backends/hostmem-memfd.c
@@ -145,16 +145,25 @@ memfd_backend_class_init(ObjectClass *oc, void *data)
                                        memfd_backend_get_hugetlb,
                                        memfd_backend_set_hugetlb,
                                        &error_abort);
+        object_class_property_set_description(oc, "hugetlb",
+                                              "Use huge pages",
+                                              &error_abort);
         object_class_property_add(oc, "hugetlbsize", "int",
                                   memfd_backend_get_hugetlbsize,
                                   memfd_backend_set_hugetlbsize,
                                   NULL, NULL, &error_abort);
+        object_class_property_set_description(oc, "hugetlbsize",
+                                              "Huge pages size (ex: 2M, 1G)",
+                                              &error_abort);
     }
     if (qemu_memfd_check(MFD_ALLOW_SEALING)) {
         object_class_property_add_bool(oc, "seal",
                                        memfd_backend_get_seal,
                                        memfd_backend_set_seal,
                                        &error_abort);
+        object_class_property_set_description(oc, "seal",
+                                              "Seal growing & shrinking",
+                                              &error_abort);
     }
 }
 
diff --git a/backends/hostmem.c b/backends/hostmem.c
index 4908946cd3..1a89342039 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -397,27 +397,41 @@ host_memory_backend_class_init(ObjectClass *oc, void *data)
     object_class_property_add_bool(oc, "merge",
         host_memory_backend_get_merge,
         host_memory_backend_set_merge, &error_abort);
+    object_class_property_set_description(oc, "merge",
+        "Mark memory as mergeable", &error_abort);
     object_class_property_add_bool(oc, "dump",
         host_memory_backend_get_dump,
         host_memory_backend_set_dump, &error_abort);
+    object_class_property_set_description(oc, "dump",
+        "Set to 'off' to exclude from core dump", &error_abort);
     object_class_property_add_bool(oc, "prealloc",
         host_memory_backend_get_prealloc,
         host_memory_backend_set_prealloc, &error_abort);
+    object_class_property_set_description(oc, "prealloc",
+        "Preallocate memory", &error_abort);
     object_class_property_add(oc, "size", "int",
         host_memory_backend_get_size,
         host_memory_backend_set_size,
         NULL, NULL, &error_abort);
+    object_class_property_set_description(oc, "size",
+        "Size of the memory region (ex: 500M)", &error_abort);
     object_class_property_add(oc, "host-nodes", "int",
         host_memory_backend_get_host_nodes,
         host_memory_backend_set_host_nodes,
         NULL, NULL, &error_abort);
+    object_class_property_set_description(oc, "host-nodes",
+        "Binds memory to the list of NUMA host nodes", &error_abort);
     object_class_property_add_enum(oc, "policy", "HostMemPolicy",
         &HostMemPolicy_lookup,
         host_memory_backend_get_policy,
         host_memory_backend_set_policy, &error_abort);
+    object_class_property_set_description(oc, "policy",
+        "Set the NUMA policy", &error_abort);
     object_class_property_add_bool(oc, "share",
         host_memory_backend_get_share, host_memory_backend_set_share,
         &error_abort);
+    object_class_property_set_description(oc, "share",
+        "Mark the memory as private to QEMU or shared", &error_abort);
 }
 
 static const TypeInfo host_memory_backend_info = {
-- 
2.19.0.271.gfe8321ec05

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

* [Qemu-devel] [PULL v2 12/12] vl: list user creatable properties when 'help' is argument
  2018-10-05 12:28 [Qemu-devel] [PULL v2 00/12] Option patches Marc-André Lureau
                   ` (10 preceding siblings ...)
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 11/12] hostmem: add some properties description Marc-André Lureau
@ 2018-10-05 12:29 ` Marc-André Lureau
  2018-10-08 10:10 ` [Qemu-devel] [PULL v2 00/12] Option patches Peter Maydell
  12 siblings, 0 replies; 14+ messages in thread
From: Marc-André Lureau @ 2018-10-05 12:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, Marc-André Lureau

Iterate over the writable class properties, sort and print them out
with the description if available.

Ex: qemu -object memory-backend-file,help
memory-backend-file.align=int
memory-backend-file.discard-data=bool
memory-backend-file.dump=bool - Set to 'off' to exclude from core dump
memory-backend-file.host-nodes=int - Binds memory to the list of NUMA host nodes
memory-backend-file.mem-path=string
memory-backend-file.merge=bool - Mark memory as mergeable
memory-backend-file.pmem=bool
memory-backend-file.policy=HostMemPolicy - Set the NUMA policy
memory-backend-file.prealloc=bool - Preallocate memory
memory-backend-file.share=bool - Mark the memory as private to QEMU or shared
memory-backend-file.size=int - Size of the memory region (ex: 500M)

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
---
 qom/object_interfaces.c |  6 +++---
 vl.c                    | 40 +++++++++++++++++++++++++++++++++++++---
 2 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index 72b97a8bed..941fd63afd 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -141,14 +141,14 @@ Object *user_creatable_add_opts(QemuOpts *opts, Error **errp)
 
 int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
 {
-    bool (*type_predicate)(const char *) = opaque;
+    bool (*type_opt_predicate)(const char *, QemuOpts *) = opaque;
     Object *obj = NULL;
     Error *err = NULL;
     const char *type;
 
     type = qemu_opt_get(opts, "qom-type");
-    if (type && type_predicate &&
-        !type_predicate(type)) {
+    if (type && type_opt_predicate &&
+        !type_opt_predicate(type, opts)) {
         return 0;
     }
 
diff --git a/vl.c b/vl.c
index f254b99bdb..4e25c78bff 100644
--- a/vl.c
+++ b/vl.c
@@ -2696,8 +2696,10 @@ static int machine_set_property(void *opaque,
  * cannot be created here, as it depends on the chardev
  * already existing.
  */
-static bool object_create_initial(const char *type)
+static bool object_create_initial(const char *type, QemuOpts *opts)
 {
+    ObjectClass *klass;
+
     if (is_help_option(type)) {
         GSList *l, *list;
 
@@ -2711,6 +2713,38 @@ static bool object_create_initial(const char *type)
         exit(0);
     }
 
+    klass = object_class_by_name(type);
+    if (klass && qemu_opt_has_help_opt(opts)) {
+        ObjectPropertyIterator iter;
+        ObjectProperty *prop;
+        GPtrArray *array = g_ptr_array_new();
+        int i;
+
+        object_class_property_iter_init(&iter, klass);
+        while ((prop = object_property_iter_next(&iter))) {
+            GString *str;
+
+            if (!prop->set) {
+                continue;
+            }
+
+            str = g_string_new(NULL);
+            g_string_append_printf(str, "%s.%s=%s", type,
+                                   prop->name, prop->type);
+            if (prop->description) {
+                g_string_append_printf(str, " - %s", prop->description);
+            }
+            g_ptr_array_add(array, g_string_free(str, false));
+        }
+        g_ptr_array_sort(array, (GCompareFunc)qemu_pstrcmp0);
+        for (i = 0; i < array->len; i++) {
+            printf("%s\n", (char *)array->pdata[i]);
+        }
+        g_ptr_array_set_free_func(array, g_free);
+        g_ptr_array_free(array, true);
+        exit(0);
+    }
+
     if (g_str_equal(type, "rng-egd") ||
         g_str_has_prefix(type, "pr-manager-")) {
         return false;
@@ -2757,9 +2791,9 @@ static bool object_create_initial(const char *type)
  * The remainder of object creation happens after the
  * creation of chardev, fsdev, net clients and device data types.
  */
-static bool object_create_delayed(const char *type)
+static bool object_create_delayed(const char *type, QemuOpts *opts)
 {
-    return !object_create_initial(type);
+    return !object_create_initial(type, opts);
 }
 
 
-- 
2.19.0.271.gfe8321ec05

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

* Re: [Qemu-devel] [PULL v2 00/12] Option patches
  2018-10-05 12:28 [Qemu-devel] [PULL v2 00/12] Option patches Marc-André Lureau
                   ` (11 preceding siblings ...)
  2018-10-05 12:29 ` [Qemu-devel] [PULL v2 12/12] vl: list user creatable properties when 'help' is argument Marc-André Lureau
@ 2018-10-08 10:10 ` Peter Maydell
  12 siblings, 0 replies; 14+ messages in thread
From: Peter Maydell @ 2018-10-08 10:10 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: QEMU Developers

On 5 October 2018 at 13:28, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
> The following changes since commit b8e5671a8cd196e7262802ca895bf87d50416989:
>
>   Merge remote-tracking branch 'remotes/elmarco/tags/chardev-pull-request' into staging (2018-10-03 14:07:49 +0100)
>
> are available in the Git repository at:
>
>   https://github.com/elmarco/qemu.git tags/option-pull-request
>
> for you to fetch changes up to 1195fa2b08d98ab503155c5cee8831d1ef91aac5:
>
>   vl: list user creatable properties when 'help' is argument (2018-10-05 16:27:09 +0400)
>
> ----------------------------------------------------------------
> CLI help improvements
>
> PULLv2:
>  - fix uninitialized "seentype" variable in qom-test
>

Applied, thanks.

-- PMM

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

end of thread, other threads:[~2018-10-08 10:11 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-05 12:28 [Qemu-devel] [PULL v2 00/12] Option patches Marc-André Lureau
2018-10-05 12:28 ` [Qemu-devel] [PULL v2 01/12] qdev-monitor: print help to stdout Marc-André Lureau
2018-10-05 12:29 ` [Qemu-devel] [PULL v2 02/12] cutils: add qemu_pstrcmp0() Marc-André Lureau
2018-10-05 12:29 ` [Qemu-devel] [PULL v2 03/12] qemu-option: add help fallback to print the list of options Marc-André Lureau
2018-10-05 12:29 ` [Qemu-devel] [PULL v2 04/12] qemu-option: improve qemu_opts_print_help() output Marc-André Lureau
2018-10-05 12:29 ` [Qemu-devel] [PULL v2 05/12] qom/object: fix iterating properties over a class Marc-André Lureau
2018-10-05 12:29 ` [Qemu-devel] [PULL v2 06/12] qom/object: register 'type' property as class property Marc-André Lureau
2018-10-05 12:29 ` [Qemu-devel] [PULL v2 07/12] tests/qom-proplist: check duplicate "bv" property registration failed Marc-André Lureau
2018-10-05 12:29 ` [Qemu-devel] [PULL v2 08/12] tests/qom-proplist: check properties are not listed multiple times Marc-André Lureau
2018-10-05 12:29 ` [Qemu-devel] [PULL v2 09/12] tests/qom-proplist: check class properties iterator Marc-André Lureau
2018-10-05 12:29 ` [Qemu-devel] [PULL v2 10/12] vl: handle -object help Marc-André Lureau
2018-10-05 12:29 ` [Qemu-devel] [PULL v2 11/12] hostmem: add some properties description Marc-André Lureau
2018-10-05 12:29 ` [Qemu-devel] [PULL v2 12/12] vl: list user creatable properties when 'help' is argument Marc-André Lureau
2018-10-08 10:10 ` [Qemu-devel] [PULL v2 00/12] Option patches Peter Maydell

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.