From: David S. Miller <davem@davemloft.net>
Date: Tue, 7 Feb 2017 21:29:30 +0000 (-0500)
Subject: Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
X-Git-Tag: v4.11-rc1~124^2~179
X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=3efa70d78f218e4c9276b0bac0545e5184c1c47b;p=linux.git

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

The conflict was an interaction between a bug fix in the
netvsc driver in 'net' and an optimization of the RX path
in 'net-next'.

Signed-off-by: David S. Miller <davem@davemloft.net>
---

3efa70d78f218e4c9276b0bac0545e5184c1c47b
diff --cc drivers/net/hyperv/netvsc.c
index 5cfdb1a1b4c1,86e5749226ef..fd6ebbefd919
--- a/drivers/net/hyperv/netvsc.c
+++ b/drivers/net/hyperv/netvsc.c
@@@ -1245,25 -1289,74 +1245,28 @@@ void netvsc_channel_cb(void *context
  	else
  		device = channel->device_obj;
  
 -	net_device = get_inbound_net_device(device);
 -	if (!net_device)
 -		return;
  	ndev = hv_get_drvdata(device);
 -	buffer = get_per_channel_state(channel);
 +	if (unlikely(!ndev))
 +		return;
 +
 +	net_device = net_device_to_netvsc_device(ndev);
 +	if (unlikely(net_device->destroy) &&
 +	    netvsc_channel_idle(net_device, q_idx))
 +		return;
  
+ 	/* commit_rd_index() -> hv_signal_on_read() needs this. */
+ 	init_cached_read_index(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;
 -				netvsc_process_raw_pkt(device,
 -						       channel,
 -						       net_device,
 -						       ndev,
 -						       request_id,
 -						       desc);
 -			} else {
 -				/*
 -				 * We are done for this pass.
 -				 */
 -				break;
 -			}
 -
 -		} else if (ret == -ENOBUFS) {
 -			if (bufferlen > NETVSC_PACKET_SIZE)
 -				kfree(buffer);
 -			/* Handle large packet */
 -			buffer = kmalloc(bytes_recvd, GFP_ATOMIC);
 -			if (buffer == NULL) {
 -				/* Try again next time around */
 -				netdev_err(ndev,
 -					   "unable to allocate buffer of size "
 -					   "(%d)!!\n", bytes_recvd);
 -				break;
 -			}
 -
 -			bufferlen = bytes_recvd;
 -		}
 -
 -		init_cached_read_index(channel);
 +	while ((desc = get_next_pkt_raw(channel)) != NULL) {
 +		netvsc_process_raw_pkt(device, channel, net_device,
 +				       ndev, desc->trans_id, desc);
  
 -	} while (1);
 +		put_pkt_raw(channel, desc);
 +		need_to_commit = true;
 +	}
  
 -	if (bufferlen > NETVSC_PACKET_SIZE)
 -		kfree(buffer);
 +	if (need_to_commit)
 +		commit_rd_index(channel);
  
  	netvsc_chk_recv_comp(net_device, channel, q_idx);
  }