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:
Louis Kuo
2021-07-16 19:32:39 +08:00
committed by louis kuo
parent fdb1cfe2d3
commit e6a59da61e
5 changed files with 31 additions and 1 deletions

View File

@@ -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_cpufreq_acct_update_power);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_typec_tcpm_log); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_typec_tcpm_log);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_media_device_setup_link); 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_clear_reserved_fmt_fields);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_fill_ext_fmtdesc); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_fill_ext_fmtdesc);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_clear_mask_adjust); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_clear_mask_adjust);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_v4l2subdev_set_selection); 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_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_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_vh_scmi_timeout_sync);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_find_new_ilb); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_find_new_ilb);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_uid); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_uid);

View File

@@ -225,6 +225,7 @@ static long media_device_setup_link(struct media_device *mdev, void *arg)
/* Setup the link on both entities */ /* Setup the link on both entities */
trace_android_vh_media_device_setup_link(link, linkd, &ret); trace_android_vh_media_device_setup_link(link, linkd, &ret);
trace_android_rvh_media_device_setup_link(link, linkd, &ret);
if (ret) if (ret)
return ret; return ret;

View File

@@ -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, trace_android_vh_v4l2subdev_set_fmt(sd, subdev_fh->pad,
format, &ret); format, &ret);
trace_android_rvh_v4l2subdev_set_fmt(sd, subdev_fh->pad,
format, &ret);
if (ret) if (ret)
return ret; return ret;
@@ -600,6 +602,7 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)
return -EPERM; return -EPERM;
trace_android_vh_v4l2subdev_set_frame_interval(sd, fi, &ret); trace_android_vh_v4l2subdev_set_frame_interval(sd, fi, &ret);
trace_android_rvh_v4l2subdev_set_frame_interval(sd, fi, &ret);
if (ret) if (ret)
return 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, trace_android_vh_v4l2subdev_set_selection(sd, subdev_fh->pad,
sel, &ret); sel, &ret);
trace_android_rvh_v4l2subdev_set_selection(sd, subdev_fh->pad,
sel, &ret);
if (ret) if (ret)
return ret; return ret;

View File

@@ -5,7 +5,7 @@
#define TRACE_INCLUDE_PATH trace/hooks #define TRACE_INCLUDE_PATH trace/hooks
#if !defined(_TRACE_HOOK_V4L2CORE_H) || defined(TRACE_HEADER_MULTI_READ) #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 <linux/tracepoint.h>
#include <trace/hooks/vendor_hooks.h> #include <trace/hooks/vendor_hooks.h>
@@ -44,6 +44,21 @@ DECLARE_HOOK(android_vh_v4l2subdev_set_frame_interval,
int *ret), int *ret),
TP_ARGS(sd, fi, 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 */ #endif /* _TRACE_HOOK_V4L2CORE_H */
/* This part must be outside protection */ /* This part must be outside protection */
#include <trace/define_trace.h> #include <trace/define_trace.h>

View File

@@ -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_PROTO(struct media_link *link, struct media_link_desc *linkd, int *ret),
TP_ARGS(link, linkd, 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 */ #endif /* _TRACE_HOOK_V4L2MC_H */
/* This part must be outside protection */ /* This part must be outside protection */
#include <trace/define_trace.h> #include <trace/define_trace.h>