On 07/19/2017 04:24 PM, Miklos Szeredi wrote: > On Mon, Jul 17, 2017 at 3:39 PM, Waiman Long <longman@xxxxxxxxxx> wrote: >> The number of positive dentries is limited by the number of files >> in the filesystems. The number of negative dentries, however, >> has no limit other than the total amount of memory available in >> the system. So a rogue application that generates a lot of negative >> dentries can potentially exhaust most of the memory available in the >> system impacting performance on other running applications. >> >> To prevent this from happening, the dcache code is now updated to limit >> the amount of the negative dentries in the LRU lists that can be kept >> as a percentage of total available system memory. The default is 5% >> and can be changed by specifying the "neg_dentry_pc=" kernel command >> line option. >> >> Signed-off-by: Waiman Long <longman@xxxxxxxxxx> >> --- > [...] > >> @@ -603,7 +698,13 @@ static struct dentry *dentry_kill(struct dentry *dentry) >> >> if (!IS_ROOT(dentry)) { >> parent = dentry->d_parent; >> - if (unlikely(!spin_trylock(&parent->d_lock))) { >> + /* >> + * Force the killing of this negative dentry when >> + * DCACHE_KILL_NEGATIVE flag is set. >> + */ >> + if (unlikely(dentry->d_flags & DCACHE_KILL_NEGATIVE)) { >> + spin_lock(&parent->d_lock); > This looks like d_lock ordering problem (should be parent first, child > second). Why is this needed, anyway? > Yes, that is a bug. I should have used lock_parent() instead. I have a test program that generate a lot of negative dentries continuously. Using spin_trylock(), it failed most of the time when that test program was running. So I need to actually acquire the parent's d_lock to make sure that the offending negative dentry was really killed. It was there to protect against the worst case situation. I will update the patch to correct that. Thanks for spotting this. Cheers, Longman