LCOV - code coverage report
Current view: top level - lib - is_single_threaded.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 0 22 0.0 %
Date: 2021-04-22 12:43:58 Functions: 0 1 0.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0-or-later
       2             : /* Function to determine if a thread group is single threaded or not
       3             :  *
       4             :  * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved.
       5             :  * Written by David Howells (dhowells@redhat.com)
       6             :  * - Derived from security/selinux/hooks.c
       7             :  */
       8             : #include <linux/sched/signal.h>
       9             : #include <linux/sched/task.h>
      10             : #include <linux/sched/mm.h>
      11             : 
      12             : /*
      13             :  * Returns true if the task does not share ->mm with another thread/process.
      14             :  */
      15           0 : bool current_is_single_threaded(void)
      16             : {
      17           0 :         struct task_struct *task = current;
      18           0 :         struct mm_struct *mm = task->mm;
      19           0 :         struct task_struct *p, *t;
      20           0 :         bool ret;
      21             : 
      22           0 :         if (atomic_read(&task->signal->live) != 1)
      23             :                 return false;
      24             : 
      25           0 :         if (atomic_read(&mm->mm_users) == 1)
      26             :                 return true;
      27             : 
      28           0 :         ret = false;
      29           0 :         rcu_read_lock();
      30           0 :         for_each_process(p) {
      31           0 :                 if (unlikely(p->flags & PF_KTHREAD))
      32           0 :                         continue;
      33           0 :                 if (unlikely(p == task->group_leader))
      34           0 :                         continue;
      35             : 
      36           0 :                 for_each_thread(p, t) {
      37           0 :                         if (unlikely(t->mm == mm))
      38           0 :                                 goto found;
      39           0 :                         if (likely(t->mm))
      40             :                                 break;
      41             :                         /*
      42             :                          * t->mm == NULL. Make sure next_thread/next_task
      43             :                          * will see other CLONE_VM tasks which might be
      44             :                          * forked before exiting.
      45             :                          */
      46           0 :                         smp_rmb();
      47             :                 }
      48             :         }
      49             :         ret = true;
      50           0 : found:
      51           0 :         rcu_read_unlock();
      52             : 
      53           0 :         return ret;
      54             : }

Generated by: LCOV version 1.14