Re: [Qemu-devel] [RFC v4 57/71] accel/tcg: convert to cpu_interrupt_request

2018-10-31 Thread Alex Bennée


Emilio G. Cota  writes:

> Signed-off-by: Emilio G. Cota 

Reviewed-by: Alex Bennée 

> ---
>  accel/tcg/cpu-exec.c  | 15 ---
>  accel/tcg/tcg-all.c   | 12 +---
>  accel/tcg/translate-all.c |  2 +-
>  3 files changed, 18 insertions(+), 11 deletions(-)
>
> diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
> index f37c9b1e94..d590f1f6c0 100644
> --- a/accel/tcg/cpu-exec.c
> +++ b/accel/tcg/cpu-exec.c
> @@ -428,7 +428,7 @@ static inline bool cpu_handle_halt_locked(CPUState *cpu)
>
>  if (cpu_halted(cpu)) {
>  #if defined(TARGET_I386) && !defined(CONFIG_USER_ONLY)
> -if ((cpu->interrupt_request & CPU_INTERRUPT_POLL)
> +if ((cpu_interrupt_request(cpu) & CPU_INTERRUPT_POLL)
>  && replay_interrupt()) {
>  X86CPU *x86_cpu = X86_CPU(cpu);
>
> @@ -540,16 +540,17 @@ 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;
> @@ -558,7 +559,7 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
>  /* Do nothing */
>  } else if (interrupt_request & CPU_INTERRUPT_HALT) {
>  replay_interrupt();
> -cpu->interrupt_request &= ~CPU_INTERRUPT_HALT;
> +cpu_reset_interrupt(cpu, CPU_INTERRUPT_HALT);
>  cpu_halted_set(cpu, 1);
>  cpu->exception_index = EXCP_HLT;
>  qemu_mutex_unlock_iothread();
> @@ -595,10 +596,10 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
>  }
>  /* The target hook may have updated the 'cpu->interrupt_request';
>   * reload the 'interrupt_request' value */
> -interrupt_request = cpu->interrupt_request;
> +interrupt_request = cpu_interrupt_request(cpu);
>  }
>  if (interrupt_request & CPU_INTERRUPT_EXITTB) {
> -cpu->interrupt_request &= ~CPU_INTERRUPT_EXITTB;
> +cpu_reset_interrupt(cpu, CPU_INTERRUPT_EXITTB);
>  /* ensure that no TB jump will be modified as
> the program flow was changed */
>  *last_tb = NULL;
> diff --git a/accel/tcg/tcg-all.c b/accel/tcg/tcg-all.c
> index 3d25bdcc17..4e2fe70350 100644
> --- a/accel/tcg/tcg-all.c
> +++ b/accel/tcg/tcg-all.c
> @@ -39,10 +39,16 @@ unsigned long tcg_tb_size;
>  static void tcg_handle_interrupt(CPUState *cpu, int mask)
>  {
>  int old_mask;
> -g_assert(qemu_mutex_iothread_locked());
>
> -old_mask = cpu->interrupt_request;
> -cpu->interrupt_request |= mask;
> +if (!cpu_mutex_locked(cpu)) {
> +cpu_mutex_lock(cpu);
> +old_mask = cpu_interrupt_request(cpu);
> +cpu_interrupt_request_or(cpu, mask);
> +cpu_mutex_unlock(cpu);
> +} else {
> +old_mask = cpu_interrupt_request(cpu);
> +cpu_interrupt_request_or(cpu, mask);
> +}
>
>  /*
>   * If called from iothread context, wake the target cpu in
> diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
> index 356dcd0948..038d82fdb5 100644
> --- a/accel/tcg/translate-all.c
> +++ b/accel/tcg/translate-all.c
> @@ -2340,7 +2340,7 @@ void dump_opcount_info(FILE *f, fprintf_function 
> cpu_fprintf)
>  void cpu_interrupt(CPUState *cpu, int mask)
>  {
>  g_assert(qemu_mutex_iothread_locked());
> -cpu->interrupt_request |= mask;
> +cpu_interrupt_request_or(cpu, mask);
>  atomic_set(&cpu->icount_decr.u16.high, -1);
>  }


--
Alex Bennée



Re: [Qemu-devel] [RFC v4 57/71] accel/tcg: convert to cpu_interrupt_request

2018-10-26 Thread Richard Henderson
On 10/25/18 3:46 PM, Emilio G. Cota wrote:
> Signed-off-by: Emilio G. Cota 
> ---
>  accel/tcg/cpu-exec.c  | 15 ---
>  accel/tcg/tcg-all.c   | 12 +---
>  accel/tcg/translate-all.c |  2 +-
>  3 files changed, 18 insertions(+), 11 deletions(-)

Reviewed-by: Richard Henderson 

r~





[Qemu-devel] [RFC v4 57/71] accel/tcg: convert to cpu_interrupt_request

2018-10-25 Thread Emilio G. Cota
Signed-off-by: Emilio G. Cota 
---
 accel/tcg/cpu-exec.c  | 15 ---
 accel/tcg/tcg-all.c   | 12 +---
 accel/tcg/translate-all.c |  2 +-
 3 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
index f37c9b1e94..d590f1f6c0 100644
--- a/accel/tcg/cpu-exec.c
+++ b/accel/tcg/cpu-exec.c
@@ -428,7 +428,7 @@ static inline bool cpu_handle_halt_locked(CPUState *cpu)
 
 if (cpu_halted(cpu)) {
 #if defined(TARGET_I386) && !defined(CONFIG_USER_ONLY)
-if ((cpu->interrupt_request & CPU_INTERRUPT_POLL)
+if ((cpu_interrupt_request(cpu) & CPU_INTERRUPT_POLL)
 && replay_interrupt()) {
 X86CPU *x86_cpu = X86_CPU(cpu);
 
@@ -540,16 +540,17 @@ 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;
@@ -558,7 +559,7 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
 /* Do nothing */
 } else if (interrupt_request & CPU_INTERRUPT_HALT) {
 replay_interrupt();
-cpu->interrupt_request &= ~CPU_INTERRUPT_HALT;
+cpu_reset_interrupt(cpu, CPU_INTERRUPT_HALT);
 cpu_halted_set(cpu, 1);
 cpu->exception_index = EXCP_HLT;
 qemu_mutex_unlock_iothread();
@@ -595,10 +596,10 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
 }
 /* The target hook may have updated the 'cpu->interrupt_request';
  * reload the 'interrupt_request' value */
-interrupt_request = cpu->interrupt_request;
+interrupt_request = cpu_interrupt_request(cpu);
 }
 if (interrupt_request & CPU_INTERRUPT_EXITTB) {
-cpu->interrupt_request &= ~CPU_INTERRUPT_EXITTB;
+cpu_reset_interrupt(cpu, CPU_INTERRUPT_EXITTB);
 /* ensure that no TB jump will be modified as
the program flow was changed */
 *last_tb = NULL;
diff --git a/accel/tcg/tcg-all.c b/accel/tcg/tcg-all.c
index 3d25bdcc17..4e2fe70350 100644
--- a/accel/tcg/tcg-all.c
+++ b/accel/tcg/tcg-all.c
@@ -39,10 +39,16 @@ unsigned long tcg_tb_size;
 static void tcg_handle_interrupt(CPUState *cpu, int mask)
 {
 int old_mask;
-g_assert(qemu_mutex_iothread_locked());
 
-old_mask = cpu->interrupt_request;
-cpu->interrupt_request |= mask;
+if (!cpu_mutex_locked(cpu)) {
+cpu_mutex_lock(cpu);
+old_mask = cpu_interrupt_request(cpu);
+cpu_interrupt_request_or(cpu, mask);
+cpu_mutex_unlock(cpu);
+} else {
+old_mask = cpu_interrupt_request(cpu);
+cpu_interrupt_request_or(cpu, mask);
+}
 
 /*
  * If called from iothread context, wake the target cpu in
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
index 356dcd0948..038d82fdb5 100644
--- a/accel/tcg/translate-all.c
+++ b/accel/tcg/translate-all.c
@@ -2340,7 +2340,7 @@ void dump_opcount_info(FILE *f, fprintf_function 
cpu_fprintf)
 void cpu_interrupt(CPUState *cpu, int mask)
 {
 g_assert(qemu_mutex_iothread_locked());
-cpu->interrupt_request |= mask;
+cpu_interrupt_request_or(cpu, mask);
 atomic_set(&cpu->icount_decr.u16.high, -1);
 }
 
-- 
2.17.1