From: Li Zefan <lizf@cn.fujitsu.com>
To: Ben Blum <bblum@andrew.cmu.edu>
Cc: linux-kernel@vger.kernel.org,
containers@lists.linux-foundation.org, akpm@linux-foundation.org,
Paul Menage <menage@google.com>
Subject: Re: [RFC] [PATCH 1/5] cgroups: revamp subsys array
Date: Thu, 10 Dec 2009 11:18:06 +0800 [thread overview]
Message-ID: <4B20686E.3070907@cn.fujitsu.com> (raw)
In-Reply-To: <20091209082729.GA14114@andrew.cmu.edu>
>>>>> @@ -1291,6 +1324,7 @@ static int cgroup_get_sb(struct file_system_type *fs_type,
>>>>> struct cgroupfs_root *new_root;
>>>>>
>>>>> /* First find the desired set of subsystems */
>>>>> + down_read(&subsys_mutex);
>>>> Hmm.. this can lead to deadlock. sget() returns success with sb->s_umount
>>>> held, so here we have:
>>>>
>>>> down_read(&subsys_mutex);
>>>>
>>>> down_write(&sb->s_umount);
>>>>
>>>> On the other hand, sb->s_umount is held before calling kill_sb(),
>>>> so when umounting we have:
>>>>
>>>> down_write(&sb->s_umount);
>>>>
>>>> down_read(&subsys_mutex);
>>> Unless I'm gravely mistaken, you can't have deadlock on an rwsem when
>>> it's being taken for reading in both cases? You would have to have at
>>> least one of the cases being down_write.
>>>
>> lockdep will warn on this..
>
> Hm. Why did I not see this warning...?
>
Because you haven't triggered it. ;)
The scripts below can trigger the warning (at least for me):
# cat test1.sh
#! /bin/sh
for ((; ;))
{
mount -t cgroup -o devices xxx /cgroup1
umount /cgroup1
}
# cat test2.sh
#! /bin/sh
for ((; ;))
{
mount -t cgroup -o devices xxx /cgroup2
umount /cgroup2
}
>> And it can really lead to deadlock, though not so obivously:
>>
>> thread 1 thread 2 thread 3
>> -------------------------------------------
>> | read(A) write(B)
>> |
>> | write(A)
>> |
>> | read(A)
>> |
>> | write(B)
>> |
>>
>> t3 is waiting for t1 to release the lock, then t2 tries to
>> acquire A lock to read, but it has to wait because of t3,
>> and t1 has to wait t2.
>>
>> Note: a read lock has to wait if a write lock is already
>> waiting for the lock.
>
> Okay, clever, the deadlock happens because of a behavioural optimization
> of the rwsems. Good catch on the whole issue.
>
> How does this sound as a possible solution, in cgroup_get_sb:
>
> 1) Take subsys_mutex
> 2) Call parse_cgroupfs_options()
> 3) Drop subsys_mutex
> 4) Call sget(), which gets sb->s_umount without subsys_mutex held
> 5) Take subsys_mutex
> 6) Call verify_cgroupfs_options()
> 7) Proceed as normal
>
> In which verify_cgroupfs_options will be a new function that ensures the
> invariants that rebind_subsystems expects are still there; if not, bail
> out by jumping to drop_new_super just as if parse_cgroupfs_options had
> failed in the first place.
>
The current code doesn't need this verify_cgroupfs_options, so why it
will become necessary? I think what we need is grab module refcnt in
parse_cgroupfs_options, and then we can drop subsys_mutex.
But why you are using a rw semaphore? I think a mutex is fine.
And why not just use cgroup_mutex to protect the subsys[] array?
The adding and spreading of subsys_mutex looks ugly to me.
> Another question: What's the justification for having an interface of
> seemingly symmetrical "initialize" and "destroy" functions, one of which
> has to take a lock and the other gets called with the lock already held?
> Seems like it's asking for trouble.
>
Are you refering to get_sb() and kill_sb()? VFS is not my area, so I'm
not going to judge it. ;)
next prev parent reply other threads:[~2009-12-10 3:18 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-12-04 8:53 [RFC] [PATCH 0/5] cgroups: support for module-loadable subsystems Ben Blum
2009-12-04 8:55 ` [RFC] [PATCH 1/5] cgroups: revamp subsys array Ben Blum
2009-12-08 7:38 ` Li Zefan
2009-12-09 5:50 ` Ben Blum
2009-12-09 6:07 ` Li Zefan
2009-12-09 6:09 ` Li Zefan
2009-12-09 8:27 ` Ben Blum
2009-12-10 3:18 ` Li Zefan [this message]
2009-12-10 5:19 ` Ben Blum
2009-12-10 6:00 ` Li Zefan
2009-12-10 6:13 ` Ben Blum
2009-12-09 8:36 ` Ben Blum
2009-12-04 8:56 ` [RFC] [PATCH 2/5] cgroups: subsystem module loading interface Ben Blum
2009-12-04 8:57 ` [RFC] [PATCH 3/5] cgroups: net_cls as module Ben Blum
2009-12-08 6:07 ` Li Zefan
2009-12-04 8:58 ` [RFC] [PATCH 4/5] cgroups: subsystem module unloading Ben Blum
2009-12-04 8:58 ` [RFC] [PATCH 5/5] cgroups: subsystem dependencies Ben Blum
2009-12-08 6:11 ` Li Zefan
2009-12-09 1:08 ` Ben Blum
2009-12-09 1:40 ` Li Zefan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B20686E.3070907@cn.fujitsu.com \
--to=lizf@cn.fujitsu.com \
--cc=akpm@linux-foundation.org \
--cc=bblum@andrew.cmu.edu \
--cc=containers@lists.linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=menage@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox