Received: by 10.223.164.202 with SMTP id h10csp1590001wrb; Mon, 27 Nov 2017 04:57:15 -0800 (PST) X-Google-Smtp-Source: AGs4zMb0JPuQ+/3K17QAopcV6gDJHL9CXu9wRd09WYSRIk2h8ks1mLN68Af4w570yhurX90YwNUr X-Received: by 10.98.74.148 with SMTP id c20mr21090850pfj.200.1511787435432; Mon, 27 Nov 2017 04:57:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511787435; cv=none; d=google.com; s=arc-20160816; b=rmd5VmgpO/WzIh7hdV5CoZe1/5XpJYM4UQw5bnjOtiu5RC0+yJjmnp81XHmeLN6tFZ rU6LK1lJLzoPsCBTKn4+zKtNswvcAmsc8w3TxR7ExWooxSNcigaRe7KvUxjkbsRwcFjY f16XUi0fW9W3rNFhcQeQPfE5DbiALFanNXaHEwRbwvFv0Wv4IfrcfViTy2SAAXwrIVfP pyLvxTVQFXXKx9DCU3EGh3sm5B5JPmALJ9YO173oqupC/c9FB90/3/HtbjxNAFQgLuz9 c0NiFRKdDWrSc/6Uame4rE/8Ki1h8VK2zxS9lcwsLM+1R8zKHN2nfeAn4GJK0UXEzxSN 0npQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=9MDspdhQkToOqkb2AiPljgCNHuRDF5kMdvqm3inkIjc=; b=E81n7IybXC9hXq8OJ45qe7o59Bmw05ervNpAywFZKdMCo+s/vbO4pUofw6nfrtvO2c wOJUfU0aSaURg2oY4CNZS3/BOU2uzlg9HlOzIhnLWD/oSgRZhRxhVmliXY6iXu98mY64 qo1hq11nUu7KXtrD7jP85LqLJuW8uVAVQJPNpWFEwbPFw3diziMHnO798g72r+7JTB0a t/Ukx4d7Ph7IDiFHaZY8/4pByfyepFtIDAOdcmz6vJQ224tRvYfWH5l++Rm8ElP8jK0v mkitq3cIWJfDjexfFbPa6Tm+jle4j9nVNcVOApbVPst1n3IUAHiJHTCrxU7VNjnKz0gq 5IeA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g3si22157344pgc.280.2017.11.27.04.57.03; Mon, 27 Nov 2017 04:57:15 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752947AbdK0Mz5 (ORCPT + 77 others); Mon, 27 Nov 2017 07:55:57 -0500 Received: from mx1.redhat.com ([209.132.183.28]:42406 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752932AbdK0Mz4 (ORCPT ); Mon, 27 Nov 2017 07:55:56 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7BEDBC047B91; Mon, 27 Nov 2017 12:55:56 +0000 (UTC) Received: from helium.redhat.com (unknown [10.36.118.61]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3055962920; Mon, 27 Nov 2017 12:55:55 +0000 (UTC) From: Giuseppe Scrivano To: linux-kernel@vger.kernel.org Cc: gregkh@linuxfoundation.org, mingo@kernel.org, gscrivan@redhat.com, dave@stgolabs.net Subject: [RFC PATCH] ipc, mqueue: lazy call kern_mount_data in new namespaces Date: Mon, 27 Nov 2017 13:55:50 +0100 Message-Id: <20171127125550.15514-1-gscrivan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 27 Nov 2017 12:55:56 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org kern_mount_data is a relatively expensive operation when creating a new IPC namespace, so delay the mount until its first usage when not creating the the global namespace. On my machine, the time for creating 1000 new IPC namespaces dropped from ~8s to ~2s. Signed-off-by: Giuseppe Scrivano --- include/linux/ipc_namespace.h | 2 +- ipc/mqueue.c | 47 ++++++++++++++++++++++++++++++++++--------- ipc/namespace.c | 2 +- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h index b5630c8eb2f3..a06617c113f1 100644 --- a/include/linux/ipc_namespace.h +++ b/include/linux/ipc_namespace.h @@ -81,7 +81,7 @@ static inline void shm_destroy_orphaned(struct ipc_namespace *ns) {} #endif /* CONFIG_SYSVIPC */ #ifdef CONFIG_POSIX_MQUEUE -extern int mq_init_ns(struct ipc_namespace *ns); +extern int mq_init_ns(struct ipc_namespace *ns, bool mount); /* * POSIX Message Queue default values: * diff --git a/ipc/mqueue.c b/ipc/mqueue.c index d24025626310..46d2795bbf93 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c @@ -87,6 +87,7 @@ struct mqueue_inode_info { unsigned long qsize; /* size of queue in memory (sum of all msgs) */ }; +static struct file_system_type mqueue_fs_type; static const struct inode_operations mqueue_dir_inode_operations; static const struct file_operations mqueue_file_operations; static const struct super_operations mqueue_super_ops; @@ -776,10 +777,24 @@ static int do_mq_open(const char __user *u_name, int oflag, umode_t mode, struct filename *name; int fd, error; struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns; - struct vfsmount *mnt = ipc_ns->mq_mnt; - struct dentry *root = mnt->mnt_root; + struct vfsmount *mnt; + struct dentry *root; int ro; + spin_lock(&mq_lock); + mnt = ipc_ns->mq_mnt; + if (unlikely(!mnt)) { + mnt = kern_mount_data(&mqueue_fs_type, ipc_ns); + if (IS_ERR(mnt)) { + spin_unlock(&mq_lock); + return PTR_ERR(mnt); + } + ipc_ns->mq_mnt = mnt; + } + spin_unlock(&mq_lock); + + root = mnt->mnt_root; + audit_mq_open(oflag, mode, attr); if (IS_ERR(name = getname(u_name))) @@ -863,6 +878,9 @@ SYSCALL_DEFINE1(mq_unlink, const char __user *, u_name) struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns; struct vfsmount *mnt = ipc_ns->mq_mnt; + if (!mnt) + return -ENOENT; + name = getname(u_name); if (IS_ERR(name)) return PTR_ERR(name); @@ -1581,7 +1599,8 @@ static struct file_system_type mqueue_fs_type = { .fs_flags = FS_USERNS_MOUNT, }; -int mq_init_ns(struct ipc_namespace *ns) + +int mq_init_ns(struct ipc_namespace *ns, bool mount) { ns->mq_queues_count = 0; ns->mq_queues_max = DFLT_QUEUESMAX; @@ -1590,23 +1609,31 @@ int mq_init_ns(struct ipc_namespace *ns) ns->mq_msg_default = DFLT_MSG; ns->mq_msgsize_default = DFLT_MSGSIZE; - ns->mq_mnt = kern_mount_data(&mqueue_fs_type, ns); - if (IS_ERR(ns->mq_mnt)) { - int err = PTR_ERR(ns->mq_mnt); + if (!mount) ns->mq_mnt = NULL; - return err; + else { + int err; + + ns->mq_mnt = kern_mount_data(&mqueue_fs_type, ns); + if (IS_ERR(ns->mq_mnt)) { + err = PTR_ERR(ns->mq_mnt); + ns->mq_mnt = NULL; + return err; + } } return 0; } void mq_clear_sbinfo(struct ipc_namespace *ns) { - ns->mq_mnt->mnt_sb->s_fs_info = NULL; + if (ns->mq_mnt) + ns->mq_mnt->mnt_sb->s_fs_info = NULL; } void mq_put_mnt(struct ipc_namespace *ns) { - kern_unmount(ns->mq_mnt); + if (ns->mq_mnt) + kern_unmount(ns->mq_mnt); } static int __init init_mqueue_fs(void) @@ -1628,7 +1655,7 @@ static int __init init_mqueue_fs(void) spin_lock_init(&mq_lock); - error = mq_init_ns(&init_ipc_ns); + error = mq_init_ns(&init_ipc_ns, true); if (error) goto out_filesystem; diff --git a/ipc/namespace.c b/ipc/namespace.c index f59a89966f92..9d3689577f66 100644 --- a/ipc/namespace.c +++ b/ipc/namespace.c @@ -65,7 +65,7 @@ static struct ipc_namespace *create_ipc_ns(struct user_namespace *user_ns, if (err) goto fail_destroy_msg; - err = mq_init_ns(ns); + err = mq_init_ns(ns, false); if (err) goto fail_destroy_shm; -- 2.14.3 From 1585790090787496750@xxx Sun Dec 03 18:54:40 +0000 2017 X-GM-THRID: 1585790090787496750 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread