All of lore.kernel.org
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: qemu-devel@nongnu.org
Subject: [PATCH 73/86] sparc:sun4m: use memdev for RAM
Date: Tue, 31 Dec 2019 14:03:57 +0100	[thread overview]
Message-ID: <1577797450-88458-74-git-send-email-imammedo@redhat.com> (raw)
In-Reply-To: <1577797450-88458-1-git-send-email-imammedo@redhat.com>

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Patch moves ram size check into sun4m_hw_init() and drops
ram_init() moving remainder to sun4m_hw_init() as well,
as it was the only place that called it.

Also it rewrites impl. of RamDevice a little bit, which
could serve as an example of frontend device for RAM backend.
(Caveats are:
  1. it doesn't check for memdev backend being mapped
     since it's been  usurped by generic machine to handle
     majority of machines which don't have RAM frontend device
  2. it still lacks 'addr' property and still has hardcoded
     sysbus_mmio_map() in board init. If done right, board should
     set 'addr' property and bus/machine plug handler should map
     it during device realize time.
)
Further improvements were left as exercise for the future,
since frontends are out scope of RAM conversion to memdev.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/sparc/sun4m.c | 73 ++++++++++++++++++++++++++++----------------------------
 1 file changed, 36 insertions(+), 37 deletions(-)

diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 2aaa5bf..834ad2a 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -777,63 +777,42 @@ static const TypeInfo prom_info = {
 
 typedef struct RamDevice {
     SysBusDevice parent_obj;
-
-    MemoryRegion ram;
-    uint64_t size;
+    HostMemoryBackend *memdev;
 } RamDevice;
 
 /* System RAM */
 static void ram_realize(DeviceState *dev, Error **errp)
 {
     RamDevice *d = SUN4M_RAM(dev);
-    SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
+    MemoryRegion *ram = host_memory_backend_get_memory(d->memdev);
 
-    memory_region_allocate_system_memory(&d->ram, OBJECT(d), "sun4m.ram",
-                                         d->size);
-    sysbus_init_mmio(sbd, &d->ram);
+    sysbus_init_mmio(SYS_BUS_DEVICE(dev), ram);
 }
 
-static void ram_init(hwaddr addr, ram_addr_t RAM_size,
-                     uint64_t max_mem)
+static void ram_initfn(Object *obj)
 {
-    DeviceState *dev;
-    SysBusDevice *s;
-    RamDevice *d;
-
-    /* allocate RAM */
-    if ((uint64_t)RAM_size > max_mem) {
-        error_report("Too much memory for this machine: %" PRId64 ","
-                     " maximum %" PRId64,
-                     RAM_size / MiB, max_mem / MiB);
-        exit(1);
-    }
-    dev = qdev_create(NULL, "memory");
-    s = SYS_BUS_DEVICE(dev);
-
-    d = SUN4M_RAM(dev);
-    d->size = RAM_size;
-    qdev_init_nofail(dev);
-
-    sysbus_mmio_map(s, 0, addr);
+    RamDevice *d = SUN4M_RAM(obj);
+    object_property_add_link(obj, "memdev", TYPE_MEMORY_BACKEND,
+                             (Object **)&d->memdev,
+                             object_property_allow_set_link,
+                             OBJ_PROP_LINK_STRONG, &error_abort);
+    object_property_set_description(obj, "memdev", "Set RAM backend"
+                                    "Valid value is ID of a hostmem backend",
+                                     &error_abort);
 }
 
-static Property ram_properties[] = {
-    DEFINE_PROP_UINT64("size", RamDevice, size, 0),
-    DEFINE_PROP_END_OF_LIST(),
-};
-
 static void ram_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = ram_realize;
-    dc->props = ram_properties;
 }
 
 static const TypeInfo ram_info = {
     .name          = TYPE_SUN4M_MEMORY,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(RamDevice),
+    .instance_init = ram_initfn,
     .class_init    = ram_class_init,
 };
 
@@ -880,6 +859,13 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
     unsigned int smp_cpus = machine->smp.cpus;
     unsigned int max_cpus = machine->smp.max_cpus;
 
