Re: [PATCH v2] mount: dont execute propagate_umount() many times for same mounts

From: Eric W. Biederman
Date: Fri Oct 07 2016 - 00:48:00 EST

Andrei Vagin <avagin@xxxxxxxxxxxxx> writes:

> On Thu, Oct 06, 2016 at 02:46:30PM -0500, Eric W. Biederman wrote:
>> Andrei Vagin <avagin@xxxxxxxxxx> writes:
>> > The reason of this optimization is that umount() can hold namespace_sem
>> > for a long time, this semaphore is global, so it affects all users.
>> > Recently Eric W. Biederman added a per mount namespace limit on the
>> > number of mounts. The default number of mounts allowed per mount
>> > namespace at 100,000. Currently this value is allowed to construct a tree
>> > which requires hours to be umounted.
>> I am going to take a hard look at this as this problem sounds very
>> unfortunate. My memory of going through this code before strongly
>> suggests that changing the last list_for_each_entry to
>> list_for_each_entry_reverse is going to impact the correctness of this
>> change.
> I have read this code again and you are right, list_for_each_entry can't
> be changed on list_for_each_entry_reverse here.
> I tested these changes more carefully and find one more issue, so I am
> going to send a new patch and would like to get your comments to it.
> Thank you for your time.

No problem.

A quick question. You have introduced lookup_mnt_cont. Is that a core
part of your fix or do you truly have problmenatic long hash chains.

Simply increasing the hash table size should fix problems long hash
chains (and there are other solutions like rhashtable that may be more
appropriate than pre-allocating large hash chains).

If it is not long hash chains introducing lookup_mnt_cont in your patch
is a distraction to the core of what is going on.

Perhaps I am blind but if the hash chains are not long I don't see mount
propagation could be more than quadratic in the worst case. As there is
only a loop within a loop. Or Is the tree walking in propagation_next
that bad?