diff --git a/kernel/events/core.c b/kernel/events/core.c index 03ac9c8b02fb81a89662a16c6871755933cf9721..e886b2593e3ad11414e674b52879c1ef7f79eff8 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -9429,7 +9429,25 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu, event->parent = parent_event; - event->ns = get_pid_ns(task_active_pid_ns(current)); + + /* + * This is a fix for pb_sched. + * + * When this method is called within the scheduling process the + * 'current' task is (at least in our case) already in a exit + * state. Trying to use it will cause a NULL-Pointer Exception. + * Thats why we use the task provided by 'task' to prevent this. + */ + if(task != NULL) + { + event->ns = get_pid_ns(task_active_pid_ns(task)); + } + else + { + event->ns = get_pid_ns(task_active_pid_ns(current)); + } + // fix end + event->id = atomic64_inc_return(&perf_event_id); event->state = PERF_EVENT_STATE_INACTIVE;