Drivers: hv: vmbus: Move __vmbus_open()
Pure function movement, no functional changes. The move is made, because in a later change, __vmbus_open() will rely on some static functions afterwards, so we separate the move and the modification of __vmbus_open() in two patches to make it easy to review. Signed-off-by: Boqun Feng <boqun.feng@gmail.com> Reviewed-by: Wei Liu <wei.liu@kernel.org> Reviewed-by: Michael Kelley <mikelley@microsoft.com> Link: https://lore.kernel.org/r/20200916034817.30282-3-boqun.feng@gmail.com Signed-off-by: Wei Liu <wei.liu@kernel.org>
This commit is contained in:
parent
a5dda201a0
commit
edd9bbc1d9
@ -109,160 +109,6 @@ int vmbus_alloc_ring(struct vmbus_channel *newchannel,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(vmbus_alloc_ring);
|
EXPORT_SYMBOL_GPL(vmbus_alloc_ring);
|
||||||
|
|
||||||
static int __vmbus_open(struct vmbus_channel *newchannel,
|
|
||||||
void *userdata, u32 userdatalen,
|
|
||||||
void (*onchannelcallback)(void *context), void *context)
|
|
||||||
{
|
|
||||||
struct vmbus_channel_open_channel *open_msg;
|
|
||||||
struct vmbus_channel_msginfo *open_info = NULL;
|
|
||||||
struct page *page = newchannel->ringbuffer_page;
|
|
||||||
u32 send_pages, recv_pages;
|
|
||||||
unsigned long flags;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
if (userdatalen > MAX_USER_DEFINED_BYTES)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
send_pages = newchannel->ringbuffer_send_offset;
|
|
||||||
recv_pages = newchannel->ringbuffer_pagecount - send_pages;
|
|
||||||
|
|
||||||
if (newchannel->state != CHANNEL_OPEN_STATE)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
newchannel->state = CHANNEL_OPENING_STATE;
|
|
||||||
newchannel->onchannel_callback = onchannelcallback;
|
|
||||||
newchannel->channel_callback_context = context;
|
|
||||||
|
|
||||||
err = hv_ringbuffer_init(&newchannel->outbound, page, send_pages);
|
|
||||||
if (err)
|
|
||||||
goto error_clean_ring;
|
|
||||||
|
|
||||||
err = hv_ringbuffer_init(&newchannel->inbound,
|
|
||||||
&page[send_pages], recv_pages);
|
|
||||||
if (err)
|
|
||||||
goto error_clean_ring;
|
|
||||||
|
|
||||||
/* Establish the gpadl for the ring buffer */
|
|
||||||
newchannel->ringbuffer_gpadlhandle = 0;
|
|
||||||
|
|
||||||
err = vmbus_establish_gpadl(newchannel,
|
|
||||||
page_address(newchannel->ringbuffer_page),
|
|
||||||
(send_pages + recv_pages) << PAGE_SHIFT,
|
|
||||||
&newchannel->ringbuffer_gpadlhandle);
|
|
||||||
if (err)
|
|
||||||
goto error_clean_ring;
|
|
||||||
|
|
||||||
/* Create and init the channel open message */
|
|
||||||
open_info = kmalloc(sizeof(*open_info) +
|
|
||||||
sizeof(struct vmbus_channel_open_channel),
|
|
||||||
GFP_KERNEL);
|
|
||||||
if (!open_info) {
|
|
||||||
err = -ENOMEM;
|
|
||||||
goto error_free_gpadl;
|
|
||||||
}
|
|
||||||
|
|
||||||
init_completion(&open_info->waitevent);
|
|
||||||
open_info->waiting_channel = newchannel;
|
|
||||||
|
|
||||||
open_msg = (struct vmbus_channel_open_channel *)open_info->msg;
|
|
||||||
open_msg->header.msgtype = CHANNELMSG_OPENCHANNEL;
|
|
||||||
open_msg->openid = newchannel->offermsg.child_relid;
|
|
||||||
open_msg->child_relid = newchannel->offermsg.child_relid;
|
|
||||||
open_msg->ringbuffer_gpadlhandle = newchannel->ringbuffer_gpadlhandle;
|
|
||||||
open_msg->downstream_ringbuffer_pageoffset = newchannel->ringbuffer_send_offset;
|
|
||||||
open_msg->target_vp = hv_cpu_number_to_vp_number(newchannel->target_cpu);
|
|
||||||
|
|
||||||
if (userdatalen)
|
|
||||||
memcpy(open_msg->userdata, userdata, userdatalen);
|
|
||||||
|
|
||||||
spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
|
|
||||||
list_add_tail(&open_info->msglistentry,
|
|
||||||
&vmbus_connection.chn_msg_list);
|
|
||||||
spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
|
|
||||||
|
|
||||||
if (newchannel->rescind) {
|
|
||||||
err = -ENODEV;
|
|
||||||
goto error_free_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = vmbus_post_msg(open_msg,
|
|
||||||
sizeof(struct vmbus_channel_open_channel), true);
|
|
||||||
|
|
||||||
trace_vmbus_open(open_msg, err);
|
|
||||||
|
|
||||||
if (err != 0)
|
|
||||||
goto error_clean_msglist;
|
|
||||||
|
|
||||||
wait_for_completion(&open_info->waitevent);
|
|
||||||
|
|
||||||
spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
|
|
||||||
list_del(&open_info->msglistentry);
|
|
||||||
spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
|
|
||||||
|
|
||||||
if (newchannel->rescind) {
|
|
||||||
err = -ENODEV;
|
|
||||||
goto error_free_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (open_info->response.open_result.status) {
|
|
||||||
err = -EAGAIN;
|
|
||||||
goto error_free_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
newchannel->state = CHANNEL_OPENED_STATE;
|
|
||||||
kfree(open_info);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
error_clean_msglist:
|
|
||||||
spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
|
|
||||||
list_del(&open_info->msglistentry);
|
|
||||||
spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
|
|
||||||
error_free_info:
|
|
||||||
kfree(open_info);
|
|
||||||
error_free_gpadl:
|
|
||||||
vmbus_teardown_gpadl(newchannel, newchannel->ringbuffer_gpadlhandle);
|
|
||||||
newchannel->ringbuffer_gpadlhandle = 0;
|
|
||||||
error_clean_ring:
|
|
||||||
hv_ringbuffer_cleanup(&newchannel->outbound);
|
|
||||||
hv_ringbuffer_cleanup(&newchannel->inbound);
|
|
||||||
newchannel->state = CHANNEL_OPEN_STATE;
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* vmbus_connect_ring - Open the channel but reuse ring buffer
|
|
||||||
*/
|
|
||||||
int vmbus_connect_ring(struct vmbus_channel *newchannel,
|
|
||||||
void (*onchannelcallback)(void *context), void *context)
|
|
||||||
{
|
|
||||||
return __vmbus_open(newchannel, NULL, 0, onchannelcallback, context);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(vmbus_connect_ring);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* vmbus_open - Open the specified channel.
|
|
||||||
*/
|
|
||||||
int vmbus_open(struct vmbus_channel *newchannel,
|
|
||||||
u32 send_ringbuffer_size, u32 recv_ringbuffer_size,
|
|
||||||
void *userdata, u32 userdatalen,
|
|
||||||
void (*onchannelcallback)(void *context), void *context)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
|
|
||||||
err = vmbus_alloc_ring(newchannel, send_ringbuffer_size,
|
|
||||||
recv_ringbuffer_size);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
err = __vmbus_open(newchannel, userdata, userdatalen,
|
|
||||||
onchannelcallback, context);
|
|
||||||
if (err)
|
|
||||||
vmbus_free_ring(newchannel);
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(vmbus_open);
|
|
||||||
|
|
||||||
/* Used for Hyper-V Socket: a guest client's connect() to the host */
|
/* Used for Hyper-V Socket: a guest client's connect() to the host */
|
||||||
int vmbus_send_tl_connect_request(const guid_t *shv_guest_servie_id,
|
int vmbus_send_tl_connect_request(const guid_t *shv_guest_servie_id,
|
||||||
const guid_t *shv_host_servie_id)
|
const guid_t *shv_host_servie_id)
|
||||||
@ -556,6 +402,161 @@ cleanup:
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(vmbus_establish_gpadl);
|
EXPORT_SYMBOL_GPL(vmbus_establish_gpadl);
|
||||||
|
|
||||||
|
static int __vmbus_open(struct vmbus_channel *newchannel,
|
||||||
|
void *userdata, u32 userdatalen,
|
||||||
|
void (*onchannelcallback)(void *context), void *context)
|
||||||
|
{
|
||||||
|
struct vmbus_channel_open_channel *open_msg;
|
||||||
|
struct vmbus_channel_msginfo *open_info = NULL;
|
||||||
|
struct page *page = newchannel->ringbuffer_page;
|
||||||
|
u32 send_pages, recv_pages;
|
||||||
|
unsigned long flags;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (userdatalen > MAX_USER_DEFINED_BYTES)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
send_pages = newchannel->ringbuffer_send_offset;
|
||||||
|
recv_pages = newchannel->ringbuffer_pagecount - send_pages;
|
||||||
|
|
||||||
|
if (newchannel->state != CHANNEL_OPEN_STATE)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
newchannel->state = CHANNEL_OPENING_STATE;
|
||||||
|
newchannel->onchannel_callback = onchannelcallback;
|
||||||
|
newchannel->channel_callback_context = context;
|
||||||
|
|
||||||
|
err = hv_ringbuffer_init(&newchannel->outbound, page, send_pages);
|
||||||
|
if (err)
|
||||||
|
goto error_clean_ring;
|
||||||
|
|
||||||
|
err = hv_ringbuffer_init(&newchannel->inbound,
|
||||||
|
&page[send_pages], recv_pages);
|
||||||
|
if (err)
|
||||||
|
goto error_clean_ring;
|
||||||
|
|
||||||
|
/* Establish the gpadl for the ring buffer */
|
||||||
|
newchannel->ringbuffer_gpadlhandle = 0;
|
||||||
|
|
||||||
|
err = vmbus_establish_gpadl(newchannel,
|
||||||
|
page_address(newchannel->ringbuffer_page),
|
||||||
|
(send_pages + recv_pages) << PAGE_SHIFT,
|
||||||
|
&newchannel->ringbuffer_gpadlhandle);
|
||||||
|
if (err)
|
||||||
|
goto error_clean_ring;
|
||||||
|
|
||||||
|
/* Create and init the channel open message */
|
||||||
|
open_info = kmalloc(sizeof(*open_info) +
|
||||||
|
sizeof(struct vmbus_channel_open_channel),
|
||||||
|
GFP_KERNEL);
|
||||||
|
if (!open_info) {
|
||||||
|
err = -ENOMEM;
|
||||||
|
goto error_free_gpadl;
|
||||||
|
}
|
||||||
|
|
||||||
|
init_completion(&open_info->waitevent);
|
||||||
|
open_info->waiting_channel = newchannel;
|
||||||
|
|
||||||
|
open_msg = (struct vmbus_channel_open_channel *)open_info->msg;
|
||||||
|
open_msg->header.msgtype = CHANNELMSG_OPENCHANNEL;
|
||||||
|
open_msg->openid = newchannel->offermsg.child_relid;
|
||||||
|
open_msg->child_relid = newchannel->offermsg.child_relid;
|
||||||
|
open_msg->ringbuffer_gpadlhandle = newchannel->ringbuffer_gpadlhandle;
|
||||||
|
open_msg->downstream_ringbuffer_pageoffset = newchannel->ringbuffer_send_offset;
|
||||||
|
open_msg->target_vp = hv_cpu_number_to_vp_number(newchannel->target_cpu);
|
||||||
|
|
||||||
|
if (userdatalen)
|
||||||
|
memcpy(open_msg->userdata, userdata, userdatalen);
|
||||||
|
|
||||||
|
spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
|
||||||
|
list_add_tail(&open_info->msglistentry,
|
||||||
|
&vmbus_connection.chn_msg_list);
|
||||||
|
spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
|
||||||
|
|
||||||
|
if (newchannel->rescind) {
|
||||||
|
err = -ENODEV;
|
||||||
|
goto error_free_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = vmbus_post_msg(open_msg,
|
||||||
|
sizeof(struct vmbus_channel_open_channel), true);
|
||||||
|
|
||||||
|
trace_vmbus_open(open_msg, err);
|
||||||
|
|
||||||
|
if (err != 0)
|
||||||
|
goto error_clean_msglist;
|
||||||
|
|
||||||
|
wait_for_completion(&open_info->waitevent);
|
||||||
|
|
||||||
|
spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
|
||||||
|
list_del(&open_info->msglistentry);
|
||||||
|
spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
|
||||||
|
|
||||||
|
if (newchannel->rescind) {
|
||||||
|
err = -ENODEV;
|
||||||
|
goto error_free_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (open_info->response.open_result.status) {
|
||||||
|
err = -EAGAIN;
|
||||||
|
goto error_free_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
newchannel->state = CHANNEL_OPENED_STATE;
|
||||||
|
kfree(open_info);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error_clean_msglist:
|
||||||
|
spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
|
||||||
|
list_del(&open_info->msglistentry);
|
||||||
|
spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
|
||||||
|
error_free_info:
|
||||||
|
kfree(open_info);
|
||||||
|
error_free_gpadl:
|
||||||
|
vmbus_teardown_gpadl(newchannel, newchannel->ringbuffer_gpadlhandle);
|
||||||
|
newchannel->ringbuffer_gpadlhandle = 0;
|
||||||
|
error_clean_ring:
|
||||||
|
hv_ringbuffer_cleanup(&newchannel->outbound);
|
||||||
|
hv_ringbuffer_cleanup(&newchannel->inbound);
|
||||||
|
newchannel->state = CHANNEL_OPEN_STATE;
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* vmbus_connect_ring - Open the channel but reuse ring buffer
|
||||||
|
*/
|
||||||
|
int vmbus_connect_ring(struct vmbus_channel *newchannel,
|
||||||
|
void (*onchannelcallback)(void *context), void *context)
|
||||||
|
{
|
||||||
|
return __vmbus_open(newchannel, NULL, 0, onchannelcallback, context);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(vmbus_connect_ring);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* vmbus_open - Open the specified channel.
|
||||||
|
*/
|
||||||
|
int vmbus_open(struct vmbus_channel *newchannel,
|
||||||
|
u32 send_ringbuffer_size, u32 recv_ringbuffer_size,
|
||||||
|
void *userdata, u32 userdatalen,
|
||||||
|
void (*onchannelcallback)(void *context), void *context)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = vmbus_alloc_ring(newchannel, send_ringbuffer_size,
|
||||||
|
recv_ringbuffer_size);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
err = __vmbus_open(newchannel, userdata, userdatalen,
|
||||||
|
onchannelcallback, context);
|
||||||
|
if (err)
|
||||||
|
vmbus_free_ring(newchannel);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(vmbus_open);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* vmbus_teardown_gpadl -Teardown the specified GPADL handle
|
* vmbus_teardown_gpadl -Teardown the specified GPADL handle
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user