• Kuniyuki Iwashima's avatar
    selftest: Add test for SO_INCOMING_CPU. · 6df96146
    Kuniyuki Iwashima authored
    Some highly optimised applications use SO_INCOMING_CPU to make them
    efficient, but they didn't test if it's working correctly by getsockopt()
    to avoid slowing down.  As a result, no one noticed it had been broken
    for years, so it's a good time to add a test to catch future regression.
    
    The test does
    
      1) Create $(nproc) TCP listeners associated with each CPU.
    
      2) Create 32 child sockets for each listener by calling
         sched_setaffinity() for each CPU.
    
      3) Check if accept()ed sockets' sk_incoming_cpu matches
         listener's one.
    
    If we see -EAGAIN, SO_INCOMING_CPU is broken.  However, we might not see
    any error even if broken; the kernel could miraculously distribute all SYN
    to correct listeners.  Not to let that happen, we must increase the number
    of clients and CPUs to some extent, so the test requires $(nproc) >= 2 and
    creates 64 sockets at least.
    
    Test:
      $ nproc
      96
      $ ./so_incoming_cpu
    
    Before the previous patch:
    
      # Starting 12 tests from 5 test cases.
      #  RUN           so_incoming_cpu.before_reuseport.test1 ...
      # so_incoming_cpu.c:191:test1:Expected cpu (5) == i (0)
      # test1: Test terminated by assertion
      #          FAIL  so_incoming_cpu.before_reuseport.test1
      not ok 1 so_incoming_cpu.before_reuseport.test1
      ...
      # FAILED: 0 / 12 tests passed.
      # Totals: pass:0 fail:12 xfail:0 xpass:0 skip:0 error:0
    
    After:
    
      # Starting 12 tests from 5 test cases.
      #  RUN           so_incoming_cpu.before_reuseport.test1 ...
      # so_incoming_cpu.c:199:test1:SO_INCOMING_CPU is very likely to be working correctly with 3072 sockets.
      #            OK  so_incoming_cpu.before_reuseport.test1
      ok 1 so_incoming_cpu.before_reuseport.test1
      ...
      # PASSED: 12 / 12 tests passed.
      # Totals: pass:12 fail:0 xfail:0 xpass:0 skip:0 error:0
    Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
    Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    6df96146
so_incoming_cpu.c 5.14 KB