mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 23:22:31 +02:00
Merge branch 'Bug fix and test case for special map value field '
Xu Kuohai says: ==================== This series is a follow-up to [0]. patch 1 updates sk_storage_map_test to ensure special map value fields are not copied between user and kernel. patch 0 fixes a bug found by the updated test. [0] https://lore.kernel.org/bpf/1ca2e4e8-ed7e-9174-01f6-c14539b8b8b2@huawei.com/ ==================== Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
commit
11a695a8c2
|
|
@ -74,7 +74,7 @@ bpf_selem_alloc(struct bpf_local_storage_map *smap, void *owner,
|
|||
gfp_flags | __GFP_NOWARN);
|
||||
if (selem) {
|
||||
if (value)
|
||||
memcpy(SDATA(selem)->data, value, smap->map.value_size);
|
||||
copy_map_value(&smap->map, SDATA(selem)->data, value);
|
||||
return selem;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -458,7 +458,7 @@ static void test_sk_storage_map_basic(void)
|
|||
struct {
|
||||
int cnt;
|
||||
int lock;
|
||||
} value = { .cnt = 0xeB9f, .lock = 0, }, lookup_value;
|
||||
} value = { .cnt = 0xeB9f, .lock = 1, }, lookup_value;
|
||||
struct bpf_map_create_opts bad_xattr;
|
||||
int btf_fd, map_fd, sk_fd, err;
|
||||
|
||||
|
|
@ -483,38 +483,41 @@ static void test_sk_storage_map_basic(void)
|
|||
"err:%d errno:%d\n", err, errno);
|
||||
err = bpf_map_lookup_elem_flags(map_fd, &sk_fd, &lookup_value,
|
||||
BPF_F_LOCK);
|
||||
CHECK(err || lookup_value.cnt != value.cnt,
|
||||
CHECK(err || lookup_value.lock || lookup_value.cnt != value.cnt,
|
||||
"bpf_map_lookup_elem_flags(BPF_F_LOCK)",
|
||||
"err:%d errno:%d cnt:%x(%x)\n",
|
||||
err, errno, lookup_value.cnt, value.cnt);
|
||||
"err:%d errno:%d lock:%x cnt:%x(%x)\n",
|
||||
err, errno, lookup_value.lock, lookup_value.cnt, value.cnt);
|
||||
|
||||
/* Bump the cnt and update with BPF_EXIST | BPF_F_LOCK */
|
||||
value.cnt += 1;
|
||||
value.lock = 2;
|
||||
err = bpf_map_update_elem(map_fd, &sk_fd, &value,
|
||||
BPF_EXIST | BPF_F_LOCK);
|
||||
CHECK(err, "bpf_map_update_elem(BPF_EXIST|BPF_F_LOCK)",
|
||||
"err:%d errno:%d\n", err, errno);
|
||||
err = bpf_map_lookup_elem_flags(map_fd, &sk_fd, &lookup_value,
|
||||
BPF_F_LOCK);
|
||||
CHECK(err || lookup_value.cnt != value.cnt,
|
||||
CHECK(err || lookup_value.lock || lookup_value.cnt != value.cnt,
|
||||
"bpf_map_lookup_elem_flags(BPF_F_LOCK)",
|
||||
"err:%d errno:%d cnt:%x(%x)\n",
|
||||
err, errno, lookup_value.cnt, value.cnt);
|
||||
"err:%d errno:%d lock:%x cnt:%x(%x)\n",
|
||||
err, errno, lookup_value.lock, lookup_value.cnt, value.cnt);
|
||||
|
||||
/* Bump the cnt and update with BPF_EXIST */
|
||||
value.cnt += 1;
|
||||
value.lock = 2;
|
||||
err = bpf_map_update_elem(map_fd, &sk_fd, &value, BPF_EXIST);
|
||||
CHECK(err, "bpf_map_update_elem(BPF_EXIST)",
|
||||
"err:%d errno:%d\n", err, errno);
|
||||
err = bpf_map_lookup_elem_flags(map_fd, &sk_fd, &lookup_value,
|
||||
BPF_F_LOCK);
|
||||
CHECK(err || lookup_value.cnt != value.cnt,
|
||||
CHECK(err || lookup_value.lock || lookup_value.cnt != value.cnt,
|
||||
"bpf_map_lookup_elem_flags(BPF_F_LOCK)",
|
||||
"err:%d errno:%d cnt:%x(%x)\n",
|
||||
err, errno, lookup_value.cnt, value.cnt);
|
||||
"err:%d errno:%d lock:%x cnt:%x(%x)\n",
|
||||
err, errno, lookup_value.lock, lookup_value.cnt, value.cnt);
|
||||
|
||||
/* Update with BPF_NOEXIST */
|
||||
value.cnt += 1;
|
||||
value.lock = 2;
|
||||
err = bpf_map_update_elem(map_fd, &sk_fd, &value,
|
||||
BPF_NOEXIST | BPF_F_LOCK);
|
||||
CHECK(!err || errno != EEXIST,
|
||||
|
|
@ -526,22 +529,23 @@ static void test_sk_storage_map_basic(void)
|
|||
value.cnt -= 1;
|
||||
err = bpf_map_lookup_elem_flags(map_fd, &sk_fd, &lookup_value,
|
||||
BPF_F_LOCK);
|
||||
CHECK(err || lookup_value.cnt != value.cnt,
|
||||
CHECK(err || lookup_value.lock || lookup_value.cnt != value.cnt,
|
||||
"bpf_map_lookup_elem_flags(BPF_F_LOCK)",
|
||||
"err:%d errno:%d cnt:%x(%x)\n",
|
||||
err, errno, lookup_value.cnt, value.cnt);
|
||||
"err:%d errno:%d lock:%x cnt:%x(%x)\n",
|
||||
err, errno, lookup_value.lock, lookup_value.cnt, value.cnt);
|
||||
|
||||
/* Bump the cnt again and update with map_flags == 0 */
|
||||
value.cnt += 1;
|
||||
value.lock = 2;
|
||||
err = bpf_map_update_elem(map_fd, &sk_fd, &value, 0);
|
||||
CHECK(err, "bpf_map_update_elem()", "err:%d errno:%d\n",
|
||||
err, errno);
|
||||
err = bpf_map_lookup_elem_flags(map_fd, &sk_fd, &lookup_value,
|
||||
BPF_F_LOCK);
|
||||
CHECK(err || lookup_value.cnt != value.cnt,
|
||||
CHECK(err || lookup_value.lock || lookup_value.cnt != value.cnt,
|
||||
"bpf_map_lookup_elem_flags(BPF_F_LOCK)",
|
||||
"err:%d errno:%d cnt:%x(%x)\n",
|
||||
err, errno, lookup_value.cnt, value.cnt);
|
||||
"err:%d errno:%d lock:%x cnt:%x(%x)\n",
|
||||
err, errno, lookup_value.lock, lookup_value.cnt, value.cnt);
|
||||
|
||||
/* Test delete elem */
|
||||
err = bpf_map_delete_elem(map_fd, &sk_fd);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user