On 02/08/2018 12:41 PM, Naresh Kamboju wrote: > selftests/net/reuseport_bpf FAILED in full run on x86_64 and the > independent test execution resulted as PASS. > > Test failed output log: > ----------------------------- > Testing too many filters... > Testing filters on non-SO_REUSEPORT socket... > ./reuseport_bpf : ebpf error: Operation not permitted > > One more experiment, > The same test case "reuseport_bpf" run 10 times in a row. > The first run pass and other runs failed. > > Running tests for 10 times > + cd /opt/kselftests/mainline/net > + ./reuseport_bpf [...] > ---- IPv6 TCP w/ mapped IPv4 ---- > Testing EBPF mod 10... > Reprograming, testing mod 5... > Testing CBPF mod 10... > Reprograming, testing mod 5... > Testing filter add without bind... > SUCCESS > + echo PASS > PASS > + ./reuseport_bpf > ---- IPv4 UDP ---- > Testing EBPF mod 10... > Reprograming, testing mod 5... > ./reuseport_bpf: ebpf error. log: > 0: (bf) r6 = r1 > 1: (20) r0 = *(u32 *)skb[0] > 2: (97) r0 %= 10 > 3: (95) exit > processed 4 insns > : Operation not permitted > + echo FAIL > FAIL > + ./reuseport_bpf > ---- IPv4 UDP ---- > Testing EBPF mod 10... > Reprograming, testing mod 5... > ./reuseport_bpf: ebpf error. log: > 0: (bf) r6 = r1 > 1: (20) r0 = *(u32 *)skb[0] > 2: (97) r0 %= 10 > 3: (95) exit > processed 4 insns > : Operation not permitted > + echo FAIL > FAIL > + ./reuseport_bpf > ---- IPv4 UDP ---- > Testing EBPF mod 10... > Reprograming, testing mod 5... > Testing EBPF mod 20... > Reprograming, testing mod 10... > Testing CBPF mod 10... > Reprograming, testing mod 5... > Testing CBPF mod 20... > Reprograming, testing mod 10... > Testing too many filters... > Testing filters on non-SO_REUSEPORT socket... > ---- IPv6 UDP ---- > Testing EBPF mod 10... > Reprograming, testing mod 5... > Testing EBPF mod 20... > Reprograming, testing mod 10... > Testing CBPF mod 10... > Reprograming, testing mod 5... > Testing CBPF mod 20... > Reprograming, testing mod 10... > Testing too many filters... > Testing filters on non-SO_REUSEPORT socket... > ---- IPv6 UDP w/ mapped IPv4 ---- > Testing EBPF mod 20... > Reprograming, testing mod 10... > Testing EBPF mod 10... > Reprograming, testing mod 5... > Testing CBPF mod 10... > Reprograming, testing mod 5... > Testing CBPF mod 20... > Reprograming, testing mod 10... > ---- IPv4 TCP ---- > Testing EBPF mod 10... > ./reuseport_bpf: failed to bind send socket: Address already in use > + echo FAIL [...] > > Please refer this bug link for more details > https://bugs.linaro.org/show_bug.cgi?id=3502 > > We are using x86_64 machine and the rootfs is mounted on NFS. > Please guide me in solving this test case failure.
[ +Alexei ] Below should fix these two issues. (For checking the bpf selftests, we should probably adapt similar scheme with ctor/dtor to act more graceful.) tools/testing/selftests/net/reuseport_bpf.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/reuseport_bpf.c b/tools/testing/selftests/net/reuseport_bpf.c index 4a82174..cad14cd 100644 --- a/tools/testing/selftests/net/reuseport_bpf.c +++ b/tools/testing/selftests/net/reuseport_bpf.c @@ -21,6 +21,7 @@ #include <sys/epoll.h> #include <sys/types.h> #include <sys/socket.h> +#include <sys/resource.h> #include <unistd.h> #ifndef ARRAY_SIZE @@ -190,11 +191,14 @@ static void send_from(struct test_params p, uint16_t sport, char *buf, struct sockaddr * const saddr = new_any_sockaddr(p.send_family, sport); struct sockaddr * const daddr = new_loopback_sockaddr(p.send_family, p.recv_port); - const int fd = socket(p.send_family, p.protocol, 0); + const int fd = socket(p.send_family, p.protocol, 0), one = 1; if (fd < 0) error(1, errno, "failed to create send socket"); + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one))) + error(1, errno, "failed to set reuseaddr"); + if (bind(fd, saddr, sockaddr_size())) error(1, errno, "failed to bind send socket"); @@ -433,6 +437,21 @@ void enable_fastopen(void) } } +static struct rlimit rlim_old, rlim_new; + +static __attribute__((constructor)) void main_ctor(void) +{ + getrlimit(RLIMIT_MEMLOCK, &rlim_old); + rlim_new.rlim_cur = rlim_old.rlim_cur + (1UL << 20); + rlim_new.rlim_max = rlim_old.rlim_max + (1UL << 20); + setrlimit(RLIMIT_MEMLOCK, &rlim_new); +} + +static __attribute__((destructor)) void main_dtor(void) +{ + setrlimit(RLIMIT_MEMLOCK, &rlim_old); +} + int main(void) { fprintf(stderr, "---- IPv4 UDP ----\n"); -- 2.9.5