forked from luck/tmp_suning_uos_patched
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: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
f03b488b2f
|
@ -647,9 +647,23 @@ void vmbus_close(struct vmbus_channel *channel)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(vmbus_close);
|
||||
|
||||
int vmbus_sendpacket_ctl(struct vmbus_channel *channel, void *buffer,
|
||||
u32 bufferlen, u64 requestid,
|
||||
enum vmbus_packet_type type, u32 flags)
|
||||
/**
|
||||
* 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)
|
||||
{
|
||||
struct vmpacket_descriptor desc;
|
||||
u32 packetlen = sizeof(struct vmpacket_descriptor) + bufferlen;
|
||||
|
@ -676,42 +690,19 @@ int vmbus_sendpacket_ctl(struct vmbus_channel *channel, void *buffer,
|
|||
|
||||
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);
|
||||
|
||||
/*
|
||||
* 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
|
||||
* 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_ctl(struct vmbus_channel *channel,
|
||||
struct hv_page_buffer pagebuffers[],
|
||||
u32 pagecount, void *buffer, u32 bufferlen,
|
||||
u64 requestid, u32 flags)
|
||||
int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel,
|
||||
struct hv_page_buffer pagebuffers[],
|
||||
u32 pagecount, void *buffer, u32 bufferlen,
|
||||
u64 requestid)
|
||||
{
|
||||
int i;
|
||||
struct vmbus_channel_packet_page_buffer desc;
|
||||
|
@ -736,7 +727,7 @@ int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel,
|
|||
|
||||
/* Setup the descriptor */
|
||||
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.length8 = (u16)(packetlen_aligned >> 3);
|
||||
desc.transactionid = requestid;
|
||||
|
@ -757,24 +748,6 @@ int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel,
|
|||
|
||||
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);
|
||||
|
||||
/*
|
||||
|
@ -814,62 +787,6 @@ int vmbus_sendpacket_mpb_desc(struct vmbus_channel *channel,
|
|||
}
|
||||
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
|
||||
* @channel: Pointer to vmbus_channel structure.
|
||||
|
|
|
@ -775,18 +775,15 @@ static inline int netvsc_send_pkt(
|
|||
if (packet->cp_partial)
|
||||
pb += packet->rmsg_pgcnt;
|
||||
|
||||
ret = vmbus_sendpacket_pagebuffer_ctl(out_channel,
|
||||
pb, packet->page_buf_cnt,
|
||||
&nvmsg,
|
||||
sizeof(struct nvsp_message),
|
||||
req_id,
|
||||
VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
|
||||
ret = vmbus_sendpacket_pagebuffer(out_channel,
|
||||
pb, packet->page_buf_cnt,
|
||||
&nvmsg, sizeof(nvmsg),
|
||||
req_id);
|
||||
} else {
|
||||
ret = vmbus_sendpacket_ctl(out_channel, &nvmsg,
|
||||
sizeof(struct nvsp_message),
|
||||
req_id,
|
||||
VM_PKT_DATA_INBAND,
|
||||
VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
|
||||
ret = vmbus_sendpacket(out_channel,
|
||||
&nvmsg, sizeof(nvmsg),
|
||||
req_id, VM_PKT_DATA_INBAND,
|
||||
VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
|
||||
}
|
||||
|
||||
if (ret == 0) {
|
||||
|
|
|
@ -1030,13 +1030,6 @@ extern int vmbus_sendpacket(struct vmbus_channel *channel,
|
|||
enum vmbus_packet_type type,
|
||||
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,
|
||||
struct hv_page_buffer pagebuffers[],
|
||||
u32 pagecount,
|
||||
|
@ -1044,20 +1037,6 @@ extern int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel,
|
|||
u32 bufferlen,
|
||||
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,
|
||||
struct vmbus_packet_mpb_array *mpb,
|
||||
u32 desc_size,
|
||||
|
|
Loading…
Reference in New Issue
Block a user