afs: Drop GLOCK for various Rx calls 84/14184/7
authorAndrew Deason <adeason@dson.org>
Sun, 3 May 2020 15:33:28 +0000 (10:33 -0500)
committerBenjamin Kaduk <kaduk@mit.edu>
Thu, 9 Dec 2021 18:55:11 +0000 (13:55 -0500)
commitd5e1428a3bd4a7fbb4401cf17176474f0c1825d3
tree54ec599d2deb7d3db7993e8768201dade7990e02
parent2a659ba160fbdc87a5fb4f330ffda82c1534929d
afs: Drop GLOCK for various Rx calls

Most calls into Rx from libafs do so without the AFS_GLOCK, but a few
pieces of code still hold AFS_GLOCK while making some Rx calls. A few
calls into Rx also currently require AFS_GLOCK, but drop AFS_GLOCK
internally, which is somewhat confusing/inconsistent. Calling Rx
functions with AFS_GLOCK held can potentially cause locking/allocation
problems on various platforms, such as FreeBSD where we get WITNESS
warnings about acquiring sleepable Rx locks while holding the
non-sleepable AFS_GLOCK.

Fix a variety of Rx calls from libafs to drop AFS_GLOCK before calling
into Rx. Specifically, this commit handles calls to rxi_GetIFInfo,
rx_InitHost, rx_StartServer, rx_ServerProc, rx_GetConnection,
rx_DestroyConnection/rx_PutConnection, and
rx_SetConnSecondsUntilNatPing.

For calls made via afs_start_thread, adjust afs_start_thread to accept
a new argument that says whether to acquire AFS_GLOCK for the relevant
function or not.

For a call to rx_InitHost inside afs_InitSetup, dropping GLOCK makes
it possible for another thread to also enter afs_InitSetup while we're
running, before afs_InitSetup_done is set. To prevent two threads from
running afs_InitSetup in parallel, introduce afs_InitSetup_running
(which is set while afs_InitSetup is running), and simply wait for it
to be cleared if it is set when we enter afs_InitSetup.

This commit does not handle strictly all calls into Rx from libafs,
since many Rx calls don't do anything interesting besides set some
internal variables, and so AFS_GLOCK doesn't really matter for them,
and dropping/reacquiring it around those calls may have performance
impact.

Change-Id: Ib6344f08593182ad0f812ea42eb8c91d8f082356
Reviewed-on: https://gerrit.openafs.org/14184
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
src/afs/LINUX/osi_misc.c
src/afs/LINUX/osi_prototypes.h
src/afs/afs_call.c
src/afs/afs_callback.c
src/afs/afs_conn.c
src/afs/afs_daemons.c
src/afs/afs_init.c
src/afs/afs_pag_call.c
src/rx/rx_kcommon.c