On 20/08/15 17:43, Bill Fischofer wrote:
Remember that the purpose of RSS is simply to help spread arriving packets to different receiving CPUs. Also, the RSS has itself is not static. It takes as input the RSS key, which defines the packet fields over which the hash is calculated, and the low order bits of it are used as an index into the RSS indirection table. Both the keys and the indirection table are dynamically updated by SW, so the interpretation of a given RSS hash value will vary. So I can't look at a packet and tell you the RSS hash without knowing what key to use, and the interpretation of the hash is dependent on the indirection table (also not part of the hash). Once the packet has been delivered in accordance with the information in the indirection table the "meaning" of the RSS hash is no longer current. At that point it's just a pseudo-random set of bits that is indirectly associated with what were the packet fields of interest at the time the packet was originally received.
Currently the purpose is just to have a hash of certain headers, which defines a flow. Later on we can add APIs about how to define that set of headers, right now these bits are the important bits for OVS.
Also, the key an the indirection table is not relevant for OVS's use case.
On Thu, Aug 20, 2015 at 9:20 AM, Zoltan Kiss <zoltan.k...@linaro.org <mailto:zoltan.k...@linaro.org>> wrote: Hi, On 20/08/15 11:53, Jerin Jacob wrote: How about following change in OVS plarform specific packet_get_hash code. odp_packet_rss_hash_set kind of interface wont fit correctly in octeon platform as hash identifier used by hardware in subsequent HW based queue operations static inline uint32_t packet_get_hash(struct dp_packet *p) { #ifdef DPDK_NETDEV return p->mbuf.hash.rss; #else #ifdef ODP_NETDEV unit32_t hash; hash = odp_packet_rss_hash(p->odp_pkt); if (OVS_UNLIKELY(!hash) hash = odp_packet_generate_rss_hash(p->odp_pkt); return hash; #endif return p->rss_hash; #endif } I was thinking about this too, but I see two problems: 1. OVS changes the hash if the packet is currently recirculated: https://github.com/openvswitch/ovs/blob/master/lib/dpif-netdev.c#L3125 And as far as I can see, it doesn't recalculate the hash when the recirculation is finished. So the final hash of the packet at the end won't be what the platform would generate. OVS doesn't seem to care about it, I think the assumption is that the platform won't use this hash anymore, and it's role is finished after matching in EMC. My first idea to sort this out is to check for recirculation depth in netdev_send(), before the send of course. If it's true, then we can regenerate the hash using odp_packet_generate_rss_hash() 2. Minor thing, but if the platform is only able to do this from software (like DPDK), it should better be as fast as OVS's hashing at least. OVS uses CRC32 on SSE4 x64 CPUs, and Murmurhash on others. I don't know how do they compare e.g. with Toeplitz, but I guess they choose them because they are more suitable for the purpose. _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org <mailto:lng-odp@lists.linaro.org> https://lists.linaro.org/mailman/listinfo/lng-odp
_______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp