From: "Michael S. Tsirkin" <mst@redhat.com> To: qemu-devel@nongnu.org Cc: Peter Maydell <peter.maydell@linaro.org>, Peter Xu <peterx@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Richard Henderson <rth@twiddle.net>, Eduardo Habkost <ehabkost@redhat.com>, Marcelo Tosatti <mtosatti@redhat.com>, kvm@vger.kernel.org Subject: [PULL 24/55] intel_iommu: add support for split irqchip Date: Tue, 19 Jul 2016 01:45:08 +0300 [thread overview] Message-ID: <20160719014508-mutt-send-email-mst@redhat.com> (raw) In-Reply-To: <1468881010-27229-1-git-send-email-mst@redhat.com> From: Peter Xu <peterx@redhat.com> In split irqchip mode, IOAPIC is working in user space, only update kernel irq routes when entry changed. When IR is enabled, we directly update the kernel with translated messages. It works just like a kernel cache for the remapping entries. Since KVM irqfd is using kernel gsi routes to deliver interrupts, as long as we can support split irqchip, we will support irqfd as well. Also, since kernel gsi routes will cache translated interrupts, irqfd delivery will not suffer from any performance impact due to IR. And, since we supported irqfd, vhost devices will be able to work seamlessly with IR now. Logically this should contain both vhost-net and vhost-user case. Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> [move trace-events lines into target-i386/trace-events] Signed-off-by: Peter Xu <peterx@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Peter Xu <peterx@redhat.com> --- Makefile.objs | 1 + include/hw/i386/intel_iommu.h | 1 + include/hw/i386/x86-iommu.h | 5 +++++ hw/i386/intel_iommu.c | 7 +++++++ target-i386/kvm.c | 27 +++++++++++++++++++++++++++ target-i386/trace-events | 4 ++++ 6 files changed, 45 insertions(+) create mode 100644 target-i386/trace-events diff --git a/Makefile.objs b/Makefile.objs index 7f1f0a3..6d5ddcf 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -153,6 +153,7 @@ trace-events-y += hw/alpha/trace-events trace-events-y += ui/trace-events trace-events-y += audio/trace-events trace-events-y += net/trace-events +trace-events-y += target-i386/trace-events trace-events-y += target-sparc/trace-events trace-events-y += target-s390x/trace-events trace-events-y += target-ppc/trace-events diff --git a/include/hw/i386/intel_iommu.h b/include/hw/i386/intel_iommu.h index cdbbddd..e048ced 100644 --- a/include/hw/i386/intel_iommu.h +++ b/include/hw/i386/intel_iommu.h @@ -26,6 +26,7 @@ #include "hw/i386/x86-iommu.h" #include "hw/i386/ioapic.h" #include "hw/pci/msi.h" +#include "hw/sysbus.h" #define TYPE_INTEL_IOMMU_DEVICE "intel-iommu" #define INTEL_IOMMU_DEVICE(obj) \ diff --git a/include/hw/i386/x86-iommu.h b/include/hw/i386/x86-iommu.h index 699dd06..fa6ce31 100644 --- a/include/hw/i386/x86-iommu.h +++ b/include/hw/i386/x86-iommu.h @@ -21,6 +21,7 @@ #define IOMMU_COMMON_H #include "hw/sysbus.h" +#include "hw/pci/pci.h" #define TYPE_X86_IOMMU_DEVICE ("x86-iommu") #define X86_IOMMU_DEVICE(obj) \ @@ -31,6 +32,7 @@ OBJECT_GET_CLASS(X86IOMMUClass, obj, TYPE_X86_IOMMU_DEVICE) #define X86_IOMMU_PCI_DEVFN_MAX 256 +#define X86_IOMMU_SID_INVALID (0xffff) typedef struct X86IOMMUState X86IOMMUState; typedef struct X86IOMMUClass X86IOMMUClass; @@ -39,6 +41,9 @@ struct X86IOMMUClass { SysBusDeviceClass parent; /* Intel/AMD specific realize() hook */ DeviceRealize realize; + /* MSI-based interrupt remapping */ + int (*int_remap)(X86IOMMUState *iommu, MSIMessage *src, + MSIMessage *dst, uint16_t sid); }; struct X86IOMMUState { diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index feaf806..064d2ab 100644 --- a/hw/i386/intel_iommu.c +++ b/hw/i386/intel_iommu.c @@ -2167,6 +2167,12 @@ do_not_translate: return 0; } +static int vtd_int_remap(X86IOMMUState *iommu, MSIMessage *src, + MSIMessage *dst, uint16_t sid) +{ + return vtd_interrupt_remap_msi(INTEL_IOMMU_DEVICE(iommu), src, dst); +} + static MemTxResult vtd_mem_ir_read(void *opaque, hwaddr addr, uint64_t *data, unsigned size, MemTxAttrs attrs) @@ -2401,6 +2407,7 @@ static void vtd_class_init(ObjectClass *klass, void *data) dc->props = vtd_properties; dc->hotpluggable = false; x86_class->realize = vtd_realize; + x86_class->int_remap = vtd_int_remap; } static const TypeInfo vtd_info = { diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 9327523..9c00e48 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -35,6 +35,7 @@ #include "hw/i386/apic.h" #include "hw/i386/apic_internal.h" #include "hw/i386/apic-msidef.h" +#include "hw/i386/intel_iommu.h" #include "exec/ioport.h" #include "standard-headers/asm-x86/hyperv.h" @@ -42,6 +43,7 @@ #include "hw/pci/msi.h" #include "migration/migration.h" #include "exec/memattrs.h" +#include "trace.h" //#define DEBUG_KVM @@ -3371,6 +3373,31 @@ int kvm_device_msix_deassign(KVMState *s, uint32_t dev_id) int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route, uint64_t address, uint32_t data, PCIDevice *dev) { + X86IOMMUState *iommu = x86_iommu_get_default(); + + if (iommu) { + int ret; + MSIMessage src, dst; + X86IOMMUClass *class = X86_IOMMU_GET_CLASS(iommu); + + src.address = route->u.msi.address_hi; + src.address <<= VTD_MSI_ADDR_HI_SHIFT; + src.address |= route->u.msi.address_lo; + src.data = route->u.msi.data; + + ret = class->int_remap(iommu, &src, &dst, dev ? \ + pci_requester_id(dev) : \ + X86_IOMMU_SID_INVALID); + if (ret) { + trace_kvm_x86_fixup_msi_error(route->gsi); + return 1; + } + + route->u.msi.address_hi = dst.address >> VTD_MSI_ADDR_HI_SHIFT; + route->u.msi.address_lo = dst.address & VTD_MSI_ADDR_LO_MASK; + route->u.msi.data = dst.data; + } + return 0; } diff --git a/target-i386/trace-events b/target-i386/trace-events new file mode 100644 index 0000000..2113075 --- /dev/null +++ b/target-i386/trace-events @@ -0,0 +1,4 @@ +# See docs/trace-events.txt for syntax documentation. + +# target-i386/kvm.c +kvm_x86_fixup_msi_error(uint32_t gsi) "VT-d failed to remap interrupt for GSI %" PRIu32 -- MST
WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com> To: qemu-devel@nongnu.org Cc: Peter Maydell <peter.maydell@linaro.org>, Peter Xu <peterx@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Richard Henderson <rth@twiddle.net>, Eduardo Habkost <ehabkost@redhat.com>, Marcelo Tosatti <mtosatti@redhat.com>, kvm@vger.kernel.org Subject: [Qemu-devel] [PULL 24/55] intel_iommu: add support for split irqchip Date: Tue, 19 Jul 2016 01:45:08 +0300 [thread overview] Message-ID: <20160719014508-mutt-send-email-mst@redhat.com> (raw) In-Reply-To: <1468881010-27229-1-git-send-email-mst@redhat.com> From: Peter Xu <peterx@redhat.com> In split irqchip mode, IOAPIC is working in user space, only update kernel irq routes when entry changed. When IR is enabled, we directly update the kernel with translated messages. It works just like a kernel cache for the remapping entries. Since KVM irqfd is using kernel gsi routes to deliver interrupts, as long as we can support split irqchip, we will support irqfd as well. Also, since kernel gsi routes will cache translated interrupts, irqfd delivery will not suffer from any performance impact due to IR. And, since we supported irqfd, vhost devices will be able to work seamlessly with IR now. Logically this should contain both vhost-net and vhost-user case. Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> [move trace-events lines into target-i386/trace-events] Signed-off-by: Peter Xu <peterx@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Peter Xu <peterx@redhat.com> --- Makefile.objs | 1 + include/hw/i386/intel_iommu.h | 1 + include/hw/i386/x86-iommu.h | 5 +++++ hw/i386/intel_iommu.c | 7 +++++++ target-i386/kvm.c | 27 +++++++++++++++++++++++++++ target-i386/trace-events | 4 ++++ 6 files changed, 45 insertions(+) create mode 100644 target-i386/trace-events diff --git a/Makefile.objs b/Makefile.objs index 7f1f0a3..6d5ddcf 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -153,6 +153,7 @@ trace-events-y += hw/alpha/trace-events trace-events-y += ui/trace-events trace-events-y += audio/trace-events trace-events-y += net/trace-events +trace-events-y += target-i386/trace-events trace-events-y += target-sparc/trace-events trace-events-y += target-s390x/trace-events trace-events-y += target-ppc/trace-events diff --git a/include/hw/i386/intel_iommu.h b/include/hw/i386/intel_iommu.h index cdbbddd..e048ced 100644 --- a/include/hw/i386/intel_iommu.h +++ b/include/hw/i386/intel_iommu.h @@ -26,6 +26,7 @@ #include "hw/i386/x86-iommu.h" #include "hw/i386/ioapic.h" #include "hw/pci/msi.h" +#include "hw/sysbus.h" #define TYPE_INTEL_IOMMU_DEVICE "intel-iommu" #define INTEL_IOMMU_DEVICE(obj) \ diff --git a/include/hw/i386/x86-iommu.h b/include/hw/i386/x86-iommu.h index 699dd06..fa6ce31 100644 --- a/include/hw/i386/x86-iommu.h +++ b/include/hw/i386/x86-iommu.h @@ -21,6 +21,7 @@ #define IOMMU_COMMON_H #include "hw/sysbus.h" +#include "hw/pci/pci.h" #define TYPE_X86_IOMMU_DEVICE ("x86-iommu") #define X86_IOMMU_DEVICE(obj) \ @@ -31,6 +32,7 @@ OBJECT_GET_CLASS(X86IOMMUClass, obj, TYPE_X86_IOMMU_DEVICE) #define X86_IOMMU_PCI_DEVFN_MAX 256 +#define X86_IOMMU_SID_INVALID (0xffff) typedef struct X86IOMMUState X86IOMMUState; typedef struct X86IOMMUClass X86IOMMUClass; @@ -39,6 +41,9 @@ struct X86IOMMUClass { SysBusDeviceClass parent; /* Intel/AMD specific realize() hook */ DeviceRealize realize; + /* MSI-based interrupt remapping */ + int (*int_remap)(X86IOMMUState *iommu, MSIMessage *src, + MSIMessage *dst, uint16_t sid); }; struct X86IOMMUState { diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index feaf806..064d2ab 100644 --- a/hw/i386/intel_iommu.c +++ b/hw/i386/intel_iommu.c @@ -2167,6 +2167,12 @@ do_not_translate: return 0; } +static int vtd_int_remap(X86IOMMUState *iommu, MSIMessage *src, + MSIMessage *dst, uint16_t sid) +{ + return vtd_interrupt_remap_msi(INTEL_IOMMU_DEVICE(iommu), src, dst); +} + static MemTxResult vtd_mem_ir_read(void *opaque, hwaddr addr, uint64_t *data, unsigned size, MemTxAttrs attrs) @@ -2401,6 +2407,7 @@ static void vtd_class_init(ObjectClass *klass, void *data) dc->props = vtd_properties; dc->hotpluggable = false; x86_class->realize = vtd_realize; + x86_class->int_remap = vtd_int_remap; } static const TypeInfo vtd_info = { diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 9327523..9c00e48 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -35,6 +35,7 @@ #include "hw/i386/apic.h" #include "hw/i386/apic_internal.h" #include "hw/i386/apic-msidef.h" +#include "hw/i386/intel_iommu.h" #include "exec/ioport.h" #include "standard-headers/asm-x86/hyperv.h" @@ -42,6 +43,7 @@ #include "hw/pci/msi.h" #include "migration/migration.h" #include "exec/memattrs.h" +#include "trace.h" //#define DEBUG_KVM @@ -3371,6 +3373,31 @@ int kvm_device_msix_deassign(KVMState *s, uint32_t dev_id) int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route, uint64_t address, uint32_t data, PCIDevice *dev) { + X86IOMMUState *iommu = x86_iommu_get_default(); + + if (iommu) { + int ret; + MSIMessage src, dst; + X86IOMMUClass *class = X86_IOMMU_GET_CLASS(iommu); + + src.address = route->u.msi.address_hi; + src.address <<= VTD_MSI_ADDR_HI_SHIFT; + src.address |= route->u.msi.address_lo; + src.data = route->u.msi.data; + + ret = class->int_remap(iommu, &src, &dst, dev ? \ + pci_requester_id(dev) : \ + X86_IOMMU_SID_INVALID); + if (ret) { + trace_kvm_x86_fixup_msi_error(route->gsi); + return 1; + } + + route->u.msi.address_hi = dst.address >> VTD_MSI_ADDR_HI_SHIFT; + route->u.msi.address_lo = dst.address & VTD_MSI_ADDR_LO_MASK; + route->u.msi.data = dst.data; + } + return 0; } diff --git a/target-i386/trace-events b/target-i386/trace-events new file mode 100644 index 0000000..2113075 --- /dev/null +++ b/target-i386/trace-events @@ -0,0 +1,4 @@ +# See docs/trace-events.txt for syntax documentation. + +# target-i386/kvm.c +kvm_x86_fixup_msi_error(uint32_t gsi) "VT-d failed to remap interrupt for GSI %" PRIu32 -- MST
next prev parent reply other threads:[~2016-07-18 22:45 UTC|newest] Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top [not found] <1468881010-27229-1-git-send-email-mst@redhat.com> 2016-07-18 22:42 ` [Qemu-devel] [PULL 01/55] nvdimm: fix memory leak in error code path Michael S. Tsirkin 2016-07-18 22:42 ` [Qemu-devel] [PULL 02/55] tests/prom-env-test: increase the test timeout Michael S. Tsirkin 2016-07-18 22:42 ` [Qemu-devel] [PULL 03/55] hw/alpha: fix PCI bus initialization Michael S. Tsirkin 2016-07-18 22:42 ` [Qemu-devel] [PULL 04/55] hw/mips: " Michael S. Tsirkin 2016-07-18 22:43 ` [Qemu-devel] [PULL 05/55] hw/apb: " Michael S. Tsirkin 2016-07-18 22:43 ` [Qemu-devel] [PULL 06/55] hw/grackle: " Michael S. Tsirkin 2016-07-18 22:43 ` [Qemu-devel] [PULL 07/55] hw/prep: realize the PCI root bus as part of the prep init Michael S. Tsirkin 2016-07-18 22:43 ` [Qemu-devel] [PULL 08/55] hw/versatile: realize the PCI root bus as part of the versatile init Michael S. Tsirkin 2016-07-18 22:43 ` [Qemu-devel] [PULL 09/55] x86-iommu: introduce parent class Michael S. Tsirkin 2016-07-18 22:43 ` [Qemu-devel] [PULL 10/55] intel_iommu: rename VTD_PCI_DEVFN_MAX to x86-iommu Michael S. Tsirkin 2016-07-18 22:43 ` [Qemu-devel] [PULL 11/55] x86-iommu: provide x86_iommu_get_default Michael S. Tsirkin 2016-07-18 22:43 ` [Qemu-devel] [PULL 12/55] x86-iommu: introduce "intremap" property Michael S. Tsirkin 2016-07-18 22:43 ` [Qemu-devel] [PULL 13/55] acpi: enable INTR for DMAR report structure Michael S. Tsirkin 2016-07-18 22:43 ` [Qemu-devel] [PULL 14/55] intel_iommu: allow queued invalidation for IR Michael S. Tsirkin 2016-07-18 22:43 ` [Qemu-devel] [PULL 15/55] intel_iommu: set IR bit for ECAP register Michael S. Tsirkin 2016-07-18 22:44 ` [Qemu-devel] [PULL 16/55] acpi: add DMAR scope definition for root IOAPIC Michael S. Tsirkin 2016-07-18 22:44 ` [Qemu-devel] [PULL 17/55] intel_iommu: define interrupt remap table addr register Michael S. Tsirkin 2016-07-18 22:44 ` [Qemu-devel] [PULL 18/55] intel_iommu: handle interrupt remap enable Michael S. Tsirkin 2016-07-18 22:44 ` [Qemu-devel] [PULL 19/55] intel_iommu: define several structs for IOMMU IR Michael S. Tsirkin 2016-07-18 22:44 ` [Qemu-devel] [PULL 20/55] intel_iommu: add IR translation faults defines Michael S. Tsirkin 2016-07-18 22:44 ` [Qemu-devel] [PULL 21/55] intel_iommu: Add support for PCI MSI remap Michael S. Tsirkin 2016-07-18 22:44 ` [Qemu-devel] [PULL 22/55] q35: ioapic: add support for emulated IOAPIC IR Michael S. Tsirkin 2016-11-11 17:18 ` Emilio G. Cota 2016-11-11 19:50 ` Emilio G. Cota 2016-11-11 23:17 ` Peter Xu 2016-11-12 2:04 ` Emilio G. Cota 2016-11-12 11:01 ` Alex Bennée 2016-07-18 22:44 ` [Qemu-devel] [PULL 23/55] ioapic: introduce ioapic_entry_parse() helper Michael S. Tsirkin 2016-07-18 22:45 ` Michael S. Tsirkin [this message] 2016-07-18 22:45 ` [Qemu-devel] [PULL 24/55] intel_iommu: add support for split irqchip Michael S. Tsirkin 2016-07-18 22:45 ` [Qemu-devel] [PULL 25/55] x86-iommu: introduce IEC notifiers Michael S. Tsirkin 2016-07-18 22:45 ` [Qemu-devel] [PULL 26/55] ioapic: register IOMMU IEC notifier for ioapic Michael S. Tsirkin 2016-07-18 22:45 ` [Qemu-devel] [PULL 27/55] intel_iommu: Add support for Extended Interrupt Mode Michael S. Tsirkin 2016-07-18 22:45 ` [Qemu-devel] [PULL 28/55] intel_iommu: add SID validation for IR Michael S. Tsirkin 2016-07-18 22:45 ` [PULL 29/55] kvm-irqchip: simplify kvm_irqchip_add_msi_route Michael S. Tsirkin 2016-07-18 22:45 ` [Qemu-devel] " Michael S. Tsirkin 2016-07-18 22:45 ` [PULL 30/55] kvm-irqchip: i386: add hook for add/remove virq Michael S. Tsirkin 2016-07-18 22:45 ` [Qemu-devel] " Michael S. Tsirkin 2016-07-18 22:45 ` [PULL 31/55] kvm-irqchip: x86: add msi route notify fn Michael S. Tsirkin 2016-07-18 22:45 ` [Qemu-devel] " Michael S. Tsirkin 2016-07-18 22:46 ` [PULL 32/55] kvm-irqchip: do explicit commit when update irq Michael S. Tsirkin 2016-07-18 22:46 ` [Qemu-devel] " Michael S. Tsirkin 2016-07-18 22:46 ` [Qemu-devel] [PULL 33/55] intel_iommu: support all masks in interrupt entry cache invalidation Michael S. Tsirkin 2016-07-18 22:46 ` [PULL 34/55] kvm-all: add trace events for kvm irqchip ops Michael S. Tsirkin 2016-07-18 22:46 ` [Qemu-devel] " Michael S. Tsirkin 2016-07-18 22:46 ` [Qemu-devel] [PULL 35/55] intel_iommu: disallow kernel-irqchip=on with IR Michael S. Tsirkin 2016-07-18 22:46 ` [Qemu-devel] [PULL 36/55] virtio: Add typedef for handle_output Michael S. Tsirkin 2016-07-18 22:46 ` [Qemu-devel] [PULL 37/55] virtio: Introduce virtio_add_queue_aio Michael S. Tsirkin 2016-07-18 22:46 ` [Qemu-devel] [PULL 38/55] virtio-blk: Call virtio_add_queue_aio Michael S. Tsirkin 2016-07-18 22:46 ` [Qemu-devel] [PULL 39/55] virtio-scsi: " Michael S. Tsirkin 2016-07-18 22:46 ` [Qemu-devel] [PULL 40/55] Revert "mirror: Workaround for unexpected iohandler events during completion" Michael S. Tsirkin 2016-07-18 22:47 ` [Qemu-devel] [PULL 41/55] virtio-scsi: Replace HandleOutput typedef Michael S. Tsirkin 2016-07-18 22:47 ` [Qemu-devel] [PULL 42/55] virtio-net: Remove old migration version support Michael S. Tsirkin 2016-07-18 22:47 ` [Qemu-devel] [PULL 43/55] virtio-serial: " Michael S. Tsirkin 2016-07-18 22:47 ` [Qemu-devel] [PULL 44/55] virtio: Migration helper function and macro Michael S. Tsirkin 2016-07-18 22:47 ` [Qemu-devel] [PULL 45/55] virtio-scsi: Wrap in vmstate Michael S. Tsirkin 2016-07-18 22:47 ` [Qemu-devel] [PULL 46/55] virtio-blk: " Michael S. Tsirkin 2016-07-18 22:47 ` [Qemu-devel] [PULL 47/55] virtio-rng: " Michael S. Tsirkin 2016-07-18 22:47 ` [Qemu-devel] [PULL 48/55] virtio-balloon: " Michael S. Tsirkin 2016-07-18 22:47 ` [Qemu-devel] [PULL 49/55] virtio-net: " Michael S. Tsirkin 2016-07-18 22:47 ` [Qemu-devel] [PULL 50/55] virtio-serial: " Michael S. Tsirkin 2016-07-18 22:47 ` [Qemu-devel] [PULL 51/55] 9pfs: " Michael S. Tsirkin 2016-07-18 22:48 ` [Qemu-devel] [PULL 52/55] virtio-input: " Michael S. Tsirkin 2016-07-18 22:48 ` [Qemu-devel] [PULL 53/55] virtio-gpu: Use migrate_add_blocker for virgl migration blocking Michael S. Tsirkin 2016-07-18 22:48 ` [Qemu-devel] [PULL 54/55] virtio-gpu: Wrap in vmstate Michael S. Tsirkin 2016-07-18 22:48 ` [Qemu-devel] [PULL 55/55] virtio: Update migration docs Michael S. Tsirkin
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=20160719014508-mutt-send-email-mst@redhat.com \ --to=mst@redhat.com \ --cc=ehabkost@redhat.com \ --cc=kvm@vger.kernel.org \ --cc=mtosatti@redhat.com \ --cc=pbonzini@redhat.com \ --cc=peter.maydell@linaro.org \ --cc=peterx@redhat.com \ --cc=qemu-devel@nongnu.org \ --cc=rth@twiddle.net \ /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: linkBe 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.