Messages in this thread Patch in this message | | | Date | Thu, 28 May 2015 12:32:33 +1000 | From | NeilBrown <> | Subject | LOCKDEP warning due to ext_devt_lock |
| |
Hi Keith, I'm getting lockdep warning around use of ext_devt_lock.
[11428.266019] inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
As you say in 2da78092dda1 ("block: Fix dev_t minor allocation lifetime") ext_devt_lock can be taken from call_rcu's soft-irq. I think that means it should always use the _irq verion of spinlock.
I've been using the following patch and the LOCKDEP message are gone.
If you agree, could you forward it or something similar upstream? Thanks, NeilBrown
Signed-off-by: NeilBrown <neilb@suse.de> diff --git a/block/genhd.c b/block/genhd.c index 666e11b83983..d1338934562e 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -422,9 +422,9 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt) /* allocate ext devt */ idr_preload(GFP_KERNEL); - spin_lock(&ext_devt_lock); + spin_lock_irq(&ext_devt_lock); idx = idr_alloc(&ext_devt_idr, part, 0, NR_EXT_DEVT, GFP_NOWAIT); - spin_unlock(&ext_devt_lock); + spin_unlock_irq(&ext_devt_lock); idr_preload_end(); if (idx < 0) @@ -449,9 +449,9 @@ void blk_free_devt(dev_t devt) return; if (MAJOR(devt) == BLOCK_EXT_MAJOR) { - spin_lock(&ext_devt_lock); + spin_lock_irq(&ext_devt_lock); idr_remove(&ext_devt_idr, blk_mangle_minor(MINOR(devt))); - spin_unlock(&ext_devt_lock); + spin_unlock_irq(&ext_devt_lock); } } @@ -690,13 +690,13 @@ struct gendisk *get_gendisk(dev_t devt, int *partno) } else { struct hd_struct *part; - spin_lock(&ext_devt_lock); + spin_lock_irq(&ext_devt_lock); part = idr_find(&ext_devt_idr, blk_mangle_minor(MINOR(devt))); if (part && get_disk(part_to_disk(part))) { *partno = part->partno; disk = part_to_disk(part); } - spin_unlock(&ext_devt_lock); + spin_unlock_irq(&ext_devt_lock); } return disk;[unhandled content-type:application/pgp-signature]
| |