diff --git a/fs/proc/base.c b/fs/proc/base.c index f7c6474c8d55..6d549f98d8c9 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -98,6 +98,7 @@ #include #include #include +#include #include "internal.h" #include "fd.h" @@ -344,13 +345,24 @@ static ssize_t get_task_cmdline(struct task_struct *tsk, char __user *buf, size_t count, loff_t *pos) { struct mm_struct *mm; + bool prio_inherited = false; + int saved_prio; ssize_t ret; mm = get_task_mm(tsk); if (!mm) return 0; + /* + * access_remote_vm() holds the hot mmap_sem lock which can cause the + * task for which we read cmdline etc for by some debug deamon to slow + * down and suffer a performance hit. Especially if the reader task has + * a low nice value. + */ + trace_android_vh_prio_inheritance(tsk, &saved_prio, &prio_inherited); ret = get_mm_cmdline(mm, buf, count, pos); + if (prio_inherited) + trace_android_vh_prio_restore(saved_prio); mmput(mm); return ret; } diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index 594d6bd6c38b..462552ec537e 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -426,6 +426,14 @@ DECLARE_RESTRICTED_HOOK(android_rvh_update_rt_rq_load_avg, TP_PROTO(u64 now, struct rq *rq, struct task_struct *tsk, int running), TP_ARGS(now, rq, tsk, running), 1); +DECLARE_HOOK(android_vh_prio_inheritance, + TP_PROTO(struct task_struct *p, int *saved_prio, bool *prio_inherited), + TP_ARGS(p, saved_prio, prio_inherited)); + +DECLARE_HOOK(android_vh_prio_restore, + TP_PROTO(int saved_prio), + TP_ARGS(saved_prio)); + #endif /* _TRACE_HOOK_SCHED_H */ /* This part must be outside protection */ #include diff --git a/kernel/sched/vendor_hooks.c b/kernel/sched/vendor_hooks.c index 9a8f2c3b2758..a4c6f277c0f6 100644 --- a/kernel/sched/vendor_hooks.c +++ b/kernel/sched/vendor_hooks.c @@ -108,3 +108,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_load_avg); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_remove_entity_load_avg); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_blocked_fair); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_rt_rq_load_avg); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_prio_inheritance); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_prio_restore);