4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21 * CA 95054 USA or visit www.sun.com if you need additional information or
27 * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
28 * Use is subject to license terms.
30 * Copyright (c) 2010, 2012, Intel Corporation.
33 * This file is part of Lustre, http://www.lustre.org/
34 * Lustre is a trademark of Sun Microsystems, Inc.
36 * lustre/ldlm/ldlm_lockd.c
38 * Author: Peter Braam <braam@clusterfs.com>
39 * Author: Phil Schwan <phil@clusterfs.com>
42 #define DEBUG_SUBSYSTEM S_LDLM
44 # include <linux/libcfs/libcfs.h>
46 #include <lustre_dlm.h>
47 #include <obd_class.h>
48 #include <linux/list.h>
49 #include "ldlm_internal.h"
51 static int ldlm_num_threads;
52 CFS_MODULE_PARM(ldlm_num_threads, "i", int, 0444,
53 "number of DLM service threads to start");
55 static char *ldlm_cpts;
56 CFS_MODULE_PARM(ldlm_cpts, "s", charp, 0444,
57 "CPU partitions ldlm threads should run on");
59 extern struct kmem_cache *ldlm_resource_slab;
60 extern struct kmem_cache *ldlm_lock_slab;
61 static struct mutex ldlm_ref_mutex;
62 static int ldlm_refcount;
64 struct ldlm_cb_async_args {
65 struct ldlm_cb_set_arg *ca_set_arg;
66 struct ldlm_lock *ca_lock;
71 static struct ldlm_state *ldlm_state;
73 inline cfs_time_t round_timeout(cfs_time_t timeout)
75 return cfs_time_seconds((int)cfs_duration_sec(cfs_time_sub(timeout, 0)) + 1);
78 /* timeout for initial callback (AST) reply (bz10399) */
79 static inline unsigned int ldlm_get_rq_timeout(void)
82 unsigned int timeout = min(ldlm_timeout, obd_timeout / 3);
84 return timeout < 1 ? 1 : timeout;
89 #define ELT_TERMINATE 2
95 * blp_prio_list is used for callbacks that should be handled
96 * as a priority. It is used for LDLM_FL_DISCARD_DATA requests.
99 struct list_head blp_prio_list;
102 * blp_list is used for all other callbacks which are likely
103 * to take longer to process.
105 struct list_head blp_list;
107 wait_queue_head_t blp_waitq;
108 struct completion blp_comp;
109 atomic_t blp_num_threads;
110 atomic_t blp_busy_threads;
115 struct ldlm_bl_work_item {
116 struct list_head blwi_entry;
117 struct ldlm_namespace *blwi_ns;
118 struct ldlm_lock_desc blwi_ld;
119 struct ldlm_lock *blwi_lock;
120 struct list_head blwi_head;
122 struct completion blwi_comp;
123 ldlm_cancel_flags_t blwi_flags;
124 int blwi_mem_pressure;
128 int ldlm_del_waiting_lock(struct ldlm_lock *lock)
133 int ldlm_refresh_waiting_lock(struct ldlm_lock *lock, int timeout)
141 * Callback handler for receiving incoming blocking ASTs.
143 * This can only happen on client side.
145 void ldlm_handle_bl_callback(struct ldlm_namespace *ns,
146 struct ldlm_lock_desc *ld, struct ldlm_lock *lock)
151 LDLM_DEBUG(lock, "client blocking AST callback handler");
153 lock_res_and_lock(lock);
154 lock->l_flags |= LDLM_FL_CBPENDING;
156 if (lock->l_flags & LDLM_FL_CANCEL_ON_BLOCK)
157 lock->l_flags |= LDLM_FL_CANCEL;
159 do_ast = (!lock->l_readers && !lock->l_writers);
160 unlock_res_and_lock(lock);
163 CDEBUG(D_DLMTRACE, "Lock %p already unused, calling callback (%p)\n",
164 lock, lock->l_blocking_ast);
165 if (lock->l_blocking_ast != NULL)
166 lock->l_blocking_ast(lock, ld, lock->l_ast_data,
169 CDEBUG(D_DLMTRACE, "Lock %p is referenced, will be cancelled later\n",
173 LDLM_DEBUG(lock, "client blocking callback handler END");
174 LDLM_LOCK_RELEASE(lock);
179 * Callback handler for receiving incoming completion ASTs.
181 * This only can happen on client side.
183 static void ldlm_handle_cp_callback(struct ptlrpc_request *req,
184 struct ldlm_namespace *ns,
185 struct ldlm_request *dlm_req,
186 struct ldlm_lock *lock)
193 LDLM_DEBUG(lock, "client completion callback handler START");
195 if (OBD_FAIL_CHECK(OBD_FAIL_LDLM_CANCEL_BL_CB_RACE)) {
196 int to = cfs_time_seconds(1);
198 schedule_timeout_and_set_state(
199 TASK_INTERRUPTIBLE, to);
200 if (lock->l_granted_mode == lock->l_req_mode ||
206 lvb_len = req_capsule_get_size(&req->rq_pill, &RMF_DLM_LVB, RCL_CLIENT);
208 LDLM_ERROR(lock, "Fail to get lvb_len, rc = %d", lvb_len);
209 GOTO(out, rc = lvb_len);
210 } else if (lvb_len > 0) {
211 if (lock->l_lvb_len > 0) {
212 /* for extent lock, lvb contains ost_lvb{}. */
213 LASSERT(lock->l_lvb_data != NULL);
215 if (unlikely(lock->l_lvb_len < lvb_len)) {
216 LDLM_ERROR(lock, "Replied LVB is larger than "
217 "expectation, expected = %d, "
219 lock->l_lvb_len, lvb_len);
220 GOTO(out, rc = -EINVAL);
222 } else if (ldlm_has_layout(lock)) { /* for layout lock, lvb has
226 OBD_ALLOC(lvb_data, lvb_len);
227 if (lvb_data == NULL) {
228 LDLM_ERROR(lock, "No memory: %d.\n", lvb_len);
229 GOTO(out, rc = -ENOMEM);
232 lock_res_and_lock(lock);
233 LASSERT(lock->l_lvb_data == NULL);
234 lock->l_lvb_data = lvb_data;
235 lock->l_lvb_len = lvb_len;
236 unlock_res_and_lock(lock);
240 lock_res_and_lock(lock);
241 if (lock->l_destroyed ||
242 lock->l_granted_mode == lock->l_req_mode) {
243 /* bug 11300: the lock has already been granted */
244 unlock_res_and_lock(lock);
245 LDLM_DEBUG(lock, "Double grant race happened");
249 /* If we receive the completion AST before the actual enqueue returned,
250 * then we might need to switch lock modes, resources, or extents. */
251 if (dlm_req->lock_desc.l_granted_mode != lock->l_req_mode) {
252 lock->l_req_mode = dlm_req->lock_desc.l_granted_mode;
253 LDLM_DEBUG(lock, "completion AST, new lock mode");
256 if (lock->l_resource->lr_type != LDLM_PLAIN) {
257 ldlm_convert_policy_to_local(req->rq_export,
258 dlm_req->lock_desc.l_resource.lr_type,
259 &dlm_req->lock_desc.l_policy_data,
260 &lock->l_policy_data);
261 LDLM_DEBUG(lock, "completion AST, new policy data");
264 ldlm_resource_unlink_lock(lock);
265 if (memcmp(&dlm_req->lock_desc.l_resource.lr_name,
266 &lock->l_resource->lr_name,
267 sizeof(lock->l_resource->lr_name)) != 0) {
268 unlock_res_and_lock(lock);
269 rc = ldlm_lock_change_resource(ns, lock,
270 &dlm_req->lock_desc.l_resource.lr_name);
272 LDLM_ERROR(lock, "Failed to allocate resource");
275 LDLM_DEBUG(lock, "completion AST, new resource");
276 CERROR("change resource!\n");
277 lock_res_and_lock(lock);
280 if (dlm_req->lock_flags & LDLM_FL_AST_SENT) {
281 /* BL_AST locks are not needed in LRU.
282 * Let ldlm_cancel_lru() be fast. */
283 ldlm_lock_remove_from_lru(lock);
284 lock->l_flags |= LDLM_FL_CBPENDING | LDLM_FL_BL_AST;
285 LDLM_DEBUG(lock, "completion AST includes blocking AST");
288 if (lock->l_lvb_len > 0) {
289 rc = ldlm_fill_lvb(lock, &req->rq_pill, RCL_CLIENT,
290 lock->l_lvb_data, lvb_len);
292 unlock_res_and_lock(lock);
297 ldlm_grant_lock(lock, &ast_list);
298 unlock_res_and_lock(lock);
300 LDLM_DEBUG(lock, "callback handler finished, about to run_ast_work");
302 /* Let Enqueue to call osc_lock_upcall() and initialize
304 OBD_FAIL_TIMEOUT(OBD_FAIL_OSC_CP_ENQ_RACE, 2);
306 ldlm_run_ast_work(ns, &ast_list, LDLM_WORK_CP_AST);
308 LDLM_DEBUG_NOLOCK("client completion callback handler END (lock %p)",
314 lock_res_and_lock(lock);
315 lock->l_flags |= LDLM_FL_FAILED;
316 unlock_res_and_lock(lock);
317 wake_up(&lock->l_waitq);
319 LDLM_LOCK_RELEASE(lock);
323 * Callback handler for receiving incoming glimpse ASTs.
325 * This only can happen on client side. After handling the glimpse AST
326 * we also consider dropping the lock here if it is unused locally for a
329 static void ldlm_handle_gl_callback(struct ptlrpc_request *req,
330 struct ldlm_namespace *ns,
331 struct ldlm_request *dlm_req,
332 struct ldlm_lock *lock)
337 LDLM_DEBUG(lock, "client glimpse AST callback handler");
339 if (lock->l_glimpse_ast != NULL)
340 rc = lock->l_glimpse_ast(lock, req);
342 if (req->rq_repmsg != NULL) {
349 lock_res_and_lock(lock);
350 if (lock->l_granted_mode == LCK_PW &&
351 !lock->l_readers && !lock->l_writers &&
352 cfs_time_after(cfs_time_current(),
353 cfs_time_add(lock->l_last_used,
354 cfs_time_seconds(10)))) {
355 unlock_res_and_lock(lock);
356 if (ldlm_bl_to_thread_lock(ns, NULL, lock))
357 ldlm_handle_bl_callback(ns, NULL, lock);
362 unlock_res_and_lock(lock);
363 LDLM_LOCK_RELEASE(lock);
367 static int ldlm_callback_reply(struct ptlrpc_request *req, int rc)
369 if (req->rq_no_reply)
373 if (!req->rq_packed_final) {
374 rc = lustre_pack_reply(req, 1, NULL, NULL);
378 return ptlrpc_reply(req);
381 static int __ldlm_bl_to_thread(struct ldlm_bl_work_item *blwi,
382 ldlm_cancel_flags_t cancel_flags)
384 struct ldlm_bl_pool *blp = ldlm_state->ldlm_bl_pool;
387 spin_lock(&blp->blp_lock);
388 if (blwi->blwi_lock &&
389 blwi->blwi_lock->l_flags & LDLM_FL_DISCARD_DATA) {
390 /* add LDLM_FL_DISCARD_DATA requests to the priority list */
391 list_add_tail(&blwi->blwi_entry, &blp->blp_prio_list);
393 /* other blocking callbacks are added to the regular list */
394 list_add_tail(&blwi->blwi_entry, &blp->blp_list);
396 spin_unlock(&blp->blp_lock);
398 wake_up(&blp->blp_waitq);
400 /* can not check blwi->blwi_flags as blwi could be already freed in
402 if (!(cancel_flags & LCF_ASYNC))
403 wait_for_completion(&blwi->blwi_comp);
408 static inline void init_blwi(struct ldlm_bl_work_item *blwi,
409 struct ldlm_namespace *ns,
410 struct ldlm_lock_desc *ld,
411 struct list_head *cancels, int count,
412 struct ldlm_lock *lock,
413 ldlm_cancel_flags_t cancel_flags)
415 init_completion(&blwi->blwi_comp);
416 INIT_LIST_HEAD(&blwi->blwi_head);
418 if (memory_pressure_get())
419 blwi->blwi_mem_pressure = 1;
422 blwi->blwi_flags = cancel_flags;
426 list_add(&blwi->blwi_head, cancels);
427 list_del_init(cancels);
428 blwi->blwi_count = count;
430 blwi->blwi_lock = lock;
435 * Queues a list of locks \a cancels containing \a count locks
436 * for later processing by a blocking thread. If \a count is zero,
437 * then the lock referenced as \a lock is queued instead.
439 * The blocking thread would then call ->l_blocking_ast callback in the lock.
440 * If list addition fails an error is returned and caller is supposed to
441 * call ->l_blocking_ast itself.
443 static int ldlm_bl_to_thread(struct ldlm_namespace *ns,
444 struct ldlm_lock_desc *ld,
445 struct ldlm_lock *lock,
446 struct list_head *cancels, int count,
447 ldlm_cancel_flags_t cancel_flags)
451 if (cancels && count == 0)
454 if (cancel_flags & LCF_ASYNC) {
455 struct ldlm_bl_work_item *blwi;
457 OBD_ALLOC(blwi, sizeof(*blwi));
460 init_blwi(blwi, ns, ld, cancels, count, lock, cancel_flags);
462 RETURN(__ldlm_bl_to_thread(blwi, cancel_flags));
464 /* if it is synchronous call do minimum mem alloc, as it could
465 * be triggered from kernel shrinker
467 struct ldlm_bl_work_item blwi;
469 memset(&blwi, 0, sizeof(blwi));
470 init_blwi(&blwi, ns, ld, cancels, count, lock, cancel_flags);
471 RETURN(__ldlm_bl_to_thread(&blwi, cancel_flags));
476 int ldlm_bl_to_thread_lock(struct ldlm_namespace *ns, struct ldlm_lock_desc *ld,
477 struct ldlm_lock *lock)
479 return ldlm_bl_to_thread(ns, ld, lock, NULL, 0, LCF_ASYNC);
482 int ldlm_bl_to_thread_list(struct ldlm_namespace *ns, struct ldlm_lock_desc *ld,
483 struct list_head *cancels, int count,
484 ldlm_cancel_flags_t cancel_flags)
486 return ldlm_bl_to_thread(ns, ld, NULL, cancels, count, cancel_flags);
489 /* Setinfo coming from Server (eg MDT) to Client (eg MDC)! */
490 static int ldlm_handle_setinfo(struct ptlrpc_request *req)
492 struct obd_device *obd = req->rq_export->exp_obd;
499 DEBUG_REQ(D_HSM, req, "%s: handle setinfo\n", obd->obd_name);
501 req_capsule_set(&req->rq_pill, &RQF_OBD_SET_INFO);
503 key = req_capsule_client_get(&req->rq_pill, &RMF_SETINFO_KEY);
505 DEBUG_REQ(D_IOCTL, req, "no set_info key");
508 keylen = req_capsule_get_size(&req->rq_pill, &RMF_SETINFO_KEY,
510 val = req_capsule_client_get(&req->rq_pill, &RMF_SETINFO_VAL);
512 DEBUG_REQ(D_IOCTL, req, "no set_info val");
515 vallen = req_capsule_get_size(&req->rq_pill, &RMF_SETINFO_VAL,
518 /* We are responsible for swabbing contents of val */
520 if (KEY_IS(KEY_HSM_COPYTOOL_SEND))
521 /* Pass it on to mdc (the "export" in this case) */
522 rc = obd_set_info_async(req->rq_svc_thread->t_env,
524 sizeof(KEY_HSM_COPYTOOL_SEND),
525 KEY_HSM_COPYTOOL_SEND,
528 DEBUG_REQ(D_WARNING, req, "ignoring unknown key %s", key);
533 static inline void ldlm_callback_errmsg(struct ptlrpc_request *req,
534 const char *msg, int rc,
535 struct lustre_handle *handle)
537 DEBUG_REQ((req->rq_no_reply || rc) ? D_WARNING : D_DLMTRACE, req,
538 "%s: [nid %s] [rc %d] [lock "LPX64"]",
539 msg, libcfs_id2str(req->rq_peer), rc,
540 handle ? handle->cookie : 0);
541 if (req->rq_no_reply)
542 CWARN("No reply was sent, maybe cause bug 21636.\n");
544 CWARN("Send reply failed, maybe cause bug 21636.\n");
547 static int ldlm_handle_qc_callback(struct ptlrpc_request *req)
549 struct obd_quotactl *oqctl;
550 struct client_obd *cli = &req->rq_export->exp_obd->u.cli;
552 oqctl = req_capsule_client_get(&req->rq_pill, &RMF_OBD_QUOTACTL);
554 CERROR("Can't unpack obd_quotactl\n");
558 cli->cl_qchk_stat = oqctl->qc_stat;
562 /* TODO: handle requests in a similar way as MDT: see mdt_handle_common() */
563 static int ldlm_callback_handler(struct ptlrpc_request *req)
565 struct ldlm_namespace *ns;
566 struct ldlm_request *dlm_req;
567 struct ldlm_lock *lock;
571 /* Requests arrive in sender's byte order. The ptlrpc service
572 * handler has already checked and, if necessary, byte-swapped the
573 * incoming request message body, but I am responsible for the
574 * message buffers. */
576 /* do nothing for sec context finalize */
577 if (lustre_msg_get_opc(req->rq_reqmsg) == SEC_CTX_FINI)
580 req_capsule_init(&req->rq_pill, req, RCL_SERVER);
582 if (req->rq_export == NULL) {
583 rc = ldlm_callback_reply(req, -ENOTCONN);
584 ldlm_callback_errmsg(req, "Operate on unconnected server",
589 LASSERT(req->rq_export != NULL);
590 LASSERT(req->rq_export->exp_obd != NULL);
592 switch (lustre_msg_get_opc(req->rq_reqmsg)) {
593 case LDLM_BL_CALLBACK:
594 if (OBD_FAIL_CHECK(OBD_FAIL_LDLM_BL_CALLBACK_NET))
597 case LDLM_CP_CALLBACK:
598 if (OBD_FAIL_CHECK(OBD_FAIL_LDLM_CP_CALLBACK_NET))
601 case LDLM_GL_CALLBACK:
602 if (OBD_FAIL_CHECK(OBD_FAIL_LDLM_GL_CALLBACK_NET))
606 rc = ldlm_handle_setinfo(req);
607 ldlm_callback_reply(req, rc);
609 case OBD_LOG_CANCEL: /* remove this eventually - for 1.4.0 compat */
610 CERROR("shouldn't be handling OBD_LOG_CANCEL on DLM thread\n");
611 req_capsule_set(&req->rq_pill, &RQF_LOG_CANCEL);
612 if (OBD_FAIL_CHECK(OBD_FAIL_OBD_LOG_CANCEL_NET))
614 rc = llog_origin_handle_cancel(req);
615 if (OBD_FAIL_CHECK(OBD_FAIL_OBD_LOG_CANCEL_REP))
617 ldlm_callback_reply(req, rc);
619 case LLOG_ORIGIN_HANDLE_CREATE:
620 req_capsule_set(&req->rq_pill, &RQF_LLOG_ORIGIN_HANDLE_CREATE);
621 if (OBD_FAIL_CHECK(OBD_FAIL_OBD_LOGD_NET))
623 rc = llog_origin_handle_open(req);
624 ldlm_callback_reply(req, rc);
626 case LLOG_ORIGIN_HANDLE_NEXT_BLOCK:
627 req_capsule_set(&req->rq_pill,
628 &RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK);
629 if (OBD_FAIL_CHECK(OBD_FAIL_OBD_LOGD_NET))
631 rc = llog_origin_handle_next_block(req);
632 ldlm_callback_reply(req, rc);
634 case LLOG_ORIGIN_HANDLE_READ_HEADER:
635 req_capsule_set(&req->rq_pill,
636 &RQF_LLOG_ORIGIN_HANDLE_READ_HEADER);
637 if (OBD_FAIL_CHECK(OBD_FAIL_OBD_LOGD_NET))
639 rc = llog_origin_handle_read_header(req);
640 ldlm_callback_reply(req, rc);
642 case LLOG_ORIGIN_HANDLE_CLOSE:
643 if (OBD_FAIL_CHECK(OBD_FAIL_OBD_LOGD_NET))
645 rc = llog_origin_handle_close(req);
646 ldlm_callback_reply(req, rc);
648 case OBD_QC_CALLBACK:
649 req_capsule_set(&req->rq_pill, &RQF_QC_CALLBACK);
650 if (OBD_FAIL_CHECK(OBD_FAIL_OBD_QC_CALLBACK_NET))
652 rc = ldlm_handle_qc_callback(req);
653 ldlm_callback_reply(req, rc);
656 CERROR("unknown opcode %u\n",
657 lustre_msg_get_opc(req->rq_reqmsg));
658 ldlm_callback_reply(req, -EPROTO);
662 ns = req->rq_export->exp_obd->obd_namespace;
665 req_capsule_set(&req->rq_pill, &RQF_LDLM_CALLBACK);
667 dlm_req = req_capsule_client_get(&req->rq_pill, &RMF_DLM_REQ);
668 if (dlm_req == NULL) {
669 rc = ldlm_callback_reply(req, -EPROTO);
670 ldlm_callback_errmsg(req, "Operate without parameter", rc,
675 /* Force a known safe race, send a cancel to the server for a lock
676 * which the server has already started a blocking callback on. */
677 if (OBD_FAIL_CHECK(OBD_FAIL_LDLM_CANCEL_BL_CB_RACE) &&
678 lustre_msg_get_opc(req->rq_reqmsg) == LDLM_BL_CALLBACK) {
679 rc = ldlm_cli_cancel(&dlm_req->lock_handle[0], 0);
681 CERROR("ldlm_cli_cancel: %d\n", rc);
684 lock = ldlm_handle2lock_long(&dlm_req->lock_handle[0], 0);
686 CDEBUG(D_DLMTRACE, "callback on lock "LPX64" - lock "
687 "disappeared\n", dlm_req->lock_handle[0].cookie);
688 rc = ldlm_callback_reply(req, -EINVAL);
689 ldlm_callback_errmsg(req, "Operate with invalid parameter", rc,
690 &dlm_req->lock_handle[0]);
694 if ((lock->l_flags & LDLM_FL_FAIL_LOC) &&
695 lustre_msg_get_opc(req->rq_reqmsg) == LDLM_BL_CALLBACK)
696 OBD_RACE(OBD_FAIL_LDLM_CP_BL_RACE);
698 /* Copy hints/flags (e.g. LDLM_FL_DISCARD_DATA) from AST. */
699 lock_res_and_lock(lock);
700 lock->l_flags |= ldlm_flags_from_wire(dlm_req->lock_flags &
702 if (lustre_msg_get_opc(req->rq_reqmsg) == LDLM_BL_CALLBACK) {
703 /* If somebody cancels lock and cache is already dropped,
704 * or lock is failed before cp_ast received on client,
705 * we can tell the server we have no lock. Otherwise, we
706 * should send cancel after dropping the cache. */
707 if (((lock->l_flags & LDLM_FL_CANCELING) &&
708 (lock->l_flags & LDLM_FL_BL_DONE)) ||
709 (lock->l_flags & LDLM_FL_FAILED)) {
710 LDLM_DEBUG(lock, "callback on lock "
711 LPX64" - lock disappeared\n",
712 dlm_req->lock_handle[0].cookie);
713 unlock_res_and_lock(lock);
714 LDLM_LOCK_RELEASE(lock);
715 rc = ldlm_callback_reply(req, -EINVAL);
716 ldlm_callback_errmsg(req, "Operate on stale lock", rc,
717 &dlm_req->lock_handle[0]);
720 /* BL_AST locks are not needed in LRU.
721 * Let ldlm_cancel_lru() be fast. */
722 ldlm_lock_remove_from_lru(lock);
723 lock->l_flags |= LDLM_FL_BL_AST;
725 unlock_res_and_lock(lock);
727 /* We want the ost thread to get this reply so that it can respond
728 * to ost requests (write cache writeback) that might be triggered
731 * But we'd also like to be able to indicate in the reply that we're
732 * cancelling right now, because it's unused, or have an intent result
733 * in the reply, so we might have to push the responsibility for sending
734 * the reply down into the AST handlers, alas. */
736 switch (lustre_msg_get_opc(req->rq_reqmsg)) {
737 case LDLM_BL_CALLBACK:
738 CDEBUG(D_INODE, "blocking ast\n");
739 req_capsule_extend(&req->rq_pill, &RQF_LDLM_BL_CALLBACK);
740 if (!(lock->l_flags & LDLM_FL_CANCEL_ON_BLOCK)) {
741 rc = ldlm_callback_reply(req, 0);
742 if (req->rq_no_reply || rc)
743 ldlm_callback_errmsg(req, "Normal process", rc,
744 &dlm_req->lock_handle[0]);
746 if (ldlm_bl_to_thread_lock(ns, &dlm_req->lock_desc, lock))
747 ldlm_handle_bl_callback(ns, &dlm_req->lock_desc, lock);
749 case LDLM_CP_CALLBACK:
750 CDEBUG(D_INODE, "completion ast\n");
751 req_capsule_extend(&req->rq_pill, &RQF_LDLM_CP_CALLBACK);
752 ldlm_callback_reply(req, 0);
753 ldlm_handle_cp_callback(req, ns, dlm_req, lock);
755 case LDLM_GL_CALLBACK:
756 CDEBUG(D_INODE, "glimpse ast\n");
757 req_capsule_extend(&req->rq_pill, &RQF_LDLM_GL_CALLBACK);
758 ldlm_handle_gl_callback(req, ns, dlm_req, lock);
761 LBUG(); /* checked above */
768 static struct ldlm_bl_work_item *ldlm_bl_get_work(struct ldlm_bl_pool *blp)
770 struct ldlm_bl_work_item *blwi = NULL;
771 static unsigned int num_bl = 0;
773 spin_lock(&blp->blp_lock);
774 /* process a request from the blp_list at least every blp_num_threads */
775 if (!list_empty(&blp->blp_list) &&
776 (list_empty(&blp->blp_prio_list) || num_bl == 0))
777 blwi = list_entry(blp->blp_list.next,
778 struct ldlm_bl_work_item, blwi_entry);
780 if (!list_empty(&blp->blp_prio_list))
781 blwi = list_entry(blp->blp_prio_list.next,
782 struct ldlm_bl_work_item,
786 if (++num_bl >= atomic_read(&blp->blp_num_threads))
788 list_del(&blwi->blwi_entry);
790 spin_unlock(&blp->blp_lock);
795 /* This only contains temporary data until the thread starts */
796 struct ldlm_bl_thread_data {
797 char bltd_name[CFS_CURPROC_COMM_MAX];
798 struct ldlm_bl_pool *bltd_blp;
799 struct completion bltd_comp;
803 static int ldlm_bl_thread_main(void *arg);
805 static int ldlm_bl_thread_start(struct ldlm_bl_pool *blp)
807 struct ldlm_bl_thread_data bltd = { .bltd_blp = blp };
810 init_completion(&bltd.bltd_comp);
811 bltd.bltd_num = atomic_read(&blp->blp_num_threads);
812 snprintf(bltd.bltd_name, sizeof(bltd.bltd_name) - 1,
813 "ldlm_bl_%02d", bltd.bltd_num);
814 task = kthread_run(ldlm_bl_thread_main, &bltd, bltd.bltd_name);
816 CERROR("cannot start LDLM thread ldlm_bl_%02d: rc %ld\n",
817 atomic_read(&blp->blp_num_threads), PTR_ERR(task));
818 return PTR_ERR(task);
820 wait_for_completion(&bltd.bltd_comp);
826 * Main blocking requests processing thread.
828 * Callers put locks into its queue by calling ldlm_bl_to_thread.
829 * This thread in the end ends up doing actual call to ->l_blocking_ast
832 static int ldlm_bl_thread_main(void *arg)
834 struct ldlm_bl_pool *blp;
838 struct ldlm_bl_thread_data *bltd = arg;
840 blp = bltd->bltd_blp;
842 atomic_inc(&blp->blp_num_threads);
843 atomic_inc(&blp->blp_busy_threads);
845 complete(&bltd->bltd_comp);
846 /* cannot use bltd after this, it is only on caller's stack */
850 struct l_wait_info lwi = { 0 };
851 struct ldlm_bl_work_item *blwi = NULL;
854 blwi = ldlm_bl_get_work(blp);
857 atomic_dec(&blp->blp_busy_threads);
858 l_wait_event_exclusive(blp->blp_waitq,
859 (blwi = ldlm_bl_get_work(blp)) != NULL,
861 busy = atomic_inc_return(&blp->blp_busy_threads);
863 busy = atomic_read(&blp->blp_busy_threads);
866 if (blwi->blwi_ns == NULL)
867 /* added by ldlm_cleanup() */
870 /* Not fatal if racy and have a few too many threads */
871 if (unlikely(busy < blp->blp_max_threads &&
872 busy >= atomic_read(&blp->blp_num_threads) &&
873 !blwi->blwi_mem_pressure))
874 /* discard the return value, we tried */
875 ldlm_bl_thread_start(blp);
877 if (blwi->blwi_mem_pressure)
878 memory_pressure_set();
880 if (blwi->blwi_count) {
882 /* The special case when we cancel locks in LRU
883 * asynchronously, we pass the list of locks here.
884 * Thus locks are marked LDLM_FL_CANCELING, but NOT
885 * canceled locally yet. */
886 count = ldlm_cli_cancel_list_local(&blwi->blwi_head,
889 ldlm_cli_cancel_list(&blwi->blwi_head, count, NULL,
892 ldlm_handle_bl_callback(blwi->blwi_ns, &blwi->blwi_ld,
895 if (blwi->blwi_mem_pressure)
896 memory_pressure_clr();
898 if (blwi->blwi_flags & LCF_ASYNC)
899 OBD_FREE(blwi, sizeof(*blwi));
901 complete(&blwi->blwi_comp);
904 atomic_dec(&blp->blp_busy_threads);
905 atomic_dec(&blp->blp_num_threads);
906 complete(&blp->blp_comp);
911 static int ldlm_setup(void);
912 static int ldlm_cleanup(void);
914 int ldlm_get_ref(void)
918 mutex_lock(&ldlm_ref_mutex);
919 if (++ldlm_refcount == 1) {
924 mutex_unlock(&ldlm_ref_mutex);
928 EXPORT_SYMBOL(ldlm_get_ref);
930 void ldlm_put_ref(void)
933 mutex_lock(&ldlm_ref_mutex);
934 if (ldlm_refcount == 1) {
935 int rc = ldlm_cleanup();
937 CERROR("ldlm_cleanup failed: %d\n", rc);
943 mutex_unlock(&ldlm_ref_mutex);
947 EXPORT_SYMBOL(ldlm_put_ref);
950 * Export handle<->lock hash operations.
953 ldlm_export_lock_hash(cfs_hash_t *hs, const void *key, unsigned mask)
955 return cfs_hash_u64_hash(((struct lustre_handle *)key)->cookie, mask);
959 ldlm_export_lock_key(struct hlist_node *hnode)
961 struct ldlm_lock *lock;
963 lock = hlist_entry(hnode, struct ldlm_lock, l_exp_hash);
964 return &lock->l_remote_handle;
968 ldlm_export_lock_keycpy(struct hlist_node *hnode, void *key)
970 struct ldlm_lock *lock;
972 lock = hlist_entry(hnode, struct ldlm_lock, l_exp_hash);
973 lock->l_remote_handle = *(struct lustre_handle *)key;
977 ldlm_export_lock_keycmp(const void *key, struct hlist_node *hnode)
979 return lustre_handle_equal(ldlm_export_lock_key(hnode), key);
983 ldlm_export_lock_object(struct hlist_node *hnode)
985 return hlist_entry(hnode, struct ldlm_lock, l_exp_hash);
989 ldlm_export_lock_get(cfs_hash_t *hs, struct hlist_node *hnode)
991 struct ldlm_lock *lock;
993 lock = hlist_entry(hnode, struct ldlm_lock, l_exp_hash);
998 ldlm_export_lock_put(cfs_hash_t *hs, struct hlist_node *hnode)
1000 struct ldlm_lock *lock;
1002 lock = hlist_entry(hnode, struct ldlm_lock, l_exp_hash);
1003 LDLM_LOCK_RELEASE(lock);
1006 static cfs_hash_ops_t ldlm_export_lock_ops = {
1007 .hs_hash = ldlm_export_lock_hash,
1008 .hs_key = ldlm_export_lock_key,
1009 .hs_keycmp = ldlm_export_lock_keycmp,
1010 .hs_keycpy = ldlm_export_lock_keycpy,
1011 .hs_object = ldlm_export_lock_object,
1012 .hs_get = ldlm_export_lock_get,
1013 .hs_put = ldlm_export_lock_put,
1014 .hs_put_locked = ldlm_export_lock_put,
1017 int ldlm_init_export(struct obd_export *exp)
1021 exp->exp_lock_hash =
1022 cfs_hash_create(obd_uuid2str(&exp->exp_client_uuid),
1023 HASH_EXP_LOCK_CUR_BITS,
1024 HASH_EXP_LOCK_MAX_BITS,
1025 HASH_EXP_LOCK_BKT_BITS, 0,
1026 CFS_HASH_MIN_THETA, CFS_HASH_MAX_THETA,
1027 &ldlm_export_lock_ops,
1028 CFS_HASH_DEFAULT | CFS_HASH_REHASH_KEY |
1029 CFS_HASH_NBLK_CHANGE);
1031 if (!exp->exp_lock_hash)
1036 EXPORT_SYMBOL(ldlm_init_export);
1038 void ldlm_destroy_export(struct obd_export *exp)
1041 cfs_hash_putref(exp->exp_lock_hash);
1042 exp->exp_lock_hash = NULL;
1044 ldlm_destroy_flock_export(exp);
1047 EXPORT_SYMBOL(ldlm_destroy_export);
1049 static int ldlm_setup(void)
1051 static struct ptlrpc_service_conf conf;
1052 struct ldlm_bl_pool *blp = NULL;
1057 if (ldlm_state != NULL)
1060 OBD_ALLOC(ldlm_state, sizeof(*ldlm_state));
1061 if (ldlm_state == NULL)
1065 rc = ldlm_proc_setup();
1070 memset(&conf, 0, sizeof(conf));
1071 conf = (typeof(conf)) {
1072 .psc_name = "ldlm_cbd",
1073 .psc_watchdog_factor = 2,
1075 .bc_nbufs = LDLM_CLIENT_NBUFS,
1076 .bc_buf_size = LDLM_BUFSIZE,
1077 .bc_req_max_size = LDLM_MAXREQSIZE,
1078 .bc_rep_max_size = LDLM_MAXREPSIZE,
1079 .bc_req_portal = LDLM_CB_REQUEST_PORTAL,
1080 .bc_rep_portal = LDLM_CB_REPLY_PORTAL,
1083 .tc_thr_name = "ldlm_cb",
1084 .tc_thr_factor = LDLM_THR_FACTOR,
1085 .tc_nthrs_init = LDLM_NTHRS_INIT,
1086 .tc_nthrs_base = LDLM_NTHRS_BASE,
1087 .tc_nthrs_max = LDLM_NTHRS_MAX,
1088 .tc_nthrs_user = ldlm_num_threads,
1089 .tc_cpu_affinity = 1,
1090 .tc_ctx_tags = LCT_MD_THREAD | LCT_DT_THREAD,
1093 .cc_pattern = ldlm_cpts,
1096 .so_req_handler = ldlm_callback_handler,
1099 ldlm_state->ldlm_cb_service = \
1100 ptlrpc_register_service(&conf, ldlm_svc_proc_dir);
1101 if (IS_ERR(ldlm_state->ldlm_cb_service)) {
1102 CERROR("failed to start service\n");
1103 rc = PTR_ERR(ldlm_state->ldlm_cb_service);
1104 ldlm_state->ldlm_cb_service = NULL;
1109 OBD_ALLOC(blp, sizeof(*blp));
1111 GOTO(out, rc = -ENOMEM);
1112 ldlm_state->ldlm_bl_pool = blp;
1114 spin_lock_init(&blp->blp_lock);
1115 INIT_LIST_HEAD(&blp->blp_list);
1116 INIT_LIST_HEAD(&blp->blp_prio_list);
1117 init_waitqueue_head(&blp->blp_waitq);
1118 atomic_set(&blp->blp_num_threads, 0);
1119 atomic_set(&blp->blp_busy_threads, 0);
1121 if (ldlm_num_threads == 0) {
1122 blp->blp_min_threads = LDLM_NTHRS_INIT;
1123 blp->blp_max_threads = LDLM_NTHRS_MAX;
1125 blp->blp_min_threads = blp->blp_max_threads = \
1126 min_t(int, LDLM_NTHRS_MAX, max_t(int, LDLM_NTHRS_INIT,
1130 for (i = 0; i < blp->blp_min_threads; i++) {
1131 rc = ldlm_bl_thread_start(blp);
1137 rc = ldlm_pools_init();
1139 CERROR("Failed to initialize LDLM pools: %d\n", rc);
1149 static int ldlm_cleanup(void)
1153 if (!list_empty(ldlm_namespace_list(LDLM_NAMESPACE_SERVER)) ||
1154 !list_empty(ldlm_namespace_list(LDLM_NAMESPACE_CLIENT))) {
1155 CERROR("ldlm still has namespaces; clean these up first.\n");
1156 ldlm_dump_all_namespaces(LDLM_NAMESPACE_SERVER, D_DLMTRACE);
1157 ldlm_dump_all_namespaces(LDLM_NAMESPACE_CLIENT, D_DLMTRACE);
1163 if (ldlm_state->ldlm_bl_pool != NULL) {
1164 struct ldlm_bl_pool *blp = ldlm_state->ldlm_bl_pool;
1166 while (atomic_read(&blp->blp_num_threads) > 0) {
1167 struct ldlm_bl_work_item blwi = { .blwi_ns = NULL };
1169 init_completion(&blp->blp_comp);
1171 spin_lock(&blp->blp_lock);
1172 list_add_tail(&blwi.blwi_entry, &blp->blp_list);
1173 wake_up(&blp->blp_waitq);
1174 spin_unlock(&blp->blp_lock);
1176 wait_for_completion(&blp->blp_comp);
1179 OBD_FREE(blp, sizeof(*blp));
1182 if (ldlm_state->ldlm_cb_service != NULL)
1183 ptlrpc_unregister_service(ldlm_state->ldlm_cb_service);
1185 ldlm_proc_cleanup();
1188 OBD_FREE(ldlm_state, sizeof(*ldlm_state));
1196 mutex_init(&ldlm_ref_mutex);
1197 mutex_init(ldlm_namespace_lock(LDLM_NAMESPACE_SERVER));
1198 mutex_init(ldlm_namespace_lock(LDLM_NAMESPACE_CLIENT));
1199 ldlm_resource_slab = kmem_cache_create("ldlm_resources",
1200 sizeof(struct ldlm_resource), 0,
1201 SLAB_HWCACHE_ALIGN, NULL);
1202 if (ldlm_resource_slab == NULL)
1205 ldlm_lock_slab = kmem_cache_create("ldlm_locks",
1206 sizeof(struct ldlm_lock), 0,
1207 SLAB_HWCACHE_ALIGN | SLAB_DESTROY_BY_RCU, NULL);
1208 if (ldlm_lock_slab == NULL) {
1209 kmem_cache_destroy(ldlm_resource_slab);
1213 ldlm_interval_slab = kmem_cache_create("interval_node",
1214 sizeof(struct ldlm_interval),
1215 0, SLAB_HWCACHE_ALIGN, NULL);
1216 if (ldlm_interval_slab == NULL) {
1217 kmem_cache_destroy(ldlm_resource_slab);
1218 kmem_cache_destroy(ldlm_lock_slab);
1221 #if LUSTRE_TRACKS_LOCK_EXP_REFS
1222 class_export_dump_hook = ldlm_dump_export_locks;
1227 void ldlm_exit(void)
1230 CERROR("ldlm_refcount is %d in ldlm_exit!\n", ldlm_refcount);
1231 kmem_cache_destroy(ldlm_resource_slab);
1232 /* ldlm_lock_put() use RCU to call ldlm_lock_free, so need call
1233 * synchronize_rcu() to wait a grace period elapsed, so that
1234 * ldlm_lock_free() get a chance to be called. */
1236 kmem_cache_destroy(ldlm_lock_slab);
1237 kmem_cache_destroy(ldlm_interval_slab);