mirror of
https://github.com/opnsense/src.git
synced 2026-04-22 23:02:02 -04:00
hyperv/vmbus: Use post message Hypercall APIs for channel close
MFC after: 1 week Sponsored by: Microsoft OSTC Differential Revision: https://reviews.freebsd.org/D6906
This commit is contained in:
parent
2bf62f9a89
commit
e9bd7c4417
2 changed files with 34 additions and 17 deletions
|
|
@ -487,10 +487,11 @@ cleanup:
|
|||
static void
|
||||
hv_vmbus_channel_close_internal(hv_vmbus_channel *channel)
|
||||
{
|
||||
int ret = 0;
|
||||
struct vmbus_softc *sc = channel->vmbus_sc;
|
||||
struct vmbus_msghc *mh;
|
||||
struct vmbus_chanmsg_chclose *req;
|
||||
struct taskqueue *rxq = channel->rxq;
|
||||
hv_vmbus_channel_close_channel* msg;
|
||||
hv_vmbus_channel_msg_info* info;
|
||||
int error;
|
||||
|
||||
channel->state = HV_CHANNEL_OPEN_STATE;
|
||||
|
||||
|
|
@ -504,20 +505,31 @@ hv_vmbus_channel_close_internal(hv_vmbus_channel *channel)
|
|||
/**
|
||||
* Send a closing message
|
||||
*/
|
||||
info = (hv_vmbus_channel_msg_info *)
|
||||
malloc( sizeof(hv_vmbus_channel_msg_info) +
|
||||
sizeof(hv_vmbus_channel_close_channel),
|
||||
M_DEVBUF, M_NOWAIT);
|
||||
KASSERT(info != NULL, ("VMBUS: malloc failed hv_vmbus_channel_close!"));
|
||||
if(info == NULL)
|
||||
return;
|
||||
|
||||
msg = (hv_vmbus_channel_close_channel*) info->msg;
|
||||
msg->header.message_type = HV_CHANNEL_MESSAGE_CLOSE_CHANNEL;
|
||||
msg->child_rel_id = channel->offer_msg.child_rel_id;
|
||||
mh = vmbus_msghc_get(sc, sizeof(*req));
|
||||
if (mh == NULL) {
|
||||
device_printf(sc->vmbus_dev,
|
||||
"can not get msg hypercall for chclose(chan%u)\n",
|
||||
channel->offer_msg.child_rel_id);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = hv_vmbus_post_message(
|
||||
msg, sizeof(hv_vmbus_channel_close_channel));
|
||||
req = vmbus_msghc_dataptr(mh);
|
||||
req->chm_hdr.chm_type = VMBUS_CHANMSG_TYPE_CHCLOSE;
|
||||
req->chm_chanid = channel->offer_msg.child_rel_id;
|
||||
|
||||
error = vmbus_msghc_exec_noresult(mh);
|
||||
vmbus_msghc_put(sc, mh);
|
||||
|
||||
if (error) {
|
||||
device_printf(sc->vmbus_dev,
|
||||
"chclose(chan%u) msg hypercall exec failed: %d\n",
|
||||
channel->offer_msg.child_rel_id, error);
|
||||
return;
|
||||
} else if (bootverbose) {
|
||||
device_printf(sc->vmbus_dev, "close chan%u\n",
|
||||
channel->offer_msg.child_rel_id);
|
||||
}
|
||||
|
||||
/* Tear down the gpadl for the channel's ring buffer */
|
||||
if (channel->ring_buffer_gpadl_handle) {
|
||||
|
|
@ -533,8 +545,6 @@ hv_vmbus_channel_close_internal(hv_vmbus_channel *channel)
|
|||
|
||||
contigfree(channel->ring_buffer_pages, channel->ring_buffer_size,
|
||||
M_DEVBUF);
|
||||
|
||||
free(info, M_DEVBUF);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -96,6 +96,7 @@ struct vmbus_gpa_range {
|
|||
#define VMBUS_CHANMSG_TYPE_CHANNEL_REQ 3 /* REQ */
|
||||
#define VMBUS_CHANMSG_TYPE_CHOPEN 5 /* REQ */
|
||||
#define VMBUS_CHANMSG_TYPE_CHOPEN_RESP 6 /* RESP */
|
||||
#define VMBUS_CHANMSG_TYPE_CHCLOSE 7 /* REQ */
|
||||
#define VMBUS_CHANMSG_TYPE_GPADL_CONN 8 /* REQ */
|
||||
#define VMBUS_CHANMSG_TYPE_GPADL_SUBCONN 9 /* REQ */
|
||||
#define VMBUS_CHANMSG_TYPE_GPADP_CONNRESP 10 /* RESP */
|
||||
|
|
@ -190,4 +191,10 @@ struct vmbus_chanmsg_gpadl_connresp {
|
|||
uint32_t chm_status;
|
||||
} __packed;
|
||||
|
||||
/* VMBUS_CHANMSG_TYPE_CHCLOSE */
|
||||
struct vmbus_chanmsg_chclose {
|
||||
struct vmbus_chanmsg_hdr chm_hdr;
|
||||
uint32_t chm_chanid;
|
||||
} __packed;
|
||||
|
||||
#endif /* !_VMBUS_REG_H_ */
|
||||
|
|
|
|||
Loading…
Reference in a new issue