From 3a1f6aabf6eeee097476e3776afeeb1c13f75568 Mon Sep 17 00:00:00 2001 From: phil Date: Sun, 3 Aug 2003 21:06:34 +0000 Subject: [PATCH] * Landing fix on HEAD, originally committed to b_devel b=707 r=shaver Makes the LRU size a /proc tunable, "lru_size". If you shrink the LRU size below the number of existing unused locks, they're cancelled immediately. Echo "clear" to cancel all locks without changing the value. --- lustre/include/linux/lustre_dlm.h | 2 ++ lustre/ldlm/ldlm_resource.c | 68 ++++++++++++++++++++++++++++++++------- 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/lustre/include/linux/lustre_dlm.h b/lustre/include/linux/lustre_dlm.h index 8fc90ae..4cc56ab 100644 --- a/lustre/include/linux/lustre_dlm.h +++ b/lustre/include/linux/lustre_dlm.h @@ -21,6 +21,8 @@ struct obd_device; #define OBD_LDLM_DEVICENAME "ldlm" +#define LDLM_DEFAULT_LRU_SIZE 100 + typedef enum { ELDLM_OK = 0, diff --git a/lustre/ldlm/ldlm_resource.c b/lustre/ldlm/ldlm_resource.c index 4449c79..3d98afe 100644 --- a/lustre/ldlm/ldlm_resource.c +++ b/lustre/ldlm/ldlm_resource.c @@ -23,12 +23,13 @@ #define DEBUG_SUBSYSTEM S_LDLM #ifdef __KERNEL__ -#include +# include #else -#include +# include #endif #include +#include "ldlm_internal.h" kmem_cache_t *ldlm_resource_slab, *ldlm_lock_slab; @@ -67,8 +68,46 @@ static int lprocfs_uint_rd(char *page, char **start, off_t off, return snprintf(page, count, "%u\n", *temp); } +static int lprocfs_read_lru_size(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + struct ldlm_namespace *ns = data; + return lprocfs_uint_rd(page, start, off, count, eof, + &ns->ns_max_unused); +} #define MAX_STRING_SIZE 128 +static int lprocfs_write_lru_size(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct ldlm_namespace *ns = data; + char dummy[MAX_STRING_SIZE + 1]; + unsigned long tmp; + + dummy[MAX_STRING_SIZE] = '\0'; + copy_from_user(dummy, buffer, MAX_STRING_SIZE); + + if (count == 6 && memcmp(dummy, "clear", 5) == 0) { + CDEBUG(D_DLMTRACE, + "dropping all unused locks from namespace %s\n", + ns->ns_name); + tmp = ns->ns_max_unused; + ns->ns_max_unused = 0; + ldlm_cancel_lru(ns); + ns->ns_max_unused = tmp; + return count; + } + + tmp = simple_strtoul(dummy, NULL, 0); + 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); + + return count; +} + void ldlm_proc_namespace(struct ldlm_namespace *ns) { struct lprocfs_vars lock_vars[2]; @@ -81,29 +120,34 @@ void ldlm_proc_namespace(struct ldlm_namespace *ns) memset(lock_vars, 0, sizeof(lock_vars)); lock_vars[0].read_fptr = lprocfs_rd_u64; - lock_vars[0].name = lock_name; snprintf(lock_name, MAX_STRING_SIZE, "%s/resource_count", ns->ns_name); - lock_vars[0].data = &ns->ns_resources; lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0); snprintf(lock_name, MAX_STRING_SIZE, "%s/lock_count", ns->ns_name); - lock_vars[0].data = &ns->ns_locks; lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0); - snprintf(lock_name, MAX_STRING_SIZE, "%s/lock_unused_count", - ns->ns_name); - lock_vars[0].data = &ns->ns_nr_unused; - lock_vars[0].read_fptr = lprocfs_uint_rd; - lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0); + if (ns->ns_client) { + snprintf(lock_name, MAX_STRING_SIZE, "%s/lock_unused_count", + ns->ns_name); + lock_vars[0].data = &ns->ns_nr_unused; + lock_vars[0].read_fptr = lprocfs_uint_rd; + lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0); + + snprintf(lock_name, MAX_STRING_SIZE, "%s/lru_size", + ns->ns_name); + lock_vars[0].data = ns; + lock_vars[0].read_fptr = lprocfs_read_lru_size; + lock_vars[0].write_fptr = lprocfs_write_lru_size; + lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0); + } } #endif #undef MAX_STRING_SIZE -#define LDLM_MAX_UNUSED 100 struct ldlm_namespace *ldlm_namespace_new(char *name, __u32 client) { struct ldlm_namespace *ns = NULL; @@ -138,7 +182,7 @@ struct ldlm_namespace *ldlm_namespace_new(char *name, __u32 client) INIT_LIST_HEAD(&ns->ns_unused_list); ns->ns_nr_unused = 0; - ns->ns_max_unused = LDLM_MAX_UNUSED; + ns->ns_max_unused = LDLM_DEFAULT_LRU_SIZE; spin_lock(&ldlm_namespace_lock); list_add(&ns->ns_list_chain, &ldlm_namespace_list); -- 1.8.3.1