2008-11-14 02:39:21 +03:00
/* Function to determine if a thread group is single threaded or not
*
* Copyright ( C ) 2008 Red Hat , Inc . All Rights Reserved .
* Written by David Howells ( dhowells @ redhat . com )
* - Derived from security / selinux / hooks . c
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public Licence
* as published by the Free Software Foundation ; either version
* 2 of the Licence , or ( at your option ) any later version .
*/
2017-02-08 20:51:30 +03:00
# include <linux/sched/signal.h>
2017-02-04 02:16:44 +03:00
# include <linux/sched/mm.h>
2008-11-14 02:39:21 +03:00
2009-07-17 03:09:36 +04:00
/*
* Returns true if the task does not share - > mm with another thread / process .
2008-11-14 02:39:21 +03:00
*/
2009-07-10 05:48:23 +04:00
bool current_is_single_threaded ( void )
2008-11-14 02:39:21 +03:00
{
2009-07-10 05:48:23 +04:00
struct task_struct * task = current ;
2009-07-17 03:09:36 +04:00
struct mm_struct * mm = task - > mm ;
struct task_struct * p , * t ;
bool ret ;
if ( atomic_read ( & task - > signal - > live ) ! = 1 )
return false ;
2008-11-14 02:39:21 +03:00
2009-07-17 03:09:36 +04:00
if ( atomic_read ( & mm - > mm_users ) = = 1 )
return true ;
ret = false ;
rcu_read_lock ( ) ;
for_each_process ( p ) {
if ( unlikely ( p - > flags & PF_KTHREAD ) )
continue ;
if ( unlikely ( p = = task - > group_leader ) )
continue ;
2015-11-07 03:31:26 +03:00
for_each_thread ( p , t ) {
2009-07-17 03:09:36 +04:00
if ( unlikely ( t - > mm = = mm ) )
goto found ;
if ( likely ( t - > mm ) )
break ;
2009-07-10 01:28:49 +04:00
/*
* t - > mm = = NULL . Make sure next_thread / next_task
* will see other CLONE_VM tasks which might be
* forked before exiting .
*/
smp_rmb ( ) ;
2015-11-07 03:31:26 +03:00
}
2009-07-17 03:09:36 +04:00
}
ret = true ;
found :
rcu_read_unlock ( ) ;
2008-11-14 02:39:21 +03:00
2009-07-17 03:09:36 +04:00
return ret ;
2008-11-14 02:39:21 +03:00
}