xref: /openbmc/qemu/include/sysemu/accel-blocker.h (revision f703f1ef)
1bd688fc9SEmanuele Giuseppe Esposito /*
2bd688fc9SEmanuele Giuseppe Esposito  * Accelerator blocking API, to prevent new ioctls from starting and wait the
3bd688fc9SEmanuele Giuseppe Esposito  * running ones finish.
4bd688fc9SEmanuele Giuseppe Esposito  * This mechanism differs from pause/resume_all_vcpus() in that it does not
5bd688fc9SEmanuele Giuseppe Esposito  * release the BQL.
6bd688fc9SEmanuele Giuseppe Esposito  *
7bd688fc9SEmanuele Giuseppe Esposito  *  Copyright (c) 2022 Red Hat Inc.
8bd688fc9SEmanuele Giuseppe Esposito  *
9bd688fc9SEmanuele Giuseppe Esposito  * Author: Emanuele Giuseppe Esposito       <eesposit@redhat.com>
10bd688fc9SEmanuele Giuseppe Esposito  *
11bd688fc9SEmanuele Giuseppe Esposito  * This work is licensed under the terms of the GNU GPL, version 2 or later.
12bd688fc9SEmanuele Giuseppe Esposito  * See the COPYING file in the top-level directory.
13bd688fc9SEmanuele Giuseppe Esposito  */
14bd688fc9SEmanuele Giuseppe Esposito #ifndef ACCEL_BLOCKER_H
15bd688fc9SEmanuele Giuseppe Esposito #define ACCEL_BLOCKER_H
16bd688fc9SEmanuele Giuseppe Esposito 
17bd688fc9SEmanuele Giuseppe Esposito #include "sysemu/cpus.h"
18bd688fc9SEmanuele Giuseppe Esposito 
19*f703f1efSPhilippe Mathieu-Daudé void accel_blocker_init(void);
20bd688fc9SEmanuele Giuseppe Esposito 
21bd688fc9SEmanuele Giuseppe Esposito /*
22bd688fc9SEmanuele Giuseppe Esposito  * accel_{cpu_}ioctl_begin/end:
23bd688fc9SEmanuele Giuseppe Esposito  * Mark when ioctl is about to run or just finished.
24bd688fc9SEmanuele Giuseppe Esposito  *
25bd688fc9SEmanuele Giuseppe Esposito  * accel_{cpu_}ioctl_begin will block after accel_ioctl_inhibit_begin() is
26bd688fc9SEmanuele Giuseppe Esposito  * called, preventing new ioctls to run. They will continue only after
27bd688fc9SEmanuele Giuseppe Esposito  * accel_ioctl_inibith_end().
28bd688fc9SEmanuele Giuseppe Esposito  */
29*f703f1efSPhilippe Mathieu-Daudé void accel_ioctl_begin(void);
30*f703f1efSPhilippe Mathieu-Daudé void accel_ioctl_end(void);
31*f703f1efSPhilippe Mathieu-Daudé void accel_cpu_ioctl_begin(CPUState *cpu);
32*f703f1efSPhilippe Mathieu-Daudé void accel_cpu_ioctl_end(CPUState *cpu);
33bd688fc9SEmanuele Giuseppe Esposito 
34bd688fc9SEmanuele Giuseppe Esposito /*
35bd688fc9SEmanuele Giuseppe Esposito  * accel_ioctl_inhibit_begin: start critical section
36bd688fc9SEmanuele Giuseppe Esposito  *
37bd688fc9SEmanuele Giuseppe Esposito  * This function makes sure that:
38bd688fc9SEmanuele Giuseppe Esposito  * 1) incoming accel_{cpu_}ioctl_begin() calls block
39bd688fc9SEmanuele Giuseppe Esposito  * 2) wait that all ioctls that were already running reach
40bd688fc9SEmanuele Giuseppe Esposito  *    accel_{cpu_}ioctl_end(), kicking vcpus if necessary.
41bd688fc9SEmanuele Giuseppe Esposito  *
42bd688fc9SEmanuele Giuseppe Esposito  * This allows the caller to access shared data or perform operations without
43bd688fc9SEmanuele Giuseppe Esposito  * worrying of concurrent vcpus accesses.
44bd688fc9SEmanuele Giuseppe Esposito  */
45*f703f1efSPhilippe Mathieu-Daudé void accel_ioctl_inhibit_begin(void);
46bd688fc9SEmanuele Giuseppe Esposito 
47bd688fc9SEmanuele Giuseppe Esposito /*
48bd688fc9SEmanuele Giuseppe Esposito  * accel_ioctl_inhibit_end: end critical section started by
49bd688fc9SEmanuele Giuseppe Esposito  * accel_ioctl_inhibit_begin()
50bd688fc9SEmanuele Giuseppe Esposito  *
51bd688fc9SEmanuele Giuseppe Esposito  * This function allows blocked accel_{cpu_}ioctl_begin() to continue.
52bd688fc9SEmanuele Giuseppe Esposito  */
53*f703f1efSPhilippe Mathieu-Daudé void accel_ioctl_inhibit_end(void);
54bd688fc9SEmanuele Giuseppe Esposito 
55bd688fc9SEmanuele Giuseppe Esposito #endif /* ACCEL_BLOCKER_H */
56