mirror of https://gitee.com/openkylin/linux.git
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
Alexei Starovoitov says: ==================== pull-request: bpf 2020-07-09 The following pull-request contains BPF updates for your *net* tree. We've added 4 non-merge commits during the last 1 day(s) which contain a total of 4 files changed, 26 insertions(+), 15 deletions(-). The main changes are: 1) fix crash in libbpf on 32-bit archs, from Jakub and Andrii. 2) fix crash when l2tp and bpf_sk_reuseport conflict, from Martin. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
45ae836f8a
|
@ -533,7 +533,8 @@ enum sk_pacing {
|
||||||
* be copied.
|
* be copied.
|
||||||
*/
|
*/
|
||||||
#define SK_USER_DATA_NOCOPY 1UL
|
#define SK_USER_DATA_NOCOPY 1UL
|
||||||
#define SK_USER_DATA_PTRMASK ~(SK_USER_DATA_NOCOPY)
|
#define SK_USER_DATA_BPF 2UL /* Managed by BPF */
|
||||||
|
#define SK_USER_DATA_PTRMASK ~(SK_USER_DATA_NOCOPY | SK_USER_DATA_BPF)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sk_user_data_is_nocopy - Test if sk_user_data pointer must not be copied
|
* sk_user_data_is_nocopy - Test if sk_user_data pointer must not be copied
|
||||||
|
|
|
@ -20,11 +20,14 @@ static struct reuseport_array *reuseport_array(struct bpf_map *map)
|
||||||
/* The caller must hold the reuseport_lock */
|
/* The caller must hold the reuseport_lock */
|
||||||
void bpf_sk_reuseport_detach(struct sock *sk)
|
void bpf_sk_reuseport_detach(struct sock *sk)
|
||||||
{
|
{
|
||||||
struct sock __rcu **socks;
|
uintptr_t sk_user_data;
|
||||||
|
|
||||||
write_lock_bh(&sk->sk_callback_lock);
|
write_lock_bh(&sk->sk_callback_lock);
|
||||||
socks = sk->sk_user_data;
|
sk_user_data = (uintptr_t)sk->sk_user_data;
|
||||||
if (socks) {
|
if (sk_user_data & SK_USER_DATA_BPF) {
|
||||||
|
struct sock __rcu **socks;
|
||||||
|
|
||||||
|
socks = (void *)(sk_user_data & SK_USER_DATA_PTRMASK);
|
||||||
WRITE_ONCE(sk->sk_user_data, NULL);
|
WRITE_ONCE(sk->sk_user_data, NULL);
|
||||||
/*
|
/*
|
||||||
* Do not move this NULL assignment outside of
|
* Do not move this NULL assignment outside of
|
||||||
|
@ -252,6 +255,7 @@ int bpf_fd_reuseport_array_update_elem(struct bpf_map *map, void *key,
|
||||||
struct sock *free_osk = NULL, *osk, *nsk;
|
struct sock *free_osk = NULL, *osk, *nsk;
|
||||||
struct sock_reuseport *reuse;
|
struct sock_reuseport *reuse;
|
||||||
u32 index = *(u32 *)key;
|
u32 index = *(u32 *)key;
|
||||||
|
uintptr_t sk_user_data;
|
||||||
struct socket *socket;
|
struct socket *socket;
|
||||||
int err, fd;
|
int err, fd;
|
||||||
|
|
||||||
|
@ -305,7 +309,9 @@ int bpf_fd_reuseport_array_update_elem(struct bpf_map *map, void *key,
|
||||||
if (err)
|
if (err)
|
||||||
goto put_file_unlock;
|
goto put_file_unlock;
|
||||||
|
|
||||||
WRITE_ONCE(nsk->sk_user_data, &array->ptrs[index]);
|
sk_user_data = (uintptr_t)&array->ptrs[index] | SK_USER_DATA_NOCOPY |
|
||||||
|
SK_USER_DATA_BPF;
|
||||||
|
WRITE_ONCE(nsk->sk_user_data, (void *)sk_user_data);
|
||||||
rcu_assign_pointer(array->ptrs[index], nsk);
|
rcu_assign_pointer(array->ptrs[index], nsk);
|
||||||
free_osk = osk;
|
free_osk = osk;
|
||||||
err = 0;
|
err = 0;
|
||||||
|
|
|
@ -11,14 +11,18 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#ifndef __WORDSIZE
|
|
||||||
#define __WORDSIZE (__SIZEOF_LONG__ * 8)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline size_t hash_bits(size_t h, int bits)
|
static inline size_t hash_bits(size_t h, int bits)
|
||||||
{
|
{
|
||||||
/* shuffle bits and return requested number of upper bits */
|
/* shuffle bits and return requested number of upper bits */
|
||||||
return (h * 11400714819323198485llu) >> (__WORDSIZE - bits);
|
#if (__SIZEOF_SIZE_T__ == __SIZEOF_LONG_LONG__)
|
||||||
|
/* LP64 case */
|
||||||
|
return (h * 11400714819323198485llu) >> (__SIZEOF_LONG_LONG__ * 8 - bits);
|
||||||
|
#elif (__SIZEOF_SIZE_T__ <= __SIZEOF_LONG__)
|
||||||
|
return (h * 2654435769lu) >> (__SIZEOF_LONG__ * 8 - bits);
|
||||||
|
#else
|
||||||
|
# error "Unsupported size_t size"
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef size_t (*hashmap_hash_fn)(const void *key, void *ctx);
|
typedef size_t (*hashmap_hash_fn)(const void *key, void *ctx);
|
||||||
|
|
|
@ -789,19 +789,19 @@ static void test_sockmap(unsigned int tasks, void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = bpf_prog_detach(fd, BPF_SK_SKB_STREAM_PARSER);
|
err = bpf_prog_detach(fd, BPF_SK_SKB_STREAM_PARSER);
|
||||||
if (err) {
|
if (!err) {
|
||||||
printf("Failed empty parser prog detach\n");
|
printf("Failed empty parser prog detach\n");
|
||||||
goto out_sockmap;
|
goto out_sockmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = bpf_prog_detach(fd, BPF_SK_SKB_STREAM_VERDICT);
|
err = bpf_prog_detach(fd, BPF_SK_SKB_STREAM_VERDICT);
|
||||||
if (err) {
|
if (!err) {
|
||||||
printf("Failed empty verdict prog detach\n");
|
printf("Failed empty verdict prog detach\n");
|
||||||
goto out_sockmap;
|
goto out_sockmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = bpf_prog_detach(fd, BPF_SK_MSG_VERDICT);
|
err = bpf_prog_detach(fd, BPF_SK_MSG_VERDICT);
|
||||||
if (err) {
|
if (!err) {
|
||||||
printf("Failed empty msg verdict prog detach\n");
|
printf("Failed empty msg verdict prog detach\n");
|
||||||
goto out_sockmap;
|
goto out_sockmap;
|
||||||
}
|
}
|
||||||
|
@ -1090,19 +1090,19 @@ static void test_sockmap(unsigned int tasks, void *data)
|
||||||
assert(status == 0);
|
assert(status == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = bpf_prog_detach(map_fd_rx, __MAX_BPF_ATTACH_TYPE);
|
err = bpf_prog_detach2(parse_prog, map_fd_rx, __MAX_BPF_ATTACH_TYPE);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
printf("Detached an invalid prog type.\n");
|
printf("Detached an invalid prog type.\n");
|
||||||
goto out_sockmap;
|
goto out_sockmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = bpf_prog_detach(map_fd_rx, BPF_SK_SKB_STREAM_PARSER);
|
err = bpf_prog_detach2(parse_prog, map_fd_rx, BPF_SK_SKB_STREAM_PARSER);
|
||||||
if (err) {
|
if (err) {
|
||||||
printf("Failed parser prog detach\n");
|
printf("Failed parser prog detach\n");
|
||||||
goto out_sockmap;
|
goto out_sockmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = bpf_prog_detach(map_fd_rx, BPF_SK_SKB_STREAM_VERDICT);
|
err = bpf_prog_detach2(verdict_prog, map_fd_rx, BPF_SK_SKB_STREAM_VERDICT);
|
||||||
if (err) {
|
if (err) {
|
||||||
printf("Failed parser prog detach\n");
|
printf("Failed parser prog detach\n");
|
||||||
goto out_sockmap;
|
goto out_sockmap;
|
||||||
|
|
Loading…
Reference in New Issue