On Mon, 2008-11-17 at 13:35 +0100, Max Kellermann wrote: > On 2008/10/27 16:48, Trond Myklebust <trond.myklebust@xxxxxxxxxx> wrote: > > OK. That points a finger at the garbage collector. Does the following > > patch help at all? > > Hi Trond, > > the server's load seems to be a little bit lower with 2.6.27.6 plus > your patch, but OProfile still gives me 45% in > rpcauth_lookup_credcache(). See: > > 1060627 45.1474 (no location information) rpcauth_lookup_credcache > 289362 12.3172 auth_generic.c:0 generic_match > 31886 1.3573 page_alloc.c:0 get_page_from_freelist > 23932 1.0187 (no location information) page_fault > 22176 0.9440 (no location information) schedule > 14613 0.6220 (no location information) __d_lookup > [...] > > Max Looking at the above, it seems that you're spending an inordinate amount of time in generic_match too. Could you see if the following patch helps? Cheers Trond ------------------------------------------------------------------------------- From: Trond Myklebust <Trond.Myklebust@xxxxxxxxxx> SUNRPC: Fix up generic_match() Cut down on the number of similar copies of group_info. Signed-off-by: Trond Myklebust <Trond.Myklebust@xxxxxxxxxx> --- net/sunrpc/auth_generic.c | 20 ++++++++++++++++++-- 1 files changed, 18 insertions(+), 2 deletions(-) diff --git a/net/sunrpc/auth_generic.c b/net/sunrpc/auth_generic.c index 744b79f..4028502 100644 --- a/net/sunrpc/auth_generic.c +++ b/net/sunrpc/auth_generic.c @@ -133,13 +133,29 @@ static int generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags) { struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); + int i; if (gcred->acred.uid != acred->uid || gcred->acred.gid != acred->gid || - gcred->acred.group_info != acred->group_info || gcred->acred.machine_cred != acred->machine_cred) - return 0; + goto out_nomatch; + + /* Optimisation in the case where pointers are identical... */ + if (gcred->acred.group_info == acred->group_info) + goto out_match; + + /* Slow path... */ + if (gcred->acred.group_info->ngroups != acred->group_info->ngroups) + goto out_nomatch; + for (i = 0; i < gcred->acred.group_info->ngroups; i++) { + if (GROUP_AT(gcred->acred.group_info, i) != + GROUP_AT(acred->group_info, i)) + goto out_nomatch; + } +out_match: return 1; +out_nomatch: + return 0; } void __init rpc_init_generic_auth(void) -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html