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