From ca70b78aff3634398787a4736ef29657dfff14bb Mon Sep 17 00:00:00 2001 From: yury <yury> Date: Tue, 6 Nov 2007 12:45:55 +0000 Subject: [PATCH] b=13823 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 | 22 +++++++++++++++++++++- lustre/ptlrpc/import.c | 5 ++++- 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/lustre/include/lustre_dlm.h b/lustre/include/lustre_dlm.h index ebcc6bb81a..e965106cb0 100644 --- a/lustre/include/lustre_dlm.h +++ b/lustre/include/lustre_dlm.h @@ -304,9 +304,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 4154fffcec..e191e4ba29 100644 --- a/lustre/ldlm/ldlm_lock.c +++ b/lustre/ldlm/ldlm_lock.c @@ -643,7 +643,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 8b5c280282..1bf69f7b64 100644 --- a/lustre/ldlm/ldlm_request.c +++ b/lustre/ldlm/ldlm_request.c @@ -537,7 +537,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 fd8c563a6a..49edc0d05d 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; } diff --git a/lustre/ptlrpc/import.c b/lustre/ptlrpc/import.c index 9e480469a8..f85aa0ed17 100644 --- a/lustre/ptlrpc/import.c +++ b/lustre/ptlrpc/import.c @@ -779,7 +779,10 @@ finish: ocd->ocd_brw_size >> CFS_PAGE_SHIFT; } - imp->imp_obd->obd_namespace->ns_connect_flags = ocd->ocd_connect_flags; + 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; if ((ocd->ocd_connect_flags & OBD_CONNECT_AT) && (imp->imp_msg_magic == LUSTRE_MSG_MAGIC_V2)) -- GitLab