• James Chapman's avatar
    l2tp: refactor ppp socket/session relationship · c5cbaef9
    James Chapman authored
    Each l2tp ppp session has an associated pppox socket. l2tp_ppp uses
    the session's pppox socket refcount to manage session lifetimes; the
    pppox socket holds a ref on the session which is dropped by the socket
    destructor. This complicates session cleanup.
    
    Given l2tp sessions are refcounted, it makes more sense to reverse
    this relationship such that the session keeps the socket alive, not
    the other way around. So refactor l2tp_ppp to have the session hold a
    ref on its socket while it references it. When the session is closed,
    it drops its socket ref when it detaches from its socket. If the
    socket is closed first, it initiates the closing of its session, if
    one is attached. The socket/session can then be freed asynchronously
    when their refcounts drop to 0.
    
    Use the session's session_close callback to detach the pppox socket
    since this will be done on the work queue together with the rest of
    the session cleanup via l2tp_session_delete.
    
    Also, since l2tp_ppp uses the pppox socket's sk_user_data, use the rcu
    sk_user_data access helpers when accessing it and set the socket's
    SOCK_RCU_FREE flag to have pppox sockets freed by rcu.
    Signed-off-by: default avatarJames Chapman <jchapman@katalix.com>
    Signed-off-by: default avatarTom Parkin <tparkin@katalix.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    c5cbaef9
l2tp_ppp.c 42.6 KB