Re: [PATCH UPDATED 03/10] threadgroup: extend threadgroup_lock()to cover exit and exec

From: Tejun Heo
Date: Sun Nov 27 2011 - 16:26:13 EST


Hello, Linus.

On Sun, Nov 27, 2011 at 11:21:55AM -0800, Tejun Heo wrote:
> On Thu, Nov 24, 2011 at 08:02:18PM -0800, Linus Torvalds wrote:
> > - do you even *need* two separate locks at all? If you extend the
> > threadgroup_fork_lock to cover exec/exit too (and rename it), then why
> > does that separate cred_guard_mutex make sense at all?
>
> That was mostly choosing the path of least resistance as both locks
> already existed and exec exclusion was added later on, but yeah there
> isn't much to lose by merging those two locks (do_exit nesting inside
> exec will need some care tho). I'll try to unify the two locks.

Hmmm... I tried this but it seems more difficult than originally
expected. The biggest obstacle is that we don't have _interruptible
and _killable rwsem ops.

As proposed, what we have is,

* fork and exit paths are read-protected by group_rwsem. ie. forks
and exits don't block each other.

* exec path is protected by cred_guard_mutex. cred_guard_mutex also
synchronizes parallel exec attempts. (It's probably better to
rename it to exec_mutex)

* thread_group_lock() makes the thread group stable by write-locking
group_rwsem and grabbing cred_guard_mutex. The former excludes
forks and exits and the latter exec.

group_rwsem and cred_guard_mutex can be merged by,

* fork and exit paths read-lock group_rwsem as it currently does.

* exec path write-locks group_rwsem. Note that it'll need to unlock
in de_thread() while waiting for other threads to exit as exit path
can't proceed while group_rwsem is write-locked.
prepare_bprm_creds() should be updated to check signal_pending()
after acquiring group_rwsem.

This introduces synchronization between exec and fork/exit paths,
but I don't think this is something we need to worry about as both
fork-exec and exit-exec scalabilities don't matter.

* thread_group_lock() write-locks group_rwsem.

The problem is that cred_guard_mutex uses _interruptible/_killable
operations and rwsem doesn't have them, so cred_guard_mutex can't be
easily replaced with write-locking group_rwsem.

If the two locks can't be merged, under the proposed scheme, while not
exactly pretty, both fork/exit and exec paths go through single
locking and only the ones which want stable threadgroup need to grab
both locks, so IMHO it is at least reasonable.

Any better ideas?

Thanks.

--
tejun
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/