Re: [PATCH net-next] netvsc: Use the new in-place consumption APIs in the rx path

From: Linus Torvalds
Date: Thu Jun 09 2016 - 20:18:48 EST


Srinivasan,

these are all sent through linuxonhyperv.com, and fail DMARC because
they have a microsoft.com address but no valid DKIM.

Please fix your email setup. You need to go through the real
microsoft smtp servers if you use a microsoft.com address. Or you need
to get linuxonhyperv.com fixed as a smtp server with the proper MS
email signing.

Linus

On Thu, Jun 9, 2016 at 6:34 PM, K. Y. Srinivasan <kys@xxxxxxxxxxxxx> wrote:
> Use the new APIs for eliminating a copy on the receive path. These new APIs also
> help in minimizing the number of memory barriers we end up issuing (in the
> ringbuffer code) since we can better control when we want to expose the ring
> state to the host.
>
> Signed-off-by: K. Y. Srinivasan <kys@xxxxxxxxxxxxx>
> Reviewed-by: Haiyang Zhang <haiyangz@xxxxxxxxxxxxx>
> Tested-by: Dexuan Cui <decui@xxxxxxxxxxxxx>
> Tested-by: Simon Xiao <sixiao@xxxxxxxxxxxxx>
> ---
> drivers/net/hyperv/netvsc.c | 88 +++++++++++++++++++++++++++++--------------
> 1 files changed, 59 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
> index 719cb35..8cd4c19 100644
> --- a/drivers/net/hyperv/netvsc.c
> +++ b/drivers/net/hyperv/netvsc.c
> @@ -1141,6 +1141,39 @@ static inline void netvsc_receive_inband(struct hv_device *hdev,
> }
> }
>
> +static void netvsc_process_raw_pkt(struct hv_device *device,
> + struct vmbus_channel *channel,
> + struct netvsc_device *net_device,
> + struct net_device *ndev,
> + u64 request_id,
> + struct vmpacket_descriptor *desc)
> +{
> + struct nvsp_message *nvmsg;
> +
> + nvmsg = (struct nvsp_message *)((unsigned long)
> + desc + (desc->offset8 << 3));
> +
> + switch (desc->type) {
> + case VM_PKT_COMP:
> + netvsc_send_completion(net_device, channel, device, desc);
> + break;
> +
> + case VM_PKT_DATA_USING_XFER_PAGES:
> + netvsc_receive(net_device, channel, device, desc);
> + break;
> +
> + case VM_PKT_DATA_INBAND:
> + netvsc_receive_inband(device, net_device, nvmsg);
> + break;
> +
> + default:
> + netdev_err(ndev, "unhandled packet type %d, tid %llx\n",
> + desc->type, request_id);
> + break;
> + }
> +}
> +
> +
> void netvsc_channel_cb(void *context)
> {
> int ret;
> @@ -1153,7 +1186,7 @@ void netvsc_channel_cb(void *context)
> unsigned char *buffer;
> int bufferlen = NETVSC_PACKET_SIZE;
> struct net_device *ndev;
> - struct nvsp_message *nvmsg;
> + bool need_to_commit = false;
>
> if (channel->primary_channel != NULL)
> device = channel->primary_channel->device_obj;
> @@ -1167,39 +1200,36 @@ void netvsc_channel_cb(void *context)
> buffer = get_per_channel_state(channel);
>
> do {
> + desc = get_next_pkt_raw(channel);
> + if (desc != NULL) {
> + netvsc_process_raw_pkt(device,
> + channel,
> + net_device,
> + ndev,
> + desc->trans_id,
> + desc);
> +
> + put_pkt_raw(channel, desc);
> + need_to_commit = true;
> + continue;
> + }
> + if (need_to_commit) {
> + need_to_commit = false;
> + commit_rd_index(channel);
> + }
> +
> ret = vmbus_recvpacket_raw(channel, buffer, bufferlen,
> &bytes_recvd, &request_id);
> if (ret == 0) {
> if (bytes_recvd > 0) {
> desc = (struct vmpacket_descriptor *)buffer;
> - nvmsg = (struct nvsp_message *)((unsigned long)
> - desc + (desc->offset8 << 3));
> - switch (desc->type) {
> - case VM_PKT_COMP:
> - netvsc_send_completion(net_device,
> - channel,
> - device, desc);
> - break;
> -
> - case VM_PKT_DATA_USING_XFER_PAGES:
> - netvsc_receive(net_device, channel,
> - device, desc);
> - break;
> -
> - case VM_PKT_DATA_INBAND:
> - netvsc_receive_inband(device,
> - net_device,
> - nvmsg);
> - break;
> -
> - default:
> - netdev_err(ndev,
> - "unhandled packet type %d, "
> - "tid %llx len %d\n",
> - desc->type, request_id,
> - bytes_recvd);
> - break;
> - }
> + netvsc_process_raw_pkt(device,
> + channel,
> + net_device,
> + ndev,
> + request_id,
> + desc);
> +
>
> } else {
> /*
> --
> 1.7.4.1
>