+    if (machine->ram_size > hwdef->max_mem) {
+        error_report("Too much memory for this machine: %" PRId64 ","
+                     " maximum %" PRId64,
+                     machine->ram_size / MiB, hwdef->max_mem / MiB);
+        exit(1);
+    }
+
     /* init CPUs */
     for(i = 0; i < smp_cpus; i++) {
         cpu_devinit(machine->cpu_type, i, hwdef->slavio_base, &cpu_irqs[i]);
@@ -888,9 +874,13 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
     for (i = smp_cpus; i < MAX_CPUS; i++)
         cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
 
+    /* Create and map RAM frontend */
+    dev = qdev_create(NULL, "memory");
+    object_property_set_link(OBJECT(dev), OBJECT(machine->ram_memdev),
+                             "memdev", &error_fatal);
+    qdev_init_nofail(dev);
+    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0);
 
-    /* set up devices */
-    ram_init(0, machine->ram_size, hwdef->max_mem);
     /* models without ECC don't trap when missing ram is accessed */
     if (!hwdef->ecc_base) {
         empty_slot_init(machine->ram_size, hwdef->max_mem - machine->ram_size);
@@ -1078,7 +1068,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
 
     fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)smp_cpus);
     fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)max_cpus);
-    fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
+    fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)machine->ram_size);
     fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
     fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth);
     fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_WIDTH, graphic_width);
