-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Jesper Dangaard Brouer says: ==================== Background: cpumap moves the SKB allocation out of the driver code, and instead allocate it on the remote CPU, and invokes the regular kernel network stack with the newly allocated SKB. The idea behind the XDP CPU redirect feature, is to use XDP as a load-balancer step in-front of regular kernel network stack. But the current sample code does not provide a good example of this. Part of the reason is that, I have implemented this as part of Suricata XDP load-balancer. Given this is the most frequent feature request I get. This patchset implement the same XDP load-balancing as Suricata does, which is a symmetric hash based on the IP-pairs + L4-protocol. The expected setup for the use-case is to reduce the number of NIC RX queues via ethtool (as XDP can handle more per core), and via smp_affinity assign these RX queues to a set of CPUs, which will be handling RX packets. The CPUs that runs the regular network stack is supplied to the sample xdp_redirect_cpu tool by specifying the --cpu option multiple times on the cmdline. I do note that cpumap SKB creation is not feature complete yet, and more work is coming. E.g. given GRO is not implemented yet, do expect TCP workloads to be slower. My measurements do indicate UDP workloads are faster. ==================== Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
- Loading branch information
Showing
3 changed files
with
160 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
/* SPDX-License-Identifier: LGPL-2.1 | ||
* | ||
* Based on Paul Hsieh's (LGPG 2.1) hash function | ||
* From: http://www.azillionmonkeys.com/qed/hash.html | ||
*/ | ||
|
||
#define get16bits(d) (*((const __u16 *) (d))) | ||
|
||
static __always_inline | ||
__u32 SuperFastHash (const char *data, int len, __u32 initval) { | ||
__u32 hash = initval; | ||
__u32 tmp; | ||
int rem; | ||
|
||
if (len <= 0 || data == NULL) return 0; | ||
|
||
rem = len & 3; | ||
len >>= 2; | ||
|
||
/* Main loop */ | ||
#pragma clang loop unroll(full) | ||
for (;len > 0; len--) { | ||
hash += get16bits (data); | ||
tmp = (get16bits (data+2) << 11) ^ hash; | ||
hash = (hash << 16) ^ tmp; | ||
data += 2*sizeof (__u16); | ||
hash += hash >> 11; | ||
} | ||
|
||
/* Handle end cases */ | ||
switch (rem) { | ||
case 3: hash += get16bits (data); | ||
hash ^= hash << 16; | ||
hash ^= ((signed char)data[sizeof (__u16)]) << 18; | ||
hash += hash >> 11; | ||
break; | ||
case 2: hash += get16bits (data); | ||
hash ^= hash << 11; | ||
hash += hash >> 17; | ||
break; | ||
case 1: hash += (signed char)*data; | ||
hash ^= hash << 10; | ||
hash += hash >> 1; | ||
} | ||
|
||
/* Force "avalanching" of final 127 bits */ | ||
hash ^= hash << 3; | ||
hash += hash >> 5; | ||
hash ^= hash << 4; | ||
hash += hash >> 17; | ||
hash ^= hash << 25; | ||
hash += hash >> 6; | ||
|
||
return hash; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters