From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from fieldses.org ([173.255.197.46]:49542 "EHLO fieldses.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S966340AbcHBPFg (ORCPT ); Tue, 2 Aug 2016 11:05:36 -0400 Date: Tue, 2 Aug 2016 11:05:21 -0400 From: "J. Bruce Fields" To: Nikolay Borisov Cc: jlayton@poochiereds.net, viro@zeniv.linux.org.uk, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, ebiederm@xmission.com, containers@lists.linux-foundation.org, serge.hallyn@canonical.com Subject: Re: [RFC PATCH] locks: Show only file_locks created in the same pidns as current process Message-ID: <20160802150521.GB11767@fieldses.org> References: <1470148943-21835-1-git-send-email-kernel@kyup.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470148943-21835-1-git-send-email-kernel@kyup.com> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: On Tue, Aug 02, 2016 at 05:42:23PM +0300, Nikolay Borisov wrote: > Currently when /proc/locks is read it will show all the file locks > which are currently created on the machine. On containers, hosted > on busy servers this means that doing lsof can be very slow. I > observed up to 5 seconds stalls reading 50k locks, Do you mean just that the reading process itself was blocked, or that others were getting stuck on blocked_lock_lock? (And what process was actually reading /proc/locks, out of curiosity?) > while the container > itself had only a small number of relevant entries. Fix it by > filtering the locks listed by the pidns of the current process > and the process which created the lock. Thanks, that's interesting. So you show a lock if it was created by someone in the current pid namespace. With a special exception for the init namespace so that If a filesystem is shared between containers that means you won't necessarily be able to figure out from within a container which lock is conflicting with your lock. (I don't know if that's really a problem. I'm unfortunately short on evidence aobut what people actually use /proc/locks for....) --b. > > Signed-off-by: Nikolay Borisov > --- > fs/locks.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/fs/locks.c b/fs/locks.c > index 6333263b7bc8..53e96df4c583 100644 > --- a/fs/locks.c > +++ b/fs/locks.c > @@ -2615,9 +2615,17 @@ static int locks_show(struct seq_file *f, void *v) > { > struct locks_iterator *iter = f->private; > struct file_lock *fl, *bfl; > + struct pid_namespace *pid_ns = task_active_pid_ns(current); > + > > fl = hlist_entry(v, struct file_lock, fl_link); > > + pr_info ("Current pid_ns: %p init_pid_ns: %p, fl->fl_nspid: %p nspidof:%p\n", pid_ns, &init_pid_ns, > + fl->fl_nspid, ns_of_pid(fl->fl_nspid)); > + if ((pid_ns != &init_pid_ns) && fl->fl_nspid && > + (pid_ns != ns_of_pid(fl->fl_nspid))) > + return 0; > + > lock_get_status(f, fl, iter->li_pos, ""); > > list_for_each_entry(bfl, &fl->fl_block, fl_block) > -- > 2.5.0