ANDROID: media: v4l2-core: Fix deadlock in vendor hook
The vendor hook functions we implemented will invoke callback functions which have do some sleep or spinlock operations and have risk of deadlock due to preemption disabled of normal vendor hook function. So we have to use restricted vendor hook function instead. Due to KMI freeze we could not change the existing hooks. trace_android_rvh_media_device_setup_link =>invoke setup_link, link_notify callback trace_android_rvh_v4l2subdev_set_xxx =>invoke set_xxx callback Bug: 193870284 Signed-off-by: Louis Kuo <louis.kuo@mediatek.com> Change-Id: I94fe2e112b6c3d9ac5177abb30a99b7007068f7e
This commit is contained in:
@@ -331,12 +331,16 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_task_comm);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cpufreq_acct_update_power);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_typec_tcpm_log);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_media_device_setup_link);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_media_device_setup_link);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_clear_reserved_fmt_fields);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_fill_ext_fmtdesc);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_clear_mask_adjust);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_v4l2subdev_set_selection);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_v4l2subdev_set_selection);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_v4l2subdev_set_fmt);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_v4l2subdev_set_fmt);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_v4l2subdev_set_frame_interval);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_v4l2subdev_set_frame_interval);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_scmi_timeout_sync);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_find_new_ilb);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_uid);
|
||||
|
@@ -225,6 +225,7 @@ static long media_device_setup_link(struct media_device *mdev, void *arg)
|
||||
|
||||
/* Setup the link on both entities */
|
||||
trace_android_vh_media_device_setup_link(link, linkd, &ret);
|
||||
trace_android_rvh_media_device_setup_link(link, linkd, &ret);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@@ -521,6 +521,8 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
|
||||
trace_android_vh_v4l2subdev_set_fmt(sd, subdev_fh->pad,
|
||||
format, &ret);
|
||||
trace_android_rvh_v4l2subdev_set_fmt(sd, subdev_fh->pad,
|
||||
format, &ret);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -600,6 +602,7 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
return -EPERM;
|
||||
|
||||
trace_android_vh_v4l2subdev_set_frame_interval(sd, fi, &ret);
|
||||
trace_android_rvh_v4l2subdev_set_frame_interval(sd, fi, &ret);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -632,6 +635,8 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
|
||||
trace_android_vh_v4l2subdev_set_selection(sd, subdev_fh->pad,
|
||||
sel, &ret);
|
||||
trace_android_rvh_v4l2subdev_set_selection(sd, subdev_fh->pad,
|
||||
sel, &ret);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@@ -5,7 +5,7 @@
|
||||
#define TRACE_INCLUDE_PATH trace/hooks
|
||||
|
||||
#if !defined(_TRACE_HOOK_V4L2CORE_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define _TRACE_HOOK_V4L2_CORE_H
|
||||
#define _TRACE_HOOK_V4L2CORE_H
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
#include <trace/hooks/vendor_hooks.h>
|
||||
@@ -44,6 +44,21 @@ DECLARE_HOOK(android_vh_v4l2subdev_set_frame_interval,
|
||||
int *ret),
|
||||
TP_ARGS(sd, fi, ret));
|
||||
|
||||
DECLARE_RESTRICTED_HOOK(android_rvh_v4l2subdev_set_selection,
|
||||
TP_PROTO(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *pad,
|
||||
struct v4l2_subdev_selection *sel, int *ret),
|
||||
TP_ARGS(sd, pad, sel, ret), 1);
|
||||
|
||||
DECLARE_RESTRICTED_HOOK(android_rvh_v4l2subdev_set_fmt,
|
||||
TP_PROTO(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *pad,
|
||||
struct v4l2_subdev_format *format, int *ret),
|
||||
TP_ARGS(sd, pad, format, ret), 1);
|
||||
|
||||
DECLARE_RESTRICTED_HOOK(android_rvh_v4l2subdev_set_frame_interval,
|
||||
TP_PROTO(struct v4l2_subdev *sd, struct v4l2_subdev_frame_interval *fi,
|
||||
int *ret),
|
||||
TP_ARGS(sd, fi, ret), 1);
|
||||
|
||||
#endif /* _TRACE_HOOK_V4L2CORE_H */
|
||||
/* This part must be outside protection */
|
||||
#include <trace/define_trace.h>
|
||||
|
@@ -16,6 +16,11 @@ DECLARE_HOOK(android_vh_media_device_setup_link,
|
||||
TP_PROTO(struct media_link *link, struct media_link_desc *linkd, int *ret),
|
||||
TP_ARGS(link, linkd, ret));
|
||||
|
||||
DECLARE_RESTRICTED_HOOK(android_rvh_media_device_setup_link,
|
||||
TP_PROTO(struct media_link *link,
|
||||
struct media_link_desc *linkd, int *ret),
|
||||
TP_ARGS(link, linkd, ret), 1);
|
||||
|
||||
#endif /* _TRACE_HOOK_V4L2MC_H */
|
||||
/* This part must be outside protection */
|
||||
#include <trace/define_trace.h>
|
||||
|
Reference in New Issue
Block a user