• Kuniyuki Iwashima's avatar
    af_unix: Relax race in unix_autobind(). · 9acbc584
    Kuniyuki Iwashima authored
    When we bind an AF_UNIX socket without a name specified, the kernel selects
    an available one from 0x00000 to 0xFFFFF.  unix_autobind() starts searching
    from a number in the 'static' variable and increments it after acquiring
    two locks.
    
    If multiple processes try autobind, they obtain the same lock and check if
    a socket in the hash list has the same name.  If not, one process uses it,
    and all except one end up retrying the _next_ number (actually not, it may
    be incremented by the other processes).  The more we autobind sockets in
    parallel, the longer the latency gets.  We can avoid such a race by
    searching for a name from a random number.
    
    These show latency in unix_autobind() while 64 CPUs are simultaneously
    autobind-ing 1024 sockets for each.
    
      Without this patch:
    
         usec          : count     distribution
            0          : 1176     |***                                     |
            2          : 3655     |***********                             |
            4          : 4094     |*************                           |
            6          : 3831     |************                            |
            8          : 3829     |************                            |
            10         : 3844     |************                            |
            12         : 3638     |***********                             |
            14         : 2992     |*********                               |
            16         : 2485     |*******                                 |
            18         : 2230     |*******                                 |
            20         : 2095     |******                                  |
            22         : 1853     |*****                                   |
            24         : 1827     |*****                                   |
            26         : 1677     |*****                                   |
            28         : 1473     |****                                    |
            30         : 1573     |*****                                   |
            32         : 1417     |****                                    |
            34         : 1385     |****                                    |
            36         : 1345     |****                                    |
            38         : 1344     |****                                    |
            40         : 1200     |***                                     |
    
      With this patch:
    
         usec          : count     distribution
            0          : 1855     |******                                  |
            2          : 6464     |*********************                   |
            4          : 9936     |********************************        |
            6          : 12107    |****************************************|
            8          : 10441    |**********************************      |
            10         : 7264     |***********************                 |
            12         : 4254     |**************                          |
            14         : 2538     |********                                |
            16         : 1596     |*****                                   |
            18         : 1088     |***                                     |
            20         : 800      |**                                      |
            22         : 670      |**                                      |
            24         : 601      |*                                       |
            26         : 562      |*                                       |
            28         : 525      |*                                       |
            30         : 446      |*                                       |
            32         : 378      |*                                       |
            34         : 337      |*                                       |
            36         : 317      |*                                       |
            38         : 314      |*                                       |
            40         : 298      |                                        |
    Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.co.jp>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    9acbc584
af_unix.c 82 KB