mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 05:32:00 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
Daniel Borkmann says: ==================== pull-request: bpf 2019-01-11 The following pull-request contains BPF updates for your *net* tree. The main changes are: 1) Fix TCP-BPF support for correctly setting the initial window via TCP_BPF_IW on an active TFO sender, from Yuchung. 2) Fix a panic in BPF's stack_map_get_build_id()'s ELF parsing on 32 bit archs caused by page_address() returning NULL, from Song. 3) Fix BTF pretty print in kernel and bpftool when bitfield member offset is greater than 256. Also add test cases, from Yonghong. 4) Fix improper argument handling in xdp1 sample, from Ioana. 5) Install missing tcp_server.py and tcp_client.py files from BPF selftests, from Anders. 6) Add test_libbpf to gitignore in libbpf and BPF selftests, from Stanislav. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
e8b108b050
@ -1219,8 +1219,6 @@ static void btf_bitfield_seq_show(void *data, u8 bits_offset,
|
||||
u8 nr_copy_bits;
|
||||
u64 print_num;
|
||||
|
||||
data += BITS_ROUNDDOWN_BYTES(bits_offset);
|
||||
bits_offset = BITS_PER_BYTE_MASKED(bits_offset);
|
||||
nr_copy_bits = nr_bits + bits_offset;
|
||||
nr_copy_bytes = BITS_ROUNDUP_BYTES(nr_copy_bits);
|
||||
|
||||
@ -1255,7 +1253,9 @@ static void btf_int_bits_seq_show(const struct btf *btf,
|
||||
* BTF_INT_OFFSET() cannot exceed 64 bits.
|
||||
*/
|
||||
total_bits_offset = bits_offset + BTF_INT_OFFSET(int_data);
|
||||
btf_bitfield_seq_show(data, total_bits_offset, nr_bits, m);
|
||||
data += BITS_ROUNDDOWN_BYTES(total_bits_offset);
|
||||
bits_offset = BITS_PER_BYTE_MASKED(total_bits_offset);
|
||||
btf_bitfield_seq_show(data, bits_offset, nr_bits, m);
|
||||
}
|
||||
|
||||
static void btf_int_seq_show(const struct btf *btf, const struct btf_type *t,
|
||||
@ -2001,12 +2001,12 @@ static void btf_struct_seq_show(const struct btf *btf, const struct btf_type *t,
|
||||
|
||||
member_offset = btf_member_bit_offset(t, member);
|
||||
bitfield_size = btf_member_bitfield_size(t, member);
|
||||
bytes_offset = BITS_ROUNDDOWN_BYTES(member_offset);
|
||||
bits8_offset = BITS_PER_BYTE_MASKED(member_offset);
|
||||
if (bitfield_size) {
|
||||
btf_bitfield_seq_show(data, member_offset,
|
||||
btf_bitfield_seq_show(data + bytes_offset, bits8_offset,
|
||||
bitfield_size, m);
|
||||
} else {
|
||||
bytes_offset = BITS_ROUNDDOWN_BYTES(member_offset);
|
||||
bits8_offset = BITS_PER_BYTE_MASKED(member_offset);
|
||||
ops = btf_type_ops(member_type);
|
||||
ops->seq_show(btf, member_type, member->type,
|
||||
data + bytes_offset, bits8_offset, m);
|
||||
|
@ -260,7 +260,7 @@ static int stack_map_get_build_id(struct vm_area_struct *vma,
|
||||
return -EFAULT; /* page not mapped */
|
||||
|
||||
ret = -EINVAL;
|
||||
page_addr = page_address(page);
|
||||
page_addr = kmap_atomic(page);
|
||||
ehdr = (Elf32_Ehdr *)page_addr;
|
||||
|
||||
/* compare magic x7f "ELF" */
|
||||
@ -276,6 +276,7 @@ static int stack_map_get_build_id(struct vm_area_struct *vma,
|
||||
else if (ehdr->e_ident[EI_CLASS] == ELFCLASS64)
|
||||
ret = stack_map_get_build_id_64(page_addr, build_id);
|
||||
out:
|
||||
kunmap_atomic(page_addr);
|
||||
put_page(page);
|
||||
return ret;
|
||||
}
|
||||
|
@ -4203,7 +4203,7 @@ BPF_CALL_5(bpf_setsockopt, struct bpf_sock_ops_kern *, bpf_sock,
|
||||
/* Only some options are supported */
|
||||
switch (optname) {
|
||||
case TCP_BPF_IW:
|
||||
if (val <= 0 || tp->data_segs_out > 0)
|
||||
if (val <= 0 || tp->data_segs_out > tp->syn_data)
|
||||
ret = -EINVAL;
|
||||
else
|
||||
tp->snd_cwnd = val;
|
||||
|
@ -103,7 +103,7 @@ int main(int argc, char **argv)
|
||||
return 1;
|
||||
}
|
||||
|
||||
ifindex = if_nametoindex(argv[1]);
|
||||
ifindex = if_nametoindex(argv[optind]);
|
||||
if (!ifindex) {
|
||||
perror("if_nametoindex");
|
||||
return 1;
|
||||
|
@ -82,8 +82,6 @@ static void btf_dumper_bitfield(__u32 nr_bits, __u8 bit_offset,
|
||||
int bits_to_copy;
|
||||
__u64 print_num;
|
||||
|
||||
data += BITS_ROUNDDOWN_BYTES(bit_offset);
|
||||
bit_offset = BITS_PER_BYTE_MASKED(bit_offset);
|
||||
bits_to_copy = bit_offset + nr_bits;
|
||||
bytes_to_copy = BITS_ROUNDUP_BYTES(bits_to_copy);
|
||||
|
||||
@ -118,7 +116,9 @@ static void btf_dumper_int_bits(__u32 int_type, __u8 bit_offset,
|
||||
* BTF_INT_OFFSET() cannot exceed 64 bits.
|
||||
*/
|
||||
total_bits_offset = bit_offset + BTF_INT_OFFSET(int_type);
|
||||
btf_dumper_bitfield(nr_bits, total_bits_offset, data, jw,
|
||||
data += BITS_ROUNDDOWN_BYTES(total_bits_offset);
|
||||
bit_offset = BITS_PER_BYTE_MASKED(total_bits_offset);
|
||||
btf_dumper_bitfield(nr_bits, bit_offset, data, jw,
|
||||
is_plain_text);
|
||||
}
|
||||
|
||||
@ -216,11 +216,12 @@ static int btf_dumper_struct(const struct btf_dumper *d, __u32 type_id,
|
||||
}
|
||||
|
||||
jsonw_name(d->jw, btf__name_by_offset(d->btf, m[i].name_off));
|
||||
data_off = data + BITS_ROUNDDOWN_BYTES(bit_offset);
|
||||
if (bitfield_size) {
|
||||
btf_dumper_bitfield(bitfield_size, bit_offset,
|
||||
data, d->jw, d->is_plain_text);
|
||||
btf_dumper_bitfield(bitfield_size,
|
||||
BITS_PER_BYTE_MASKED(bit_offset),
|
||||
data_off, d->jw, d->is_plain_text);
|
||||
} else {
|
||||
data_off = data + BITS_ROUNDDOWN_BYTES(bit_offset);
|
||||
ret = btf_dumper_do_type(d, m[i].type,
|
||||
BITS_PER_BYTE_MASKED(bit_offset),
|
||||
data_off);
|
||||
|
1
tools/lib/bpf/.gitignore
vendored
1
tools/lib/bpf/.gitignore
vendored
@ -1,2 +1,3 @@
|
||||
libbpf_version.h
|
||||
FEATURE-DUMP.libbpf
|
||||
test_libbpf
|
||||
|
1
tools/testing/selftests/bpf/.gitignore
vendored
1
tools/testing/selftests/bpf/.gitignore
vendored
@ -28,3 +28,4 @@ flow_dissector_load
|
||||
test_netcnt
|
||||
test_section_names
|
||||
test_tcpnotify_user
|
||||
test_libbpf
|
||||
|
@ -55,7 +55,9 @@ TEST_PROGS := test_kmod.sh \
|
||||
test_flow_dissector.sh \
|
||||
test_xdp_vlan.sh
|
||||
|
||||
TEST_PROGS_EXTENDED := with_addr.sh
|
||||
TEST_PROGS_EXTENDED := with_addr.sh \
|
||||
tcp_client.py \
|
||||
tcp_server.py
|
||||
|
||||
# Compile but not part of 'make run_tests'
|
||||
TEST_GEN_PROGS_EXTENDED = test_libbpf_open test_sock_addr test_skb_cgroup_id_user \
|
||||
|
@ -3526,6 +3526,8 @@ struct pprint_mapv {
|
||||
ENUM_TWO,
|
||||
ENUM_THREE,
|
||||
} aenum;
|
||||
uint32_t ui32b;
|
||||
uint32_t bits2c:2;
|
||||
};
|
||||
|
||||
static struct btf_raw_test pprint_test_template[] = {
|
||||
@ -3568,7 +3570,7 @@ static struct btf_raw_test pprint_test_template[] = {
|
||||
BTF_ENUM_ENC(NAME_TBD, 2),
|
||||
BTF_ENUM_ENC(NAME_TBD, 3),
|
||||
/* struct pprint_mapv */ /* [16] */
|
||||
BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 8), 32),
|
||||
BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 10), 40),
|
||||
BTF_MEMBER_ENC(NAME_TBD, 11, 0), /* uint32_t ui32 */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 10, 32), /* uint16_t ui16 */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 12, 64), /* int32_t si32 */
|
||||
@ -3577,9 +3579,11 @@ static struct btf_raw_test pprint_test_template[] = {
|
||||
BTF_MEMBER_ENC(NAME_TBD, 6, 126), /* unused_bits2b */
|
||||
BTF_MEMBER_ENC(0, 14, 128), /* union (anon) */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 15, 192), /* aenum */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 11, 224), /* uint32_t ui32b */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 6, 256), /* bits2c */
|
||||
BTF_END_RAW,
|
||||
},
|
||||
BTF_STR_SEC("\0unsigned char\0unsigned short\0unsigned int\0int\0unsigned long long\0uint8_t\0uint16_t\0uint32_t\0int32_t\0uint64_t\0ui64\0ui8a\0ENUM_ZERO\0ENUM_ONE\0ENUM_TWO\0ENUM_THREE\0pprint_mapv\0ui32\0ui16\0si32\0unused_bits2a\0bits28\0unused_bits2b\0aenum"),
|
||||
BTF_STR_SEC("\0unsigned char\0unsigned short\0unsigned int\0int\0unsigned long long\0uint8_t\0uint16_t\0uint32_t\0int32_t\0uint64_t\0ui64\0ui8a\0ENUM_ZERO\0ENUM_ONE\0ENUM_TWO\0ENUM_THREE\0pprint_mapv\0ui32\0ui16\0si32\0unused_bits2a\0bits28\0unused_bits2b\0aenum\0ui32b\0bits2c"),
|
||||
.key_size = sizeof(unsigned int),
|
||||
.value_size = sizeof(struct pprint_mapv),
|
||||
.key_type_id = 3, /* unsigned int */
|
||||
@ -3628,7 +3632,7 @@ static struct btf_raw_test pprint_test_template[] = {
|
||||
BTF_ENUM_ENC(NAME_TBD, 2),
|
||||
BTF_ENUM_ENC(NAME_TBD, 3),
|
||||
/* struct pprint_mapv */ /* [16] */
|
||||
BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 8), 32),
|
||||
BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 10), 40),
|
||||
BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 0)), /* uint32_t ui32 */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 10, BTF_MEMBER_OFFSET(0, 32)), /* uint16_t ui16 */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 12, BTF_MEMBER_OFFSET(0, 64)), /* int32_t si32 */
|
||||
@ -3637,9 +3641,11 @@ static struct btf_raw_test pprint_test_template[] = {
|
||||
BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 126)), /* unused_bits2b */
|
||||
BTF_MEMBER_ENC(0, 14, BTF_MEMBER_OFFSET(0, 128)), /* union (anon) */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 15, BTF_MEMBER_OFFSET(0, 192)), /* aenum */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 224)), /* uint32_t ui32b */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 256)), /* bits2c */
|
||||
BTF_END_RAW,
|
||||
},
|
||||
BTF_STR_SEC("\0unsigned char\0unsigned short\0unsigned int\0int\0unsigned long long\0uint8_t\0uint16_t\0uint32_t\0int32_t\0uint64_t\0ui64\0ui8a\0ENUM_ZERO\0ENUM_ONE\0ENUM_TWO\0ENUM_THREE\0pprint_mapv\0ui32\0ui16\0si32\0unused_bits2a\0bits28\0unused_bits2b\0aenum"),
|
||||
BTF_STR_SEC("\0unsigned char\0unsigned short\0unsigned int\0int\0unsigned long long\0uint8_t\0uint16_t\0uint32_t\0int32_t\0uint64_t\0ui64\0ui8a\0ENUM_ZERO\0ENUM_ONE\0ENUM_TWO\0ENUM_THREE\0pprint_mapv\0ui32\0ui16\0si32\0unused_bits2a\0bits28\0unused_bits2b\0aenum\0ui32b\0bits2c"),
|
||||
.key_size = sizeof(unsigned int),
|
||||
.value_size = sizeof(struct pprint_mapv),
|
||||
.key_type_id = 3, /* unsigned int */
|
||||
@ -3690,7 +3696,7 @@ static struct btf_raw_test pprint_test_template[] = {
|
||||
BTF_ENUM_ENC(NAME_TBD, 2),
|
||||
BTF_ENUM_ENC(NAME_TBD, 3),
|
||||
/* struct pprint_mapv */ /* [16] */
|
||||
BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 8), 32),
|
||||
BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 10), 40),
|
||||
BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 0)), /* uint32_t ui32 */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 10, BTF_MEMBER_OFFSET(0, 32)), /* uint16_t ui16 */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 12, BTF_MEMBER_OFFSET(0, 64)), /* int32_t si32 */
|
||||
@ -3699,13 +3705,15 @@ static struct btf_raw_test pprint_test_template[] = {
|
||||
BTF_MEMBER_ENC(NAME_TBD, 19, BTF_MEMBER_OFFSET(2, 126)),/* unused_bits2b */
|
||||
BTF_MEMBER_ENC(0, 14, BTF_MEMBER_OFFSET(0, 128)), /* union (anon) */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 15, BTF_MEMBER_OFFSET(0, 192)), /* aenum */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 224)), /* uint32_t ui32b */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 17, BTF_MEMBER_OFFSET(2, 256)), /* bits2c */
|
||||
/* typedef unsigned int ___int */ /* [17] */
|
||||
BTF_TYPEDEF_ENC(NAME_TBD, 18),
|
||||
BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_VOLATILE, 0, 0), 6), /* [18] */
|
||||
BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 15), /* [19] */
|
||||
BTF_END_RAW,
|
||||
},
|
||||
BTF_STR_SEC("\0unsigned char\0unsigned short\0unsigned int\0int\0unsigned long long\0uint8_t\0uint16_t\0uint32_t\0int32_t\0uint64_t\0ui64\0ui8a\0ENUM_ZERO\0ENUM_ONE\0ENUM_TWO\0ENUM_THREE\0pprint_mapv\0ui32\0ui16\0si32\0unused_bits2a\0bits28\0unused_bits2b\0aenum\0___int"),
|
||||
BTF_STR_SEC("\0unsigned char\0unsigned short\0unsigned int\0int\0unsigned long long\0uint8_t\0uint16_t\0uint32_t\0int32_t\0uint64_t\0ui64\0ui8a\0ENUM_ZERO\0ENUM_ONE\0ENUM_TWO\0ENUM_THREE\0pprint_mapv\0ui32\0ui16\0si32\0unused_bits2a\0bits28\0unused_bits2b\0aenum\0ui32b\0bits2c\0___int"),
|
||||
.key_size = sizeof(unsigned int),
|
||||
.value_size = sizeof(struct pprint_mapv),
|
||||
.key_type_id = 3, /* unsigned int */
|
||||
@ -3793,6 +3801,8 @@ static void set_pprint_mapv(struct pprint_mapv *v, uint32_t i,
|
||||
v->unused_bits2b = 3;
|
||||
v->ui64 = i;
|
||||
v->aenum = i & 0x03;
|
||||
v->ui32b = 4;
|
||||
v->bits2c = 1;
|
||||
v = (void *)v + rounded_value_size;
|
||||
}
|
||||
}
|
||||
@ -3955,7 +3965,8 @@ static int do_test_pprint(int test_num)
|
||||
|
||||
nexpected_line = snprintf(expected_line, sizeof(expected_line),
|
||||
"%s%u: {%u,0,%d,0x%x,0x%x,0x%x,"
|
||||
"{%lu|[%u,%u,%u,%u,%u,%u,%u,%u]},%s}\n",
|
||||
"{%lu|[%u,%u,%u,%u,%u,%u,%u,%u]},%s,"
|
||||
"%u,0x%x}\n",
|
||||
percpu_map ? "\tcpu" : "",
|
||||
percpu_map ? cpu : next_key,
|
||||
cmapv->ui32, cmapv->si32,
|
||||
@ -3967,7 +3978,9 @@ static int do_test_pprint(int test_num)
|
||||
cmapv->ui8a[2], cmapv->ui8a[3],
|
||||
cmapv->ui8a[4], cmapv->ui8a[5],
|
||||
cmapv->ui8a[6], cmapv->ui8a[7],
|
||||
pprint_enum_str[cmapv->aenum]);
|
||||
pprint_enum_str[cmapv->aenum],
|
||||
cmapv->ui32b,
|
||||
cmapv->bits2c);
|
||||
|
||||
err = check_line(expected_line, nexpected_line,
|
||||
sizeof(expected_line), line);
|
||||
|
Loading…
Reference in New Issue
Block a user