mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
hyperv/vmbus: Support transction result busy-wait.
MFC after: 1 week Sponsored by: Microsoft Differential Revision: https://reviews.freebsd.org/D8488
This commit is contained in:
parent
dc13fee60c
commit
8f3bf5f97b
2 changed files with 28 additions and 3 deletions
|
|
@ -51,6 +51,8 @@ void vmbus_xact_activate(struct vmbus_xact *xact);
|
|||
void vmbus_xact_deactivate(struct vmbus_xact *xact);
|
||||
const void *vmbus_xact_wait(struct vmbus_xact *xact,
|
||||
size_t *resp_len);
|
||||
const void *vmbus_xact_busywait(struct vmbus_xact *xact,
|
||||
size_t *resp_len);
|
||||
void vmbus_xact_wakeup(struct vmbus_xact *xact,
|
||||
const void *data, size_t dlen);
|
||||
void vmbus_xact_ctx_wakeup(struct vmbus_xact_ctx *ctx,
|
||||
|
|
|
|||
|
|
@ -69,6 +69,8 @@ static struct vmbus_xact *vmbus_xact_alloc(struct vmbus_xact_ctx *,
|
|||
static void vmbus_xact_free(struct vmbus_xact *);
|
||||
static struct vmbus_xact *vmbus_xact_get1(struct vmbus_xact_ctx *,
|
||||
uint32_t);
|
||||
const void *vmbus_xact_wait1(struct vmbus_xact *, size_t *,
|
||||
bool);
|
||||
|
||||
static struct vmbus_xact *
|
||||
vmbus_xact_alloc(struct vmbus_xact_ctx *ctx, bus_dma_tag_t parent_dtag)
|
||||
|
|
@ -249,7 +251,8 @@ vmbus_xact_deactivate(struct vmbus_xact *xact)
|
|||
}
|
||||
|
||||
const void *
|
||||
vmbus_xact_wait(struct vmbus_xact *xact, size_t *resp_len)
|
||||
vmbus_xact_wait1(struct vmbus_xact *xact, size_t *resp_len,
|
||||
bool can_sleep)
|
||||
{
|
||||
struct vmbus_xact_ctx *ctx = xact->x_ctx;
|
||||
const void *resp;
|
||||
|
|
@ -258,8 +261,14 @@ vmbus_xact_wait(struct vmbus_xact *xact, size_t *resp_len)
|
|||
|
||||
KASSERT(ctx->xc_active == xact, ("xact mismatch"));
|
||||
while (xact->x_resp == NULL) {
|
||||
mtx_sleep(&ctx->xc_active, &ctx->xc_active_lock, 0,
|
||||
"wxact", 0);
|
||||
if (can_sleep) {
|
||||
mtx_sleep(&ctx->xc_active, &ctx->xc_active_lock, 0,
|
||||
"wxact", 0);
|
||||
} else {
|
||||
mtx_unlock(&ctx->xc_active_lock);
|
||||
DELAY(1000);
|
||||
mtx_lock(&ctx->xc_active_lock);
|
||||
}
|
||||
}
|
||||
ctx->xc_active = NULL;
|
||||
|
||||
|
|
@ -271,6 +280,20 @@ vmbus_xact_wait(struct vmbus_xact *xact, size_t *resp_len)
|
|||
return (resp);
|
||||
}
|
||||
|
||||
const void *
|
||||
vmbus_xact_wait(struct vmbus_xact *xact, size_t *resp_len)
|
||||
{
|
||||
|
||||
return (vmbus_xact_wait1(xact, resp_len, true /* can sleep */));
|
||||
}
|
||||
|
||||
const void *
|
||||
vmbus_xact_busywait(struct vmbus_xact *xact, size_t *resp_len)
|
||||
{
|
||||
|
||||
return (vmbus_xact_wait1(xact, resp_len, false /* can't sleep */));
|
||||
}
|
||||
|
||||
static void
|
||||
vmbus_xact_save_resp(struct vmbus_xact *xact, const void *data, size_t dlen)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue