X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flustre_dlm.h;h=9edf487a5d04ca62004f3f3a2f85681d5b27e8d1;hb=7dc8ef3fb64d5608d6dd1ce1cd4131a72b8c6666;hp=be73ac012c5089393a472750f756f0705db6ab63;hpb=7d329df8f801883b6013c306c2d9e37fc1dc3ad4;p=fs%2Flustre-release.git diff --git a/lustre/include/lustre_dlm.h b/lustre/include/lustre_dlm.h index be73ac0..9edf487 100644 --- a/lustre/include/lustre_dlm.h +++ b/lustre/include/lustre_dlm.h @@ -154,11 +154,6 @@ typedef enum { /* Flags flags inherited from parent lock when doing intents. */ #define LDLM_INHERIT_FLAGS (LDLM_FL_CANCEL_ON_BLOCK) -/* These are flags that are mapped into the flags and ASTs of blocking locks */ -#define LDLM_AST_DISCARD_DATA 0x80000000 /* Add FL_DISCARD to blocking ASTs */ -/* Flags sent in AST lock_flags to be mapped into the receiving lock. */ -#define LDLM_AST_FLAGS (LDLM_FL_DISCARD_DATA) - /* completion ast to be executed */ #define LDLM_FL_CP_REQD 0x1000000 @@ -188,6 +183,23 @@ typedef enum { /* measure lock contention and return -EUSERS if locking contention is high */ #define LDLM_FL_DENY_ON_CONTENTION 0x40000000 +/* These are flags that are mapped into the flags and ASTs of blocking locks */ +#define LDLM_AST_DISCARD_DATA 0x80000000 /* Add FL_DISCARD to blocking ASTs */ + +/* Flags sent in AST lock_flags to be mapped into the receiving lock. */ +#define LDLM_AST_FLAGS (LDLM_FL_DISCARD_DATA) + +/* + * -------------------------------------------------------------------------- + * NOTE! Starting from this point, that is, LDLM_FL_* flags with values above + * 0x80000000 will not be sent over the wire. + * -------------------------------------------------------------------------- + */ + +/* Used for marking lock as an target for -EINTR while cp_ast sleep + * emulation + race with upcoming bl_ast. */ +#define LDLM_FL_FAIL_LOC 0x100000000ULL + /* The blocking callback is overloaded to perform two functions. These flags * indicate which operation should be performed. */ #define LDLM_CB_BLOCKING 1 @@ -201,6 +213,7 @@ typedef enum { #define LCK_COMPAT_CR (LCK_COMPAT_CW | LCK_PR | LCK_PW) #define LCK_COMPAT_NL (LCK_COMPAT_CR | LCK_EX | LCK_GROUP) #define LCK_COMPAT_GROUP (LCK_GROUP | LCK_NL) +#define LCK_COMPAT_COS (LCK_COS) extern ldlm_mode_t lck_compat_array[]; @@ -260,13 +273,13 @@ struct ldlm_pool_ops { int (*po_setup)(struct ldlm_pool *pl, int limit); }; -/** - * One second for pools thread check interval. Each pool has own period. +/** + * One second for pools thread check interval. Each pool has own period. */ #define LDLM_POOLS_THREAD_PERIOD (1) -/** - * 5% margin for modest pools. See ldlm_pool.c for details. +/** + * 5% margin for modest pools. See ldlm_pool.c for details. */ #define LDLM_POOLS_MODEST_MARGIN (5) @@ -364,14 +377,6 @@ typedef enum { } ldlm_appetite_t; /* - * Default value for ->ns_shrink_thumb. If lock is not extent one its cost - * is one page. Here we have 256 pages which is 1M on i386. Thus by default - * all extent locks which have more than 1M long extent will be kept in lru, - * others (including ibits locks) will be canceled on memory pressure event. - */ -#define LDLM_LOCK_SHRINK_THUMB 256 - -/* * Default values for the "max_nolock_size", "contention_time" and * "contended_locks" namespace tunables. */ @@ -431,18 +436,13 @@ struct ldlm_namespace { unsigned int ns_max_unused; unsigned int ns_max_age; - + unsigned int ns_timeouts; /** * Seconds. */ unsigned int ns_ctime_age_limit; /** - * Lower limit to number of pages in lock to keep it in cache. - */ - unsigned int ns_shrink_thumb; - - /** * Next debug dump, jiffies. */ cfs_time_t ns_next_dump; @@ -513,7 +513,7 @@ static inline int ns_connect_lru_resize(struct ldlm_namespace *ns) * */ -#define RES_HASH_BITS 10 +#define RES_HASH_BITS 12 #define RES_HASH_SIZE (1UL << RES_HASH_BITS) #define RES_HASH_MASK (RES_HASH_SIZE - 1) @@ -525,6 +525,7 @@ typedef int (*ldlm_blocking_callback)(struct ldlm_lock *lock, typedef int (*ldlm_completion_callback)(struct ldlm_lock *lock, int flags, void *data); typedef int (*ldlm_glimpse_callback)(struct ldlm_lock *lock, void *data); +typedef unsigned long (*ldlm_weigh_callback)(struct ldlm_lock *lock); /* Interval node data for each LDLM_EXTENT lock */ struct ldlm_interval { @@ -544,7 +545,7 @@ struct ldlm_interval_tree { }; struct ldlm_lock { - /** + /** * Must be first in the structure. */ struct portals_handle l_handle; @@ -552,34 +553,34 @@ struct ldlm_lock { * Lock reference count. */ atomic_t l_refc; - /** + /** * Internal spinlock protects l_resource. we should hold this lock * first before grabbing res_lock. */ spinlock_t l_lock; - /** - * ldlm_lock_change_resource() can change this. + /** + * ldlm_lock_change_resource() can change this. */ struct ldlm_resource *l_resource; - /** + /** * Protected by ns_hash_lock. List item for client side lru list. */ struct list_head l_lru; - /** - * Protected by lr_lock, linkage to resource's lock queues. + /** + * Protected by lr_lock, linkage to resource's lock queues. */ struct list_head l_res_link; - /** - * Tree node for ldlm_extent. + /** + * Tree node for ldlm_extent. */ struct ldlm_interval *l_tree_node; - /** + /** * Protected by per-bucket exp->exp_lock_hash locks. Per export hash * of locks. */ struct hlist_node l_exp_hash; - /** - * Protected by lr_lock. Requested mode. + /** + * Protected by lr_lock. Requested mode. */ ldlm_mode_t l_req_mode; /** @@ -598,6 +599,7 @@ struct ldlm_lock { * Lock glimpse handler. */ ldlm_glimpse_callback l_glimpse_ast; + ldlm_weigh_callback l_weigh_ast; /** * Lock export. @@ -618,7 +620,7 @@ struct ldlm_lock { /* * Protected by lr_lock. Various counters: readers, writers, etc. */ - __u32 l_flags; + __u64 l_flags; __u32 l_readers; __u32 l_writers; /* @@ -630,27 +632,31 @@ struct ldlm_lock { */ __u8 l_destroyed; - /** + /** * If the lock is granted, a process sleeps on this waitq to learn when * it's no longer in use. If the lock is not granted, a process sleeps - * on this waitq to learn when it becomes granted. + * on this waitq to learn when it becomes granted. */ cfs_waitq_t l_waitq; - struct timeval l_enqueued_time; + /** + * Seconds. it will be updated if there is any activity related to + * the lock, e.g. enqueue the lock or send block AST. + */ + cfs_time_t l_last_activity; /** - * Jiffies. Should be converted to time if needed. + * Jiffies. Should be converted to time if needed. */ cfs_time_t l_last_used; struct ldlm_extent l_req_extent; - /* - * Client-side-only members. + /* + * Client-side-only members. */ - - /** + + /** * Temporary storage for an LVB received during an enqueue operation. */ __u32 l_lvb_len; @@ -663,40 +669,43 @@ struct ldlm_lock { struct list_head l_cache_locks_list; - /* - * Server-side-only members. + /* + * Server-side-only members. */ - /** + /** connection cookie for the client originated the operation. */ + __u64 l_client_cookie; + + /** * Protected by elt_lock. Callbacks pending. */ struct list_head l_pending_chain; cfs_time_t l_callback_timeout; - /** - * Pid which created this lock. + /** + * Pid which created this lock. */ __u32 l_pid; - /** - * For ldlm_add_ast_work_item(). + /** + * For ldlm_add_ast_work_item(). */ struct list_head l_bl_ast; - /** - * For ldlm_add_ast_work_item(). + /** + * For ldlm_add_ast_work_item(). */ struct list_head l_cp_ast; - /** - * For ldlm_add_ast_work_item(). + /** + * For ldlm_add_ast_work_item(). */ struct list_head l_rk_ast; struct ldlm_lock *l_blocking_lock; int l_bl_ast_run; - /** - * Protected by lr_lock, linkages to "skip lists". + /** + * Protected by lr_lock, linkages to "skip lists". */ struct list_head l_sl_mode; struct list_head l_sl_policy; @@ -755,6 +764,7 @@ struct ldlm_enqueue_info { void *ei_cb_bl; /* blocking lock callback */ void *ei_cb_cp; /* lock completion callback */ void *ei_cb_gl; /* lock glimpse callback */ + void *ei_cb_wg; /* lock weigh callback */ void *ei_cbdata; /* Data to be passed into callbacks. */ short ei_async:1; /* async request */ }; @@ -784,13 +794,16 @@ void _ldlm_lock_debug(struct ldlm_lock *lock, __u32 mask, ...) __attribute__ ((format (printf, 4, 5))); -#define LDLM_ERROR(lock, fmt, a...) do { \ +#define LDLM_DEBUG_LIMIT(mask, lock, fmt, a...) do { \ static cfs_debug_limit_state_t _ldlm_cdls; \ - ldlm_lock_debug(&_ldlm_cdls, D_ERROR, lock, \ + ldlm_lock_debug(&_ldlm_cdls, mask, lock, \ __FILE__, __FUNCTION__, __LINE__, \ "### " fmt , ##a); \ } while (0) +#define LDLM_ERROR(lock, fmt, a...) LDLM_DEBUG_LIMIT(D_ERROR, lock, fmt, ## a) +#define LDLM_WARN(lock, fmt, a...) LDLM_DEBUG_LIMIT(D_WARNING, lock, fmt, ## a) + #define LDLM_DEBUG(lock, fmt, a...) do { \ ldlm_lock_debug(NULL, D_DLMTRACE, lock, \ __FILE__, __FUNCTION__, __LINE__, \ @@ -850,7 +863,7 @@ int ldlm_handle_cancel(struct ptlrpc_request *req); int ldlm_request_cancel(struct ptlrpc_request *req, const struct ldlm_request *dlm_req, int first); int ldlm_del_waiting_lock(struct ldlm_lock *lock); -int ldlm_refresh_waiting_lock(struct ldlm_lock *lock); +int ldlm_refresh_waiting_lock(struct ldlm_lock *lock, int timeout); void ldlm_revoke_export_locks(struct obd_export *exp); int ldlm_get_ref(void); void ldlm_put_ref(void); @@ -864,7 +877,6 @@ void ldlm_lock2handle(const struct ldlm_lock *lock, struct lustre_handle *lockh); struct ldlm_lock *__ldlm_handle2lock(const struct lustre_handle *, int flags); void ldlm_cancel_callback(struct ldlm_lock *); -int ldlm_lock_set_data(struct lustre_handle *, void *data); int ldlm_lock_remove_from_lru(struct ldlm_lock *); static inline struct ldlm_lock *ldlm_handle2lock(const struct lustre_handle *h) @@ -952,14 +964,14 @@ int ldlm_lock_addref_try(struct lustre_handle *lockh, __u32 mode); void ldlm_lock_decref(struct lustre_handle *lockh, __u32 mode); void ldlm_lock_decref_and_cancel(struct lustre_handle *lockh, __u32 mode); void ldlm_lock_allow_match(struct ldlm_lock *lock); -int ldlm_lock_fast_match(struct ldlm_lock *, int, obd_off, obd_off, void **); -void ldlm_lock_fast_release(void *, int); +void ldlm_lock_allow_match_locked(struct ldlm_lock *lock); ldlm_mode_t ldlm_lock_match(struct ldlm_namespace *ns, int flags, const struct ldlm_res_id *, ldlm_type_t type, ldlm_policy_data_t *, ldlm_mode_t mode, - struct lustre_handle *); + struct lustre_handle *, int unref); struct ldlm_resource *ldlm_lock_convert(struct ldlm_lock *lock, int new_mode, __u32 *flags); +void ldlm_lock_downgrade(struct ldlm_lock *lock, int new_mode); void ldlm_lock_cancel(struct ldlm_lock *lock); void ldlm_cancel_locks_for_export(struct obd_export *export); void ldlm_reprocess_all(struct ldlm_resource *res); @@ -1008,7 +1020,7 @@ int ldlm_lock_change_resource(struct ldlm_namespace *, struct ldlm_lock *, const struct ldlm_res_id *); #define LDLM_RESOURCE_ADDREF(res) do { \ - lu_ref_add(&(res)->lr_reference, __FUNCTION__, cfs_current()); \ + lu_ref_add_atomic(&(res)->lr_reference, __FUNCTION__, cfs_current()); \ } while (0) #define LDLM_RESOURCE_DELREF(res) do { \ @@ -1024,6 +1036,7 @@ struct ldlm_callback_suite { /* ldlm_request.c */ int ldlm_expired_completion_wait(void *data); +int ldlm_blocking_ast_nocheck(struct ldlm_lock *lock); int ldlm_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc, void *data, int flag); int ldlm_glimpse_ast(struct ldlm_lock *lock, void *reqp); @@ -1059,6 +1072,7 @@ int ldlm_cli_enqueue_local(struct ldlm_namespace *ns, ldlm_completion_callback completion, ldlm_glimpse_callback glimpse, void *data, __u32 lvb_len, void *lvb_swabber, + const __u64 *client_cookie, struct lustre_handle *lockh); int ldlm_server_ast(struct lustre_handle *lockh, struct ldlm_lock_desc *new, void *data, __u32 data_len);