From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nikolay Borisov Subject: Re: [RFC PATCH] locks: Show only file_locks created in the same pidns as current process Date: Tue, 2 Aug 2016 17:45:03 +0300 Message-ID: <57A0B1EF.7000603@kyup.com> References: <1470148943-21835-1-git-send-email-kernel@kyup.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1470148943-21835-1-git-send-email-kernel-6AxghH7DbtA@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: containers-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org Errors-To: containers-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org To: jlayton-vpEMnDpepFuMZCB2o+C8xQ@public.gmane.org, viro-RmSDqhL/yNMiFSDQTTA3OLVCufUGDwFn@public.gmane.org Cc: serge.hallyn-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org, containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, bfields-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org, ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org, linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: containers.vger.kernel.org On 08/02/2016 05:42 PM, 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, 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. > > 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)); Obviously I don't intend on including that in the final submission. > + 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) > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f44.google.com ([74.125.82.44]:38009 "EHLO mail-wm0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965529AbcHBOuR (ORCPT ); Tue, 2 Aug 2016 10:50:17 -0400 Received: by mail-wm0-f44.google.com with SMTP id o80so294240668wme.1 for ; Tue, 02 Aug 2016 07:50:16 -0700 (PDT) Subject: Re: [RFC PATCH] locks: Show only file_locks created in the same pidns as current process To: jlayton@poochiereds.net, viro@zeniv.linux.org.uk References: <1470148943-21835-1-git-send-email-kernel@kyup.com> Cc: serge.hallyn@canonical.com, containers@lists.linux-foundation.org, linux-kernel@vger.kernel.org, bfields@fieldses.org, ebiederm@xmission.com, linux-fsdevel@vger.kernel.org From: Nikolay Borisov Message-ID: <57A0B1EF.7000603@kyup.com> Date: Tue, 2 Aug 2016 17:45:03 +0300 MIME-Version: 1.0 In-Reply-To: <1470148943-21835-1-git-send-email-kernel@kyup.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Sender: linux-fsdevel-owner@vger.kernel.org List-ID: On 08/02/2016 05:42 PM, 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, 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. > > 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)); Obviously I don't intend on including that in the final submission. > + 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) >