return 0;
  }
  
 -char *__get_task_comm(char *buf, size_t buf_size, struct task_struct *tsk)
 -{
 -      task_lock(tsk);
 -      /* Always NUL terminated and zero-padded */
 -      strscpy_pad(buf, tsk->comm, buf_size);
 -      task_unlock(tsk);
 -      return buf;
 -}
 -EXPORT_SYMBOL_GPL(__get_task_comm);
 -
  /*
-  * These functions flushes out all traces of the currently running executable
-  * so that a new one can be started
+  * This is unlocked -- the string will always be NUL-terminated, but
+  * may show overlapping contents if racing concurrent reads.
   */
- 
  void __set_task_comm(struct task_struct *tsk, const char *buf, bool exec)
  {
-       task_lock(tsk);
+       size_t len = min(strlen(buf), sizeof(tsk->comm) - 1);
+ 
        trace_task_rename(tsk, buf);
-       strscpy_pad(tsk->comm, buf, sizeof(tsk->comm));
-       task_unlock(tsk);
+       memcpy(tsk->comm, buf, len);
+       memset(&tsk->comm[len], 0, sizeof(tsk->comm) - len);
        perf_event_comm(tsk, exec);
  }
  
 
  #endif
  
  extern void __set_task_comm(struct task_struct *tsk, const char *from, bool exec);
- 
- static inline void set_task_comm(struct task_struct *tsk, const char *from)
- {
-       __set_task_comm(tsk, from, false);
- }
+ #define set_task_comm(tsk, from) ({                   \
+       BUILD_BUG_ON(sizeof(from) != TASK_COMM_LEN);    \
+       __set_task_comm(tsk, from, false);              \
+ })
  
 -extern char *__get_task_comm(char *to, size_t len, struct task_struct *tsk);
 +/*
 + * - Why not use task_lock()?
 + *   User space can randomly change their names anyway, so locking for readers
 + *   doesn't make sense. For writers, locking is probably necessary, as a race
 + *   condition could lead to long-term mixed results.
 + *   The strscpy_pad() in __set_task_comm() can ensure that the task comm is
 + *   always NUL-terminated and zero-padded. Therefore the race condition between
 + *   reader and writer is not an issue.
 + *
 + * - BUILD_BUG_ON() can help prevent the buf from being truncated.
 + *   Since the callers don't perform any return value checks, this safeguard is
 + *   necessary.
 + */
  #define get_task_comm(buf, tsk) ({                    \
 -      BUILD_BUG_ON(sizeof(buf) != TASK_COMM_LEN);     \
 -      __get_task_comm(buf, sizeof(buf), tsk);         \
 +      BUILD_BUG_ON(sizeof(buf) < TASK_COMM_LEN);      \
 +      strscpy_pad(buf, (tsk)->comm);                  \
 +      buf;                                            \
  })
  
  #ifdef CONFIG_SMP