#include <linux/rcupdate.h>
#include <linux/sched.h>
+#include "tools-util.h"
+
enum KTHREAD_BITS {
KTHREAD_IS_PER_CPU = 0,
KTHREAD_SHOULD_STOP,
{
va_list args;
struct task_struct *p = malloc(sizeof(*p));
+ int ret;
memset(p, 0, sizeof(*p));
vsnprintf(p->comm, sizeof(p->comm), namefmt, args);
va_end(args);
+ p->flags |= PF_KTHREAD;
p->thread_fn = thread_fn;
p->thread_data = thread_data;
p->state = TASK_UNINTERRUPTIBLE;
- pthread_mutex_init(&p->lock, NULL);
- pthread_cond_init(&p->wait, NULL);
+ p->signal = &p->_signal;
atomic_set(&p->usage, 1);
init_completion(&p->exited);
+ init_rwsem(&p->_signal.exec_update_lock);
+
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setstacksize(&attr, 32 << 10);
- pthread_create(&p->thread, NULL, kthread_start_fn, p);
+ for (unsigned i = 0; i < 10; i++) {
+ ret = pthread_create(&p->thread, &attr, kthread_start_fn, p);
+ if (!ret)
+ break;
+
+ run_shrinkers(GFP_KERNEL, true);
+ }
+ if (ret)
+ return ERR_PTR(-ret);
+ pthread_setname_np(p->thread, p->comm);
return p;
}
return test_bit(KTHREAD_SHOULD_STOP, ¤t->kthread_flags);
}
+bool kthread_freezable_should_stop(bool *was_frozen)
+{
+ return test_bit(KTHREAD_SHOULD_STOP, ¤t->kthread_flags);
+}
+
/**
* kthread_stop - stop a thread created by kthread_create().
* @k: thread created by kthread_create().