|
@@ -23,6 +23,8 @@
|
|
|
#include "qemu/thread.h"
|
|
|
#include "qemu/timer.h"
|
|
|
#include "block/graph-lock.h"
|
|
|
+#include "hw/qdev-core.h"
|
|
|
+
|
|
|
|
|
|
typedef struct BlockAIOCB BlockAIOCB;
|
|
|
typedef void BlockCompletionFunc(void *opaque, int ret);
|
|
@@ -323,9 +325,11 @@ void aio_bh_schedule_oneshot_full(AioContext *ctx, QEMUBHFunc *cb, void *opaque,
|
|
|
* is opaque and must be allocated prior to its use.
|
|
|
*
|
|
|
* @name: A human-readable identifier for debugging purposes.
|
|
|
+ * @reentrancy_guard: A guard set when entering a cb to prevent
|
|
|
+ * device-reentrancy issues
|
|
|
*/
|
|
|
QEMUBH *aio_bh_new_full(AioContext *ctx, QEMUBHFunc *cb, void *opaque,
|
|
|
- const char *name);
|
|
|
+ const char *name, MemReentrancyGuard *reentrancy_guard);
|
|
|
|
|
|
/**
|
|
|
* aio_bh_new: Allocate a new bottom half structure
|
|
@@ -334,7 +338,17 @@ QEMUBH *aio_bh_new_full(AioContext *ctx, QEMUBHFunc *cb, void *opaque,
|
|
|
* string.
|
|
|
*/
|
|
|
#define aio_bh_new(ctx, cb, opaque) \
|
|
|
- aio_bh_new_full((ctx), (cb), (opaque), (stringify(cb)))
|
|
|
+ aio_bh_new_full((ctx), (cb), (opaque), (stringify(cb)), NULL)
|
|
|
+
|
|
|
+/**
|
|
|
+ * aio_bh_new_guarded: Allocate a new bottom half structure with a
|
|
|
+ * reentrancy_guard
|
|
|
+ *
|
|
|
+ * A convenience wrapper for aio_bh_new_full() that uses the cb as the name
|
|
|
+ * string.
|
|
|
+ */
|
|
|
+#define aio_bh_new_guarded(ctx, cb, opaque, guard) \
|
|
|
+ aio_bh_new_full((ctx), (cb), (opaque), (stringify(cb)), guard)
|
|
|
|
|
|
/**
|
|
|
* aio_notify: Force processing of pending events.
|