scst: Rework handling of recursive locking

Use lockdep_register_key() and lockdep_unregister_key() instead of
disabling lockdep checking for certain lock objects. See also Linux
kernel commit 108c14858b9e ("locking/lockdep: Add support for dynamic
keys"; kernel version v5.1).



git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@8663 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
Bart Van Assche
2019-11-17 19:24:43 +00:00
parent 30f4ebdab7
commit ef161f930f
3 changed files with 23 additions and 68 deletions

View File

@@ -66,66 +66,6 @@
#include <scst_const.h>
#endif
#ifdef NOLOCKDEP_SUPPORTED
#define spin_lock_nolockdep(lock) \
do { \
current->nolockdep_call = 1; \
spin_lock(lock); \
current->nolockdep_call = 0; \
} while (0)
#define spin_unlock_nolockdep(lock) \
do { \
current->nolockdep_call = 1; \
spin_unlock(lock); \
current->nolockdep_call = 0; \
} while (0)
#define mutex_lock_nolockdep(lock) \
do { \
current->nolockdep_call = 1; \
mutex_lock(lock); \
current->nolockdep_call = 0; \
} while (0)
#define mutex_unlock_nolockdep(lock) \
do { \
current->nolockdep_call = 1; \
mutex_unlock(lock); \
current->nolockdep_call = 0; \
} while (0)
#define down_read_nolockdep(lock) \
do { \
current->nolockdep_call = 1; \
down_read(lock); \
current->nolockdep_call = 0; \
} while (0)
#define up_read_nolockdep(lock) \
do { \
current->nolockdep_call = 1; \
up_read(lock); \
current->nolockdep_call = 0; \
} while (0)
#define down_write_nolockdep(lock) \
do { \
current->nolockdep_call = 1; \
down_write(lock); \
current->nolockdep_call = 0; \
} while (0)
#define up_write_nolockdep(lock) \
do { \
current->nolockdep_call = 1; \
up_write(lock); \
current->nolockdep_call = 0; \
} while (0)
#else
#define spin_lock_nolockdep spin_lock
#define spin_unlock_nolockdep spin_unlock
#define mutex_lock_nolockdep mutex_lock
#define mutex_unlock_nolockdep mutex_unlock
#define down_read_nolockdep down_read
#define up_read_nolockdep up_read
#define down_write_nolockdep down_write
#define up_write_nolockdep up_write
#endif
#ifdef INSIDE_KERNEL_TREE
#include <scst/scst_sgv.h>
#else
@@ -2879,6 +2819,7 @@ struct scst_device {
/* Device lock */
spinlock_t dev_lock ____cacheline_aligned_in_smp;
struct lock_class_key dev_lock_key;
#ifdef CONFIG_SCST_PER_DEVICE_CMD_COUNT_LIMIT
/* Number of commands associated with this device. */
@@ -3190,6 +3131,7 @@ struct scst_tgt_dev {
};
spinlock_t tgt_dev_lock; /* per-session device lock */
struct lock_class_key tgt_dev_key;
/* List of UA's for this device, protected by tgt_dev_lock */
struct list_head UA_list;

View File

@@ -1783,7 +1783,7 @@ bool scst_cm_check_block_all_devs(struct scst_cmd *cmd)
#if !defined(__CHECKER__)
list_for_each_entry(e, &d->cm_sorted_devs_list, cm_sorted_devs_list_entry) {
spin_lock_nolockdep(&e->cm_fcmd->dev->dev_lock);
spin_lock(&e->cm_fcmd->dev->dev_lock);
}
#endif
@@ -1812,7 +1812,7 @@ bool scst_cm_check_block_all_devs(struct scst_cmd *cmd)
#if !defined(__CHECKER__)
list_for_each_entry_reverse(e, &d->cm_sorted_devs_list,
cm_sorted_devs_list_entry) {
spin_unlock_nolockdep(&e->cm_fcmd->dev->dev_lock);
spin_unlock(&e->cm_fcmd->dev->dev_lock);
}
#endif

View File

@@ -2666,8 +2666,8 @@ static void scst_queue_report_luns_changed_UA(struct scst_session *sess,
list_for_each_entry_rcu(tgt_dev, head,
sess_tgt_dev_list_entry) {
/* Lockdep triggers here a false positive.. */
spin_lock_nolockdep(&tgt_dev->tgt_dev_lock);
/* Lockdep reports a false positive here before v5.1. */
spin_lock(&tgt_dev->tgt_dev_lock);
}
}
#endif
@@ -2698,7 +2698,7 @@ static void scst_queue_report_luns_changed_UA(struct scst_session *sess,
list_for_each_entry_rcu(tgt_dev, head,
sess_tgt_dev_list_entry) {
spin_unlock_nolockdep(&tgt_dev->tgt_dev_lock);
spin_unlock(&tgt_dev->tgt_dev_lock);
}
}
#endif
@@ -4213,6 +4213,8 @@ static void scst_free_device(struct work_struct *work)
scst_pr_cleanup(dev);
lockdep_unregister_key(&dev->dev_lock_key);
kfree(dev->virt_name);
percpu_ref_exit(&dev->refcnt);
kmem_cache_free(scst_dev_cachep, dev);
@@ -4256,6 +4258,8 @@ int scst_alloc_device(gfp_t gfp_mask, int nodeid, struct scst_device **out_dev)
#endif
scst_init_mem_lim(&dev->dev_mem_lim);
spin_lock_init(&dev->dev_lock);
lockdep_register_key(&dev->dev_lock_key);
lockdep_set_class(&dev->dev_lock, &dev->dev_lock_key);
INIT_LIST_HEAD(&dev->dev_exec_cmd_list);
INIT_LIST_HEAD(&dev->blocked_cmd_list);
INIT_LIST_HEAD(&dev->dev_tgt_dev_list);
@@ -5398,6 +5402,8 @@ static int scst_alloc_add_tgt_dev(struct scst_session *sess,
dev->virt_name, (unsigned long long)tgt_dev->lun);
spin_lock_init(&tgt_dev->tgt_dev_lock);
lockdep_register_key(&tgt_dev->tgt_dev_key);
lockdep_set_class(&tgt_dev->tgt_dev_lock, &tgt_dev->tgt_dev_key);
INIT_LIST_HEAD(&tgt_dev->UA_list);
scst_init_order_data(&tgt_dev->tgt_dev_order_data);
@@ -5496,6 +5502,8 @@ out_dec_free:
out_free_ua:
scst_free_all_UA(tgt_dev);
lockdep_unregister_key(&tgt_dev->tgt_dev_key);
kmem_cache_free(scst_tgtd_cachep, tgt_dev);
goto out;
}
@@ -5574,6 +5582,8 @@ static void scst_free_tgt_dev(struct scst_tgt_dev *tgt_dev)
scst_tgt_dev_stop_threads(tgt_dev);
lockdep_unregister_key(&tgt_dev->tgt_dev_key);
kmem_cache_free(scst_tgtd_cachep, tgt_dev);
percpu_ref_put(&dev->refcnt);
@@ -12971,8 +12981,11 @@ again:
list_for_each_entry_rcu(tgt_dev, head,
sess_tgt_dev_list_entry) {
/* Lockdep triggers here a false positive.. */
spin_lock_nolockdep(&tgt_dev->tgt_dev_lock);
/*
* Lockdep reports a false positive here before
* kernel version v5.1.
*/
spin_lock(&tgt_dev->tgt_dev_lock);
}
}
#endif
@@ -13046,7 +13059,7 @@ out_unlock:
list_for_each_entry_rcu(tgt_dev, head,
sess_tgt_dev_list_entry) {
spin_unlock_nolockdep(&tgt_dev->tgt_dev_lock);
spin_unlock(&tgt_dev->tgt_dev_lock);
}
}
rcu_read_unlock();