]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - linux/kthread.c
Move c_src dirs back to toplevel
[bcachefs-tools-debian] / linux / kthread.c
index eaab31db36ef7aeec98ff9ff3962e5ccbb2acc39..17830e5fd7b4b30250c49abc8ac15b2bde67742a 100644 (file)
@@ -7,6 +7,8 @@
 #include <linux/rcupdate.h>
 #include <linux/sched.h>
 
+#include "tools-util.h"
+
 enum KTHREAD_BITS {
        KTHREAD_IS_PER_CPU = 0,
        KTHREAD_SHOULD_STOP,
@@ -69,12 +71,24 @@ struct task_struct *kthread_create(int (*thread_fn)(void *data),
        p->thread_fn    = thread_fn;
        p->thread_data  = thread_data;
        p->state        = TASK_UNINTERRUPTIBLE;
+       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);
 
-       ret = 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)
-               die("pthread_create error %s", strerror(ret));
+               return ERR_PTR(-ret);
        pthread_setname_np(p->thread, p->comm);
        return p;
 }
@@ -91,6 +105,11 @@ bool kthread_should_stop(void)
        return test_bit(KTHREAD_SHOULD_STOP, &current->kthread_flags);
 }
 
+bool kthread_freezable_should_stop(bool *was_frozen)
+{
+       return test_bit(KTHREAD_SHOULD_STOP, &current->kthread_flags);
+}
+
 /**
  * kthread_stop - stop a thread created by kthread_create().
  * @k: thread created by kthread_create().