]> git.proxmox.com Git - mirror_spl.git/blobdiff - module/spl/spl-thread.c
Fix more cstyle warnings
[mirror_spl.git] / module / spl / spl-thread.c
index 6b3bec509372f086ca1482304e9d60eb04fcf4a9..d441ad65f3174a7e7d0c07266ea4193240f54d72 100644 (file)
@@ -1,4 +1,4 @@
-/*****************************************************************************\
+/*
  *  Copyright (C) 2007-2010 Lawrence Livermore National Security, LLC.
  *  Copyright (C) 2007 The Regents of the University of California.
  *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
  *
  *  You should have received a copy of the GNU General Public License along
  *  with the SPL.  If not, see <http://www.gnu.org/licenses/>.
- *****************************************************************************
+ *
  *  Solaris Porting Layer (SPL) Thread Implementation.
-\*****************************************************************************/
+ */
 
 #include <sys/thread.h>
 #include <sys/kmem.h>
 #include <sys/tsd.h>
-#include <spl-debug.h>
-
-#ifdef SS_DEBUG_SUBSYS
-#undef SS_DEBUG_SUBSYS
-#endif
-
-#define SS_DEBUG_SUBSYS SS_THREAD
 
 /*
  * Thread interfaces
  */
 typedef struct thread_priv_s {
        unsigned long tp_magic;         /* Magic */
-        int tp_name_size;              /* Name size */
-        char *tp_name;                 /* Name (without _thread suffix) */
+       int tp_name_size;               /* Name size */
+       char *tp_name;                  /* Name (without _thread suffix) */
        void (*tp_func)(void *);        /* Registered function */
        void *tp_args;                  /* Args to be passed to function */
        size_t tp_len;                  /* Len to be passed to function */
@@ -62,58 +55,57 @@ thread_generic_wrapper(void *arg)
        set_current_state(tp->tp_state);
        set_user_nice((kthread_t *)current, PRIO_TO_NICE(tp->tp_pri));
        kmem_free(tp->tp_name, tp->tp_name_size);
-       kmem_free(tp, sizeof(thread_priv_t));
+       kmem_free(tp, sizeof (thread_priv_t));
 
        if (func)
                func(args);
 
-       return 0;
+       return (0);
 }
 
 void
 __thread_exit(void)
 {
-       SENTRY;
-       SEXIT;
        tsd_exit();
        complete_and_exit(NULL, 0);
        /* Unreachable */
 }
 EXPORT_SYMBOL(__thread_exit);
 
-/* thread_create() may block forever if it cannot create a thread or
+/*
+ * thread_create() may block forever if it cannot create a thread or
  * allocate memory.  This is preferable to returning a NULL which Solaris
- * style callers likely never check for... since it can't fail. */
+ * style callers likely never check for... since it can't fail.
+ */
 kthread_t *
 __thread_create(caddr_t stk, size_t  stksize, thread_func_t func,
-               const char *name, void *args, size_t len, proc_t *pp,
-               int state, pri_t pri)
+    const char *name, void *args, size_t len, proc_t *pp, int state, pri_t pri)
 {
        thread_priv_t *tp;
        struct task_struct *tsk;
        char *p;
-       SENTRY;
 
        /* Option pp is simply ignored */
        /* Variable stack size unsupported */
        ASSERT(stk == NULL);
 
-       tp = kmem_alloc(sizeof(thread_priv_t), KM_PUSHPAGE);
+       tp = kmem_alloc(sizeof (thread_priv_t), KM_PUSHPAGE);
        if (tp == NULL)
-               SRETURN(NULL);
+               return (NULL);
 
        tp->tp_magic = TP_MAGIC;
        tp->tp_name_size = strlen(name) + 1;
 
        tp->tp_name = kmem_alloc(tp->tp_name_size, KM_PUSHPAGE);
-        if (tp->tp_name == NULL) {
-               kmem_free(tp, sizeof(thread_priv_t));
-               SRETURN(NULL);
+       if (tp->tp_name == NULL) {
+               kmem_free(tp, sizeof (thread_priv_t));
+               return (NULL);
        }
 
        strncpy(tp->tp_name, name, tp->tp_name_size);
 
-       /* Strip trailing "_thread" from passed name which will be the func
+       /*
+        * Strip trailing "_thread" from passed name which will be the func
         * name since the exposed API has no parameter for passing a name.
         */
        p = strstr(tp->tp_name, "_thread");
@@ -126,14 +118,43 @@ __thread_create(caddr_t stk, size_t  stksize, thread_func_t func,
        tp->tp_state = state;
        tp->tp_pri   = pri;
 
-       tsk = kthread_create(thread_generic_wrapper, (void *)tp,
-                            "%s", tp->tp_name);
-       if (IS_ERR(tsk)) {
-               SERROR("Failed to create thread: %ld\n", PTR_ERR(tsk));
-               SRETURN(NULL);
-       }
+       tsk = spl_kthread_create(thread_generic_wrapper, (void *)tp,
+           "%s", tp->tp_name);
+       if (IS_ERR(tsk))
+               return (NULL);
 
        wake_up_process(tsk);
-       SRETURN((kthread_t *)tsk);
+       return ((kthread_t *)tsk);
 }
 EXPORT_SYMBOL(__thread_create);
+
+/*
+ * spl_kthread_create - Wrapper providing pre-3.13 semantics for
+ * kthread_create() in which it is not killable and less likely
+ * to return -ENOMEM.
+ */
+struct task_struct *
+spl_kthread_create(int (*func)(void *), void *data, const char namefmt[], ...)
+{
+       struct task_struct *tsk;
+       va_list args;
+       char name[TASK_COMM_LEN];
+
+       va_start(args, namefmt);
+       vsnprintf(name, sizeof (name), namefmt, args);
+       va_end(args);
+       do {
+               tsk = kthread_create(func, data, "%s", name);
+               if (IS_ERR(tsk)) {
+                       if (signal_pending(current)) {
+                               clear_thread_flag(TIF_SIGPENDING);
+                               continue;
+                       }
+                       if (PTR_ERR(tsk) == -ENOMEM)
+                               continue;
+                       return (NULL);
+               } else
+                       return (tsk);
+       } while (1);
+}
+EXPORT_SYMBOL(spl_kthread_create);