[PATCH 02/26] media: mc: Maintain a list of open file handles in a media device
Jacopo Mondi
jacopo.mondi at ideasonboard.com
Thu Jul 17 03:45:28 PDT 2025
From: Sakari Ailus <sakari.ailus at linux.intel.com>
The list of file handles is needed to deliver media events as well as for
other purposes in the future.
Signed-off-by: Sakari Ailus <sakari.ailus at linux.intel.com>
[Access media_device with devnode->media_dev]
Signed-off-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
---
drivers/media/mc/mc-device.c | 19 ++++++++++++++++++-
drivers/media/mc/mc-devnode.c | 2 +-
include/media/media-devnode.h | 3 ++-
3 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/drivers/media/mc/mc-device.c b/drivers/media/mc/mc-device.c
index f298f8f67b8a84194d66126461e84228c0b20394..e0cad87087d3863bf14207049a54e5e4dea1cdd4 100644
--- a/drivers/media/mc/mc-device.c
+++ b/drivers/media/mc/mc-device.c
@@ -45,8 +45,9 @@ static inline void __user *media_get_uptr(__u64 arg)
return (void __user *)(uintptr_t)arg;
}
-static int media_device_open(struct file *filp)
+static int media_device_open(struct media_devnode *devnode, struct file *filp)
{
+ struct media_device *mdev = devnode->media_dev;
struct media_device_fh *fh;
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
@@ -55,13 +56,23 @@ static int media_device_open(struct file *filp)
filp->private_data = &fh->fh;
+ spin_lock_irq(&mdev->fh_list_lock);
+ list_add(&fh->mdev_list, &mdev->fh_list);
+ spin_unlock_irq(&mdev->fh_list_lock);
+
return 0;
}
static int media_device_close(struct file *filp)
{
+ struct media_devnode *devnode = media_devnode_data(filp);
+ struct media_device *mdev = devnode->media_dev;
struct media_device_fh *fh = media_device_fh(filp);
+ spin_lock_irq(&mdev->fh_list_lock);
+ list_del(&fh->mdev_list);
+ spin_unlock_irq(&mdev->fh_list_lock);
+
kfree(fh);
return 0;
@@ -698,10 +709,12 @@ void media_device_init(struct media_device *mdev)
INIT_LIST_HEAD(&mdev->pads);
INIT_LIST_HEAD(&mdev->links);
INIT_LIST_HEAD(&mdev->entity_notify);
+ INIT_LIST_HEAD(&mdev->fh_list);
mutex_init(&mdev->req_queue_mutex);
mutex_init(&mdev->graph_mutex);
ida_init(&mdev->entity_internal_idx);
+ spin_lock_init(&mdev->fh_list_lock);
atomic_set(&mdev->request_id, 0);
@@ -809,6 +822,10 @@ void media_device_unregister(struct media_device *mdev)
return;
}
+ spin_lock_irq(&mdev->fh_list_lock);
+ list_del_init(&mdev->fh_list);
+ spin_unlock_irq(&mdev->fh_list_lock);
+
/* Clear the devnode register bit to avoid races with media dev open */
media_devnode_unregister_prepare(mdev->devnode);
diff --git a/drivers/media/mc/mc-devnode.c b/drivers/media/mc/mc-devnode.c
index 312eb48ffc2f2a0c013e4744204995df0ff5b12c..50435f102aa7cd6a7cde759eeef73a99b9b80239 100644
--- a/drivers/media/mc/mc-devnode.c
+++ b/drivers/media/mc/mc-devnode.c
@@ -163,7 +163,7 @@ static int media_open(struct inode *inode, struct file *filp)
get_device(&devnode->dev);
mutex_unlock(&media_devnode_lock);
- ret = devnode->fops->open(filp);
+ ret = devnode->fops->open(devnode, filp);
if (ret) {
put_device(&devnode->dev);
return ret;
diff --git a/include/media/media-devnode.h b/include/media/media-devnode.h
index 6c2e253dde498779dffd103dc5d00e50e14a0249..26b19373c6646bfd11cfded220c9e61c81130580 100644
--- a/include/media/media-devnode.h
+++ b/include/media/media-devnode.h
@@ -22,6 +22,7 @@
#include <linux/cdev.h>
struct media_device;
+struct media_devnode;
/*
* Flag to mark the media_devnode struct as registered. Drivers must not touch
@@ -51,7 +52,7 @@ struct media_file_operations {
__poll_t (*poll) (struct file *, struct poll_table_struct *);
long (*ioctl) (struct file *, unsigned int, unsigned long);
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
- int (*open) (struct file *);
+ int (*open) (struct media_devnode *, struct file *);
int (*release) (struct file *);
};
--
2.49.0
More information about the linux-arm-kernel
mailing list