mirror of
https://github.com/openvswitch/ovs
synced 2025-08-31 06:15:47 +00:00
dpif-netdev: Reset RSS hash when recirculating.
Having the same RSS hash after recirculation can cause unnecessary collisions in the exact match cache. A simple solution is to rehash it with the recirculation depth if it is non-zero. Suggested-by: Ethan Jackson <ethan@nicira.com> Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com> Signed-off-by: Ethan Jackson <ethan@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
This commit is contained in:
committed by
Ethan Jackson
parent
603f2ce04d
commit
048963aa85
@@ -3015,16 +3015,24 @@ dp_netdev_upcall(struct dp_netdev_pmd_thread *pmd, struct dp_packet *packet_,
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
dpif_netdev_packet_get_dp_hash(struct dp_packet *packet,
|
||||
const struct miniflow *mf)
|
||||
dpif_netdev_packet_get_rss_hash(struct dp_packet *packet,
|
||||
const struct miniflow *mf)
|
||||
{
|
||||
uint32_t hash;
|
||||
uint32_t hash, recirc_depth;
|
||||
|
||||
hash = dp_packet_get_rss_hash(packet);
|
||||
if (OVS_UNLIKELY(!hash)) {
|
||||
hash = miniflow_hash_5tuple(mf, 0);
|
||||
dp_packet_set_rss_hash(packet, hash);
|
||||
}
|
||||
|
||||
/* The RSS hash must account for the recirculation depth to avoid
|
||||
* collisions in the exact match cache */
|
||||
recirc_depth = *recirc_depth_get_unsafe();
|
||||
if (OVS_UNLIKELY(recirc_depth)) {
|
||||
hash = hash_finish(hash, recirc_depth);
|
||||
dp_packet_set_rss_hash(packet, hash);
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
@@ -3128,7 +3136,7 @@ emc_processing(struct dp_netdev_pmd_thread *pmd, struct dp_packet **packets,
|
||||
|
||||
miniflow_extract(packets[i], &key.mf);
|
||||
key.len = 0; /* Not computed yet. */
|
||||
key.hash = dpif_netdev_packet_get_dp_hash(packets[i], &key.mf);
|
||||
key.hash = dpif_netdev_packet_get_rss_hash(packets[i], &key.mf);
|
||||
|
||||
flow = emc_lookup(flow_cache, &key);
|
||||
if (OVS_LIKELY(flow)) {
|
||||
|
Reference in New Issue
Block a user