The function cm_SyncOp() can cause threads to wait either because there
is a state conflict on the current use of the cm_scache_t object or
a state conflict on the cm_buf_t object. Waiting is always performed
on the cm_scache_t object. However, if the conflict was with the cm_buf_t
object there was no method for waking up the thread when the conflict is
cleared. Now all of the cm_buf_t waiting functions also take a cm_scache_t
and waiting threads are woken if necessary.
cm_scache_t and cm_buf_t objects now have waitCount and waitRequest fields.
The WAITING flag is now cleared by the waking thread who sets waitCount to
zero.
Many improvements to trace logging for these issues.
(1) Replace all calls to getenv() with GetEnvironment(). getenv() does
not read from the real environment but instead from a copy created by
the C RTL.
(2) Add support for preserving Kerberos 5 tickets during the Integrated
Logon process. Now when Integrated Logon is used, the tickets will
be stored into the default ccache within the user session.
(3) Stress testing at MIT uncovered two code paths that could leave
threads in a permanent sleep state under heavy load. Calls to
cm_SyncOpDone were added to plug this hole.
====================
This delta was composed from multiple commits as part of the CVS->Git migration.
The checkin message with each commit was inconsistent.
The following are the additional commit messages.
====================
Install afscpcc.exe and register the KFWLogon WinLogon Event Handler
After profiling RX for a while, I've found a few more bottlenecks in the
packet handling code. This patch addresses a couple of these issues.
The major change in this patch is a new API to allow bulk packet
alloc/free ops on rx_queue's of packets. Benefits include reduced lock
contention on rx_freePktQ_lock, elimination of a lot of unnecessary cache
line invalidates, and reduced register window thrashing on sparc.
In addition, this patch dedicates one rx_packet per thread to rxi_SendAck,
since that function is in the critical path, and represents a large
percentage of execution time.
we'll finish it on a branch and remerge; 1.3.83 needs to happen and 1.4 needs to go out.
====================
This delta was composed from multiple commits as part of the CVS->Git migration.
The checkin message with each commit was inconsistent.
The following are the additional commit messages.
====================
we'll finish it on a branch and remerge; 1.3.83 needs to happen and 1.4 needs to
go out.
On at least one system it was noticed that threads waiting in rx_NewCall
would starve forever (aka deadlock). This was the result of one out of
two problems related to a race condition on the RX_CONN_MAKECALL_WAITING
bit flag. This flag was set once in rx_NewCall and cleared in rx_EndCall.
However, it was possible for the flag to be cleared even though there
were additional flags waiting in rx_NewCall. This was due to a failure
to check the value of makeCallWaiters before clearing the flag and also
due to a failure to properly lock the access to the makeCallWaiters field.
The second problem was an ability to destroy a connection on which threads
are waiting within rx_NewCall.
It has been noticed that on startup there may be corruption of the
dnlc freelist. In particular, some items on the list are actually
in use. This patch will cause the dnlc to be purged if corruption
of the freelist is detected. It also makes changes to ensure that
items placed onto the freelist are in fact cleaned to prevent confusion.
The purge function is corrected to set that magic field to the correct
value.
The validation function is fixed to not CloseHandle the same handle
twice.
====================
This delta was composed from multiple commits as part of the CVS->Git migration.
The checkin message with each commit was inconsistent.
The following are the additional commit messages.
====================
====================
This delta was composed from multiple commits as part of the CVS->Git migration.
The checkin message with each commit was inconsistent.
The following are the additional commit messages.
====================
ifaddr/ifnet compat macros for older versions, and clean up afs_server interface ot use it.
The security module "afs_dynamic_auth" can get VERY slow if trying to
authenticate against a user in a large NIS password file. This happens
because it "replaces" getpwnam with code which loops through the
"passwd" file.
this 1) makes external programs use the "real"
getpwnam, and 2) changes the internal routine afs_getpwnam_int to use
getpwnam instead of iterating.
when the callback for a directory is broken the children of this vnode
are not invalidated as well. so VerifyVCache() always believes these
vnodes to be up to date since they will still have the CStatd flag.
perhaps breaking the callback on a directory should also clear CStatd
on children vnodes?
this isnt a problem for other operating system which go through the
dnlc which does purge the children entries for the vnode in question
during ClearCallBack().
since d_revalidate now avoids the dnlc (and afs_lookup) the following
patch tracks the parent vnode's DataVersion (just the lower half really
but this should be sufficient) in d_time. if the parent has changed
then the dentry is flagged as neededing updated.
====================
This delta was composed from multiple commits as part of the CVS->Git migration.
The checkin message with each commit was inconsistent.
The following are the additional commit messages.
====================
====================
This delta was composed from multiple commits as part of the CVS->Git migration.
The checkin message with each commit was inconsistent.
The following are the additional commit messages.
====================
split for rw/ro dcaches to allow portion of cache to be dedicated
====================
This delta was composed from multiple commits as part of the CVS->Git migration.
The checkin message with each commit was inconsistent.
The following are the additional commit messages.
====================
cm_EndCallbackGrantingCall contained a race condition due to the release
of the cm_callbackLock in the middle of the for() loop. The race was
removed by optimizing out the call to cm_CallbackNotifyChange(). There
is no reason this needed to be called once per callback revoke in the
list.
here's a patch that reduces the overhead of transfers
between the local and global free packet queues. The old algorithm was
O(n) in the number of store instructions -- 7 per rx_packet. I've added
some bulk transfer macros to the rx_queue package. Now, the number of
store instructions is O(1) -- 6 total. This should help reduce bus
contention and cache line invalidates on SMPs.
provide daemon() if none exists. call it in bosserver and in afsd for afsdb handler
====================
This delta was composed from multiple commits as part of the CVS->Git migration.
The checkin message with each commit was inconsistent.
The following are the additional commit messages.
====================
I've been stress testing a patch all weekend that changes the way
thread-local packet quotas are computed. I was able to replicate the
unbounded packet alloc problem on unix server components by eliminating my
code from rxi_StartServerProcs that sets the maximum number of expected
threads. This patch makes the upper thread limit get computed on the fly,
adds some thread-local free packet queue statistics, and a few other minor
tweaks. I still don't have a working windows development environment, so
I can't say whether this will fix all the windows client problems. But,
the unbounded packet allocation problem should go away with this patch.
stress testing on windows succeeds as well. <jaltman@secure-endpoints.com>
Fix IsAfsVnode and friends for OpenBSD and NetBSD.
Use "v" instead of "vc" for vnode args to macros (cosmetic only).
Redefine OpenBSD macros instead of using #ifdefs in afs_osi.h.