struct kwork_work *work, key;
 
        BUG_ON(class->work_init == NULL);
-       class->work_init(class, &key, evsel, sample, machine);
+       class->work_init(kwork, class, &key, src_type, evsel, sample, machine);
 
        atom = atom_new(kwork, sample);
        if (atom == NULL)
        struct kwork_work *work, key;
 
        BUG_ON(class->work_init == NULL);
-       class->work_init(class, &key, evsel, sample, machine);
+       class->work_init(kwork, class, &key, src_type, evsel, sample, machine);
 
        work = work_findnew(&class->work_root, &key, &kwork->cmp_id);
        if (ret_work != NULL)
        return 0;
 }
 
-static void irq_work_init(struct kwork_class *class,
+static void irq_work_init(struct perf_kwork *kwork __maybe_unused,
+                         struct kwork_class *class,
                          struct kwork_work *work,
+                         enum kwork_trace_type src_type __maybe_unused,
                          struct evsel *evsel,
                          struct perf_sample *sample,
                          struct machine *machine __maybe_unused)
        return name;
 }
 
-static void softirq_work_init(struct kwork_class *class,
+static void softirq_work_init(struct perf_kwork *kwork __maybe_unused,
+                             struct kwork_class *class,
                              struct kwork_work *work,
+                             enum kwork_trace_type src_type __maybe_unused,
                              struct evsel *evsel,
                              struct perf_sample *sample,
                              struct machine *machine __maybe_unused)
        return 0;
 }
 
-static void workqueue_work_init(struct kwork_class *class,
+static void workqueue_work_init(struct perf_kwork *kwork __maybe_unused,
+                               struct kwork_class *class,
                                struct kwork_work *work,
+                               enum kwork_trace_type src_type __maybe_unused,
                                struct evsel *evsel,
                                struct perf_sample *sample,
                                struct machine *machine)
 
        DECLARE_BITMAP(bitmap, NR_ATOM_PER_PAGE);
 };
 
+struct perf_kwork;
 struct kwork_class;
 struct kwork_work {
        /*
        int (*class_init)(struct kwork_class *class,
                          struct perf_session *session);
 
-       void (*work_init)(struct kwork_class *class,
+       void (*work_init)(struct perf_kwork *kwork,
+                         struct kwork_class *class,
                          struct kwork_work *work,
+                         enum kwork_trace_type src_type,
                          struct evsel *evsel,
                          struct perf_sample *sample,
                          struct machine *machine);
                          char *buf, int len);
 };
 
-struct perf_kwork;
 struct trace_kwork_handler {
        int (*raise_event)(struct perf_kwork *kwork,
                           struct kwork_class *class, struct evsel *evsel,