Commit 7d4b6402 authored by Sakari Ailus's avatar Sakari Ailus Committed by Mauro Carvalho Chehab

[media] media: Add flags to tell whether to take graph mutex for an IOCTL

New IOCTLs (especially for the request API) do not necessarily need the
graph mutex acquired. Leave this up to the drivers.
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent bcd5081b
...@@ -381,31 +381,36 @@ static long copy_arg_to_user(void __user *uarg, void *karg, unsigned int cmd) ...@@ -381,31 +381,36 @@ static long copy_arg_to_user(void __user *uarg, void *karg, unsigned int cmd)
return 0; return 0;
} }
#define MEDIA_IOC_ARG(__cmd, func, from_user, to_user) \ /* Do acquire the graph mutex */
[_IOC_NR(MEDIA_IOC_##__cmd)] = { \ #define MEDIA_IOC_FL_GRAPH_MUTEX BIT(0)
.cmd = MEDIA_IOC_##__cmd, \
#define MEDIA_IOC_ARG(__cmd, func, fl, from_user, to_user) \
[_IOC_NR(MEDIA_IOC_##__cmd)] = { \
.cmd = MEDIA_IOC_##__cmd, \
.fn = (long (*)(struct media_device *, void *))func, \ .fn = (long (*)(struct media_device *, void *))func, \
.arg_from_user = from_user, \ .flags = fl, \
.arg_to_user = to_user, \ .arg_from_user = from_user, \
.arg_to_user = to_user, \
} }
#define MEDIA_IOC(__cmd, func) \ #define MEDIA_IOC(__cmd, func, fl) \
MEDIA_IOC_ARG(__cmd, func, copy_arg_from_user, copy_arg_to_user) MEDIA_IOC_ARG(__cmd, func, fl, copy_arg_from_user, copy_arg_to_user)
/* the table is indexed by _IOC_NR(cmd) */ /* the table is indexed by _IOC_NR(cmd) */
struct media_ioctl_info { struct media_ioctl_info {
unsigned int cmd; unsigned int cmd;
unsigned short flags;
long (*fn)(struct media_device *dev, void *arg); long (*fn)(struct media_device *dev, void *arg);
long (*arg_from_user)(void *karg, void __user *uarg, unsigned int cmd); long (*arg_from_user)(void *karg, void __user *uarg, unsigned int cmd);
long (*arg_to_user)(void __user *uarg, void *karg, unsigned int cmd); long (*arg_to_user)(void __user *uarg, void *karg, unsigned int cmd);
}; };
static const struct media_ioctl_info ioctl_info[] = { static const struct media_ioctl_info ioctl_info[] = {
MEDIA_IOC(DEVICE_INFO, media_device_get_info), MEDIA_IOC(DEVICE_INFO, media_device_get_info, MEDIA_IOC_FL_GRAPH_MUTEX),
MEDIA_IOC(ENUM_ENTITIES, media_device_enum_entities), MEDIA_IOC(ENUM_ENTITIES, media_device_enum_entities, MEDIA_IOC_FL_GRAPH_MUTEX),
MEDIA_IOC(ENUM_LINKS, media_device_enum_links), MEDIA_IOC(ENUM_LINKS, media_device_enum_links, MEDIA_IOC_FL_GRAPH_MUTEX),
MEDIA_IOC(SETUP_LINK, media_device_setup_link), MEDIA_IOC(SETUP_LINK, media_device_setup_link, MEDIA_IOC_FL_GRAPH_MUTEX),
MEDIA_IOC(G_TOPOLOGY, media_device_get_topology), MEDIA_IOC(G_TOPOLOGY, media_device_get_topology, MEDIA_IOC_FL_GRAPH_MUTEX),
}; };
static long media_device_ioctl(struct file *filp, unsigned int cmd, static long media_device_ioctl(struct file *filp, unsigned int cmd,
...@@ -436,9 +441,13 @@ static long media_device_ioctl(struct file *filp, unsigned int cmd, ...@@ -436,9 +441,13 @@ static long media_device_ioctl(struct file *filp, unsigned int cmd,
goto out_free; goto out_free;
} }
mutex_lock(&dev->graph_mutex); if (info->flags & MEDIA_IOC_FL_GRAPH_MUTEX)
mutex_lock(&dev->graph_mutex);
ret = info->fn(dev, karg); ret = info->fn(dev, karg);
mutex_unlock(&dev->graph_mutex);
if (info->flags & MEDIA_IOC_FL_GRAPH_MUTEX)
mutex_unlock(&dev->graph_mutex);
if (!ret && info->arg_to_user) if (!ret && info->arg_to_user)
ret = info->arg_to_user(arg, karg, cmd); ret = info->arg_to_user(arg, karg, cmd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment