svn commit: r305270 - head/sys/dev/hyperv/netvsc
Sepherosa Ziehau
sephe at FreeBSD.org
Fri Sep 2 03:19:57 UTC 2016
Author: sephe
Date: Fri Sep 2 03:19:55 2016
New Revision: 305270
URL: https://svnweb.freebsd.org/changeset/base/305270
Log:
hyperv/hn: Simplify RX hash related bits.
MFC after: 1 week
Sponsored by: Microsoft
Differential Revision: https://reviews.freebsd.org/D7736
Modified:
head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
head/sys/dev/hyperv/netvsc/if_hnreg.h
head/sys/dev/hyperv/netvsc/if_hnvar.h
Modified: head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c Fri Sep 2 03:15:54 2016 (r305269)
+++ head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c Fri Sep 2 03:19:55 2016 (r305270)
@@ -1289,7 +1289,7 @@ netvsc_recv(struct hn_rx_ring *rxr, cons
struct ifnet *ifp = rxr->hn_ifp;
struct mbuf *m_new;
int size, do_lro = 0, do_csum = 1;
- int hash_type = M_HASHTYPE_OPAQUE_HASH;
+ int hash_type;
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
return (0);
@@ -1421,13 +1421,13 @@ skip:
m_new->m_flags |= M_VLANTAG;
}
- if (info->hash_info != NULL && info->hash_value != NULL) {
+ if (info->hash_info != HN_NDIS_HASH_INFO_INVALID) {
rxr->hn_rss_pkts++;
- m_new->m_pkthdr.flowid = info->hash_value->hash_value;
- if ((info->hash_info->hash_info & NDIS_HASH_FUNCTION_MASK) ==
+ m_new->m_pkthdr.flowid = info->hash_value;
+ hash_type = M_HASHTYPE_OPAQUE_HASH;
+ if ((info->hash_info & NDIS_HASH_FUNCTION_MASK) ==
NDIS_HASH_FUNCTION_TOEPLITZ) {
- uint32_t type =
- (info->hash_info->hash_info & NDIS_HASH_TYPE_MASK);
+ uint32_t type = (info->hash_info & NDIS_HASH_TYPE_MASK);
switch (type) {
case NDIS_HASH_IPV4:
@@ -1456,12 +1456,8 @@ skip:
}
}
} else {
- if (info->hash_value != NULL) {
- m_new->m_pkthdr.flowid = info->hash_value->hash_value;
- } else {
- m_new->m_pkthdr.flowid = rxr->hn_rx_idx;
- hash_type = M_HASHTYPE_OPAQUE;
- }
+ m_new->m_pkthdr.flowid = rxr->hn_rx_idx;
+ hash_type = M_HASHTYPE_OPAQUE;
}
M_HASHTYPE_SET(m_new, hash_type);
Modified: head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_rndis_filter.c Fri Sep 2 03:15:54 2016 (r305269)
+++ head/sys/dev/hyperv/netvsc/hv_rndis_filter.c Fri Sep 2 03:19:55 2016 (r305270)
@@ -158,8 +158,7 @@ hv_rf_find_recvinfo(const rndis_packet *
info->vlan_info = HN_NDIS_VLAN_INFO_INVALID;
info->csum_info = HN_NDIS_RXCSUM_INFO_INVALID;
- info->hash_info = NULL;
- info->hash_value = NULL;
+ info->hash_info = HN_NDIS_HASH_INFO_INVALID;
if (rpkt->per_pkt_info_offset == 0)
return (0);
@@ -207,18 +206,16 @@ hv_rf_find_recvinfo(const rndis_packet *
break;
case nbl_hash_value:
- if (__predict_false(dlen <
- sizeof(struct rndis_hash_value)))
+ if (__predict_false(dlen < HN_NDIS_HASH_VALUE_SIZE))
return (EINVAL);
- info->hash_value = data;
+ info->hash_value = *((const uint32_t *)data);
mask |= HV_RF_RECVINFO_HASHVAL;
break;
case nbl_hash_info:
- if (__predict_false(dlen <
- sizeof(struct rndis_hash_info)))
+ if (__predict_false(dlen < HN_NDIS_HASH_INFO_SIZE))
return (EINVAL);
- info->hash_info = data;
+ info->hash_info = *((const uint32_t *)data);
mask |= HV_RF_RECVINFO_HASHINF;
break;
@@ -234,6 +231,13 @@ next:
pi = (const struct rndis_pktinfo *)
((const uint8_t *)pi + pi->rm_size);
}
+
+ /*
+ * Final fixup.
+ * - If there is no hash value, invalidate the hash info.
+ */
+ if ((mask & HV_RF_RECVINFO_HASHVAL) == 0)
+ info->hash_info = HN_NDIS_HASH_INFO_INVALID;
return (0);
}
Modified: head/sys/dev/hyperv/netvsc/if_hnreg.h
==============================================================================
--- head/sys/dev/hyperv/netvsc/if_hnreg.h Fri Sep 2 03:15:54 2016 (r305269)
+++ head/sys/dev/hyperv/netvsc/if_hnreg.h Fri Sep 2 03:19:55 2016 (r305270)
@@ -208,4 +208,17 @@ struct hn_nvs_rndis_ack {
} __packed;
CTASSERT(sizeof(struct hn_nvs_rndis_ack) >= HN_NVS_REQSIZE_MIN);
+/*
+ * RNDIS extension
+ */
+
+/* Per-packet hash info */
+#define HN_NDIS_HASH_INFO_SIZE sizeof(uint32_t)
+#define HN_NDIS_PKTINFO_TYPE_HASHINF NDIS_PKTINFO_TYPE_ORIG_NBLIST
+/* NDIS_HASH_ */
+
+/* Per-packet hash value */
+#define HN_NDIS_HASH_VALUE_SIZE sizeof(uint32_t)
+#define HN_NDIS_PKTINFO_TYPE_HASHVAL NDIS_PKTINFO_TYPE_PKT_CANCELID
+
#endif /* !_IF_HNREG_H_ */
Modified: head/sys/dev/hyperv/netvsc/if_hnvar.h
==============================================================================
--- head/sys/dev/hyperv/netvsc/if_hnvar.h Fri Sep 2 03:15:54 2016 (r305269)
+++ head/sys/dev/hyperv/netvsc/if_hnvar.h Fri Sep 2 03:19:55 2016 (r305270)
@@ -57,12 +57,13 @@ struct rndis_tcp_ip_csum_info_;
#define HN_NDIS_VLAN_INFO_INVALID 0xffffffff
#define HN_NDIS_RXCSUM_INFO_INVALID 0
+#define HN_NDIS_HASH_INFO_INVALID 0
struct hn_recvinfo {
uint32_t vlan_info;
uint32_t csum_info;
- const struct rndis_hash_info *hash_info;
- const struct rndis_hash_value *hash_value;
+ uint32_t hash_info;
+ uint32_t hash_value;
};
#define HN_SEND_CTX_INITIALIZER(cb, cbarg) \
More information about the svn-src-head
mailing list