Emilio G. Cota <c...@braap.org> 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 <c...@braap.org> > --- > 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