Commit f03b488b authored by David S. Miller's avatar David S. Miller

Merge branch 'vmbus-sendpacket-cleanups'

Stephen Hemminger says:

====================
vmbus sendpacket cleanups

These patches remove and consolidate vmbus_sendpacket functions.

They should go through the net-next tree since these API's
were only used by the netvsc driver.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 774c4673 5dd0fb9b
...@@ -647,9 +647,23 @@ void vmbus_close(struct vmbus_channel *channel) ...@@ -647,9 +647,23 @@ void vmbus_close(struct vmbus_channel *channel)
} }
EXPORT_SYMBOL_GPL(vmbus_close); EXPORT_SYMBOL_GPL(vmbus_close);
int vmbus_sendpacket_ctl(struct vmbus_channel *channel, void *buffer, /**
u32 bufferlen, u64 requestid, * vmbus_sendpacket() - Send the specified buffer on the given channel
enum vmbus_packet_type type, u32 flags) * @channel: Pointer to vmbus_channel structure.
* @buffer: Pointer to the buffer you want to receive the data into.
* @bufferlen: Maximum size of what the the buffer will hold
* @requestid: Identifier of the request
* @type: Type of packet that is being send e.g. negotiate, time
* packet etc.
*
* Sends data in @buffer directly to hyper-v via the vmbus
* This will send the data unparsed to hyper-v.
*
* Mainly used by Hyper-V drivers.
*/
int vmbus_sendpacket(struct vmbus_channel *channel, void *buffer,
u32 bufferlen, u64 requestid,
enum vmbus_packet_type type, u32 flags)
{ {
struct vmpacket_descriptor desc; struct vmpacket_descriptor desc;
u32 packetlen = sizeof(struct vmpacket_descriptor) + bufferlen; u32 packetlen = sizeof(struct vmpacket_descriptor) + bufferlen;
...@@ -676,42 +690,19 @@ int vmbus_sendpacket_ctl(struct vmbus_channel *channel, void *buffer, ...@@ -676,42 +690,19 @@ int vmbus_sendpacket_ctl(struct vmbus_channel *channel, void *buffer,
return hv_ringbuffer_write(channel, bufferlist, num_vecs); return hv_ringbuffer_write(channel, bufferlist, num_vecs);
} }
EXPORT_SYMBOL(vmbus_sendpacket_ctl);
/**
* vmbus_sendpacket() - Send the specified buffer on the given channel
* @channel: Pointer to vmbus_channel structure.
* @buffer: Pointer to the buffer you want to receive the data into.
* @bufferlen: Maximum size of what the the buffer will hold
* @requestid: Identifier of the request
* @type: Type of packet that is being send e.g. negotiate, time
* packet etc.
*
* Sends data in @buffer directly to hyper-v via the vmbus
* This will send the data unparsed to hyper-v.
*
* Mainly used by Hyper-V drivers.
*/
int vmbus_sendpacket(struct vmbus_channel *channel, void *buffer,
u32 bufferlen, u64 requestid,
enum vmbus_packet_type type, u32 flags)
{
return vmbus_sendpacket_ctl(channel, buffer, bufferlen, requestid,
type, flags);
}
EXPORT_SYMBOL(vmbus_sendpacket); EXPORT_SYMBOL(vmbus_sendpacket);
/* /*
* vmbus_sendpacket_pagebuffer_ctl - Send a range of single-page buffer * vmbus_sendpacket_pagebuffer - Send a range of single-page buffer
* packets using a GPADL Direct packet type. This interface allows you * packets using a GPADL Direct packet type. This interface allows you
* to control notifying the host. This will be useful for sending * to control notifying the host. This will be useful for sending
* batched data. Also the sender can control the send flags * batched data. Also the sender can control the send flags
* explicitly. * explicitly.
*/ */
int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel, int vmbus_sendpacket_pagebuffer(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, u32 flags) u64 requestid)
{ {
int i; int i;
struct vmbus_channel_packet_page_buffer desc; struct vmbus_channel_packet_page_buffer desc;
...@@ -736,7 +727,7 @@ int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel, ...@@ -736,7 +727,7 @@ int vmbus_sendpacket_pagebuffer_ctl(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 = flags; desc.flags = VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED;
desc.dataoffset8 = descsize >> 3; /* in 8-bytes granularity */ desc.dataoffset8 = descsize >> 3; /* in 8-bytes granularity */
desc.length8 = (u16)(packetlen_aligned >> 3); desc.length8 = (u16)(packetlen_aligned >> 3);
desc.transactionid = requestid; desc.transactionid = requestid;
...@@ -757,24 +748,6 @@ int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel, ...@@ -757,24 +748,6 @@ int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel,
return hv_ringbuffer_write(channel, bufferlist, 3); return hv_ringbuffer_write(channel, bufferlist, 3);
} }
EXPORT_SYMBOL_GPL(vmbus_sendpacket_pagebuffer_ctl);
/*
* 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);
}
EXPORT_SYMBOL_GPL(vmbus_sendpacket_pagebuffer); EXPORT_SYMBOL_GPL(vmbus_sendpacket_pagebuffer);
/* /*
...@@ -814,62 +787,6 @@ int vmbus_sendpacket_mpb_desc(struct vmbus_channel *channel, ...@@ -814,62 +787,6 @@ int vmbus_sendpacket_mpb_desc(struct vmbus_channel *channel,
} }
EXPORT_SYMBOL_GPL(vmbus_sendpacket_mpb_desc); EXPORT_SYMBOL_GPL(vmbus_sendpacket_mpb_desc);
/*
* vmbus_sendpacket_multipagebuffer - Send a multi-page buffer packet
* using a GPADL Direct packet type.
*/
int vmbus_sendpacket_multipagebuffer(struct vmbus_channel *channel,
struct hv_multipage_buffer *multi_pagebuffer,
void *buffer, u32 bufferlen, u64 requestid)
{
struct vmbus_channel_packet_multipage_buffer desc;
u32 descsize;
u32 packetlen;
u32 packetlen_aligned;
struct kvec bufferlist[3];
u64 aligned_data = 0;
u32 pfncount = NUM_PAGES_SPANNED(multi_pagebuffer->offset,
multi_pagebuffer->len);
if (pfncount > MAX_MULTIPAGE_BUFFER_COUNT)
return -EINVAL;
/*
* Adjust the size down since vmbus_channel_packet_multipage_buffer is
* the largest size we support
*/
descsize = sizeof(struct vmbus_channel_packet_multipage_buffer) -
((MAX_MULTIPAGE_BUFFER_COUNT - pfncount) *
sizeof(u64));
packetlen = descsize + bufferlen;
packetlen_aligned = ALIGN(packetlen, sizeof(u64));
/* Setup the descriptor */
desc.type = VM_PKT_DATA_USING_GPA_DIRECT;
desc.flags = VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED;
desc.dataoffset8 = descsize >> 3; /* in 8-bytes granularity */
desc.length8 = (u16)(packetlen_aligned >> 3);
desc.transactionid = requestid;
desc.rangecount = 1;
desc.range.len = multi_pagebuffer->len;
desc.range.offset = multi_pagebuffer->offset;
memcpy(desc.range.pfn_array, multi_pagebuffer->pfn_array,
pfncount * sizeof(u64));
bufferlist[0].iov_base = &desc;
bufferlist[0].iov_len = descsize;
bufferlist[1].iov_base = buffer;
bufferlist[1].iov_len = bufferlen;
bufferlist[2].iov_base = &aligned_data;
bufferlist[2].iov_len = (packetlen_aligned - packetlen);
return hv_ringbuffer_write(channel, bufferlist, 3);
}
EXPORT_SYMBOL_GPL(vmbus_sendpacket_multipagebuffer);
/** /**
* vmbus_recvpacket() - Retrieve the user packet on the specified channel * vmbus_recvpacket() - Retrieve the user packet on the specified channel
* @channel: Pointer to vmbus_channel structure. * @channel: Pointer to vmbus_channel structure.
......
...@@ -775,18 +775,15 @@ static inline int netvsc_send_pkt( ...@@ -775,18 +775,15 @@ static inline int netvsc_send_pkt(
if (packet->cp_partial) if (packet->cp_partial)
pb += packet->rmsg_pgcnt; pb += packet->rmsg_pgcnt;
ret = vmbus_sendpacket_pagebuffer_ctl(out_channel, ret = vmbus_sendpacket_pagebuffer(out_channel,
pb, packet->page_buf_cnt, pb, packet->page_buf_cnt,
&nvmsg, &nvmsg, sizeof(nvmsg),
sizeof(struct nvsp_message), req_id);
req_id,
VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
} else { } else {
ret = vmbus_sendpacket_ctl(out_channel, &nvmsg, ret = vmbus_sendpacket(out_channel,
sizeof(struct nvsp_message), &nvmsg, sizeof(nvmsg),
req_id, req_id, VM_PKT_DATA_INBAND,
VM_PKT_DATA_INBAND, VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
} }
if (ret == 0) { if (ret == 0) {
......
...@@ -1030,13 +1030,6 @@ extern int vmbus_sendpacket(struct vmbus_channel *channel, ...@@ -1030,13 +1030,6 @@ extern int vmbus_sendpacket(struct vmbus_channel *channel,
enum vmbus_packet_type type, enum vmbus_packet_type type,
u32 flags); u32 flags);
extern int vmbus_sendpacket_ctl(struct vmbus_channel *channel,
void *buffer,
u32 bufferLen,
u64 requestid,
enum vmbus_packet_type type,
u32 flags);
extern int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel, extern int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel,
struct hv_page_buffer pagebuffers[], struct hv_page_buffer pagebuffers[],
u32 pagecount, u32 pagecount,
...@@ -1044,20 +1037,6 @@ extern int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel, ...@@ -1044,20 +1037,6 @@ 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);
extern int vmbus_sendpacket_multipagebuffer(struct vmbus_channel *channel,
struct hv_multipage_buffer *mpb,
void *buffer,
u32 bufferlen,
u64 requestid);
extern int vmbus_sendpacket_mpb_desc(struct vmbus_channel *channel, extern int vmbus_sendpacket_mpb_desc(struct vmbus_channel *channel,
struct vmbus_packet_mpb_array *mpb, struct vmbus_packet_mpb_array *mpb,
u32 desc_size, u32 desc_size,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment