All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: kwolf@redhat.com, qemu-devel@nongnu.org,
	Eduardo Habkost <ehabkost@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 11/17] hw/core: Collect HMP command handlers in hw/core/
Date: Thu, 20 Jun 2019 10:56:05 +0100	[thread overview]
Message-ID: <20190620095604.GE2907@work-vm> (raw)
In-Reply-To: <20190619201050.19040-12-armbru@redhat.com>

* Markus Armbruster (armbru@redhat.com) wrote:
> Move the HMP handlers related to qapi/machine.json to
> hw/core/machine-hmp-cmds.c, where they are covered by MAINTAINERS
> section "Machine core", just like qapi/machine.json.
> 
> Cc: Eduardo Habkost <ehabkost@redhat.com>
> Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
> Cc: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>

> ---
>  hw/core/Makefile.objs      |   1 +
>  hw/core/machine-hmp-cmds.c | 164 +++++++++++++++++++++++++++++++++++++
>  include/monitor/hmp.h      |   1 +
>  monitor/hmp-cmds.c         | 111 -------------------------
>  monitor/misc.c             |  32 +-------
>  5 files changed, 168 insertions(+), 141 deletions(-)
>  create mode 100644 hw/core/machine-hmp-cmds.c
> 
> diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs
> index 99e7abe982..585b734358 100644
> --- a/hw/core/Makefile.objs
> +++ b/hw/core/Makefile.objs
> @@ -25,3 +25,4 @@ common-obj-$(CONFIG_SOFTMMU) += null-machine.o
>  
>  obj-$(CONFIG_SOFTMMU) += machine-qmp-cmds.o
>  obj-$(CONFIG_SOFTMMU) += numa.o
> +common-obj-$(CONFIG_SOFTMMU) += machine-hmp-cmds.o
> diff --git a/hw/core/machine-hmp-cmds.c b/hw/core/machine-hmp-cmds.c
> new file mode 100644
> index 0000000000..7fa6075f1e
> --- /dev/null
> +++ b/hw/core/machine-hmp-cmds.c
> @@ -0,0 +1,164 @@
> +/*
> + * HMP commands related to machines and CPUs
> + *
> + * Copyright IBM, Corp. 2011
> + *
> + * Authors:
> + *  Anthony Liguori   <aliguori@us.ibm.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2.  See
> + * the COPYING file in the top-level directory.
> + *
> + * Contributions after 2012-01-13 are licensed under the terms of the
> + * GNU GPL, version 2 or (at your option) any later version.
> + */
> +
> +#include "qemu/osdep.h"
> +#include "monitor/hmp.h"
> +#include "monitor/monitor.h"
> +#include "qapi/error.h"
> +#include "qapi/qapi-builtin-visit.h"
> +#include "qapi/qapi-commands-machine.h"
> +#include "qapi/qmp/qdict.h"
> +#include "qapi/string-output-visitor.h"
> +#include "qemu/error-report.h"
> +#include "sysemu/numa.h"
> +
> +void hmp_info_cpus(Monitor *mon, const QDict *qdict)
> +{
> +    CpuInfoFastList *cpu_list, *cpu;
> +
> +    cpu_list = qmp_query_cpus_fast(NULL);
> +
> +    for (cpu = cpu_list; cpu; cpu = cpu->next) {
> +        int active = ' ';
> +
> +        if (cpu->value->cpu_index == monitor_get_cpu_index()) {
> +            active = '*';
> +        }
> +
> +        monitor_printf(mon, "%c CPU #%" PRId64 ":", active,
> +                       cpu->value->cpu_index);
> +        monitor_printf(mon, " thread_id=%" PRId64 "\n", cpu->value->thread_id);
> +    }
> +
> +    qapi_free_CpuInfoFastList(cpu_list);
> +}
> +
> +void hmp_cpu_add(Monitor *mon, const QDict *qdict)
> +{
> +    int cpuid;
> +    Error *err = NULL;
> +
> +    error_report("cpu_add is deprecated, please use device_add instead");
> +
> +    cpuid = qdict_get_int(qdict, "id");
> +    qmp_cpu_add(cpuid, &err);
> +    hmp_handle_error(mon, &err);
> +}
> +
> +void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict)
> +{
> +    Error *err = NULL;
> +    HotpluggableCPUList *l = qmp_query_hotpluggable_cpus(&err);
> +    HotpluggableCPUList *saved = l;
> +    CpuInstanceProperties *c;
> +
> +    if (err != NULL) {
> +        hmp_handle_error(mon, &err);
> +        return;
> +    }
> +
> +    monitor_printf(mon, "Hotpluggable CPUs:\n");
> +    while (l) {
> +        monitor_printf(mon, "  type: \"%s\"\n", l->value->type);
> +        monitor_printf(mon, "  vcpus_count: \"%" PRIu64 "\"\n",
> +                       l->value->vcpus_count);
> +        if (l->value->has_qom_path) {
> +            monitor_printf(mon, "  qom_path: \"%s\"\n", l->value->qom_path);
> +        }
> +
> +        c = l->value->props;
> +        monitor_printf(mon, "  CPUInstance Properties:\n");
> +        if (c->has_node_id) {
> +            monitor_printf(mon, "    node-id: \"%" PRIu64 "\"\n", c->node_id);
> +        }
> +        if (c->has_socket_id) {
> +            monitor_printf(mon, "    socket-id: \"%" PRIu64 "\"\n", c->socket_id);
> +        }
> +        if (c->has_core_id) {
> +            monitor_printf(mon, "    core-id: \"%" PRIu64 "\"\n", c->core_id);
> +        }
> +        if (c->has_thread_id) {
> +            monitor_printf(mon, "    thread-id: \"%" PRIu64 "\"\n", c->thread_id);
> +        }
> +
> +        l = l->next;
> +    }
> +
> +    qapi_free_HotpluggableCPUList(saved);
> +}
> +
> +void hmp_info_memdev(Monitor *mon, const QDict *qdict)
> +{
> +    Error *err = NULL;
> +    MemdevList *memdev_list = qmp_query_memdev(&err);
> +    MemdevList *m = memdev_list;
> +    Visitor *v;
> +    char *str;
> +
> +    while (m) {
> +        v = string_output_visitor_new(false, &str);
> +        visit_type_uint16List(v, NULL, &m->value->host_nodes, NULL);
> +        monitor_printf(mon, "memory backend: %s\n", m->value->id);
> +        monitor_printf(mon, "  size:  %" PRId64 "\n", m->value->size);
> +        monitor_printf(mon, "  merge: %s\n",
> +                       m->value->merge ? "true" : "false");
> +        monitor_printf(mon, "  dump: %s\n",
> +                       m->value->dump ? "true" : "false");
> +        monitor_printf(mon, "  prealloc: %s\n",
> +                       m->value->prealloc ? "true" : "false");
> +        monitor_printf(mon, "  policy: %s\n",
> +                       HostMemPolicy_str(m->value->policy));
> +        visit_complete(v, &str);
> +        monitor_printf(mon, "  host nodes: %s\n", str);
> +
> +        g_free(str);
> +        visit_free(v);
> +        m = m->next;
> +    }
> +
> +    monitor_printf(mon, "\n");
> +
> +    qapi_free_MemdevList(memdev_list);
> +    hmp_handle_error(mon, &err);
> +}
> +
> +void hmp_info_numa(Monitor *mon, const QDict *qdict)
> +{
> +    int i;
> +    NumaNodeMem *node_mem;
> +    CpuInfoList *cpu_list, *cpu;
> +
> +    cpu_list = qmp_query_cpus(&error_abort);
> +    node_mem = g_new0(NumaNodeMem, nb_numa_nodes);
> +
> +    query_numa_node_mem(node_mem);
> +    monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
> +    for (i = 0; i < nb_numa_nodes; i++) {
> +        monitor_printf(mon, "node %d cpus:", i);
> +        for (cpu = cpu_list; cpu; cpu = cpu->next) {
> +            if (cpu->value->has_props && cpu->value->props->has_node_id &&
> +                cpu->value->props->node_id == i) {
> +                monitor_printf(mon, " %" PRIi64, cpu->value->CPU);
> +            }
> +        }
> +        monitor_printf(mon, "\n");
> +        monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
> +                       node_mem[i].node_mem >> 20);
> +        monitor_printf(mon, "node %d plugged: %" PRId64 " MB\n", i,
> +                       node_mem[i].node_plugged_mem >> 20);
> +    }
> +    qapi_free_CpuInfoList(cpu_list);
> +    g_free(node_mem);
> +}
> diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h
> index f46ccdaa35..9d558e9d78 100644
> --- a/include/monitor/hmp.h
> +++ b/include/monitor/hmp.h
> @@ -117,6 +117,7 @@ void hmp_cpu_add(Monitor *mon, const QDict *qdict);
>  void hmp_object_add(Monitor *mon, const QDict *qdict);
>  void hmp_object_del(Monitor *mon, const QDict *qdict);
>  void hmp_info_memdev(Monitor *mon, const QDict *qdict);
> +void hmp_info_numa(Monitor *mon, const QDict *qdict);
>  void hmp_info_memory_devices(Monitor *mon, const QDict *qdict);
>  void hmp_qom_list(Monitor *mon, const QDict *qdict);
>  void hmp_qom_set(Monitor *mon, const QDict *qdict);
> diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
> index 789f763938..ea8ae2966e 100644
> --- a/monitor/hmp-cmds.c
> +++ b/monitor/hmp-cmds.c
> @@ -31,7 +31,6 @@
>  #include "qapi/qapi-builtin-visit.h"
>  #include "qapi/qapi-commands-block.h"
>  #include "qapi/qapi-commands-char.h"
> -#include "qapi/qapi-commands-machine.h"
>  #include "qapi/qapi-commands-migration.h"
>  #include "qapi/qapi-commands-misc.h"
>  #include "qapi/qapi-commands-net.h"
> @@ -457,27 +456,6 @@ void hmp_info_migrate_cache_size(Monitor *mon, const QDict *qdict)
>                     qmp_query_migrate_cache_size(NULL) >> 10);
>  }
>  
> -void hmp_info_cpus(Monitor *mon, const QDict *qdict)
> -{
> -    CpuInfoFastList *cpu_list, *cpu;
> -
> -    cpu_list = qmp_query_cpus_fast(NULL);
> -
> -    for (cpu = cpu_list; cpu; cpu = cpu->next) {
> -        int active = ' ';
> -
> -        if (cpu->value->cpu_index == monitor_get_cpu_index()) {
> -            active = '*';
> -        }
> -
> -        monitor_printf(mon, "%c CPU #%" PRId64 ":", active,
> -                       cpu->value->cpu_index);
> -        monitor_printf(mon, " thread_id=%" PRId64 "\n", cpu->value->thread_id);
> -    }
> -
> -    qapi_free_CpuInfoFastList(cpu_list);
> -}
> -
>  static void print_block_info(Monitor *mon, BlockInfo *info,
>                               BlockDeviceInfo *inserted, bool verbose)
>  {
> @@ -2472,18 +2450,6 @@ void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, &err);
>  }
>  
> -void hmp_cpu_add(Monitor *mon, const QDict *qdict)
> -{
> -    int cpuid;
> -    Error *err = NULL;
> -
> -    error_report("cpu_add is deprecated, please use device_add instead");
> -
> -    cpuid = qdict_get_int(qdict, "id");
> -    qmp_cpu_add(cpuid, &err);
> -    hmp_handle_error(mon, &err);
> -}
> -
>  void hmp_chardev_add(Monitor *mon, const QDict *qdict)
>  {
>      const char *args = qdict_get_str(qdict, "args");
> @@ -2615,41 +2581,6 @@ void hmp_object_del(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, &err);
>  }
>  
> -void hmp_info_memdev(Monitor *mon, const QDict *qdict)
> -{
> -    Error *err = NULL;
> -    MemdevList *memdev_list = qmp_query_memdev(&err);
> -    MemdevList *m = memdev_list;
> -    Visitor *v;
> -    char *str;
> -
> -    while (m) {
> -        v = string_output_visitor_new(false, &str);
> -        visit_type_uint16List(v, NULL, &m->value->host_nodes, NULL);
> -        monitor_printf(mon, "memory backend: %s\n", m->value->id);
> -        monitor_printf(mon, "  size:  %" PRId64 "\n", m->value->size);
> -        monitor_printf(mon, "  merge: %s\n",
> -                       m->value->merge ? "true" : "false");
> -        monitor_printf(mon, "  dump: %s\n",
> -                       m->value->dump ? "true" : "false");
> -        monitor_printf(mon, "  prealloc: %s\n",
> -                       m->value->prealloc ? "true" : "false");
> -        monitor_printf(mon, "  policy: %s\n",
> -                       HostMemPolicy_str(m->value->policy));
> -        visit_complete(v, &str);
> -        monitor_printf(mon, "  host nodes: %s\n", str);
> -
> -        g_free(str);
> -        visit_free(v);
> -        m = m->next;
> -    }
> -
> -    monitor_printf(mon, "\n");
> -
> -    qapi_free_MemdevList(memdev_list);
> -    hmp_handle_error(mon, &err);
> -}
> -
>  void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
>  {
>      Error *err = NULL;
> @@ -3039,48 +2970,6 @@ void hmp_info_ramblock(Monitor *mon, const QDict *qdict)
>      ram_block_dump(mon);
>  }
>  
> -void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict)
> -{
> -    Error *err = NULL;
> -    HotpluggableCPUList *l = qmp_query_hotpluggable_cpus(&err);
> -    HotpluggableCPUList *saved = l;
> -    CpuInstanceProperties *c;
> -
> -    if (err != NULL) {
> -        hmp_handle_error(mon, &err);
> -        return;
> -    }
> -
> -    monitor_printf(mon, "Hotpluggable CPUs:\n");
> -    while (l) {
> -        monitor_printf(mon, "  type: \"%s\"\n", l->value->type);
> -        monitor_printf(mon, "  vcpus_count: \"%" PRIu64 "\"\n",
> -                       l->value->vcpus_count);
> -        if (l->value->has_qom_path) {
> -            monitor_printf(mon, "  qom_path: \"%s\"\n", l->value->qom_path);
> -        }
> -
> -        c = l->value->props;
> -        monitor_printf(mon, "  CPUInstance Properties:\n");
> -        if (c->has_node_id) {
> -            monitor_printf(mon, "    node-id: \"%" PRIu64 "\"\n", c->node_id);
> -        }
> -        if (c->has_socket_id) {
> -            monitor_printf(mon, "    socket-id: \"%" PRIu64 "\"\n", c->socket_id);
> -        }
> -        if (c->has_core_id) {
> -            monitor_printf(mon, "    core-id: \"%" PRIu64 "\"\n", c->core_id);
> -        }
> -        if (c->has_thread_id) {
> -            monitor_printf(mon, "    thread-id: \"%" PRIu64 "\"\n", c->thread_id);
> -        }
> -
> -        l = l->next;
> -    }
> -
> -    qapi_free_HotpluggableCPUList(saved);
> -}
> -
>  void hmp_info_vm_generation_id(Monitor *mon, const QDict *qdict)
>  {
>      Error *err = NULL;
> diff --git a/monitor/misc.c b/monitor/misc.c
> index 45f3f55a4d..00338c002a 100644
> --- a/monitor/misc.c
> +++ b/monitor/misc.c
> @@ -36,7 +36,6 @@
>  #include "net/slirp.h"
>  #include "chardev/char-mux.h"
>  #include "ui/qemu-spice.h"
> -#include "sysemu/numa.h"
>  #include "qemu/config-file.h"
>  #include "qemu/ctype.h"
>  #include "ui/console.h"
> @@ -48,6 +47,8 @@
>  #include "sysemu/hw_accel.h"
>  #include "authz/list.h"
>  #include "qapi/util.h"
> +#include "sysemu/blockdev.h"
> +#include "sysemu/sysemu.h"
>  #include "sysemu/tcg.h"
>  #include "sysemu/tpm.h"
>  #include "qapi/qmp/qdict.h"
> @@ -1081,35 +1082,6 @@ static void hmp_info_mtree(Monitor *mon, const QDict *qdict)
>      mtree_info(flatview, dispatch_tree, owner);
>  }
>  
> -static void hmp_info_numa(Monitor *mon, const QDict *qdict)
> -{
> -    int i;
> -    NumaNodeMem *node_mem;
> -    CpuInfoList *cpu_list, *cpu;
> -
> -    cpu_list = qmp_query_cpus(&error_abort);
> -    node_mem = g_new0(NumaNodeMem, nb_numa_nodes);
> -
> -    query_numa_node_mem(node_mem);
> -    monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
> -    for (i = 0; i < nb_numa_nodes; i++) {
> -        monitor_printf(mon, "node %d cpus:", i);
> -        for (cpu = cpu_list; cpu; cpu = cpu->next) {
> -            if (cpu->value->has_props && cpu->value->props->has_node_id &&
> -                cpu->value->props->node_id == i) {
> -                monitor_printf(mon, " %" PRIi64, cpu->value->CPU);
> -            }
> -        }
> -        monitor_printf(mon, "\n");
> -        monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
> -                       node_mem[i].node_mem >> 20);
> -        monitor_printf(mon, "node %d plugged: %" PRId64 " MB\n", i,
> -                       node_mem[i].node_plugged_mem >> 20);
> -    }
> -    qapi_free_CpuInfoList(cpu_list);
> -    g_free(node_mem);
> -}
> -
>  #ifdef CONFIG_PROFILER
>  
>  int64_t dev_time;
> -- 
> 2.21.0
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK


  parent reply	other threads:[~2019-06-20  9:59 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-19 20:10 [Qemu-devel] [PATCH 00/17] Move QOM, qdev, machine core and dump code Markus Armbruster
2019-06-19 20:10 ` [Qemu-devel] [PATCH 01/17] MAINTAINERS: new maintainers for QOM Markus Armbruster
2019-06-19 20:31   ` Andreas Färber
2019-06-20  8:37     ` Paolo Bonzini
2019-06-24 11:07     ` Markus Armbruster
2019-06-20  8:31   ` Daniel P. Berrangé
2019-06-19 20:10 ` [Qemu-devel] [PATCH 02/17] Makefile: Don't add monitor/ twice to common-obj-y Markus Armbruster
2019-06-20  8:32   ` Daniel P. Berrangé
2019-06-19 20:10 ` [Qemu-devel] [PATCH 03/17] hmp: Move hmp.h to include/monitor/ Markus Armbruster
2019-06-20  8:33   ` Daniel P. Berrangé
2019-06-20  9:48   ` Dr. David Alan Gilbert
2019-06-19 20:10 ` [Qemu-devel] [PATCH 04/17] qapi: Split qom.json and qdev.json off misc.json Markus Armbruster
2019-06-20  8:34   ` Daniel P. Berrangé
2019-06-20  8:38   ` Paolo Bonzini
2019-06-24 11:19     ` Markus Armbruster
2019-06-24 11:45       ` Daniel P. Berrangé
2019-06-19 20:10 ` [Qemu-devel] [PATCH 05/17] qom: Move QMP command handlers to qom/ Markus Armbruster
2019-06-20  8:35   ` Daniel P. Berrangé
2019-06-19 20:10 ` [Qemu-devel] [PATCH 06/17] qom: Move HMP " Markus Armbruster
2019-06-20  8:39   ` Daniel P. Berrangé
2019-06-20  9:51   ` Dr. David Alan Gilbert
2019-07-02  5:08   ` Markus Armbruster
2019-06-19 20:10 ` [Qemu-devel] [PATCH 07/17] MAINTAINERS: Merge sections CPU, NUMA into Machine core Markus Armbruster
2019-06-20  8:41   ` Daniel P. Berrangé
2019-06-24 11:22     ` Markus Armbruster
2019-07-08 22:54       ` Eduardo Habkost
2019-07-09  6:36         ` Markus Armbruster
2019-06-19 20:10 ` [Qemu-devel] [PATCH 08/17] qapi: Split machine.json off misc.json Markus Armbruster
2019-06-20  8:45   ` Daniel P. Berrangé
2019-06-19 20:10 ` [Qemu-devel] [PATCH 09/17] hw/core: Move numa.c to hw/core/ Markus Armbruster
2019-06-20  8:46   ` Daniel P. Berrangé
2019-06-19 20:10 ` [Qemu-devel] [PATCH 10/17] hw/core: Collect QMP command handlers in hw/core/ Markus Armbruster
2019-06-20  8:50   ` Daniel P. Berrangé
2019-06-19 20:10 ` [Qemu-devel] [PATCH 11/17] hw/core: Collect HMP " Markus Armbruster
2019-06-20  8:51   ` Daniel P. Berrangé
2019-06-20  9:56   ` Dr. David Alan Gilbert [this message]
2019-06-19 20:10 ` [Qemu-devel] [PATCH 12/17] qapi: Split machine-target.json off target.json and misc.json Markus Armbruster
2019-06-19 20:18   ` Eric Blake
2019-06-24 11:33     ` Markus Armbruster
2019-06-20  8:53   ` Daniel P. Berrangé
2019-06-19 20:10 ` [Qemu-devel] [PATCH 13/17] qapi: Rename target.json to misc-target.json Markus Armbruster
2019-06-20  8:54   ` Daniel P. Berrangé
2019-06-19 20:10 ` [Qemu-devel] [PATCH 14/17] qapi: Split dump.json off misc.json Markus Armbruster
2019-06-19 23:36   ` Marc-André Lureau
2019-06-20  8:54   ` Daniel P. Berrangé
2019-06-19 20:10 ` [Qemu-devel] [PATCH 15/17] dump: Move the code to dump/ Markus Armbruster
2019-06-19 23:37   ` Marc-André Lureau
2019-06-20  8:55   ` Daniel P. Berrangé
2019-06-19 20:10 ` [Qemu-devel] [PATCH 16/17] MAINTAINERS: Add Windows dump to section "Dump" Markus Armbruster
2019-06-19 23:38   ` Marc-André Lureau
2019-06-20  8:56   ` Daniel P. Berrangé
2019-06-24 11:31     ` Markus Armbruster
2019-06-19 20:10 ` [Qemu-devel] [PATCH 17/17] dump: Move HMP command handlers to dump/ Markus Armbruster
2019-06-19 20:19   ` Eric Blake
2019-06-24 11:34     ` Markus Armbruster
2019-06-20  8:57   ` Daniel P. Berrangé
2019-06-20  9:57   ` Dr. David Alan Gilbert

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190620095604.GE2907@work-vm \
    --to=dgilbert@redhat.com \
    --cc=armbru@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.