• Home
  • Raw
  • Download

Lines Matching +full:close +full:- +full:range

15  * Place - Suite 330, Boston, MA 02111-1307 USA.
37 ((PAGE_ALIGN(addr + len) >> PAGE_SHIFT) - (addr >> PAGE_SHIFT))
53 * vmbus_setevent- Trigger an event notification on the specified
66 if (channel->offermsg.monitor_allocated && !channel->low_latency) { in vmbus_setevent()
67 vmbus_send_interrupt(channel->offermsg.child_relid); in vmbus_setevent()
72 sync_set_bit(channel->monitor_bit, in vmbus_setevent()
73 (unsigned long *)&monitorpage->trigger_group in vmbus_setevent()
74 [channel->monitor_grp].pending); in vmbus_setevent()
83 * vmbus_open - Open the specified channel.
98 return -EINVAL; in vmbus_open()
102 spin_lock_irqsave(&newchannel->lock, flags); in vmbus_open()
103 if (newchannel->state == CHANNEL_OPEN_STATE) { in vmbus_open()
104 newchannel->state = CHANNEL_OPENING_STATE; in vmbus_open()
106 spin_unlock_irqrestore(&newchannel->lock, flags); in vmbus_open()
107 return -EINVAL; in vmbus_open()
109 spin_unlock_irqrestore(&newchannel->lock, flags); in vmbus_open()
111 newchannel->onchannel_callback = onchannelcallback; in vmbus_open()
112 newchannel->channel_callback_context = context; in vmbus_open()
115 page = alloc_pages_node(cpu_to_node(newchannel->target_cpu), in vmbus_open()
122 err = -ENOMEM; in vmbus_open()
126 newchannel->ringbuffer_page = page; in vmbus_open()
127 newchannel->ringbuffer_pagecount = (send_ringbuffer_size + in vmbus_open()
130 ret = hv_ringbuffer_init(&newchannel->outbound, page, in vmbus_open()
138 ret = hv_ringbuffer_init(&newchannel->inbound, in vmbus_open()
148 newchannel->ringbuffer_gpadlhandle = 0; in vmbus_open()
154 &newchannel->ringbuffer_gpadlhandle); in vmbus_open()
166 err = -ENOMEM; in vmbus_open()
170 init_completion(&open_info->waitevent); in vmbus_open()
171 open_info->waiting_channel = newchannel; in vmbus_open()
173 open_msg = (struct vmbus_channel_open_channel *)open_info->msg; in vmbus_open()
174 open_msg->header.msgtype = CHANNELMSG_OPENCHANNEL; in vmbus_open()
175 open_msg->openid = newchannel->offermsg.child_relid; in vmbus_open()
176 open_msg->child_relid = newchannel->offermsg.child_relid; in vmbus_open()
177 open_msg->ringbuffer_gpadlhandle = newchannel->ringbuffer_gpadlhandle; in vmbus_open()
178 open_msg->downstream_ringbuffer_pageoffset = send_ringbuffer_size >> in vmbus_open()
180 open_msg->target_vp = newchannel->target_vp; in vmbus_open()
183 err = -EINVAL; in vmbus_open()
188 memcpy(open_msg->userdata, userdata, userdatalen); in vmbus_open()
191 list_add_tail(&open_info->msglistentry, in vmbus_open()
195 if (newchannel->rescind) { in vmbus_open()
196 err = -ENODEV; in vmbus_open()
210 wait_for_completion(&open_info->waitevent); in vmbus_open()
213 list_del(&open_info->msglistentry); in vmbus_open()
216 if (newchannel->rescind) { in vmbus_open()
217 err = -ENODEV; in vmbus_open()
221 if (open_info->response.open_result.status) { in vmbus_open()
222 err = -EAGAIN; in vmbus_open()
226 newchannel->state = CHANNEL_OPENED_STATE; in vmbus_open()
232 list_del(&open_info->msglistentry); in vmbus_open()
236 vmbus_teardown_gpadl(newchannel, newchannel->ringbuffer_gpadlhandle); in vmbus_open()
239 hv_ringbuffer_cleanup(&newchannel->outbound); in vmbus_open()
240 hv_ringbuffer_cleanup(&newchannel->inbound); in vmbus_open()
243 newchannel->state = CHANNEL_OPEN_STATE; in vmbus_open()
248 /* Used for Hyper-V Socket: a guest client's connect() to the host */
269 * create_gpadl_header - Creates a gpadl for the specified buffer
287 pfnsize = MAX_SIZE_CHANNEL_MESSAGE - in create_gpadl_header()
288 sizeof(struct vmbus_channel_gpadl_header) - in create_gpadl_header()
302 INIT_LIST_HEAD(&msgheader->submsglist); in create_gpadl_header()
303 msgheader->msgsize = msgsize; in create_gpadl_header()
306 msgheader->msg; in create_gpadl_header()
307 gpadl_header->rangecount = 1; in create_gpadl_header()
308 gpadl_header->range_buflen = sizeof(struct gpa_range) + in create_gpadl_header()
310 gpadl_header->range[0].byte_offset = 0; in create_gpadl_header()
311 gpadl_header->range[0].byte_count = size; in create_gpadl_header()
313 gpadl_header->range[0].pfn_array[i] = virt_to_hvpfn( in create_gpadl_header()
318 pfnleft = pagecount - pfncount; in create_gpadl_header()
321 pfnsize = MAX_SIZE_CHANNEL_MESSAGE - in create_gpadl_header()
344 &msgheader->submsglist, in create_gpadl_header()
347 list_del(&pos->msglistentry); in create_gpadl_header()
354 msgbody->msgsize = msgsize; in create_gpadl_header()
356 (struct vmbus_channel_gpadl_body *)msgbody->msg; in create_gpadl_header()
360 * be 64-bit in create_gpadl_header()
365 gpadl_body->pfn[i] = virt_to_hvpfn( in create_gpadl_header()
369 list_add_tail(&msgbody->msglistentry, in create_gpadl_header()
370 &msgheader->submsglist); in create_gpadl_header()
372 pfnleft -= pfncurr; in create_gpadl_header()
383 INIT_LIST_HEAD(&msgheader->submsglist); in create_gpadl_header()
384 msgheader->msgsize = msgsize; in create_gpadl_header()
387 msgheader->msg; in create_gpadl_header()
388 gpadl_header->rangecount = 1; in create_gpadl_header()
389 gpadl_header->range_buflen = sizeof(struct gpa_range) + in create_gpadl_header()
391 gpadl_header->range[0].byte_offset = 0; in create_gpadl_header()
392 gpadl_header->range[0].byte_count = size; in create_gpadl_header()
394 gpadl_header->range[0].pfn_array[i] = virt_to_hvpfn( in create_gpadl_header()
404 return -ENOMEM; in create_gpadl_header()
408 * vmbus_establish_gpadl - Establish a GPADL for the specified buffer
412 * @size: page-size multiple
428 (atomic_inc_return(&vmbus_connection.next_gpadl_handle) - 1); in vmbus_establish_gpadl()
434 init_completion(&msginfo->waitevent); in vmbus_establish_gpadl()
435 msginfo->waiting_channel = channel; in vmbus_establish_gpadl()
437 gpadlmsg = (struct vmbus_channel_gpadl_header *)msginfo->msg; in vmbus_establish_gpadl()
438 gpadlmsg->header.msgtype = CHANNELMSG_GPADL_HEADER; in vmbus_establish_gpadl()
439 gpadlmsg->child_relid = channel->offermsg.child_relid; in vmbus_establish_gpadl()
440 gpadlmsg->gpadl = next_gpadl_handle; in vmbus_establish_gpadl()
444 list_add_tail(&msginfo->msglistentry, in vmbus_establish_gpadl()
449 if (channel->rescind) { in vmbus_establish_gpadl()
450 ret = -ENODEV; in vmbus_establish_gpadl()
454 ret = vmbus_post_msg(gpadlmsg, msginfo->msgsize - in vmbus_establish_gpadl()
462 list_for_each(curr, &msginfo->submsglist) { in vmbus_establish_gpadl()
465 (struct vmbus_channel_gpadl_body *)submsginfo->msg; in vmbus_establish_gpadl()
467 gpadl_body->header.msgtype = in vmbus_establish_gpadl()
469 gpadl_body->gpadl = next_gpadl_handle; in vmbus_establish_gpadl()
472 submsginfo->msgsize - sizeof(*submsginfo), in vmbus_establish_gpadl()
481 wait_for_completion(&msginfo->waitevent); in vmbus_establish_gpadl()
483 if (msginfo->response.gpadl_created.creation_status != 0) { in vmbus_establish_gpadl()
485 msginfo->response.gpadl_created.creation_status); in vmbus_establish_gpadl()
487 ret = -EDQUOT; in vmbus_establish_gpadl()
491 if (channel->rescind) { in vmbus_establish_gpadl()
492 ret = -ENODEV; in vmbus_establish_gpadl()
497 *gpadl_handle = gpadlmsg->gpadl; in vmbus_establish_gpadl()
501 list_del(&msginfo->msglistentry); in vmbus_establish_gpadl()
503 list_for_each_entry_safe(submsginfo, tmp, &msginfo->submsglist, in vmbus_establish_gpadl()
514 * vmbus_teardown_gpadl -Teardown the specified GPADL handle
526 return -ENOMEM; in vmbus_teardown_gpadl()
528 init_completion(&info->waitevent); in vmbus_teardown_gpadl()
529 info->waiting_channel = channel; in vmbus_teardown_gpadl()
531 msg = (struct vmbus_channel_gpadl_teardown *)info->msg; in vmbus_teardown_gpadl()
533 msg->header.msgtype = CHANNELMSG_GPADL_TEARDOWN; in vmbus_teardown_gpadl()
534 msg->child_relid = channel->offermsg.child_relid; in vmbus_teardown_gpadl()
535 msg->gpadl = gpadl_handle; in vmbus_teardown_gpadl()
538 list_add_tail(&info->msglistentry, in vmbus_teardown_gpadl()
542 if (channel->rescind) in vmbus_teardown_gpadl()
553 wait_for_completion(&info->waitevent); in vmbus_teardown_gpadl()
561 if (channel->rescind) in vmbus_teardown_gpadl()
565 list_del(&info->msglistentry); in vmbus_teardown_gpadl()
577 channel->onchannel_callback = NULL; in reset_channel_cb()
583 * vmbus_on_event(), running in the per-channel tasklet, can race in vmbus_reset_channel_cb()
585 * the former is accessing channel->inbound.ring_buffer, the latter in vmbus_reset_channel_cb()
589 tasklet_disable(&channel->callback_event); in vmbus_reset_channel_cb()
591 channel->sc_creation_callback = NULL; in vmbus_reset_channel_cb()
594 if (channel->target_cpu != get_cpu()) { in vmbus_reset_channel_cb()
596 smp_call_function_single(channel->target_cpu, reset_channel_cb, in vmbus_reset_channel_cb()
603 /* Re-enable tasklet for use on re-open */ in vmbus_reset_channel_cb()
604 tasklet_enable(&channel->callback_event); in vmbus_reset_channel_cb()
616 * util_probe() -> vmbus_open() returns -ENOMEM) and the device is in vmbus_close_internal()
618 * in Hyper-V Manager), the driver's remove() invokes vmbus_close(): in vmbus_close_internal()
621 if (channel->state != CHANNEL_OPENED_STATE) { in vmbus_close_internal()
622 ret = -EINVAL; in vmbus_close_internal()
626 channel->state = CHANNEL_OPEN_STATE; in vmbus_close_internal()
630 msg = &channel->close_msg.msg; in vmbus_close_internal()
632 msg->header.msgtype = CHANNELMSG_CLOSECHANNEL; in vmbus_close_internal()
633 msg->child_relid = channel->offermsg.child_relid; in vmbus_close_internal()
641 pr_err("Close failed: close post msg return is %d\n", ret); in vmbus_close_internal()
643 * If we failed to post the close msg, in vmbus_close_internal()
650 if (channel->ringbuffer_gpadlhandle) { in vmbus_close_internal()
652 channel->ringbuffer_gpadlhandle); in vmbus_close_internal()
654 pr_err("Close failed: teardown gpadl return %d\n", ret); in vmbus_close_internal()
664 hv_ringbuffer_cleanup(&channel->outbound); in vmbus_close_internal()
665 hv_ringbuffer_cleanup(&channel->inbound); in vmbus_close_internal()
667 __free_pages(channel->ringbuffer_page, in vmbus_close_internal()
668 get_order(channel->ringbuffer_pagecount << PAGE_SHIFT)); in vmbus_close_internal()
675 * vmbus_close - Close the specified channel
682 if (channel->primary_channel != NULL) { in vmbus_close()
684 * We will only close sub-channels when in vmbus_close()
690 * Close all the sub-channels first and then close the in vmbus_close()
693 list_for_each_safe(cur, tmp, &channel->sc_list) { in vmbus_close()
695 if (cur_channel->rescind) { in vmbus_close()
696 wait_for_completion(&cur_channel->rescind_event); in vmbus_close()
700 cur_channel->offermsg.child_relid); in vmbus_close()
708 * Now close the primary. in vmbus_close()
717 * vmbus_sendpacket() - Send the specified buffer on the given channel
725 * Sends data in @buffer directly to hyper-v via the vmbus
726 * This will send the data unparsed to hyper-v.
728 * Mainly used by Hyper-V drivers.
745 /* in 8-bytes granularity */ in vmbus_sendpacket()
755 bufferlist[2].iov_len = (packetlen_aligned - packetlen); in vmbus_sendpacket()
762 * vmbus_sendpacket_pagebuffer - Send a range of single-page buffer
782 return -EINVAL; in vmbus_sendpacket_pagebuffer()
788 descsize = sizeof(struct vmbus_channel_packet_page_buffer) - in vmbus_sendpacket_pagebuffer()
789 ((MAX_PAGE_BUFFER_COUNT - pagecount) * in vmbus_sendpacket_pagebuffer()
797 desc.dataoffset8 = descsize >> 3; /* in 8-bytes granularity */ in vmbus_sendpacket_pagebuffer()
804 desc.range[i].len = pagebuffers[i].len; in vmbus_sendpacket_pagebuffer()
805 desc.range[i].offset = pagebuffers[i].offset; in vmbus_sendpacket_pagebuffer()
806 desc.range[i].pfn = pagebuffers[i].pfn; in vmbus_sendpacket_pagebuffer()
814 bufferlist[2].iov_len = (packetlen_aligned - packetlen); in vmbus_sendpacket_pagebuffer()
821 * vmbus_sendpacket_multipagebuffer - Send a multi-page buffer packet
839 desc->type = VM_PKT_DATA_USING_GPA_DIRECT; in vmbus_sendpacket_mpb_desc()
840 desc->flags = VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED; in vmbus_sendpacket_mpb_desc()
841 desc->dataoffset8 = desc_size >> 3; /* in 8-bytes granularity */ in vmbus_sendpacket_mpb_desc()
842 desc->length8 = (u16)(packetlen_aligned >> 3); in vmbus_sendpacket_mpb_desc()
843 desc->transactionid = requestid; in vmbus_sendpacket_mpb_desc()
844 desc->reserved = 0; in vmbus_sendpacket_mpb_desc()
845 desc->rangecount = 1; in vmbus_sendpacket_mpb_desc()
852 bufferlist[2].iov_len = (packetlen_aligned - packetlen); in vmbus_sendpacket_mpb_desc()
859 * vmbus_recvpacket() - Retrieve the user packet on the specified channel
866 * Receives directly from the hyper-v vmbus and puts the data it received
867 * into Buffer. This will receive the data unparsed from hyper-v.
869 * Mainly used by Hyper-V drivers.
891 * vmbus_recvpacket_raw - Retrieve the raw packet on the specified channel