From e6a59da61ee8027a97faa3e93945e3f397570a1e Mon Sep 17 00:00:00 2001 From: Louis Kuo Date: Fri, 16 Jul 2021 19:32:39 +0800 Subject: [PATCH] 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 Change-Id: I94fe2e112b6c3d9ac5177abb30a99b7007068f7e --- drivers/android/vendor_hooks.c | 4 ++++ drivers/media/mc/mc-device.c | 1 + drivers/media/v4l2-core/v4l2-subdev.c | 5 +++++ include/trace/hooks/v4l2core.h | 17 ++++++++++++++++- include/trace/hooks/v4l2mc.h | 5 +++++ 5 files changed, 31 insertions(+), 1 deletion(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 48ca66786f42..63710748e07a 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -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); diff --git a/drivers/media/mc/mc-device.c b/drivers/media/mc/mc-device.c index 97baa541c826..0fb6e4e853a0 100644 --- a/drivers/media/mc/mc-device.c +++ b/drivers/media/mc/mc-device.c @@ -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; diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c index da491fd1baf8..ac6ce031c7b7 100644 --- a/drivers/media/v4l2-core/v4l2-subdev.c +++ b/drivers/media/v4l2-core/v4l2-subdev.c @@ -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; diff --git a/include/trace/hooks/v4l2core.h b/include/trace/hooks/v4l2core.h index 32b6e96ba627..7207810a7e37 100644 --- a/include/trace/hooks/v4l2core.h +++ b/include/trace/hooks/v4l2core.h @@ -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 #include @@ -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 diff --git a/include/trace/hooks/v4l2mc.h b/include/trace/hooks/v4l2mc.h index 8a4653bd4a4d..0f60515bb8e2 100644 --- a/include/trace/hooks/v4l2mc.h +++ b/include/trace/hooks/v4l2mc.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