diff --git a/kernel/sched/core.c b/kernel/sched/core.c index b3378fcbc66b..2c20bd870fb3 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -5627,6 +5627,7 @@ unsigned int sched_lib_mask_force; bool is_sched_lib_based_app(pid_t pid) { const char *name = NULL; + char *lib_list, *libname; struct vm_area_struct *vma; char path_buf[LIB_PATH_LENGTH]; bool found = false; @@ -5636,11 +5637,14 @@ bool is_sched_lib_based_app(pid_t pid) if (strnlen(sched_lib_name, LIB_PATH_LENGTH) == 0) return false; + lib_list = kstrdup(sched_lib_name, GFP_KERNEL); + rcu_read_lock(); p = find_process_by_pid(pid); if (!p) { rcu_read_unlock(); + kfree(lib_list); return false; } @@ -5660,10 +5664,12 @@ bool is_sched_lib_based_app(pid_t pid) if (IS_ERR(name)) goto release_sem; - if (strnstr(name, sched_lib_name, + while ((libname = strsep(&lib_list, ","))) { + if (strnstr(name, libname, strnlen(name, LIB_PATH_LENGTH))) { - found = true; - break; + found = true; + break; + } } } } @@ -5673,6 +5679,7 @@ release_sem: mmput(mm); put_task_struct: put_task_struct(p); + kfree(lib_list); return found; }