X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flustre_dlm.h;h=f1071bd1de785232b2e98ca324fefeb8b67a0727;hb=6052cc88eb1232ac3b0193f0d47881887a2dcfdc;hp=28d2cd9ebf7f4fda3196efc475977fb563f3d9b7;hpb=6c6f247bc08bb6c3a3c07d2da2774a54fd244c9a;p=fs%2Flustre-release.git diff --git a/lustre/include/lustre_dlm.h b/lustre/include/lustre_dlm.h index 28d2cd9..f1071bd 100644 --- a/lustre/include/lustre_dlm.h +++ b/lustre/include/lustre_dlm.h @@ -68,6 +68,7 @@ extern struct kset *ldlm_svc_kset; * client shows interest in that lock, e.g. glimpse is occured. */ #define LDLM_DIRTY_AGE_LIMIT (10) #define LDLM_DEFAULT_PARALLEL_AST_LIMIT 1024 +#define LDLM_DEFAULT_LRU_SHRINK_BATCH (16) /** * LDLM non-error return states @@ -308,8 +309,8 @@ struct ldlm_valblock_ops { * Greedy means release cached locks aggressively */ enum ldlm_appetite { - LDLM_NAMESPACE_GREEDY = 1 << 0, - LDLM_NAMESPACE_MODEST = 1 << 1 + LDLM_NAMESPACE_GREEDY = BIT(0), + LDLM_NAMESPACE_MODEST = BIT(1), }; /** @@ -353,6 +354,14 @@ enum ldlm_ns_type { LDLM_NS_TYPE_MGT, /**< MGT namespace */ }; +enum ldlm_namespace_flags { + /** + * Flag to indicate the LRU cancel is in progress. + * Used to limit the process by 1 thread only. + */ + LDLM_LRU_CANCEL = 0 +}; + /** * LDLM Namespace. * @@ -435,7 +444,15 @@ struct ldlm_namespace { */ unsigned int ns_max_unused; - /** Maximum allowed age (last used time) for locks in the LRU */ + /** + * Cancel batch, if unused lock count exceed lru_size + * Only be used if LRUR disable. + */ + unsigned int ns_cancel_batch; + + /** Maximum allowed age (last used time) for locks in the LRU. Set in + * seconds from userspace, but stored in ns to avoid repeat conversions. + */ ktime_t ns_max_age; /** @@ -444,19 +461,20 @@ struct ldlm_namespace { */ unsigned int ns_timeouts; /** - * Number of seconds since the file change time after which the - * MDT will return an UPDATE lock along with a LOOKUP lock. + * Number of seconds since the file change time after which + * the MDT will return an UPDATE lock along with a LOOKUP lock. * This allows the client to start caching negative dentries * for a directory and may save an RPC for a later stat. */ - time64_t ns_ctime_age_limit; + timeout_t ns_ctime_age_limit; /** - * Number of seconds since the lock was last used. The client may - * cancel the lock limited by this age and flush related data if - * any other client shows interest in it doing glimpse request. - * This allows to cache stat data locally for such files early. + * Number of (nano)seconds since the lock was last used. The client + * may cancel the lock older than this age and flush related data if + * another client shows interest in this lock by doing glimpse request. + * This allows to cache stat data locally for such files early. Set in + * seconds from userspace, but stored in ns to avoid repeat conversions. */ - time64_t ns_dirty_age_limit; + ktime_t ns_dirty_age_limit; /** * Used to rate-limit ldlm_namespace_dump calls. * \see ldlm_namespace_dump. Increased by 10 seconds every time @@ -535,6 +553,11 @@ struct ldlm_namespace { struct kobject ns_kobj; /* sysfs object */ struct completion ns_kobj_unregister; + + /** + * To avoid another ns_lock usage, a separate bitops field. + */ + unsigned long ns_flags; }; /** @@ -962,6 +985,12 @@ struct ldlm_lock { struct list_head l_exp_list; }; +enum ldlm_match_flags { + LDLM_MATCH_UNREF = BIT(0), + LDLM_MATCH_AST = BIT(1), + LDLM_MATCH_AST_ANY = BIT(2), +}; + /** * Describe the overlap between two locks. itree_overlap_cb data. */ @@ -972,8 +1001,7 @@ struct ldlm_match_data { union ldlm_policy_data *lmd_policy; __u64 lmd_flags; __u64 lmd_skip_flags; - int lmd_unref; - bool lmd_has_ast_data; + enum ldlm_match_flags lmd_match; }; /** For uncommitted cross-MDT lock, store transno this lock belongs to */ @@ -1425,7 +1453,7 @@ static inline struct ldlm_lock *ldlm_handle2lock(const struct lustre_handle *h) } #define LDLM_LOCK_REF_DEL(lock) \ - lu_ref_del(&lock->l_reference, "handle", current) + lu_ref_del(&lock->l_reference, "handle", lock) static inline struct ldlm_lock * ldlm_handle2lock_long(const struct lustre_handle *h, __u64 flags) @@ -1533,6 +1561,7 @@ void ldlm_lock_fail_match_locked(struct ldlm_lock *lock); void ldlm_lock_fail_match(struct ldlm_lock *lock); void ldlm_lock_allow_match(struct ldlm_lock *lock); void ldlm_lock_allow_match_locked(struct ldlm_lock *lock); + enum ldlm_mode ldlm_lock_match_with_skip(struct ldlm_namespace *ns, __u64 flags, __u64 skip_flags, const struct ldlm_res_id *res_id, @@ -1540,18 +1569,17 @@ enum ldlm_mode ldlm_lock_match_with_skip(struct ldlm_namespace *ns, union ldlm_policy_data *policy, enum ldlm_mode mode, struct lustre_handle *lh, - int unref); + enum ldlm_match_flags match_flags); static inline enum ldlm_mode ldlm_lock_match(struct ldlm_namespace *ns, __u64 flags, const struct ldlm_res_id *res_id, enum ldlm_type type, union ldlm_policy_data *policy, enum ldlm_mode mode, - struct lustre_handle *lh, - int unref) + struct lustre_handle *lh) { return ldlm_lock_match_with_skip(ns, flags, 0, res_id, type, policy, - mode, lh, unref); + mode, lh, 0); } struct ldlm_lock *search_itree(struct ldlm_resource *res, struct ldlm_match_data *data); @@ -1725,6 +1753,8 @@ int ldlm_cli_inodebits_convert(struct ldlm_lock *lock, /** @} ldlm_cli_api */ +extern unsigned int ldlm_enqueue_min; + /* mds/handler.c */ /* This has to be here because recursive inclusion sucks. */ int intent_disposition(struct ldlm_reply *rep, int flag);