@@ -1415,6 +1405,7 @@ static void ss5_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss5_type = {
@@ -1434,6 +1425,7 @@ static void ss10_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss10_type = {
@@ -1453,6 +1445,7 @@ static void ss600mp_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss600mp_type = {
@@ -1472,6 +1465,7 @@ static void ss20_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss20_type = {
@@ -1490,6 +1484,7 @@ static void voyager_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo voyager_type = {
@@ -1508,6 +1503,7 @@ static void ss_lx_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss_lx_type = {
@@ -1526,6 +1522,7 @@ static void ss4_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss4_type = {
@@ -1544,6 +1541,7 @@ static void scls_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo scls_type = {
@@ -1562,6 +1560,7 @@ static void sbook_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo sbook_type = {
-- 
2.7.4



  parent reply	other threads:[~2019-12-31 13:47 UTC|newest]

Thread overview: 148+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
2019-12-31 13:02 ` [PATCH 01/86] numa: remove not needed check Igor Mammedov
2019-12-31 13:02 ` [PATCH 02/86] numa: properly check if numa is supported Igor Mammedov
2019-12-31 13:02 ` [PATCH 03/86] numa: remove deprecated -mem-path fallback to anonymous RAM Igor Mammedov
2019-12-31 13:02 ` [PATCH 04/86] machine: introduce ram-memdev property Igor Mammedov
2019-12-31 13:02 ` [PATCH 05/86] machine: alias -mem-path and -mem-prealloc into memory-foo backend Igor Mammedov
2019-12-31 13:02 ` [PATCH 06/86] machine: introduce convenience MachineState::ram Igor Mammedov
2019-12-31 13:02 ` [PATCH 07/86] initialize MachineState::ram in NUMA case Igor Mammedov
2019-12-31 13:02 ` [PATCH 08/86] alpha:dp264: use memdev for RAM Igor Mammedov
2019-12-31 16:11   ` Philippe Mathieu-Daudé
2020-01-06  0:37   ` Richard Henderson
2019-12-31 13:02 ` [PATCH 09/86] arm:aspeed: convert valid RAM sizes to data Igor Mammedov
2019-12-31 13:02 ` [PATCH 10/86] arm:aspeed: actually check RAM size Igor Mammedov
2019-12-31 13:02 ` [PATCH 11/86] hw:aspeed: drop warning and bogus ram_size fixup Igor Mammedov
2019-12-31 13:02 ` [PATCH 12/86] arm:aspeed: use memdev for RAM Igor Mammedov
2019-12-31 13:02 ` [PATCH 13/86] arm:collie: " Igor Mammedov
2019-12-31 13:02 ` [PATCH 14/86] arm:cubieboard: " Igor Mammedov
2019-12-31 13:02 ` [PATCH 15/86] arm:digic_boards: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 16/86] arm:highbank: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 17/86] arm:imx25_pdk: drop RAM size fixup Igor Mammedov
2019-12-31 13:03 ` [PATCH 18/86] arm:imx25_pdk: use memdev for RAM Igor Mammedov
2019-12-31 13:03 ` [PATCH 19/86] arm:integratorcp: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 20/86] arm:kzm: drop RAM size fixup Igor Mammedov
2019-12-31 13:03 ` [PATCH 21/86] arm:kzm: use memdev for RAM Igor Mammedov
2019-12-31 16:10   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 22/86] arm:mcimx6ul-evk: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 23/86] arm:mcimx7d-sabre: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 24/86] arm:mps2-tz: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 25/86] arm:mps2: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 26/86] arm:musicpal: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 27/86] arm:nseries: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 28/86] arm:omap_sx1: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 29/86] arm:palm: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 30/86] arm:raspi: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 31/86] arm:sabrelite: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 32/86] arm:sbsa-ref: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 33/86] arm:versatilepb: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 34/86] arm:vexpress: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 35/86] arm:virt: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 36/86] arm:xilinx_zynq: drop RAM size fixup Igor Mammedov
2019-12-31 13:03 ` [PATCH 37/86] arm:xilinx_zynq: use memdev for RAM Igor Mammedov
2019-12-31 13:03 ` [PATCH 38/86] arm:xlnx-versal-virt: " Igor Mammedov
2019-12-31 16:05   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 39/86] arm:xlnx-zcu102: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 40/86] s390x:s390-virtio-ccw: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 41/86] null-machine: " Igor Mammedov
2019-12-31 15:32   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 42/86] cris:axis_dev88: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 43/86] hppa: drop RAM size fixup Igor Mammedov
2019-12-31 15:44   ` Philippe Mathieu-Daudé
2020-01-02 11:31     ` Helge Deller
2020-01-02 12:06       ` Philippe Mathieu-Daudé
2020-01-02 13:02         ` Helge Deller
2020-01-02 14:47           ` Igor Mammedov
2020-01-02 14:12         ` Igor Mammedov
2020-01-02 14:17           ` Philippe Mathieu-Daudé
2020-01-02 15:08             ` Igor Mammedov
2020-01-02 15:49               ` Philippe Mathieu-Daudé
2020-01-02 16:50                 ` Igor Mammedov
2020-01-02 17:14                   ` Philippe Mathieu-Daudé
2020-01-02 17:32                     ` Igor Mammedov
2020-01-02 20:09                 ` Helge Deller
2020-01-02 14:41       ` Igor Mammedov
2020-01-02 14:45         ` Philippe Mathieu-Daudé
2020-01-02 15:35           ` Igor Mammedov
2020-01-02 15:40             ` Philippe Mathieu-Daudé
2020-01-02 17:08   ` [PATCH] hppa: allow max ram size upto 4Gb Igor Mammedov
2020-01-02 17:15     ` Philippe Mathieu-Daudé
2020-01-02 17:36       ` Igor Mammedov
2020-01-02 17:46       ` [PATCH v2] " Igor Mammedov
2020-01-02 20:22         ` Helge Deller
2020-01-03  9:54           ` Igor Mammedov
2020-01-04 15:00             ` Philippe Mathieu-Daudé
2020-01-06 10:48               ` Igor Mammedov
2020-01-06 11:05                 ` Philippe Mathieu-Daudé
2020-01-06 11:28                 ` Helge Deller
2020-01-06 16:24                   ` Igor Mammedov
2020-01-06 17:03                     ` Helge Deller
2020-01-07 11:21                       ` Igor Mammedov
2020-01-07 11:53                         ` Helge Deller
2020-01-07 15:17                           ` Igor Mammedov
2020-01-07 15:34   ` [PATCH v3 43/86] " Igor Mammedov
2019-12-31 13:03 ` [PATCH 44/86] hppa: use memdev for RAM Igor Mammedov
2019-12-31 15:45   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 45/86] x86:microvm: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 46/86] x86:pc: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 47/86] lm32:lm32_boards: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 48/86] lm32:milkymist: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 49/86] m68k:an5206: " Igor Mammedov
2020-01-07 16:11   ` Thomas Huth
2019-12-31 13:03 ` [PATCH 50/86] m68k:mcf5208: " Igor Mammedov
2020-01-07 16:11   ` Thomas Huth
2019-12-31 13:03 ` [PATCH 51/86] m68k:next-cube: " Igor Mammedov
2020-01-07 16:12   ` Thomas Huth
2019-12-31 13:03 ` [PATCH 52/86] mips:boston-cube: " Igor Mammedov
2019-12-31 16:08   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 53/86] mips:mips_fulong2e: drop RAM size fixup Igor Mammedov
2019-12-31 13:03 ` [PATCH 54/86] mips:mips_fulong2e: use memdev for RAM Igor Mammedov
2019-12-31 13:03 ` [PATCH 55/86] mips:mips_jazz: " Igor Mammedov
2019-12-31 16:06   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 56/86] mips:mips_malta: " Igor Mammedov
2019-12-31 16:07   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 57/86] mips:mips_mipssim: " Igor Mammedov
2019-12-31 16:07   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 58/86] mips:mips_r4k: " Igor Mammedov
2019-12-31 16:08   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 59/86] ppc:e500: drop RAM size fixup Igor Mammedov
2019-12-31 13:03 ` [PATCH 60/86] ppc:e500: use memdev for RAM Igor Mammedov
2019-12-31 13:03 ` [PATCH 61/86] ppc:mac_newworld: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 62/86] ppc:mac_oldworld: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 63/86] ppc:pnv: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 64/86] ppc:ppc405_boards: add RAM size checks Igor Mammedov
2019-12-31 13:03 ` [PATCH 65/86] ppc:ppc405_boards: use memdev for RAM Igor Mammedov
2019-12-31 13:03 ` [PATCH 66/86] ppc:ppc440_bamboo/sam460ex: drop RAM size fixup Igor Mammedov
2020-01-01 11:54   ` BALATON Zoltan
2020-01-01 15:39     ` Philippe Mathieu-Daudé
2020-01-01 18:45       ` BALATON Zoltan
2020-01-02 11:47     ` Igor Mammedov
2020-01-02 15:52       ` BALATON Zoltan
2020-01-02 17:19         ` Igor Mammedov
2020-01-10 17:14         ` Igor Mammedov
2019-12-31 13:03 ` [PATCH 67/86] ppc:ppc440_bamboo/sam460ex: use memdev for RAM Igor Mammedov
2019-12-31 13:03 ` [PATCH 68/86] ppc:prep: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 69/86] ppc:spapr: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 70/86] ppc:virtex_ml507: remove unused arguments Igor Mammedov
2019-12-31 13:03 ` [PATCH 71/86] ppc:virtex_ml507: use memdev for RAM Igor Mammedov
2019-12-31 13:03 ` [PATCH 72/86] sparc:leon3: " Igor Mammedov
2019-12-31 16:02   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` Igor Mammedov [this message]
2019-12-31 13:03 ` [PATCH 74/86] sparc:niagara: " Igor Mammedov
2019-12-31 16:02   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 75/86] remove no longer used memory_region_allocate_system_memory() Igor Mammedov
2019-12-31 13:04 ` [PATCH 76/86] post conversion default_ram_id cleanup Igor Mammedov
2019-12-31 16:04   ` Philippe Mathieu-Daudé
2019-12-31 13:04 ` [PATCH 77/86] exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize() Igor Mammedov
2019-12-31 13:04 ` [PATCH 78/86] exec: drop bogus mem_path from qemu_ram_alloc_from_fd() Igor Mammedov
2019-12-31 13:04 ` [PATCH 79/86] make mem_path local variable Igor Mammedov
2019-12-31 13:04 ` [PATCH 80/86] hostmem: introduce "prealloc-threads" property Igor Mammedov
2019-12-31 13:04 ` [PATCH 81/86] hostmem: fix strict bind policy Igor Mammedov
2019-12-31 13:04 ` [PATCH 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types Igor Mammedov
2019-12-31 13:04 ` [PATCH 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups Igor Mammedov
2019-12-31 13:04 ` [PATCH 84/86] tests:numa-test: use explicit memdev to specify node RAM Igor Mammedov
2019-12-31 13:04 ` [PATCH 85/86] numa: make exit() usage consistent Igor Mammedov
2019-12-31 13:04 ` [PATCH 86/86] numa: remove deprecated implicit RAM distribution between nodes Igor Mammedov
2019-12-31 15:58 ` [PATCH 00/86] refactor main RAM allocation to use hostmem backend Philippe Mathieu-Daudé
2019-12-31 16:22   ` Igor Mammedov
2020-01-03 13:06   ` Igor Mammedov
2020-01-03 13:15     ` Philippe Mathieu-Daudé

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=1577797450-88458-74-git-send-email-imammedo@redhat.com \
    --to=imammedo@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.