Patch "iio: Use per-device lockdep class for mlock" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    iio: Use per-device lockdep class for mlock

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     iio-use-per-device-lockdep-class-for-mlock.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 7c5e377abf5291491ee8ee052328bca335c3e12d
Author: Vincent Whitchurch <vincent.whitchurch@xxxxxxxx>
Date:   Mon Aug 29 11:18:40 2022 +0200

    iio: Use per-device lockdep class for mlock
    
    [ Upstream commit 2bc9cd66eb25d0fefbb081421d6586495e25840e ]
    
    If an IIO driver uses callbacks from another IIO driver and calls
    iio_channel_start_all_cb() from one of its buffer setup ops, then
    lockdep complains due to the lock nesting, as in the below example with
    lmp91000.
    
    Since the locks are being taken on different IIO devices, there is no
    actual deadlock.  Fix the warning by telling lockdep to use a different
    class for each iio_device.
    
     ============================================
     WARNING: possible recursive locking detected
     --------------------------------------------
     python3/23 is trying to acquire lock:
     (&indio_dev->mlock){+.+.}-{3:3}, at: iio_update_buffers
    
     but task is already holding lock:
     (&indio_dev->mlock){+.+.}-{3:3}, at: enable_store
    
     other info that might help us debug this:
      Possible unsafe locking scenario:
    
            CPU0
            ----
       lock(&indio_dev->mlock);
       lock(&indio_dev->mlock);
    
      *** DEADLOCK ***
    
      May be due to missing lock nesting notation
    
     5 locks held by python3/23:
      #0: (sb_writers#5){.+.+}-{0:0}, at: ksys_write
      #1: (&of->mutex){+.+.}-{3:3}, at: kernfs_fop_write_iter
      #2: (kn->active#14){.+.+}-{0:0}, at: kernfs_fop_write_iter
      #3: (&indio_dev->mlock){+.+.}-{3:3}, at: enable_store
      #4: (&iio_dev_opaque->info_exist_lock){+.+.}-{3:3}, at: iio_update_buffers
    
     Call Trace:
      __mutex_lock
      iio_update_buffers
      iio_channel_start_all_cb
      lmp91000_buffer_postenable
      __iio_update_buffers
      enable_store
    
    Fixes: 67e17300dc1d76 ("iio: potentiostat: add LMP91000 support")
    Signed-off-by: Vincent Whitchurch <vincent.whitchurch@xxxxxxxx>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@xxxxxxxxx>
    Link: https://lore.kernel.org/r/20220829091840.2791846-1-vincent.whitchurch@xxxxxxxx
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
index 0c81c7630fb9..9aca2612d894 100644
--- a/drivers/iio/industrialio-core.c
+++ b/drivers/iio/industrialio-core.c
@@ -1631,6 +1631,8 @@ static void iio_dev_release(struct device *device)
 
 	iio_device_detach_buffers(indio_dev);
 
+	lockdep_unregister_key(&iio_dev_opaque->mlock_key);
+
 	ida_free(&iio_ida, iio_dev_opaque->id);
 	kfree(iio_dev_opaque);
 }
@@ -1691,6 +1693,9 @@ struct iio_dev *iio_device_alloc(struct device *parent, int sizeof_priv)
 	INIT_LIST_HEAD(&iio_dev_opaque->buffer_list);
 	INIT_LIST_HEAD(&iio_dev_opaque->ioctl_handlers);
 
+	lockdep_register_key(&iio_dev_opaque->mlock_key);
+	lockdep_set_class(&indio_dev->mlock, &iio_dev_opaque->mlock_key);
+
 	return indio_dev;
 }
 EXPORT_SYMBOL(iio_device_alloc);
diff --git a/include/linux/iio/iio-opaque.h b/include/linux/iio/iio-opaque.h
index c9504e9da571..50aad0f58cb4 100644
--- a/include/linux/iio/iio-opaque.h
+++ b/include/linux/iio/iio-opaque.h
@@ -8,6 +8,7 @@
  * @indio_dev:			public industrial I/O device information
  * @id:			used to identify device internally
  * @driver_module:		used to make it harder to undercut users
+ * @mlock_key:			lockdep class for iio_dev lock
  * @info_exist_lock:		lock to prevent use during removal
  * @trig_readonly:		mark the current trigger immutable
  * @event_interface:		event chrdevs associated with interrupt lines
@@ -36,6 +37,7 @@ struct iio_dev_opaque {
 	struct iio_dev			indio_dev;
 	int				id;
 	struct module			*driver_module;
+	struct lock_class_key		mlock_key;
 	struct mutex			info_exist_lock;
 	bool				trig_readonly;
 	struct iio_event_interface	*event_interface;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux