From c4f2b5bcd7dd7c01f66b776727055b596ec2848d Mon Sep 17 00:00:00 2001 From: yury <yury> Date: Tue, 6 Nov 2007 13:17:50 +0000 Subject: [PATCH] b=13372 r=adilger,nathan - enable/disable lru resize via proc. --- lustre/include/lustre_dlm.h | 9 ++++++--- lustre/ldlm/ldlm_lock.c | 2 +- lustre/ldlm/ldlm_request.c | 2 +- lustre/ldlm/ldlm_resource.c | 23 ++++++++++++++++++++++- lustre/ptlrpc/import.c | 2 ++ 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/lustre/include/lustre_dlm.h b/lustre/include/lustre_dlm.h index 393f9660ef..7e021b2583 100644 --- a/lustre/include/lustre_dlm.h +++ b/lustre/include/lustre_dlm.h @@ -298,9 +298,12 @@ typedef enum { struct ldlm_namespace { char *ns_name; ldlm_side_t ns_client; /* is this a client-side lock tree? */ - __u64 ns_connect_flags; /* client side connect flags - * supported by server */ - struct list_head *ns_hash; /* hash table for ns */ + __u64 ns_connect_flags; /* ns connect flags supported + * by server (may be changed via proc, + * lru resize may be disabled/enabled) */ + __u64 ns_orig_connect_flags; /* client side orig connect + * flags supported by server */ + struct list_head *ns_hash; /* hash table for ns */ spinlock_t ns_hash_lock; __u32 ns_refcount; /* count of resources in the hash */ struct list_head ns_root_list; /* all root resources in ns */ diff --git a/lustre/ldlm/ldlm_lock.c b/lustre/ldlm/ldlm_lock.c index e83d3966b9..4f9be3424f 100644 --- a/lustre/ldlm/ldlm_lock.c +++ b/lustre/ldlm/ldlm_lock.c @@ -632,7 +632,7 @@ void ldlm_lock_decref_internal(struct ldlm_lock *lock, __u32 mode) * are not supported by the server, otherwise, it is done on * enqueue. */ if (!exp_connect_cancelset(lock->l_conn_export) && - !exp_connect_lru_resize(lock->l_conn_export)) + !ns_connect_lru_resize(ns)) ldlm_cancel_lru(ns, 0, LDLM_ASYNC); } else { unlock_res_and_lock(lock); diff --git a/lustre/ldlm/ldlm_request.c b/lustre/ldlm/ldlm_request.c index 8aff2f612f..c1d2b6de10 100644 --- a/lustre/ldlm/ldlm_request.c +++ b/lustre/ldlm/ldlm_request.c @@ -522,7 +522,7 @@ struct ptlrpc_request *ldlm_prep_enqueue_req(struct obd_export *exp, * rpc right on enqueue, what will make it slower, vs. * asynchronous rpc in blocking thread. */ count += ldlm_cancel_lru_local(ns, cancels, - exp_connect_lru_resize(exp) ? 0 : 1, + ns_connect_lru_resize(ns) ? 0 : 1, avail - count, LDLM_CANCEL_AGED); size[DLM_LOCKREQ_OFF] = ldlm_request_bufsize(count, LDLM_ENQUEUE); diff --git a/lustre/ldlm/ldlm_resource.c b/lustre/ldlm/ldlm_resource.c index 4f68aed22f..1a2e3de52e 100644 --- a/lustre/ldlm/ldlm_resource.c +++ b/lustre/ldlm/ldlm_resource.c @@ -138,6 +138,7 @@ static int lprocfs_wr_lru_size(struct file *file, const char *buffer, struct ldlm_namespace *ns = data; char dummy[MAX_STRING_SIZE + 1], *end; unsigned long tmp; + int lru_resize; dummy[MAX_STRING_SIZE] = '\0'; if (copy_from_user(dummy, buffer, MAX_STRING_SIZE)) @@ -172,8 +173,12 @@ static int lprocfs_wr_lru_size(struct file *file, const char *buffer, CERROR("invalid value written\n"); return -EINVAL; } - + lru_resize = (tmp == 0); + if (ns_connect_lru_resize(ns)) { + if (!lru_resize) + ns->ns_max_unused = (unsigned int)tmp; + if (tmp > ns->ns_nr_unused) tmp = ns->ns_nr_unused; tmp = ns->ns_nr_unused - tmp; @@ -181,11 +186,26 @@ static int lprocfs_wr_lru_size(struct file *file, const char *buffer, CDEBUG(D_DLMTRACE, "changing namespace %s unused locks from %u to %u\n", ns->ns_name, ns->ns_nr_unused, (unsigned int)tmp); ldlm_cancel_lru(ns, (unsigned int)tmp, LDLM_ASYNC); + + if (!lru_resize) { + CDEBUG(D_DLMTRACE, "disable lru_resize for namespace %s\n", + ns->ns_name); + ns->ns_connect_flags &= ~OBD_CONNECT_LRU_RESIZE; + } } else { CDEBUG(D_DLMTRACE, "changing namespace %s max_unused from %u to %u\n", ns->ns_name, ns->ns_max_unused, (unsigned int)tmp); ns->ns_max_unused = (unsigned int)tmp; ldlm_cancel_lru(ns, 0, LDLM_ASYNC); + + /* Make sure that originally lru resize was supported before + * turning it on here. */ + if (lru_resize && + (ns->ns_orig_connect_flags & OBD_CONNECT_LRU_RESIZE)) { + CDEBUG(D_DLMTRACE, "enable lru_resize for namespace %s\n", + ns->ns_name); + ns->ns_connect_flags |= OBD_CONNECT_LRU_RESIZE; + } } return count; @@ -289,6 +309,7 @@ struct ldlm_namespace *ldlm_namespace_new(char *name, ldlm_side_t client, ns->ns_max_unused = LDLM_DEFAULT_LRU_SIZE; ns->ns_max_age = LDLM_DEFAULT_MAX_ALIVE; spin_lock_init(&ns->ns_unused_lock); + ns->ns_orig_connect_flags = 0; ns->ns_connect_flags = 0; ldlm_proc_namespace(ns); diff --git a/lustre/ptlrpc/import.c b/lustre/ptlrpc/import.c index 35a8aa8782..2597872434 100644 --- a/lustre/ptlrpc/import.c +++ b/lustre/ptlrpc/import.c @@ -776,6 +776,8 @@ finish: imp->imp_obd->obd_namespace->ns_connect_flags = ocd->ocd_connect_flags; + imp->imp_obd->obd_namespace->ns_orig_connect_flags = + ocd->ocd_connect_flags; LASSERT((cli->cl_max_pages_per_rpc <= PTLRPC_MAX_BRW_PAGES) && (cli->cl_max_pages_per_rpc > 0)); -- GitLab