Commit 87e93d61 authored by K. Y. Srinivasan's avatar K. Y. Srinivasan Committed by Greg Kroah-Hartman
Browse files

Drivers: hv: vmbus: Suport an API to send pagebuffers with additional control



Implement an API for sending pagebuffers that gives more control to the client
in terms of setting the vmbus flags as well as deciding when to
notify the host. This will be useful for enabling batch processing.

Signed-off-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a13e8bbe
Loading
Loading
Loading
Loading
+27 −6
Original line number Original line Diff line number Diff line
@@ -636,13 +636,18 @@ int vmbus_sendpacket(struct vmbus_channel *channel, void *buffer,
EXPORT_SYMBOL(vmbus_sendpacket);
EXPORT_SYMBOL(vmbus_sendpacket);


/*
/*
 * vmbus_sendpacket_pagebuffer - Send a range of single-page buffer
 * vmbus_sendpacket_pagebuffer_ctl - Send a range of single-page buffer
 * packets using a GPADL Direct packet type.
 * packets using a GPADL Direct packet type. This interface allows you
 * to control notifying the host. This will be useful for sending
 * batched data. Also the sender can control the send flags
 * explicitly.
 */
 */
int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel,
int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel,
				     struct hv_page_buffer pagebuffers[],
				     struct hv_page_buffer pagebuffers[],
				     u32 pagecount, void *buffer, u32 bufferlen,
				     u32 pagecount, void *buffer, u32 bufferlen,
				     u64 requestid)
				     u64 requestid,
				     u32 flags,
				     bool kick_q)
{
{
	int ret;
	int ret;
	int i;
	int i;
@@ -670,7 +675,7 @@ int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel,


	/* Setup the descriptor */
	/* Setup the descriptor */
	desc.type = VM_PKT_DATA_USING_GPA_DIRECT;
	desc.type = VM_PKT_DATA_USING_GPA_DIRECT;
	desc.flags = VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED;
	desc.flags = flags;
	desc.dataoffset8 = descsize >> 3; /* in 8-bytes grandularity */
	desc.dataoffset8 = descsize >> 3; /* in 8-bytes grandularity */
	desc.length8 = (u16)(packetlen_aligned >> 3);
	desc.length8 = (u16)(packetlen_aligned >> 3);
	desc.transactionid = requestid;
	desc.transactionid = requestid;
@@ -691,11 +696,27 @@ int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel,


	ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3, &signal);
	ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3, &signal);


	if (ret == 0 && signal)
	if ((ret == 0) && kick_q && signal)
		vmbus_setevent(channel);
		vmbus_setevent(channel);


	return ret;
	return ret;
}
}

/*
 * vmbus_sendpacket_pagebuffer - Send a range of single-page buffer
 * packets using a GPADL Direct packet type.
 */
int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel,
				     struct hv_page_buffer pagebuffers[],
				     u32 pagecount, void *buffer, u32 bufferlen,
				     u64 requestid)
{
	u32 flags = VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED;
	return vmbus_sendpacket_pagebuffer_ctl(channel, pagebuffers, pagecount,
					       buffer, bufferlen, requestid,
					       flags, true);

}
EXPORT_SYMBOL_GPL(vmbus_sendpacket_pagebuffer);
EXPORT_SYMBOL_GPL(vmbus_sendpacket_pagebuffer);


/*
/*
+9 −0
Original line number Original line Diff line number Diff line
@@ -874,6 +874,15 @@ extern int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel,
					    u32 bufferlen,
					    u32 bufferlen,
					    u64 requestid);
					    u64 requestid);


extern int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel,
					   struct hv_page_buffer pagebuffers[],
					   u32 pagecount,
					   void *buffer,
					   u32 bufferlen,
					   u64 requestid,
					   u32 flags,
					   bool kick_q);

extern int vmbus_sendpacket_multipagebuffer(struct vmbus_channel *channel,
extern int vmbus_sendpacket_multipagebuffer(struct vmbus_channel *channel,
					struct hv_multipage_buffer *mpb,
					struct hv_multipage_buffer *mpb,
					void *buffer,
					void *buffer,