Re: [Qemu-devel] [RFC 01/48] cpu: introduce run_on_cpu_no_bql

2018-11-14 Thread Alex Bennée


Emilio G. Cota  writes:

> On Wed, Nov 14, 2018 at 11:30:19 +, Alex Bennée wrote:
>>
>> Emilio G. Cota  writes:
>>
>> > This allows us to queue synchronous CPU work without the BQL.
>> >
>> > Will gain a user soon.
>>
>> This is also in the cpu-lock series right?
>
> No, in the cpu-lock series we add async_run_on_cpu_no_bql;
> here we add the sync version.

My mistake, being word blind:

Reviewed-by: Alex Bennée 

--
Alex Bennée



Re: [Qemu-devel] [RFC 01/48] cpu: introduce run_on_cpu_no_bql

2018-11-14 Thread Emilio G. Cota
On Wed, Nov 14, 2018 at 11:30:19 +, Alex Bennée wrote:
> 
> Emilio G. Cota  writes:
> 
> > This allows us to queue synchronous CPU work without the BQL.
> >
> > Will gain a user soon.
> 
> This is also in the cpu-lock series right?

No, in the cpu-lock series we add async_run_on_cpu_no_bql;
here we add the sync version.

E.



Re: [Qemu-devel] [RFC 01/48] cpu: introduce run_on_cpu_no_bql

2018-11-14 Thread Alex Bennée


Emilio G. Cota  writes:

> This allows us to queue synchronous CPU work without the BQL.
>
> Will gain a user soon.

This is also in the cpu-lock series right?

>
> Signed-off-by: Emilio G. Cota 
> ---
>  include/qom/cpu.h | 13 +
>  cpus-common.c | 28 ++--
>  2 files changed, 35 insertions(+), 6 deletions(-)
>
> diff --git a/include/qom/cpu.h b/include/qom/cpu.h
> index 204bc94056..863aa2bff1 100644
> --- a/include/qom/cpu.h
> +++ b/include/qom/cpu.h
> @@ -877,6 +877,19 @@ bool cpu_is_stopped(CPUState *cpu);
>   */
>  void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data);
>
> +/**
> + * run_on_cpu_no_bql
> + * @cpu: The vCPU to run on.
> + * @func: The function to be executed.
> + * @data: Data to pass to the function.
> + *
> + * Schedules the function @func for execution on the vCPU @cpu.
> + * This function is run outside the BQL.
> + * See also: run_on_cpu()
> + */
> +void run_on_cpu_no_bql(CPUState *cpu, run_on_cpu_func func,
> +   run_on_cpu_data data);
> +
>  /**
>   * async_run_on_cpu:
>   * @cpu: The vCPU to run on.
> diff --git a/cpus-common.c b/cpus-common.c
> index cffb2b71ac..b478fc8741 100644
> --- a/cpus-common.c
> +++ b/cpus-common.c
> @@ -144,7 +144,8 @@ static void queue_work_on_cpu(CPUState *cpu, struct 
> qemu_work_item *wi)
>  cpu_mutex_unlock(cpu);
>  }
>
> -void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data)
> +static void do_run_on_cpu(CPUState *cpu, run_on_cpu_func func,
> +  run_on_cpu_data data, bool bql)
>  {
>  struct qemu_work_item wi;
>  bool has_bql = qemu_mutex_iothread_locked();
> @@ -152,12 +153,16 @@ void run_on_cpu(CPUState *cpu, run_on_cpu_func func, 
> run_on_cpu_data data)
>  g_assert(no_cpu_mutex_locked());
>
>  if (qemu_cpu_is_self(cpu)) {
> -if (has_bql) {
> -func(cpu, data);
> +if (bql) {
> +if (has_bql) {
> +func(cpu, data);
> +} else {
> +qemu_mutex_lock_iothread();
> +func(cpu, data);
> +qemu_mutex_unlock_iothread();
> +}
>  } else {
> -qemu_mutex_lock_iothread();
>  func(cpu, data);
> -qemu_mutex_unlock_iothread();
>  }
>  return;
>  }
> @@ -172,7 +177,7 @@ void run_on_cpu(CPUState *cpu, run_on_cpu_func func, 
> run_on_cpu_data data)
>  wi.done = false;
>  wi.free = false;
>  wi.exclusive = false;
> -wi.bql = true;
> +wi.bql = bql;
>
>  cpu_mutex_lock(cpu);
>  queue_work_on_cpu_locked(cpu, &wi);
> @@ -189,6 +194,17 @@ void run_on_cpu(CPUState *cpu, run_on_cpu_func func, 
> run_on_cpu_data data)
>  }
>  }
>
> +void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data)
> +{
> +do_run_on_cpu(cpu, func, data, true);
> +}
> +
> +void
> +run_on_cpu_no_bql(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data)
> +{
> +do_run_on_cpu(cpu, func, data, false);
> +}
> +
>  void async_run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data 
> data)
>  {
>  struct qemu_work_item *wi;


--
Alex Bennée



[Qemu-devel] [RFC 01/48] cpu: introduce run_on_cpu_no_bql

2018-10-25 Thread Emilio G. Cota
This allows us to queue synchronous CPU work without the BQL.

Will gain a user soon.

Signed-off-by: Emilio G. Cota 
---
 include/qom/cpu.h | 13 +
 cpus-common.c | 28 ++--
 2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index 204bc94056..863aa2bff1 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -877,6 +877,19 @@ bool cpu_is_stopped(CPUState *cpu);
  */
 void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data);
 
