All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jason Wang <jasowang@redhat.com>
To: Peter Xu <peterx@redhat.com>, qemu-devel@nongnu.org
Cc: tianyu.lan@intel.com, kevin.tian@intel.com, mst@redhat.com,
	jan.kiszka@siemens.com, alex.williamson@redhat.com,
	bd.aviv@gmail.com, David Gibson <david@gibson.dropbear.id.au>
Subject: Re: [Qemu-devel] [PATCH v7 07/17] intel_iommu: convert dbg macros to traces for inv
Date: Wed, 8 Feb 2017 10:47:22 +0800	[thread overview]
Message-ID: <8376ce3f-539d-8d45-dd90-17d3de3b1d4d@redhat.com> (raw)
In-Reply-To: <1486456099-7345-8-git-send-email-peterx@redhat.com>



On 2017年02月07日 16:28, Peter Xu wrote:
> VT-d codes are still using static DEBUG_INTEL_IOMMU macro. That's not
> good, and we should end the day when we need to recompile the code
> before getting useful debugging information for vt-d. Time to switch to
> the trace system. This is the first patch to do it.
>
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
>   hw/i386/intel_iommu.c | 95 +++++++++++++++++++++------------------------------
>   hw/i386/trace-events  | 18 ++++++++++
>   2 files changed, 56 insertions(+), 57 deletions(-)

Reviewed-by: Jason Wang <jasowang@redhat.com>

> diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
> index 0c94b79..08e43b6 100644
> --- a/hw/i386/intel_iommu.c
> +++ b/hw/i386/intel_iommu.c
> @@ -35,6 +35,7 @@
>   #include "sysemu/kvm.h"
>   #include "hw/i386/apic_internal.h"
>   #include "kvm_i386.h"
> +#include "trace.h"
>   
>   /*#define DEBUG_INTEL_IOMMU*/
>   #ifdef DEBUG_INTEL_IOMMU
> @@ -474,22 +475,19 @@ static void vtd_handle_inv_queue_error(IntelIOMMUState *s)
>   /* Set the IWC field and try to generate an invalidation completion interrupt */
>   static void vtd_generate_completion_event(IntelIOMMUState *s)
>   {
> -    VTD_DPRINTF(INV, "completes an invalidation wait command with "
> -                "Interrupt Flag");
>       if (vtd_get_long_raw(s, DMAR_ICS_REG) & VTD_ICS_IWC) {
> -        VTD_DPRINTF(INV, "there is a previous interrupt condition to be "
> -                    "serviced by software, "
> -                    "new invalidation event is not generated");
> +        trace_vtd_inv_desc_wait_irq("One pending, skip current");
>           return;
>       }
>       vtd_set_clear_mask_long(s, DMAR_ICS_REG, 0, VTD_ICS_IWC);
>       vtd_set_clear_mask_long(s, DMAR_IECTL_REG, 0, VTD_IECTL_IP);
>       if (vtd_get_long_raw(s, DMAR_IECTL_REG) & VTD_IECTL_IM) {
> -        VTD_DPRINTF(INV, "IM filed in IECTL_REG is set, new invalidation "
> -                    "event is not generated");
> +        trace_vtd_inv_desc_wait_irq("IM in IECTL_REG is set, "
> +                                    "new event not generated");
>           return;
>       } else {
>           /* Generate the interrupt event */
> +        trace_vtd_inv_desc_wait_irq("Generating complete event");
>           vtd_generate_interrupt(s, DMAR_IEADDR_REG, DMAR_IEDATA_REG);
>           vtd_set_clear_mask_long(s, DMAR_IECTL_REG, VTD_IECTL_IP, 0);
>       }
> @@ -923,6 +921,7 @@ static void vtd_interrupt_remap_table_setup(IntelIOMMUState *s)
>   
>   static void vtd_context_global_invalidate(IntelIOMMUState *s)
>   {
> +    trace_vtd_inv_desc_cc_global();
>       s->context_cache_gen++;
>       if (s->context_cache_gen == VTD_CONTEXT_CACHE_GEN_MAX) {
>           vtd_reset_context_cache(s);
> @@ -962,9 +961,11 @@ static void vtd_context_device_invalidate(IntelIOMMUState *s,
>       uint16_t mask;
>       VTDBus *vtd_bus;
>       VTDAddressSpace *vtd_as;
> -    uint16_t devfn;
> +    uint8_t bus_n, devfn;
>       uint16_t devfn_it;
>   
> +    trace_vtd_inv_desc_cc_devices(source_id, func_mask);
> +
>       switch (func_mask & 3) {
>       case 0:
>           mask = 0;   /* No bits in the SID field masked */
> @@ -980,16 +981,16 @@ static void vtd_context_device_invalidate(IntelIOMMUState *s,
>           break;
>       }
>       mask = ~mask;
> -    VTD_DPRINTF(INV, "device-selective invalidation source 0x%"PRIx16
> -                    " mask %"PRIu16, source_id, mask);
> -    vtd_bus = vtd_find_as_from_bus_num(s, VTD_SID_TO_BUS(source_id));
> +
> +    bus_n = VTD_SID_TO_BUS(source_id);
> +    vtd_bus = vtd_find_as_from_bus_num(s, bus_n);
>       if (vtd_bus) {
>           devfn = VTD_SID_TO_DEVFN(source_id);
>           for (devfn_it = 0; devfn_it < X86_IOMMU_PCI_DEVFN_MAX; ++devfn_it) {
>               vtd_as = vtd_bus->dev_as[devfn_it];
>               if (vtd_as && ((devfn_it & mask) == (devfn & mask))) {
> -                VTD_DPRINTF(INV, "invalidate context-cahce of devfn 0x%"PRIx16,
> -                            devfn_it);
> +                trace_vtd_inv_desc_cc_device(bus_n, VTD_PCI_SLOT(devfn_it),
> +                                             VTD_PCI_FUNC(devfn_it));
>                   vtd_as->context_cache_entry.context_cache_gen = 0;
>               }
>           }
> @@ -1302,9 +1303,7 @@ static bool vtd_process_wait_desc(IntelIOMMUState *s, VTDInvDesc *inv_desc)
>   {
>       if ((inv_desc->hi & VTD_INV_DESC_WAIT_RSVD_HI) ||
>           (inv_desc->lo & VTD_INV_DESC_WAIT_RSVD_LO)) {
> -        VTD_DPRINTF(GENERAL, "error: non-zero reserved field in Invalidation "
> -                    "Wait Descriptor hi 0x%"PRIx64 " lo 0x%"PRIx64,
> -                    inv_desc->hi, inv_desc->lo);
> +        trace_vtd_inv_desc_wait_invalid(inv_desc->hi, inv_desc->lo);
>           return false;
>       }
>       if (inv_desc->lo & VTD_INV_DESC_WAIT_SW) {
> @@ -1316,21 +1315,18 @@ static bool vtd_process_wait_desc(IntelIOMMUState *s, VTDInvDesc *inv_desc)
>   
>           /* FIXME: need to be masked with HAW? */
>           dma_addr_t status_addr = inv_desc->hi;
> -        VTD_DPRINTF(INV, "status data 0x%x, status addr 0x%"PRIx64,
> -                    status_data, status_addr);
> +        trace_vtd_inv_desc_wait_sw(status_addr, status_data);
>           status_data = cpu_to_le32(status_data);
>           if (dma_memory_write(&address_space_memory, status_addr, &status_data,
>                                sizeof(status_data))) {
> -            VTD_DPRINTF(GENERAL, "error: fail to perform a coherent write");
> +            trace_vtd_inv_desc_wait_write_fail(inv_desc->hi, inv_desc->lo);
>               return false;
>           }
>       } else if (inv_desc->lo & VTD_INV_DESC_WAIT_IF) {
>           /* Interrupt flag */
> -        VTD_DPRINTF(INV, "Invalidation Wait Descriptor interrupt completion");
>           vtd_generate_completion_event(s);
>       } else {
> -        VTD_DPRINTF(GENERAL, "error: invalid Invalidation Wait Descriptor: "
> -                    "hi 0x%"PRIx64 " lo 0x%"PRIx64, inv_desc->hi, inv_desc->lo);
> +        trace_vtd_inv_desc_wait_invalid(inv_desc->hi, inv_desc->lo);
>           return false;
>       }
>       return true;
> @@ -1339,30 +1335,29 @@ static bool vtd_process_wait_desc(IntelIOMMUState *s, VTDInvDesc *inv_desc)
>   static bool vtd_process_context_cache_desc(IntelIOMMUState *s,
>                                              VTDInvDesc *inv_desc)
>   {
> +    uint16_t sid, fmask;
> +
>       if ((inv_desc->lo & VTD_INV_DESC_CC_RSVD) || inv_desc->hi) {
> -        VTD_DPRINTF(GENERAL, "error: non-zero reserved field in Context-cache "
> -                    "Invalidate Descriptor");
> +        trace_vtd_inv_desc_cc_invalid(inv_desc->hi, inv_desc->lo);
>           return false;
>       }
>       switch (inv_desc->lo & VTD_INV_DESC_CC_G) {
>       case VTD_INV_DESC_CC_DOMAIN:
> -        VTD_DPRINTF(INV, "domain-selective invalidation domain 0x%"PRIx16,
> -                    (uint16_t)VTD_INV_DESC_CC_DID(inv_desc->lo));
> +        trace_vtd_inv_desc_cc_domain(
> +            (uint16_t)VTD_INV_DESC_CC_DID(inv_desc->lo));
>           /* Fall through */
>       case VTD_INV_DESC_CC_GLOBAL:
> -        VTD_DPRINTF(INV, "global invalidation");
>           vtd_context_global_invalidate(s);
>           break;
>   
>       case VTD_INV_DESC_CC_DEVICE:
> -        vtd_context_device_invalidate(s, VTD_INV_DESC_CC_SID(inv_desc->lo),
> -                                      VTD_INV_DESC_CC_FM(inv_desc->lo));
> +        sid = VTD_INV_DESC_CC_SID(inv_desc->lo);
> +        fmask = VTD_INV_DESC_CC_FM(inv_desc->lo);
> +        vtd_context_device_invalidate(s, sid, fmask);
>           break;
>   
>       default:
> -        VTD_DPRINTF(GENERAL, "error: invalid granularity in Context-cache "
> -                    "Invalidate Descriptor hi 0x%"PRIx64  " lo 0x%"PRIx64,
> -                    inv_desc->hi, inv_desc->lo);
> +        trace_vtd_inv_desc_cc_invalid(inv_desc->hi, inv_desc->lo);
>           return false;
>       }
>       return true;
> @@ -1376,22 +1371,19 @@ static bool vtd_process_iotlb_desc(IntelIOMMUState *s, VTDInvDesc *inv_desc)
>   
>       if ((inv_desc->lo & VTD_INV_DESC_IOTLB_RSVD_LO) ||
>           (inv_desc->hi & VTD_INV_DESC_IOTLB_RSVD_HI)) {
> -        VTD_DPRINTF(GENERAL, "error: non-zero reserved field in IOTLB "
> -                    "Invalidate Descriptor hi 0x%"PRIx64 " lo 0x%"PRIx64,
> -                    inv_desc->hi, inv_desc->lo);
> +        trace_vtd_inv_desc_iotlb_invalid(inv_desc->hi, inv_desc->lo);
>           return false;
>       }
>   
>       switch (inv_desc->lo & VTD_INV_DESC_IOTLB_G) {
>       case VTD_INV_DESC_IOTLB_GLOBAL:
> -        VTD_DPRINTF(INV, "global invalidation");
> +        trace_vtd_inv_desc_iotlb_global();
>           vtd_iotlb_global_invalidate(s);
>           break;
>   
>       case VTD_INV_DESC_IOTLB_DOMAIN:
>           domain_id = VTD_INV_DESC_IOTLB_DID(inv_desc->lo);
> -        VTD_DPRINTF(INV, "domain-selective invalidation domain 0x%"PRIx16,
> -                    domain_id);
> +        trace_vtd_inv_desc_iotlb_domain(domain_id);
>           vtd_iotlb_domain_invalidate(s, domain_id);
>           break;
>   
> @@ -1399,20 +1391,16 @@ static bool vtd_process_iotlb_desc(IntelIOMMUState *s, VTDInvDesc *inv_desc)
>           domain_id = VTD_INV_DESC_IOTLB_DID(inv_desc->lo);
>           addr = VTD_INV_DESC_IOTLB_ADDR(inv_desc->hi);
>           am = VTD_INV_DESC_IOTLB_AM(inv_desc->hi);
> -        VTD_DPRINTF(INV, "page-selective invalidation domain 0x%"PRIx16
> -                    " addr 0x%"PRIx64 " mask %"PRIu8, domain_id, addr, am);
> +        trace_vtd_inv_desc_iotlb_pages(domain_id, addr, am);
>           if (am > VTD_MAMV) {
> -            VTD_DPRINTF(GENERAL, "error: supported max address mask value is "
> -                        "%"PRIu8, (uint8_t)VTD_MAMV);
> +            trace_vtd_inv_desc_iotlb_invalid(inv_desc->hi, inv_desc->lo);
>               return false;
>           }
>           vtd_iotlb_page_invalidate(s, domain_id, addr, am);
>           break;
>   
>       default:
> -        VTD_DPRINTF(GENERAL, "error: invalid granularity in IOTLB Invalidate "
> -                    "Descriptor hi 0x%"PRIx64 " lo 0x%"PRIx64,
> -                    inv_desc->hi, inv_desc->lo);
> +        trace_vtd_inv_desc_iotlb_invalid(inv_desc->hi, inv_desc->lo);
>           return false;
>       }
>       return true;
> @@ -1511,33 +1499,28 @@ static bool vtd_process_inv_desc(IntelIOMMUState *s)
>   
>       switch (desc_type) {
>       case VTD_INV_DESC_CC:
> -        VTD_DPRINTF(INV, "Context-cache Invalidate Descriptor hi 0x%"PRIx64
> -                    " lo 0x%"PRIx64, inv_desc.hi, inv_desc.lo);
> +        trace_vtd_inv_desc("context-cache", inv_desc.hi, inv_desc.lo);
>           if (!vtd_process_context_cache_desc(s, &inv_desc)) {
>               return false;
>           }
>           break;
>   
>       case VTD_INV_DESC_IOTLB:
> -        VTD_DPRINTF(INV, "IOTLB Invalidate Descriptor hi 0x%"PRIx64
> -                    " lo 0x%"PRIx64, inv_desc.hi, inv_desc.lo);
> +        trace_vtd_inv_desc("iotlb", inv_desc.hi, inv_desc.lo);
>           if (!vtd_process_iotlb_desc(s, &inv_desc)) {
>               return false;
>           }
>           break;
>   
>       case VTD_INV_DESC_WAIT:
> -        VTD_DPRINTF(INV, "Invalidation Wait Descriptor hi 0x%"PRIx64
> -                    " lo 0x%"PRIx64, inv_desc.hi, inv_desc.lo);
> +        trace_vtd_inv_desc("wait", inv_desc.hi, inv_desc.lo);
>           if (!vtd_process_wait_desc(s, &inv_desc)) {
>               return false;
>           }
>           break;
>   
>       case VTD_INV_DESC_IEC:
> -        VTD_DPRINTF(INV, "Invalidation Interrupt Entry Cache "
> -                    "Descriptor hi 0x%"PRIx64 " lo 0x%"PRIx64,
> -                    inv_desc.hi, inv_desc.lo);
> +        trace_vtd_inv_desc("iec", inv_desc.hi, inv_desc.lo);
>           if (!vtd_process_inv_iec_desc(s, &inv_desc)) {
>               return false;
>           }
> @@ -1552,9 +1535,7 @@ static bool vtd_process_inv_desc(IntelIOMMUState *s)
>           break;
>   
>       default:
> -        VTD_DPRINTF(GENERAL, "error: unkonw Invalidation Descriptor type "
> -                    "hi 0x%"PRIx64 " lo 0x%"PRIx64 " type %"PRIu8,
> -                    inv_desc.hi, inv_desc.lo, desc_type);
> +        trace_vtd_inv_desc_invalid(inv_desc.hi, inv_desc.lo);
>           return false;
>       }
>       s->iq_head++;
> diff --git a/hw/i386/trace-events b/hw/i386/trace-events
> index 1cc4a10..02aeaab 100644
> --- a/hw/i386/trace-events
> +++ b/hw/i386/trace-events
> @@ -3,6 +3,24 @@
>   # hw/i386/x86-iommu.c
>   x86_iommu_iec_notify(bool global, uint32_t index, uint32_t mask) "Notify IEC invalidation: global=%d index=%" PRIu32 " mask=%" PRIu32
>   
> +# hw/i386/intel_iommu.c
> +vtd_switch_address_space(uint8_t bus, uint8_t slot, uint8_t fn, bool on) "Device %02x:%02x.%x switching address space (iommu enabled=%d)"
> +vtd_inv_desc(const char *type, uint64_t hi, uint64_t lo) "invalidate desc type %s high 0x%"PRIx64" low 0x%"PRIx64
> +vtd_inv_desc_invalid(uint64_t hi, uint64_t lo) "invalid inv desc hi 0x%"PRIx64" lo 0x%"PRIx64
> +vtd_inv_desc_cc_domain(uint16_t domain) "context invalidate domain 0x%"PRIx16
> +vtd_inv_desc_cc_global(void) "context invalidate globally"
> +vtd_inv_desc_cc_device(uint8_t bus, uint8_t dev, uint8_t fn) "context invalidate device %02"PRIx8":%02"PRIx8".%02"PRIx8
> +vtd_inv_desc_cc_devices(uint16_t sid, uint16_t fmask) "context invalidate devices sid 0x%"PRIx16" fmask 0x%"PRIx16
> +vtd_inv_desc_cc_invalid(uint64_t hi, uint64_t lo) "invalid context-cache desc hi 0x%"PRIx64" lo 0x%"PRIx64
> +vtd_inv_desc_iotlb_global(void) "iotlb invalidate global"
> +vtd_inv_desc_iotlb_domain(uint16_t domain) "iotlb invalidate whole domain 0x%"PRIx16
> +vtd_inv_desc_iotlb_pages(uint16_t domain, uint64_t addr, uint8_t mask) "iotlb invalidate domain 0x%"PRIx16" addr 0x%"PRIx64" mask 0x%"PRIx8
> +vtd_inv_desc_iotlb_invalid(uint64_t hi, uint64_t lo) "invalid iotlb desc hi 0x%"PRIx64" lo 0x%"PRIx64
> +vtd_inv_desc_wait_sw(uint64_t addr, uint32_t data) "wait invalidate status write addr 0x%"PRIx64" data 0x%"PRIx32
> +vtd_inv_desc_wait_irq(const char *msg) "%s"
> +vtd_inv_desc_wait_invalid(uint64_t hi, uint64_t lo) "invalid wait desc hi 0x%"PRIx64" lo 0x%"PRIx64
> +vtd_inv_desc_wait_write_fail(uint64_t hi, uint64_t lo) "write fail for wait desc hi 0x%"PRIx64" lo 0x%"PRIx64
> +
>   # hw/i386/amd_iommu.c
>   amdvi_evntlog_fail(uint64_t addr, uint32_t head) "error: fail to write at addr 0x%"PRIx64" +  offset 0x%"PRIx32
>   amdvi_cache_update(uint16_t domid, uint8_t bus, uint8_t slot, uint8_t func, uint64_t gpa, uint64_t txaddr) " update iotlb domid 0x%"PRIx16" devid: %02x:%02x.%x gpa 0x%"PRIx64" hpa 0x%"PRIx64

  reply	other threads:[~2017-02-08  2:47 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-07  8:28 [Qemu-devel] [PATCH v7 00/17] VT-d: vfio enablement and misc enhances Peter Xu
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 01/17] vfio: trace map/unmap for notify as well Peter Xu
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 02/17] vfio: introduce vfio_get_vaddr() Peter Xu
2017-02-10  1:12   ` David Gibson
2017-02-10  5:50     ` Peter Xu
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 03/17] vfio: allow to notify unmap for very large region Peter Xu
2017-02-10  1:13   ` David Gibson
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 04/17] intel_iommu: add "caching-mode" option Peter Xu
2017-02-10  1:14   ` David Gibson
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 05/17] intel_iommu: simplify irq region translation Peter Xu
2017-02-10  1:15   ` David Gibson
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 06/17] intel_iommu: renaming gpa to iova where proper Peter Xu
2017-02-10  1:17   ` David Gibson
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 07/17] intel_iommu: convert dbg macros to traces for inv Peter Xu
2017-02-08  2:47   ` Jason Wang [this message]
2017-02-10  1:19   ` David Gibson
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 08/17] intel_iommu: convert dbg macros to trace for trans Peter Xu
2017-02-08  2:49   ` Jason Wang
2017-02-10  1:20   ` David Gibson
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 09/17] intel_iommu: vtd_slpt_level_shift check level Peter Xu
2017-02-10  1:20   ` David Gibson
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 10/17] memory: add section range info for IOMMU notifier Peter Xu
2017-02-10  2:29   ` David Gibson
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 11/17] memory: provide IOMMU_NOTIFIER_FOREACH macro Peter Xu
2017-02-10  2:30   ` David Gibson
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 12/17] memory: provide iommu_replay_all() Peter Xu
2017-02-10  2:31   ` David Gibson
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 13/17] memory: introduce memory_region_notify_one() Peter Xu
2017-02-10  2:33   ` David Gibson
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 14/17] memory: add MemoryRegionIOMMUOps.replay() callback Peter Xu
2017-02-10  2:34   ` David Gibson
2017-03-27  8:35   ` Liu, Yi L
2017-03-27  9:12     ` Peter Xu
2017-03-27  9:21       ` Liu, Yi L
2017-03-30 11:06         ` Liu, Yi L
2017-03-30 11:57           ` Jason Wang
2017-03-31  2:56             ` Peter Xu
2017-03-31  4:21               ` Jason Wang
2017-03-31  5:01                 ` Peter Xu
2017-03-31  5:12                   ` Jason Wang
2017-03-31  5:28                     ` Peter Xu
2017-03-31  5:34             ` Liu, Yi L
2017-03-31  7:16               ` Jason Wang
2017-03-31  7:30                 ` Liu, Yi L
2017-04-01  5:00                   ` Jason Wang
2017-04-01  6:39                     ` Liu, Yi L
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 15/17] intel_iommu: provide its own replay() callback Peter Xu
2017-02-10  2:36   ` David Gibson
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 16/17] intel_iommu: allow dynamic switch of IOMMU region Peter Xu
2017-02-10  2:38   ` David Gibson
2017-02-07  8:28 ` [Qemu-devel] [PATCH v7 17/17] intel_iommu: enable vfio devices Peter Xu
2017-02-10  6:24   ` Jason Wang
2017-03-16  4:05   ` Peter Xu
2017-03-19 15:34     ` Aviv B.D.
2017-03-20  1:56       ` Peter Xu
2017-03-20  2:12         ` Liu, Yi L
2017-03-20  2:41           ` Peter Xu
2017-02-17 17:18 ` [Qemu-devel] [PATCH v7 00/17] VT-d: vfio enablement and misc enhances Alex Williamson
2017-02-20  7:47   ` Peter Xu
2017-02-20  8:17     ` Liu, Yi L
2017-02-20  8:32       ` Peter Xu
2017-02-20 19:15     ` Alex Williamson
2017-02-28  7:52 ` Peter Xu

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=8376ce3f-539d-8d45-dd90-17d3de3b1d4d@redhat.com \
    --to=jasowang@redhat.com \
    --cc=alex.williamson@redhat.com \
    --cc=bd.aviv@gmail.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=jan.kiszka@siemens.com \
    --cc=kevin.tian@intel.com \
    --cc=mst@redhat.com \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=tianyu.lan@intel.com \
    /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.