]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - linux/kthread.c
Disable pristine-tar option in gbp.conf, since there is no pristine-tar branch.
[bcachefs-tools-debian] / linux / kthread.c
index 0f4b5715e9043f87d48cbb458fd478d28cb46a8b..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,
@@ -57,6 +59,7 @@ struct task_struct *kthread_create(int (*thread_fn)(void *data),
 {
        va_list args;
        struct task_struct *p = malloc(sizeof(*p));
+       int ret;
 
        memset(p, 0, sizeof(*p));
 
@@ -64,15 +67,29 @@ struct task_struct *kthread_create(int (*thread_fn)(void *data),
        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;
 }
 
@@ -88,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().