mirror of
https://git.openafs.org/openafs.git
synced 2025-01-19 07:20:11 +00:00
d5e1428a3b
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> |
||
---|---|---|
build-tools | ||
doc | ||
src | ||
tests | ||
.gitignore | ||
.gitreview | ||
.mailmap | ||
.splintrc | ||
acinclude.m4 | ||
CODING | ||
configure-libafs.ac | ||
configure.ac | ||
CONTRIBUTING | ||
INSTALL | ||
libafsdep | ||
LICENSE | ||
Makefile-libafs.in | ||
Makefile.in | ||
NEWS | ||
NTMakefile | ||
README | ||
README-WINDOWS | ||
regen.sh |
AFS is a distributed file system that enables users to share and access all of the files stored in a network of computers as easily as they access the files stored on their local machines. The file system is called distributed for this exact reason: files can reside on many different machines, but are available to users on every machine. OpenAFS 1.0 was originally released by IBM under the terms of the IBM Public License 1.0 (IPL10). For details on IPL10 see the LICENSE file in this directory. The current OpenAFS distribution is licensed under a combination of the IPL10 and many other licenses as granted by the relevant copyright holders. The LICENSE file in this directory contains more details, thought it is not a comprehensive statement. See INSTALL for information about building and installing OpenAFS on various platforms. See CODING for developer information and guidelines. See NEWS for recent changes to OpenAFS.