+/**
+ * run_on_cpu_no_bql
+ * @cpu: The vCPU to run on.
+ * @func: The function to be executed.
+ * @data: Data to pass to the function.
+ *
+ * Schedules the function @func for execution on the vCPU @cpu.
+ * This function is run outside the BQL.
+ * See also: run_on_cpu()
+ */
+void run_on_cpu_no_bql(CPUState *cpu, run_on_cpu_func func,
+   run_on_cpu_data data);
+
 /**
  * async_run_on_cpu:
  * @cpu: The vCPU to run on.
diff --git a/cpus-common.c b/cpus-common.c
index cffb2b71ac..b478fc8741 100644
--- a/cpus-common.c
+++ b/cpus-common.c
@@ -144,7 +144,8 @@ static void queue_work_on_cpu(CPUState *cpu, struct 
qemu_work_item *wi)
 cpu_mutex_unlock(cpu);
 }
 
-void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data)
+static void do_run_on_cpu(CPUState *cpu, run_on_cpu_func func,
+  run_on_cpu_data data, bool bql)
 {
 struct qemu_work_item wi;
 bool has_bql = qemu_mutex_iothread_locked();
@@ -152,12 +153,16 @@ void run_on_cpu(CPUState *cpu, run_on_cpu_func func, 
run_on_cpu_data data)
 g_assert(no_cpu_mutex_locked());
 
 if (qemu_cpu_is_self(cpu)) {
-if (has_bql) {
-func(cpu, data);
+if (bql) {
+if (has_bql) {
+func(cpu, data);
+} else {
+qemu_mutex_lock_iothread();
+func(cpu, data);
+qemu_mutex_unlock_iothread();
+}
 } else {
-qemu_mutex_lock_iothread();
 func(cpu, data);
-qemu_mutex_unlock_iothread();
 }
 return;
 }
@@ -172,7 +177,7 @@ void run_on_cpu(CPUState *cpu, run_on_cpu_func func, 
run_on_cpu_data data)
 wi.done = false;
 wi.free = false;
 wi.exclusive = false;
-wi.bql = true;
+wi.bql = bql;
 
 cpu_mutex_lock(cpu);
 queue_work_on_cpu_locked(cpu, &wi);
@@ -189,6 +194,17 @@ void run_on_cpu(CPUState *cpu, run_on_cpu_func func, 
run_on_cpu_data data)
 }
 }
 
+void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data)
+{
+do_run_on_cpu(cpu, func, data, true);
+}
+
+void
+run_on_cpu_no_bql(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data)
+{
+do_run_on_cpu(cpu, func, data, false);
+}
+
 void async_run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data 
data)
 {
 struct qemu_work_item *wi;
-- 
2.17.1