10 Aug, 2014
1 commit
-
Pull nfsd updates from Bruce Fields:
"This includes a major rewrite of the NFSv4 state code, which has
always depended on a single mutex. As an example, open creates are no
longer serialized, fixing a performance regression on NFSv3->NFSv4
upgrades. Thanks to Jeff, Trond, and Benny, and to Christoph for
review.Also some RDMA fixes from Chuck Lever and Steve Wise, and
miscellaneous fixes from Kinglong Mee and others"* 'for-3.17' of git://linux-nfs.org/~bfields/linux: (167 commits)
svcrdma: remove rdma_create_qp() failure recovery logic
nfsd: add some comments to the nfsd4 object definitions
nfsd: remove the client_mutex and the nfs4_lock/unlock_state wrappers
nfsd: remove nfs4_lock_state: nfs4_state_shutdown_net
nfsd: remove nfs4_lock_state: nfs4_laundromat
nfsd: Remove nfs4_lock_state(): reclaim_complete()
nfsd: Remove nfs4_lock_state(): setclientid, setclientid_confirm, renew
nfsd: Remove nfs4_lock_state(): exchange_id, create/destroy_session()
nfsd: Remove nfs4_lock_state(): nfsd4_open and nfsd4_open_confirm
nfsd: Remove nfs4_lock_state(): nfsd4_delegreturn()
nfsd: Remove nfs4_lock_state(): nfsd4_open_downgrade + nfsd4_close
nfsd: Remove nfs4_lock_state(): nfsd4_lock/locku/lockt()
nfsd: Remove nfs4_lock_state(): nfsd4_release_lockowner
nfsd: Remove nfs4_lock_state(): nfsd4_test_stateid/nfsd4_free_stateid
nfsd: Remove nfs4_lock_state(): nfs4_preprocess_stateid_op()
nfsd: remove old fault injection infrastructure
nfsd: add more granular locking to *_delegations fault injectors
nfsd: add more granular locking to forget_openowners fault injector
nfsd: add more granular locking to forget_locks fault injector
nfsd: add a list_head arg to nfsd_foreach_client_lock
...
06 Aug, 2014
2 commits
-
Add some comments that describe what each of these objects is, and how
they related to one another.Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields
05 Aug, 2014
24 commits
-
Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
Also destroy_clientid and bind_conn_to_session.
Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
Remove the old nfsd_for_n_state function and move nfsd_find_client
higher up into the file to get rid of forward declaration. Remove
the struct nfsd_fault_inject_op arguments from the operations as
they are no longer needed by any of them.Finally, remove the old "standard" get and set routines, which
also eliminates the client_mutex from this code.Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
...instead of relying on the client_mutex.
Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
...instead of relying on the client_mutex.
Also, fix up the printk output that is generated when the file is read.
It currently says that it's reporting the number of open files, but
it's actually reporting the number of openowners.Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
...instead of relying on the client_mutex.
Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
In a later patch, we'll want to collect the locks onto a list for later
destruction. If "func" is defined and "collect" is defined, then we'll
add the lock stateid to the list.Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
...which uses the client_lock for protection instead of client_mutex.
Also remove nfsd_forget_client as there are no more callers.Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
...that relies on the client_lock instead of client_mutex.
Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
Add a new "get" routine for forget_clients that relies on the
client_lock instead of the client_mutex.Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
Now that we've added more granular locking in other places, it's time
to address the fault injection code. This code is currently quite
reliant on the client_mutex for protection. Start to change this by
adding a new set of fault injection op vectors.For now they all use the legacy ones. In later patches we'll add new
routines that can deal with more granular locking.Also, move some of the printk routines into the callers to make the
results of the operations more uniform.Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
The clid counter is a global counter currently. Move it to be a per-net
property so that it can be properly protected by the nn->client_lock
instead of relying on the client_mutex.The verifier generator is also potentially racy if there are two
simultaneous callers. Generate the verifier when we generate the clid
value, so it's also created under the client_lock. With this, there's
no need to keep two counters as they'd always be in sync anyway, so
just use the clientid_counter for both.As Trond points out, what would be best is to eventually move this
code to use IDR instead of the hash tables. That would also help ensure
uniqueness, but that's probably best done as a separate project.Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
It's possible that we'll have an in-progress call on some of the clients
while a rogue EXCHANGE_ID or DESTROY_CLIENTID call comes in. Be sure to
try and mark the client expired first, so that the refcount is
respected.This will only be a problem once the client_mutex is removed.
Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
After testing nfs4 lock, I restart the nfsd service, got messages as,
[ 5677.403419] nfsd: last server has exited, flushing export cache
[ 5677.463728] =============================================================================
[ 5677.463942] BUG nfsd4_files (Tainted: G B OE): Objects remaining in nfsd4_files on kmem_cache_close()
[ 5677.464055] -----------------------------------------------------------------------------[ 5677.464203] INFO: Slab 0xffffea0000233400 objects=28 used=1 fp=0xffff880008cd3d98 flags=0x3ffc0000004080
[ 5677.464318] CPU: 0 PID: 3772 Comm: rmmod Tainted: G B OE 3.16.0-rc2+ #29
[ 5677.464420] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 07/31/2013
[ 5677.464538] 0000000000000000 0000000036af2c9f ffff88000ce97d68 ffffffff816eacfa
[ 5677.464643] ffffea0000233400 ffff88000ce97e40 ffffffff811cda44 ffffffff00000020
[ 5677.464774] ffff88000ce97e50 ffff88000ce97e00 656a624f00000008 616d657220737463
[ 5677.464875] Call Trace:
[ 5677.464925] [] dump_stack+0x45/0x56
[ 5677.464983] [] slab_err+0xb4/0xe0
[ 5677.465040] [] ? __kmalloc+0x117/0x290
[ 5677.465099] [] ? on_each_cpu_cond+0xac/0xf0
[ 5677.465158] [] ? kmem_cache_close+0x110/0x2e0
[ 5677.465218] [] kmem_cache_close+0x130/0x2e0
[ 5677.465279] [] ? kobject_cleanup+0x91/0x1b0
[ 5677.465338] [] __kmem_cache_shutdown+0xe/0x10
[ 5677.465399] [] kmem_cache_destroy+0x48/0x100
[ 5677.465466] [] nfsd4_free_slabs+0x2d/0x50 [nfsd]
[ 5677.465530] [] exit_nfsd+0x34/0x6ad [nfsd]
[ 5677.465589] [] SyS_delete_module+0x162/0x200
[ 5677.465649] [] ? do_notify_resume+0x59/0x90
[ 5677.465759] [] system_call_fastpath+0x16/0x1b
[ 5677.465822] INFO: Object 0xffff880008cd0000 @offset=0
[ 5677.465882] INFO: Allocated in nfsd4_process_open1+0x61/0x350 [nfsd] age=7599 cpu=0 pid=3253
[ 5677.466115] __slab_alloc+0x3b0/0x4b1
[ 5677.466166] kmem_cache_alloc+0x1e4/0x240
[ 5677.466220] nfsd4_process_open1+0x61/0x350 [nfsd]
[ 5677.466276] nfsd4_open+0xee/0x860 [nfsd]
[ 5677.466329] nfsd4_proc_compound+0x4d7/0x7f0 [nfsd]
[ 5677.466384] nfsd_dispatch+0xbb/0x200 [nfsd]
[ 5677.466447] svc_process_common+0x453/0x6f0 [sunrpc]
[ 5677.466506] svc_process+0x103/0x170 [sunrpc]
[ 5677.466559] nfsd+0x117/0x190 [nfsd]
[ 5677.466609] kthread+0xd8/0xf0
[ 5677.466656] ret_from_fork+0x7c/0xb0
[ 5677.466775] kmem_cache_destroy nfsd4_files: Slab cache still has objects
[ 5677.466839] CPU: 0 PID: 3772 Comm: rmmod Tainted: G B OE 3.16.0-rc2+ #29
[ 5677.466937] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 07/31/2013
[ 5677.467049] 0000000000000000 0000000036af2c9f ffff88000ce97eb0 ffffffff816eacfa
[ 5677.467150] ffff880020bb2d00 ffff88000ce97ed0 ffffffff8119bdd9 0000000000000000
[ 5677.467250] ffffffffa06065c0 ffff88000ce97ee0 ffffffffa05ef78d ffff88000ce97ef0
[ 5677.467351] Call Trace:
[ 5677.467397] [] dump_stack+0x45/0x56
[ 5677.467454] [] kmem_cache_destroy+0xf9/0x100
[ 5677.467516] [] nfsd4_free_slabs+0x2d/0x50 [nfsd]
[ 5677.467579] [] exit_nfsd+0x34/0x6ad [nfsd]
[ 5677.467639] [] SyS_delete_module+0x162/0x200
[ 5677.467765] [] ? do_notify_resume+0x59/0x90
[ 5677.467826] [] system_call_fastpath+0x16/0x1bSigned-off-by: Kinglong Mee
Reviewed-by: Jeff Layton
Fixes: 11b9164adad7 "nfsd: Add a struct nfs4_file field to struct nfs4_stid"
Signed-off-by: J. Bruce Fields
02 Aug, 2014
13 commits
-
If it fails, it means that the client is in use and so destroying it
would be bad. Currently, the client_mutex prevents this from happening
but once we remove it, we won't be able to do this.Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
All the callers except for the fault injection code call it directly
afterward, and in the fault injection case it won't hurt to do so
anyway.Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
Currently, it's protected by the client_mutex. Move it so that the list
and the fields in the openowner are protected by the client_lock.Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
Signed-off-by: Trond Myklebust
Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
Ensure that the client lookup is done safely under the client_lock, so
we're not relying on the client_mutex.Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
...instead of relying on the client_mutex.
Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
In particular, we want to ensure that the move_to_confirmed() is
protected by the nn->client_lock spin lock, so that we can use that when
looking up the clientid etc. instead of relying on the client_mutex.Signed-off-by: Trond Myklebust
Signed-off-by: Jeff Layton
Signed-off-by: J. Bruce Fields -
...instead of relying on the client_mutex.
Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
For efficiency reasons, and because we want to use spin locks instead
of relying on the client_mutex.Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
The struct nfs_client is supposed to be invisible and unreferenced
before it gets here.Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
If we leave the client on the confirmed/unconfirmed tables, and leave
the sessions visible on the sessionid_hashtbl, then someone might
find them before we've had a chance to destroy them.Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
When we remove the client_mutex protection, we will need to ensure
that it can't be found by other threads while we're destroying it.Signed-off-by: Trond Myklebust
Signed-off-by: J. Bruce Fields -
Signed-off-by: J. Bruce Fields