[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC v3 46/56] accel/tcg: convert to cpu_interrupt_requ
From: |
Emilio G. Cota |
Subject: |
Re: [Qemu-devel] [RFC v3 46/56] accel/tcg: convert to cpu_interrupt_request |
Date: |
Tue, 23 Oct 2018 16:21:15 -0400 |
User-agent: |
Mutt/1.9.4 (2018-02-28) |
On Tue, Oct 23, 2018 at 03:17:11 +0100, Richard Henderson wrote:
> On 10/23/18 12:50 AM, Emilio G. Cota wrote:
> > On Sun, Oct 21, 2018 at 14:34:25 +0100, Richard Henderson wrote:
> >> On 10/19/18 2:06 AM, Emilio G. Cota wrote:
> >>> @@ -540,16 +540,16 @@ static inline bool cpu_handle_interrupt(CPUState
> >>> *cpu,
> >>> */
> >>> atomic_mb_set(&cpu->icount_decr.u16.high, 0);
> >>>
> >>> - if (unlikely(atomic_read(&cpu->interrupt_request))) {
> >>> + if (unlikely(cpu_interrupt_request(cpu))) {
> >>> int interrupt_request;
> >>> qemu_mutex_lock_iothread();
> >>> - interrupt_request = cpu->interrupt_request;
> >>> + interrupt_request = cpu_interrupt_request(cpu);
> >>> if (unlikely(cpu->singlestep_enabled & SSTEP_NOIRQ)) {
> >>> /* Mask out external interrupts for this step. */
> >>> interrupt_request &= ~CPU_INTERRUPT_SSTEP_MASK;
> >>> }
> >>> if (interrupt_request & CPU_INTERRUPT_DEBUG) {
> >>> - cpu->interrupt_request &= ~CPU_INTERRUPT_DEBUG;
> >>> + cpu_reset_interrupt(cpu, CPU_INTERRUPT_DEBUG);
> >>> cpu->exception_index = EXCP_DEBUG;
> >>> qemu_mutex_unlock_iothread();
> >>> return true;
> >>
> >> Multiple calls.
> >
> > I'd rather keep it as is.
> >
> > The first read takes the lock, and that has to stay unless
> > we want to use atomic_set on interrupt_request everywhere.
>
> Why not? That's even cheaper.
>
> > Given that the CPU lock is uncontended (so it's cheap to
> > acquire) ...
>
> It still requires at minimum a "lock xchg" (or equivalent on non-x86), which
> isn't free -- think 50-ish cycles minimum just for that one insn, plus call
> overhead.
OK, I changed the first read to atomic_read (changing all the other
writers to atomic_set, but thanks to the helpers it's just very
few of them), and then I'm holding both the BQL + cpu->lock throughout.
Thanks,
Emilio
- [Qemu-devel] [RFC v3 36/56] m68k: convert to cpu_interrupt_request, (continued)
[Qemu-devel] [RFC v3 34/56] hppa: convert to cpu_interrupt_request, Emilio G. Cota, 2018/10/18
[Qemu-devel] [RFC v3 40/56] alpha: convert to cpu_interrupt_request, Emilio G. Cota, 2018/10/18
[Qemu-devel] [RFC v3 44/56] unicore32: convert to cpu_interrupt_request, Emilio G. Cota, 2018/10/18
[Qemu-devel] [RFC v3 17/56] s390x: convert to cpu_halted, Emilio G. Cota, 2018/10/18
[Qemu-devel] [RFC v3 35/56] lm32: convert to cpu_interrupt_request, Emilio G. Cota, 2018/10/18