sunrpc/cache: allow threads to block while waiting for cache update.
authorNeilBrown <neilb@suse.de>
Thu, 12 Aug 2010 07:04:06 +0000 (17:04 +1000)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 7 Sep 2010 23:22:07 +0000 (19:22 -0400)
commitf16b6e8d838b2e2bb4561201311c66ac02ad67df
tree92c4ab62aa566029ce25989ef7dc8e3634365f63
parentc5b29f885afe890f953f7f23424045cdad31d3e4
sunrpc/cache: allow threads to block while waiting for cache update.

The current practice of waiting for cache updates by queueing the
whole request to be retried has (at least) two problems.

1/ With NFSv4, requests can be quite complex and re-trying a whole
  request when a later part fails should only be a last-resort, not a
  normal practice.

2/ Large requests, and in particular any 'write' request, will not be
  queued by the current code and doing so would be undesirable.

In many cases only a very sort wait is needed before the cache gets
valid data.

So, providing the underlying transport permits it by setting
 ->thread_wait,
arrange to wait briefly for an upcall to be completed (as reflected in
the clearing of CACHE_PENDING).
If the short wait was not long enough and CACHE_PENDING is still set,
fall back on the old approach.

The 'thread_wait' value is set to 5 seconds when there are spare
threads, and 1 second when there are no spare threads.

These values are probably much higher than needed, but will ensure
some forward progress.

Note that as we only request an update for a non-valid item, and as
non-valid items are updated in place it is extremely unlikely that
cache_check will return -ETIMEDOUT.  Normally cache_defer_req will
sleep for a short while and then find that the item is_valid.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
include/linux/sunrpc/cache.h
net/sunrpc/cache.c
net/sunrpc/svc_xprt.c