Whamcloud - gitweb
LU-7542 obdclass: quiet lockdep recursive lock warning 82/17582/4
authorAndreas Dilger <andreas.dilger@intel.com>
Fri, 11 Dec 2015 00:34:58 +0000 (17:34 -0700)
committerOleg Drokin <oleg.drokin@intel.com>
Wed, 22 Jun 2016 02:55:59 +0000 (02:55 +0000)
Lockdep complains about potential recursive locking during mount
because the client configuration log is holding a lock on the MGC
obd_device to prevent it from being torn down, while also getting
locks on the MDC and OSC devices as they are instantiated:

 Lustre: Mounted myth-client
 =============================================
 [ INFO: possible recursive locking detected ]
 ---------------------------------------------

 2 locks held by ll_cfg_requeue/1460:
 #0:  (&cli->cl_sem){.+.+..}, at mgc_requeue_thread+0x27d/0x5d8 [mgc]
 #1:  (&cld->cld_lock){+.+...}, at mgc_process_log+0x88/0xc01 [mgc]

 CPU: 3 PID: 1460 Comm: ll_cfg_requeue
 Call Trace:
 [<ffffffff814cb360>] dump_stack+0x4f/0x6f
 [<ffffffff81081d73>] __lock_acquire+0xc06/0xc74
 [<ffffffff81081f4f>] lock_acquire+0x16e/0x194
 [<ffffffff814ce5d7>] down_read+0x4c/0x61
 [<ffffffffa029f370>] sptlrpc_conf_client_adapt+0x95/0x142 [ptlrpc]
 [<ffffffffa03a7a69>] mdc_set_info_async+0xeb/0x420 [mdc]
 [<ffffffffa01ad69e>] class_notify_sptlrpc_conf+0x2f4/0x347 [obdclass]
 [<ffffffffa04a805c>] mgc_process_log+0xa31/0xc01 [mgc]
 [<ffffffffa04a94ef>] mgc_requeue_thread+0x31f/0x5d8 [mgc]
 [<ffffffff81061f77>] kthread+0xfa/0x102

Add a separate lock class for the MGC callpath, since it will always
be held first, and none of the other obd_device locks should ever
be held concurrently.

Signed-off-by: Andreas Dilger <andreas.dilger@intel.com>
Change-Id: Ic36e64608d12dcd4f5b12056e3e2072ca6500c1e
Reviewed-on: http://review.whamcloud.com/17582
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Dmitry Eremin <dmitry.eremin@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/include/obd.h
lustre/mgc/mgc_request.c
lustre/ptlrpc/sec_config.c

index 385b8e2..b733c58 100644 (file)
@@ -155,6 +155,12 @@ enum {
  */
 #define OBD_MAX_DEFAULT_EA_SIZE                4096
 
+enum obd_cl_sem_lock_class {
+       OBD_CLI_SEM_NORMAL,
+       OBD_CLI_SEM_MGC,
+       OBD_CLI_SEM_MDCOSC,
+};
+
 struct mdc_rpc_lock;
 struct obd_import;
 struct client_obd {
index 0d568d3..450ca24 100644 (file)
@@ -553,10 +553,13 @@ static void do_requeue(struct config_llog_data *cld)
 
        LASSERT(atomic_read(&cld->cld_refcount) > 0);
 
-       /* Do not run mgc_process_log on a disconnected export or an
+       /*
+        * Do not run mgc_process_log on a disconnected export or an
         * export which is being disconnected. Take the client
-        * semaphore to make the check non-racy. */
-       down_read(&cld->cld_mgcexp->exp_obd->u.cli.cl_sem);
+        * semaphore to make the check non-racy.
+        */
+       down_read_nested(&cld->cld_mgcexp->exp_obd->u.cli.cl_sem,
+                        OBD_CLI_SEM_MGC);
        if (cld->cld_mgcexp->exp_obd->u.cli.cl_conn_count != 0) {
                CDEBUG(D_MGC, "updating log %s\n", cld->cld_logname);
                rc = mgc_process_log(cld->cld_mgcexp->exp_obd, cld);
index e9f429a..fd248df 100644 (file)
@@ -921,8 +921,8 @@ void sptlrpc_conf_client_adapt(struct obd_device *obd)
                strcmp(obd->obd_type->typ_name, LUSTRE_LWP_NAME) == 0);
        CDEBUG(D_SEC, "obd %s\n", obd->u.cli.cl_target_uuid.uuid);
 
-        /* serialize with connect/disconnect import */
-       down_read(&obd->u.cli.cl_sem);
+       /* serialize with connect/disconnect import */
+       down_read_nested(&obd->u.cli.cl_sem, OBD_CLI_SEM_MDCOSC);
 
        imp = obd->u.cli.cl_import;
        if (imp) {