From: David Gibson <david@gibson.dropbear.id.au>
To: "Emilio G. Cota" <cota@braap.org>
Cc: qemu-devel@nongnu.org,
"Richard Henderson" <richard.henderson@linaro.org>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Alexander Graf" <agraf@suse.de>,
qemu-ppc@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v5 18/73] ppc: convert to cpu_halted
Date: Sat, 15 Dec 2018 20:02:58 +1100 [thread overview]
Message-ID: <20181215090258.GN29278@umbus.fritz.box> (raw)
In-Reply-To: <20181213050453.9677-19-cota@braap.org>
[-- Attachment #1: Type: text/plain, Size: 10578 bytes --]
On Thu, Dec 13, 2018 at 12:03:58AM -0500, Emilio G. Cota wrote:
> In ppce500_spin.c, acquire the lock just once to update
> both cpu->halted and cpu->stopped.
>
> In hw/ppc/spapr_hcall.c, acquire the lock just once to
> update cpu->halted and call cpu_has_work, since later
> in the series we'll acquire the BQL (if not already held)
> from cpu_has_work.
>
> Cc: David Gibson <david@gibson.dropbear.id.au>
> Cc: Alexander Graf <agraf@suse.de>
> Cc: qemu-ppc@nongnu.org
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> Signed-off-by: Emilio G. Cota <cota@braap.org>
Acked-by: David Gibson <david@gibson.dropbear.id.au>
> ---
> target/ppc/helper_regs.h | 2 +-
> hw/ppc/e500.c | 4 ++--
> hw/ppc/ppc.c | 10 +++++-----
> hw/ppc/ppce500_spin.c | 6 ++++--
> hw/ppc/spapr_cpu_core.c | 4 ++--
> hw/ppc/spapr_hcall.c | 4 +++-
> hw/ppc/spapr_rtas.c | 6 +++---
> target/ppc/excp_helper.c | 4 ++--
> target/ppc/kvm.c | 4 ++--
> target/ppc/translate_init.inc.c | 6 +++---
> 10 files changed, 27 insertions(+), 23 deletions(-)
>
> diff --git a/target/ppc/helper_regs.h b/target/ppc/helper_regs.h
> index 5efd18049e..9298052ac5 100644
> --- a/target/ppc/helper_regs.h
> +++ b/target/ppc/helper_regs.h
> @@ -161,7 +161,7 @@ static inline int hreg_store_msr(CPUPPCState *env, target_ulong value,
> #if !defined(CONFIG_USER_ONLY)
> if (unlikely(msr_pow == 1)) {
> if (!env->pending_interrupts && (*env->check_pow)(env)) {
> - cs->halted = 1;
> + cpu_halted_set(cs, 1);
> excp = EXCP_HALTED;
> }
> }
> diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
> index e6747fce28..6843c545b7 100644
> --- a/hw/ppc/e500.c
> +++ b/hw/ppc/e500.c
> @@ -657,7 +657,7 @@ static void ppce500_cpu_reset_sec(void *opaque)
>
> /* Secondary CPU starts in halted state for now. Needs to change when
> implementing non-kernel boot. */
> - cs->halted = 1;
> + cpu_halted_set(cs, 1);
> cs->exception_index = EXCP_HLT;
> }
>
> @@ -671,7 +671,7 @@ static void ppce500_cpu_reset(void *opaque)
> cpu_reset(cs);
>
> /* Set initial guest state. */
> - cs->halted = 0;
> + cpu_halted_set(cs, 0);
> env->gpr[1] = (16 * MiB) - 8;
> env->gpr[3] = bi->dt_base;
> env->gpr[4] = 0;
> diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c
> index ec4be25f49..d1a5a0b877 100644
> --- a/hw/ppc/ppc.c
> +++ b/hw/ppc/ppc.c
> @@ -151,7 +151,7 @@ static void ppc6xx_set_irq(void *opaque, int pin, int level)
> /* XXX: Note that the only way to restart the CPU is to reset it */
> if (level) {
> LOG_IRQ("%s: stop the CPU\n", __func__);
> - cs->halted = 1;
> + cpu_halted_set(cs, 1);
> }
> break;
> case PPC6xx_INPUT_HRESET:
> @@ -230,10 +230,10 @@ static void ppc970_set_irq(void *opaque, int pin, int level)
> /* XXX: TODO: relay the signal to CKSTP_OUT pin */
> if (level) {
> LOG_IRQ("%s: stop the CPU\n", __func__);
> - cs->halted = 1;
> + cpu_halted_set(cs, 1);
> } else {
> LOG_IRQ("%s: restart the CPU\n", __func__);
> - cs->halted = 0;
> + cpu_halted_set(cs, 0);
> qemu_cpu_kick(cs);
> }
> break;
> @@ -361,10 +361,10 @@ static void ppc40x_set_irq(void *opaque, int pin, int level)
> /* Level sensitive - active low */
> if (level) {
> LOG_IRQ("%s: stop the CPU\n", __func__);
> - cs->halted = 1;
> + cpu_halted_set(cs, 1);
> } else {
> LOG_IRQ("%s: restart the CPU\n", __func__);
> - cs->halted = 0;
> + cpu_halted_set(cs, 0);
> qemu_cpu_kick(cs);
> }
> break;
> diff --git a/hw/ppc/ppce500_spin.c b/hw/ppc/ppce500_spin.c
> index c45fc858de..4b3532730f 100644
> --- a/hw/ppc/ppce500_spin.c
> +++ b/hw/ppc/ppce500_spin.c
> @@ -107,9 +107,11 @@ static void spin_kick(CPUState *cs, run_on_cpu_data data)
> map_start = ldq_p(&curspin->addr) & ~(map_size - 1);
> mmubooke_create_initial_mapping(env, 0, map_start, map_size);
>
> - cs->halted = 0;
> - cs->exception_index = -1;
> + cpu_mutex_lock(cs);
> + cpu_halted_set(cs, 0);
> cs->stopped = false;
> + cpu_mutex_unlock(cs);
> + cs->exception_index = -1;
> qemu_cpu_kick(cs);
> }
>
> diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
> index 2398ce62c0..4c9c60b53b 100644
> --- a/hw/ppc/spapr_cpu_core.c
> +++ b/hw/ppc/spapr_cpu_core.c
> @@ -37,7 +37,7 @@ static void spapr_cpu_reset(void *opaque)
> /* All CPUs start halted. CPU0 is unhalted from the machine level
> * reset code and the rest are explicitly started up by the guest
> * using an RTAS call */
> - cs->halted = 1;
> + cpu_halted_set(cs, 1);
>
> /* Set compatibility mode to match the boot CPU, which was either set
> * by the machine reset code or by CAS. This should never fail.
> @@ -91,7 +91,7 @@ void spapr_cpu_set_entry_state(PowerPCCPU *cpu, target_ulong nip, target_ulong r
> env->nip = nip;
> env->gpr[3] = r3;
> kvmppc_set_reg_ppc_online(cpu, 1);
> - CPU(cpu)->halted = 0;
> + cpu_halted_set(CPU(cpu), 0);
> /* Enable Power-saving mode Exit Cause exceptions */
> ppc_store_lpcr(cpu, env->spr[SPR_LPCR] | pcc->lpcr_pm);
> }
> diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
> index ae913d070f..9891fc7740 100644
> --- a/hw/ppc/spapr_hcall.c
> +++ b/hw/ppc/spapr_hcall.c
> @@ -1088,11 +1088,13 @@ static target_ulong h_cede(PowerPCCPU *cpu, sPAPRMachineState *spapr,
>
> env->msr |= (1ULL << MSR_EE);
> hreg_compute_hflags(env);
> + cpu_mutex_lock(cs);
> if (!cpu_has_work(cs)) {
> - cs->halted = 1;
> + cpu_halted_set(cs, 1);
> cs->exception_index = EXCP_HLT;
> cs->exit_request = 1;
> }
> + cpu_mutex_unlock(cs);
> return H_SUCCESS;
> }
>
> diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
> index d6a0952154..925f67123c 100644
> --- a/hw/ppc/spapr_rtas.c
> +++ b/hw/ppc/spapr_rtas.c
> @@ -109,7 +109,7 @@ static void rtas_query_cpu_stopped_state(PowerPCCPU *cpu_,
> id = rtas_ld(args, 0);
> cpu = spapr_find_cpu(id);
> if (cpu != NULL) {
> - if (CPU(cpu)->halted) {
> + if (cpu_halted(CPU(cpu))) {
> rtas_st(rets, 1, 0);
> } else {
> rtas_st(rets, 1, 2);
> @@ -153,7 +153,7 @@ static void rtas_start_cpu(PowerPCCPU *callcpu, sPAPRMachineState *spapr,
> env = &newcpu->env;
> pcc = POWERPC_CPU_GET_CLASS(newcpu);
>
> - if (!CPU(newcpu)->halted) {
> + if (!cpu_halted(CPU(newcpu))) {
> rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
> return;
> }
> @@ -207,7 +207,7 @@ static void rtas_stop_self(PowerPCCPU *cpu, sPAPRMachineState *spapr,
> * This could deliver an interrupt on a dying CPU and crash the
> * guest */
> ppc_store_lpcr(cpu, env->spr[SPR_LPCR] & ~pcc->lpcr_pm);
> - cs->halted = 1;
> + cpu_halted_set(cs, 1);
> kvmppc_set_reg_ppc_online(cpu, 0);
> qemu_cpu_kick(cs);
> }
> diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c
> index 0ec7ae1ad4..5e1778584a 100644
> --- a/target/ppc/excp_helper.c
> +++ b/target/ppc/excp_helper.c
> @@ -206,7 +206,7 @@ static inline void powerpc_excp(PowerPCCPU *cpu, int excp_model, int excp)
> qemu_log("Machine check while not allowed. "
> "Entering checkstop state\n");
> }
> - cs->halted = 1;
> + cpu_halted_set(cs, 1);
> cpu_interrupt_exittb(cs);
> }
> if (env->msr_mask & MSR_HVB) {
> @@ -954,7 +954,7 @@ void helper_pminsn(CPUPPCState *env, powerpc_pm_insn_t insn)
> CPUState *cs;
>
> cs = CPU(ppc_env_get_cpu(env));
> - cs->halted = 1;
> + cpu_halted_set(cs, 1);
> env->in_pm_state = true;
>
> /* The architecture specifies that HDEC interrupts are
> diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> index f81327d6cd..557faa3637 100644
> --- a/target/ppc/kvm.c
> +++ b/target/ppc/kvm.c
> @@ -1370,7 +1370,7 @@ MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run)
>
> int kvm_arch_process_async_events(CPUState *cs)
> {
> - return cs->halted;
> + return cpu_halted(cs);
> }
>
> static int kvmppc_handle_halt(PowerPCCPU *cpu)
> @@ -1379,7 +1379,7 @@ static int kvmppc_handle_halt(PowerPCCPU *cpu)
> CPUPPCState *env = &cpu->env;
>
> if (!(cs->interrupt_request & CPU_INTERRUPT_HARD) && (msr_ee)) {
> - cs->halted = 1;
> + cpu_halted_set(cs, 1);
> cs->exception_index = EXCP_HLT;
> }
>
> diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
> index 168d0cec28..986bbd7eb4 100644
> --- a/target/ppc/translate_init.inc.c
> +++ b/target/ppc/translate_init.inc.c
> @@ -8462,7 +8462,7 @@ static bool cpu_has_work_POWER7(CPUState *cs)
> PowerPCCPU *cpu = POWERPC_CPU(cs);
> CPUPPCState *env = &cpu->env;
>
> - if (cs->halted) {
> + if (cpu_halted(cs)) {
> if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
> return false;
> }
> @@ -8616,7 +8616,7 @@ static bool cpu_has_work_POWER8(CPUState *cs)
> PowerPCCPU *cpu = POWERPC_CPU(cs);
> CPUPPCState *env = &cpu->env;
>
> - if (cs->halted) {
> + if (cpu_halted(cs)) {
> if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
> return false;
> }
> @@ -8808,7 +8808,7 @@ static bool cpu_has_work_POWER9(CPUState *cs)
> PowerPCCPU *cpu = POWERPC_CPU(cs);
> CPUPPCState *env = &cpu->env;
>
> - if (cs->halted) {
> + if (cpu_halted(cs)) {
> if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
> return false;
> }
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2018-12-16 6:19 UTC|newest]
Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-13 5:03 [Qemu-devel] [PATCH v5 00/73] per-CPU locks Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 01/73] cpu: convert queued work to a QSIMPLEQ Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 02/73] cpu: rename cpu->work_mutex to cpu->lock Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 03/73] cpu: introduce cpu_mutex_lock/unlock Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 04/73] cpu: make qemu_work_cond per-cpu Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 05/73] cpu: move run_on_cpu to cpus-common Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 06/73] cpu: introduce process_queued_cpu_work_locked Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 07/73] cpu: make per-CPU locks an alias of the BQL in TCG rr mode Emilio G. Cota
2018-12-15 1:51 ` Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 08/73] tcg-runtime: define helper_cpu_halted_set Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 09/73] ppc: convert to helper_cpu_halted_set Emilio G. Cota
2018-12-15 9:00 ` David Gibson
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 10/73] cris: " Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 11/73] hppa: " Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 12/73] m68k: " Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 13/73] alpha: " Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 14/73] microblaze: " Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 15/73] cpu: define cpu_halted helpers Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 16/73] tcg-runtime: convert to cpu_halted_set Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 17/73] arm: convert to cpu_halted Emilio G. Cota
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 18/73] ppc: " Emilio G. Cota
2018-12-15 9:02 ` David Gibson [this message]
2018-12-13 5:03 ` [Qemu-devel] [PATCH v5 19/73] sh4: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 20/73] i386: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 21/73] lm32: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 22/73] m68k: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 23/73] mips: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 24/73] riscv: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 25/73] s390x: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 26/73] sparc: " Emilio G. Cota
2018-12-17 12:53 ` Mark Cave-Ayland
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 27/73] xtensa: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 28/73] gdbstub: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 29/73] openrisc: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 30/73] cpu-exec: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 31/73] cpu: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 32/73] cpu: define cpu_interrupt_request helpers Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 33/73] ppc: use cpu_reset_interrupt Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 34/73] exec: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 35/73] i386: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 36/73] s390x: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 37/73] openrisc: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 38/73] arm: convert to cpu_interrupt_request Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 39/73] i386: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 40/73] i386/kvm: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 41/73] i386/hax-all: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 42/73] i386/whpx-all: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 43/73] i386/hvf: convert to cpu_request_interrupt Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 44/73] ppc: convert to cpu_interrupt_request Emilio G. Cota
2018-12-15 9:06 ` David Gibson
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 45/73] sh4: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 46/73] cris: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 47/73] hppa: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 48/73] lm32: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 49/73] m68k: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 50/73] mips: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 51/73] nios: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 52/73] s390x: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 53/73] alpha: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 54/73] moxie: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 55/73] sparc: " Emilio G. Cota
2018-12-17 12:57 ` Mark Cave-Ayland
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 56/73] openrisc: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 57/73] unicore32: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 58/73] microblaze: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 59/73] accel/tcg: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 60/73] cpu: convert to interrupt_request Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 61/73] cpu: call .cpu_has_work with the CPU lock held Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 62/73] cpu: introduce cpu_has_work_with_iothread_lock Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 63/73] ppc: convert to cpu_has_work_with_iothread_lock Emilio G. Cota
2018-12-15 9:07 ` David Gibson
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 64/73] mips: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 65/73] s390x: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 66/73] riscv: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 67/73] sparc: " Emilio G. Cota
2018-12-17 12:58 ` Mark Cave-Ayland
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 68/73] xtensa: " Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 69/73] cpu: rename all_cpu_threads_idle to qemu_tcg_rr_all_cpu_threads_idle Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 70/73] cpu: protect CPU state with cpu->lock instead of the BQL Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 71/73] cpus-common: release BQL earlier in run_on_cpu Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 72/73] cpu: add async_run_on_cpu_no_bql Emilio G. Cota
2018-12-13 5:04 ` [Qemu-devel] [PATCH v5 73/73] cputlb: queue async flush jobs without the BQL Emilio G. Cota
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=20181215090258.GN29278@umbus.fritz.box \
--to=david@gibson.dropbear.id.au \
--cc=agraf@suse.de \
--cc=alex.bennee@linaro.org \
--cc=cota@braap.org \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=richard.henderson@linaro.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).