ebpf: Fix RSS error handling
calculate_rss_hash() was using hash value 0 to tell if it calculated
a hash, but the hash value may be 0 on a rare occasion. Have a
distinct bool value for correctness.
Fixes: f3fa412de2
("ebpf: Added eBPF RSS program.")
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
a4c960eedc
commit
72fa42cfca
File diff suppressed because it is too large
Load Diff
@ -380,18 +380,19 @@ error:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline __u32 calculate_rss_hash(struct __sk_buff *skb,
|
static inline bool calculate_rss_hash(struct __sk_buff *skb,
|
||||||
struct rss_config_t *config, struct toeplitz_key_data_t *toe)
|
struct rss_config_t *config,
|
||||||
|
struct toeplitz_key_data_t *toe,
|
||||||
|
__u32 *result)
|
||||||
{
|
{
|
||||||
__u8 rss_input[HASH_CALCULATION_BUFFER_SIZE] = {};
|
__u8 rss_input[HASH_CALCULATION_BUFFER_SIZE] = {};
|
||||||
size_t bytes_written = 0;
|
size_t bytes_written = 0;
|
||||||
__u32 result = 0;
|
|
||||||
int err = 0;
|
int err = 0;
|
||||||
struct packet_hash_info_t packet_info = {};
|
struct packet_hash_info_t packet_info = {};
|
||||||
|
|
||||||
err = parse_packet(skb, &packet_info);
|
err = parse_packet(skb, &packet_info);
|
||||||
if (err) {
|
if (err) {
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet_info.is_ipv4) {
|
if (packet_info.is_ipv4) {
|
||||||
@ -524,11 +525,13 @@ static inline __u32 calculate_rss_hash(struct __sk_buff *skb,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bytes_written) {
|
if (!bytes_written) {
|
||||||
net_toeplitz_add(&result, rss_input, bytes_written, toe);
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
net_toeplitz_add(result, rss_input, bytes_written, toe);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
SEC("socket")
|
SEC("socket")
|
||||||
@ -549,8 +552,7 @@ int tun_rss_steering_prog(struct __sk_buff *skb)
|
|||||||
return config->default_queue;
|
return config->default_queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
hash = calculate_rss_hash(skb, config, toe);
|
if (calculate_rss_hash(skb, config, toe, &hash)) {
|
||||||
if (hash) {
|
|
||||||
__u32 table_idx = hash % config->indirections_len;
|
__u32 table_idx = hash % config->indirections_len;
|
||||||
__u16 *queue = 0;
|
__u16 *queue = 0;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user