X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=kernel%2Fkthread.c;h=760e86df8c204dc60c23e18b01bdec314780ba1e;hb=91c2e0bcae72a3086c698b5de2b950b885abb0e6;hp=16d8ddd268b1b9c60db1afc6377f72a0754e8d6a;hpb=5a5a1bf099d6942399ea0b34a62e5f0bc4c5c36e;p=firefly-linux-kernel-4.4.55.git diff --git a/kernel/kthread.c b/kernel/kthread.c index 16d8ddd268b1..760e86df8c20 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -17,6 +17,7 @@ #include #include #include +#include #include static DEFINE_SPINLOCK(kthread_create_lock); @@ -135,6 +136,24 @@ void *kthread_data(struct task_struct *task) return to_kthread(task)->data; } +/** + * probe_kthread_data - speculative version of kthread_data() + * @task: possible kthread task in question + * + * @task could be a kthread task. Return the data value specified when it + * was created if accessible. If @task isn't a kthread task or its data is + * inaccessible for any reason, %NULL is returned. This function requires + * that @task itself is safe to dereference. + */ +void *probe_kthread_data(struct task_struct *task) +{ + struct kthread *kthread = to_kthread(task); + void *data = NULL; + + probe_kernel_read(&data, &kthread->data, sizeof(data)); + return data; +} + static void __kthread_parkme(struct kthread *self) { __set_current_state(TASK_PARKED);