Skip to content
  • Chuck Lever's avatar
    SUNRPC: Use a cached RPC client and transport for rpcbind upcalls · c526611d
    Chuck Lever authored
    
    
    The kernel's rpcbind client creates and deletes an rpc_clnt and its
    underlying transport socket for every upcall to the local rpcbind
    daemon.
    
    When starting a typical NFS server on IPv4 and IPv6, the NFS service
    itself does three upcalls (one per version) times two upcalls (one
    per transport) times two upcalls (one per address family), making 12,
    plus another one for the initial call to unregister previous NFS
    services.  Starting the NLM service adds an additional 13 upcalls,
    for similar reasons.
    
    (Currently the NFS service doesn't start IPv6 listeners, but it will
    soon enough).
    
    Instead, let's create an rpc_clnt for rpcbind upcalls during the
    first local rpcbind query, and cache it.  This saves the overhead of
    creating and destroying an rpc_clnt and a socket for every upcall.
    
    The new logic also prevents the kernel from attempting an RPCB_SET or
    RPCB_UNSET if it knows from the start that the local portmapper does
    not support rpcbind protocol version 4.  This will cut down on the
    number of rpcbind upcalls in legacy environments.
    
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    c526611d