提交 35abb21a 编写于 作者: K K. Y. Srinivasan 提交者: Greg Kroah-Hartman

Staging: hv: Use completion abstraction in struct netvsc_device

Use completion abstraction in struct netvsc_device instead of
struct wait_queue_head_t to synchronize.
Signed-off-by: NK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: NHaiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: NAbhishek Kane <v-abkane@microsoft.com>
Signed-off-by: NHank Janssen <hjanssen@microsoft.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 bc1bf5dd
...@@ -213,6 +213,7 @@ static int netvsc_destroy_recv_buf(struct netvsc_device *net_device) ...@@ -213,6 +213,7 @@ static int netvsc_destroy_recv_buf(struct netvsc_device *net_device)
static int netvsc_init_recv_buf(struct hv_device *device) static int netvsc_init_recv_buf(struct hv_device *device)
{ {
int ret = 0; int ret = 0;
int t;
struct netvsc_device *net_device; struct netvsc_device *net_device;
struct nvsp_message *init_packet; struct nvsp_message *init_packet;
...@@ -260,7 +261,6 @@ static int netvsc_init_recv_buf(struct hv_device *device) ...@@ -260,7 +261,6 @@ static int netvsc_init_recv_buf(struct hv_device *device)
send_recv_buf.id = NETVSC_RECEIVE_BUFFER_ID; send_recv_buf.id = NETVSC_RECEIVE_BUFFER_ID;
/* Send the gpadl notification request */ /* Send the gpadl notification request */
net_device->wait_condition = 0;
ret = vmbus_sendpacket(device->channel, init_packet, ret = vmbus_sendpacket(device->channel, init_packet,
sizeof(struct nvsp_message), sizeof(struct nvsp_message),
(unsigned long)init_packet, (unsigned long)init_packet,
...@@ -272,10 +272,8 @@ static int netvsc_init_recv_buf(struct hv_device *device) ...@@ -272,10 +272,8 @@ static int netvsc_init_recv_buf(struct hv_device *device)
goto cleanup; goto cleanup;
} }
wait_event_timeout(net_device->channel_init_wait, t = wait_for_completion_timeout(&net_device->channel_init_wait, HZ);
net_device->wait_condition, BUG_ON(t == 0);
msecs_to_jiffies(1000));
BUG_ON(net_device->wait_condition == 0);
/* Check the response */ /* Check the response */
...@@ -394,6 +392,7 @@ static int netvsc_destroy_send_buf(struct netvsc_device *net_device) ...@@ -394,6 +392,7 @@ static int netvsc_destroy_send_buf(struct netvsc_device *net_device)
static int netvsc_init_send_buf(struct hv_device *device) static int netvsc_init_send_buf(struct hv_device *device)
{ {
int ret = 0; int ret = 0;
int t;
struct netvsc_device *net_device; struct netvsc_device *net_device;
struct nvsp_message *init_packet; struct nvsp_message *init_packet;
...@@ -443,7 +442,6 @@ static int netvsc_init_send_buf(struct hv_device *device) ...@@ -443,7 +442,6 @@ static int netvsc_init_send_buf(struct hv_device *device)
NETVSC_SEND_BUFFER_ID; NETVSC_SEND_BUFFER_ID;
/* Send the gpadl notification request */ /* Send the gpadl notification request */
net_device->wait_condition = 0;
ret = vmbus_sendpacket(device->channel, init_packet, ret = vmbus_sendpacket(device->channel, init_packet,
sizeof(struct nvsp_message), sizeof(struct nvsp_message),
(unsigned long)init_packet, (unsigned long)init_packet,
...@@ -455,10 +453,9 @@ static int netvsc_init_send_buf(struct hv_device *device) ...@@ -455,10 +453,9 @@ static int netvsc_init_send_buf(struct hv_device *device)
goto cleanup; goto cleanup;
} }
wait_event_timeout(net_device->channel_init_wait, t = wait_for_completion_timeout(&net_device->channel_init_wait, HZ);
net_device->wait_condition,
msecs_to_jiffies(1000)); BUG_ON(t == 0);
BUG_ON(net_device->wait_condition == 0);
/* Check the response */ /* Check the response */
if (init_packet->msg.v1_msg. if (init_packet->msg.v1_msg.
...@@ -487,7 +484,7 @@ static int netvsc_init_send_buf(struct hv_device *device) ...@@ -487,7 +484,7 @@ static int netvsc_init_send_buf(struct hv_device *device)
static int netvsc_connect_vsp(struct hv_device *device) static int netvsc_connect_vsp(struct hv_device *device)
{ {
int ret; int ret, t;
struct netvsc_device *net_device; struct netvsc_device *net_device;
struct nvsp_message *init_packet; struct nvsp_message *init_packet;
int ndis_version; int ndis_version;
...@@ -509,7 +506,6 @@ static int netvsc_connect_vsp(struct hv_device *device) ...@@ -509,7 +506,6 @@ static int netvsc_connect_vsp(struct hv_device *device)
NVSP_MAX_PROTOCOL_VERSION; NVSP_MAX_PROTOCOL_VERSION;
/* Send the init request */ /* Send the init request */
net_device->wait_condition = 0;
ret = vmbus_sendpacket(device->channel, init_packet, ret = vmbus_sendpacket(device->channel, init_packet,
sizeof(struct nvsp_message), sizeof(struct nvsp_message),
(unsigned long)init_packet, (unsigned long)init_packet,
...@@ -519,10 +515,9 @@ static int netvsc_connect_vsp(struct hv_device *device) ...@@ -519,10 +515,9 @@ static int netvsc_connect_vsp(struct hv_device *device)
if (ret != 0) if (ret != 0)
goto cleanup; goto cleanup;
wait_event_timeout(net_device->channel_init_wait, t = wait_for_completion_timeout(&net_device->channel_init_wait, HZ);
net_device->wait_condition,
msecs_to_jiffies(1000)); if (t == 0) {
if (net_device->wait_condition == 0) {
ret = -ETIMEDOUT; ret = -ETIMEDOUT;
goto cleanup; goto cleanup;
} }
...@@ -647,8 +642,7 @@ static void netvsc_send_completion(struct hv_device *device, ...@@ -647,8 +642,7 @@ static void netvsc_send_completion(struct hv_device *device,
/* Copy the response back */ /* Copy the response back */
memcpy(&net_device->channel_init_pkt, nvsp_packet, memcpy(&net_device->channel_init_pkt, nvsp_packet,
sizeof(struct nvsp_message)); sizeof(struct nvsp_message));
net_device->wait_condition = 1; complete(&net_device->channel_init_wait);
wake_up(&net_device->channel_init_wait);
} else if (nvsp_packet->hdr.msg_type == } else if (nvsp_packet->hdr.msg_type ==
NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE) { NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE) {
/* Get the send context */ /* Get the send context */
...@@ -1123,7 +1117,7 @@ int netvsc_device_add(struct hv_device *device, void *additional_info) ...@@ -1123,7 +1117,7 @@ int netvsc_device_add(struct hv_device *device, void *additional_info)
list_add_tail(&packet->list_ent, list_add_tail(&packet->list_ent,
&net_device->recv_pkt_list); &net_device->recv_pkt_list);
} }
init_waitqueue_head(&net_device->channel_init_wait); init_completion(&net_device->channel_init_wait);
/* Open the channel */ /* Open the channel */
ret = vmbus_open(device->channel, net_driver->ring_buf_size, ret = vmbus_open(device->channel, net_driver->ring_buf_size,
......
...@@ -318,8 +318,7 @@ struct netvsc_device { ...@@ -318,8 +318,7 @@ struct netvsc_device {
struct nvsp_1_receive_buffer_section *recv_section; struct nvsp_1_receive_buffer_section *recv_section;
/* Used for NetVSP initialization protocol */ /* Used for NetVSP initialization protocol */
int wait_condition; struct completion channel_init_wait;
wait_queue_head_t channel_init_wait;
struct nvsp_message channel_init_pkt; struct nvsp_message channel_init_pkt;
struct nvsp_message revoke_packet; struct nvsp_message revoke_packet;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册