From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755422AbdGSUmc convert rfc822-to-8bit (ORCPT ); Wed, 19 Jul 2017 16:42:32 -0400 Received: from mx1.redhat.com ([209.132.183.28]:37034 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753888AbdGSUma (ORCPT ); Wed, 19 Jul 2017 16:42:30 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 3EFA32C155A Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=longman@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 3EFA32C155A Subject: Re: [PATCH 1/4] fs/dcache: Limit numbers of negative dentries To: Miklos Szeredi Cc: Alexander Viro , Jonathan Corbet , lkml , linux-doc@vger.kernel.org, linux-fsdevel , "Paul E. McKenney" , Andrew Morton , Ingo Molnar References: <1500298773-7510-1-git-send-email-longman@redhat.com> <1500298773-7510-2-git-send-email-longman@redhat.com> From: Waiman Long Organization: Red Hat Message-ID: <470a8774-9491-85a2-5353-1498f336e69f@redhat.com> Date: Wed, 19 Jul 2017 16:42:27 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8BIT Content-Language: en-US X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 19 Jul 2017 20:42:30 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 07/19/2017 04:24 PM, Miklos Szeredi wrote: > On Mon, Jul 17, 2017 at 3:39 PM, Waiman Long 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 >> --- > [...] > >> @@ -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