Forgive me, I don't subscribe to port-solaris, so I am forced to cut-paste mangle this message to reply.
On Thu, 3 Jul 2014 22:15:54 +0000 mvit...@sinenomine.net (Mark Vitale) wrote: > I'm hoping someone on the list can provide more historical background on th= > e "bozonlock" (AFS_BOZONLOCK_ENV, vcache->pvnLock). By reading how it is u= > sed in code, it is clearly intended to only allow one thread at a time to i= > nteract with the paging subsystem for a given vcache's memory-mapped pages.= > This is also alluded to in the name "pvnLock" - paged vnode lock. =20 > Some code comments (1) imply that bozonlock was originally intended for use= > in the Solaris port. However, sometime before IBM 1.0, it was specificall= > y disabled for Solaris by the addition of #define AFS_NOBOZO_LOCK (2). At some point the SunOS VM system was changed such that it became re-entrant. Locking a vnode and calling into the VM system would eventually callback into the AFS code which would attempt to lock the vnode again. I don't know the specific call path. The BozonLock only protected operations involving pvn_getpages(). So I imagine trying to get a page for a vnode with existing multiple pages might cause some of other pages in that vnode to be flushed/dropped resulting in a call back into AFS with the vnode already locked. > Currently bozonlock function (AFS_BOZONLOCK_ENV 1) is only defined for the = > Darwin port (and DUX). And only defined for certain Darwin versions as well. See http://gerrit.openafs.org/#change,11108 I don't believe that Darwin port even uses the BozonLock correctly since it doesn't actually take the BozonLock anywhere in its page in/out routines. > Does anyone know why bozonlock was disabled for Solaris? Does anyone know = > any reason why it could/should not be reinstated for Solaris? The comments from the SOLARIS/osi_vnodeops.c seem relevant: * afs_GetOnePage will be called multiple times by pvn_getpages in * order to get all of the requested pages. One of the later * afs_GetOnePage calls may need to evict some cache entries in order * to perform its read. If we try to kick out one of the entries an * earlier afs_GetOnePage call used, we will deadlock since we have * the page locked. So, to tell afs_GetDownD that it should skip over * any entries we've read in due to this afs_getpage call, record the * offset and length in avc->multiPage. This was part of commit 31a001f60e5fe729b315f679d1d43b367bd74ea5. This was a re-implementation of the previous multiPage flag which potentially avoided the need for the BozonLock (but I guess it didn't do a very good job or it wouldn't have needed rewritten). The multiPage flag and no BozonLock on Solaris 2.x has been around since before AFS 3.4a > this function to Sun Microsystems' Version 4.0 virtual memory system, w= They meant SunOS 4.0 -- Quite a long time ago actually. _______________________________________________ OpenAFS-devel mailing list OpenAFS-devel@openafs.org https://lists.openafs.org/mailman/listinfo/openafs-devel