mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
ipc,namespace: batch free ipc_namespace structures
Instead of waiting for an RCU grace period between each ipc_namespace structure that is being freed, wait an RCU grace period for every batch of ipc_namespace structures. Thanks to Al Viro for the suggestion of the helper function. This speeds up the run time of the test case that allocates ipc_namespaces in a loop from 6 minutes, to a little over 1 second: real 0m1.192s user 0m0.038s sys 0m1.152s Signed-off-by: Rik van Riel <riel@surriel.com> Reported-by: Chris Mason <clm@meta.com> Tested-by: Giuseppe Scrivano <gscrivan@redhat.com> Suggested-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -1709,11 +1709,6 @@ void mq_clear_sbinfo(struct ipc_namespace *ns)
|
||||
ns->mq_mnt->mnt_sb->s_fs_info = NULL;
|
||||
}
|
||||
|
||||
void mq_put_mnt(struct ipc_namespace *ns)
|
||||
{
|
||||
kern_unmount(ns->mq_mnt);
|
||||
}
|
||||
|
||||
static int __init init_mqueue_fs(void)
|
||||
{
|
||||
int error;
|
||||
|
@@ -145,10 +145,11 @@ void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
|
||||
|
||||
static void free_ipc_ns(struct ipc_namespace *ns)
|
||||
{
|
||||
/* mq_put_mnt() waits for a grace period as kern_unmount()
|
||||
* uses synchronize_rcu().
|
||||
/*
|
||||
* Caller needs to wait for an RCU grace period to have passed
|
||||
* after making the mount point inaccessible to new accesses.
|
||||
*/
|
||||
mq_put_mnt(ns);
|
||||
mntput(ns->mq_mnt);
|
||||
sem_exit_ns(ns);
|
||||
msg_exit_ns(ns);
|
||||
shm_exit_ns(ns);
|
||||
@@ -168,6 +169,12 @@ static void free_ipc(struct work_struct *unused)
|
||||
struct llist_node *node = llist_del_all(&free_ipc_list);
|
||||
struct ipc_namespace *n, *t;
|
||||
|
||||
llist_for_each_entry_safe(n, t, node, mnt_llist)
|
||||
mnt_make_shortterm(n->mq_mnt);
|
||||
|
||||
/* Wait for any last users to have gone away. */
|
||||
synchronize_rcu();
|
||||
|
||||
llist_for_each_entry_safe(n, t, node, mnt_llist)
|
||||
free_ipc_ns(n);
|
||||
}
|
||||
|
@@ -56,10 +56,8 @@ struct pid_namespace;
|
||||
|
||||
#ifdef CONFIG_POSIX_MQUEUE
|
||||
extern void mq_clear_sbinfo(struct ipc_namespace *ns);
|
||||
extern void mq_put_mnt(struct ipc_namespace *ns);
|
||||
#else
|
||||
static inline void mq_clear_sbinfo(struct ipc_namespace *ns) { }
|
||||
static inline void mq_put_mnt(struct ipc_namespace *ns) { }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SYSVIPC
|
||||
|
Reference in New Issue
Block a user