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 */
* 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);
* 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);
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))
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;
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;
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);