Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 25b85ee8 authored by KY Srinivasan's avatar KY Srinivasan Committed by David S. Miller
Browse files

hv_netvsc: Eliminate the channel field in hv_netvsc_packet structure



Eliminate the channel field in hv_netvsc_packet structure.

Signed-off-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 934d2022
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -144,7 +144,6 @@ struct hv_netvsc_packet {
	u32 total_data_buflen;
	u32 pad1;

	struct vmbus_channel *channel;

	u64 send_completion_tid;
	void *send_completion_ctx;
@@ -198,7 +197,8 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj,
void netvsc_xmit_completion(void *context);
int netvsc_recv_callback(struct hv_device *device_obj,
			struct hv_netvsc_packet *packet,
			struct ndis_tcp_ip_checksum_info *csum_info);
			struct ndis_tcp_ip_checksum_info *csum_info,
			struct vmbus_channel *channel);
void netvsc_channel_cb(void *context);
int rndis_filter_open(struct hv_device *dev);
int rndis_filter_close(struct hv_device *dev);
@@ -206,12 +206,12 @@ int rndis_filter_device_add(struct hv_device *dev,
			void *additional_info);
void rndis_filter_device_remove(struct hv_device *dev);
int rndis_filter_receive(struct hv_device *dev,
			struct hv_netvsc_packet *pkt);
			struct hv_netvsc_packet *pkt,
			struct vmbus_channel *channel);

int rndis_filter_set_packet_filter(struct rndis_device *dev, u32 new_filter);
int rndis_filter_set_device_mac(struct hv_device *hdev, char *mac);


#define NVSP_INVALID_PROTOCOL_VERSION	((u32)0xFFFFFFFF)

#define NVSP_PROTOCOL_VERSION_1		2
@@ -1274,5 +1274,19 @@ struct rndis_message {
#define TRANSPORT_INFO_IPV6_TCP ((INFO_IPV6 << 16) | INFO_TCP)
#define TRANSPORT_INFO_IPV6_UDP ((INFO_IPV6 << 16) | INFO_UDP)

static inline struct vmbus_channel *get_channel(struct hv_netvsc_packet *packet,
					struct netvsc_device *net_device)

{
	struct vmbus_channel *out_channel;

	out_channel = net_device->chn_table[packet->q_idx];
	if (!out_channel) {
		out_channel = net_device->dev->channel;
		packet->q_idx = 0;
	}
	return out_channel;
}


#endif /* _HYPERV_NET_H */
+8 −11
Original line number Diff line number Diff line
@@ -610,6 +610,7 @@ static inline void netvsc_free_send_slot(struct netvsc_device *net_device,
}

static void netvsc_send_completion(struct netvsc_device *net_device,
				   struct vmbus_channel *incoming_channel,
				   struct hv_device *device,
				   struct vmpacket_descriptor *packet)
{
@@ -651,7 +652,7 @@ static void netvsc_send_completion(struct netvsc_device *net_device,
			if (send_index != NETVSC_INVALID_INDEX)
				netvsc_free_send_slot(net_device, send_index);
			q_idx = nvsc_packet->q_idx;
			channel = nvsc_packet->channel;
			channel = incoming_channel;
			nvsc_packet->send_completion(nvsc_packet->
						     send_completion_ctx);
		}
@@ -748,7 +749,7 @@ static inline int netvsc_send_pkt(
	struct netvsc_device *net_device)
{
	struct nvsp_message nvmsg;
	struct vmbus_channel *out_channel = packet->channel;
	struct vmbus_channel *out_channel = get_channel(packet, net_device);
	u16 q_idx = packet->q_idx;
	struct net_device *ndev = net_device->ndev;
	u64 req_id;
@@ -857,13 +858,9 @@ int netvsc_send(struct hv_device *device,
	if (!net_device)
		return -ENODEV;

	out_channel = net_device->chn_table[q_idx];
	if (!out_channel) {
		out_channel = device->channel;
		q_idx = 0;
		packet->q_idx = 0;
	}
	packet->channel = out_channel;
	out_channel = get_channel(packet, net_device);
	q_idx = packet->q_idx;

	packet->send_buf_index = NETVSC_INVALID_INDEX;
	packet->cp_partial = false;

@@ -1043,7 +1040,6 @@ static void netvsc_receive(struct netvsc_device *net_device,
	}

	count = vmxferpage_packet->range_cnt;
	netvsc_packet->channel = channel;

	/* Each range represents 1 RNDIS pkt that contains 1 ethernet frame */
	for (i = 0; i < count; i++) {
@@ -1055,7 +1051,7 @@ static void netvsc_receive(struct netvsc_device *net_device,
					vmxferpage_packet->ranges[i].byte_count;

		/* Pass it to the upper layer */
		rndis_filter_receive(device, netvsc_packet);
		rndis_filter_receive(device, netvsc_packet, channel);

		if (netvsc_packet->status != NVSP_STAT_SUCCESS)
			status = NVSP_STAT_FAIL;
@@ -1150,6 +1146,7 @@ void netvsc_channel_cb(void *context)
				switch (desc->type) {
				case VM_PKT_COMP:
					netvsc_send_completion(net_device,
								channel,
								device, desc);
					break;

+3 −2
Original line number Diff line number Diff line
@@ -683,7 +683,8 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj,
 */
int netvsc_recv_callback(struct hv_device *device_obj,
				struct hv_netvsc_packet *packet,
				struct ndis_tcp_ip_checksum_info *csum_info)
				struct ndis_tcp_ip_checksum_info *csum_info,
				struct vmbus_channel *channel)
{
	struct net_device *net;
	struct net_device_context *net_device_ctx;
@@ -729,7 +730,7 @@ int netvsc_recv_callback(struct hv_device *device_obj,
		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
				       packet->vlan_tci);

	skb_record_rx_queue(skb, packet->channel->
	skb_record_rx_queue(skb, channel->
			    offermsg.offer.sub_channel_index);

	u64_stats_update_begin(&rx_stats->syncp);
+6 −4
Original line number Diff line number Diff line
@@ -350,7 +350,8 @@ static inline void *rndis_get_ppi(struct rndis_packet *rpkt, u32 type)

static void rndis_filter_receive_data(struct rndis_device *dev,
				   struct rndis_message *msg,
				   struct hv_netvsc_packet *pkt)
				   struct hv_netvsc_packet *pkt,
				   struct vmbus_channel *channel)
{
	struct rndis_packet *rndis_pkt;
	u32 data_offset;
@@ -393,11 +394,12 @@ static void rndis_filter_receive_data(struct rndis_device *dev,
	}

	csum_info = rndis_get_ppi(rndis_pkt, TCPIP_CHKSUM_PKTINFO);
	netvsc_recv_callback(dev->net_dev->dev, pkt, csum_info);
	netvsc_recv_callback(dev->net_dev->dev, pkt, csum_info, channel);
}

int rndis_filter_receive(struct hv_device *dev,
				struct hv_netvsc_packet	*pkt)
				struct hv_netvsc_packet	*pkt,
				struct vmbus_channel *channel)
{
	struct netvsc_device *net_dev = hv_get_drvdata(dev);
	struct rndis_device *rndis_dev;
@@ -436,7 +438,7 @@ int rndis_filter_receive(struct hv_device *dev,
	switch (rndis_msg->ndis_msg_type) {
	case RNDIS_MSG_PACKET:
		/* data msg */
		rndis_filter_receive_data(rndis_dev, rndis_msg, pkt);
		rndis_filter_receive_data(rndis_dev, rndis_msg, pkt, channel);
		break;

	case RNDIS_MSG_INIT_C: