Date: Thu, 5 Dec 2019 14:38:07 +1100 From: Kubilay Kocak <koobs@FreeBSD.org> To: Konstantin Belousov <kib@FreeBSD.org>, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r355407 - head/sys/fs/tmpfs Message-ID: <d8217672-6c1c-e4a0-c4e6-7ea4a8a9721c@FreeBSD.org> In-Reply-To: <201912050003.xB503HtP008634@repo.freebsd.org> References: <201912050003.xB503HtP008634@repo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On 5/12/2019 11:03 am, Konstantin Belousov wrote: > Author: kib > Date: Thu Dec 5 00:03:17 2019 > New Revision: 355407 > URL: https://svnweb.freebsd.org/changeset/base/355407 Could you elaborate on the why/rationale? Is there memory wastage/duplication, bug(s), performance or development/maintenance benefit? The review summary doesnt appear to include this information either > Log: > Stop using per-mount tmpfs zones. > > Requested and reviewed by: jeff > Sponsored by: The FreeBSD Foundation > MFC after: 1 week > Differential revision: https://reviews.freebsd.org/D22643 > > Modified: > head/sys/fs/tmpfs/tmpfs.h > head/sys/fs/tmpfs/tmpfs_subr.c > head/sys/fs/tmpfs/tmpfs_vfsops.c > > Modified: head/sys/fs/tmpfs/tmpfs.h > ============================================================================== > --- head/sys/fs/tmpfs/tmpfs.h Wed Dec 4 23:24:40 2019 (r355406) > +++ head/sys/fs/tmpfs/tmpfs.h Thu Dec 5 00:03:17 2019 (r355407) > @@ -378,10 +378,6 @@ struct tmpfs_mount { > /* All node lock to protect the node list and tmp_pages_used. */ > struct mtx tm_allnode_lock; > > - /* Zones used to store file system meta data, per tmpfs mount. */ > - uma_zone_t tm_dirent_pool; > - uma_zone_t tm_node_pool; > - > /* Read-only status. */ > bool tm_ronly; > /* Do not use namecache. */ > @@ -493,8 +489,9 @@ struct tmpfs_dirent *tmpfs_dir_next(struct tmpfs_node > #endif > > size_t tmpfs_mem_avail(void); > - > size_t tmpfs_pages_used(struct tmpfs_mount *tmp); > +void tmpfs_subr_init(void); > +void tmpfs_subr_uninit(void); > > #endif > > > Modified: head/sys/fs/tmpfs/tmpfs_subr.c > ============================================================================== > --- head/sys/fs/tmpfs/tmpfs_subr.c Wed Dec 4 23:24:40 2019 (r355406) > +++ head/sys/fs/tmpfs/tmpfs_subr.c Thu Dec 5 00:03:17 2019 (r355407) > @@ -72,7 +72,74 @@ SYSCTL_NODE(_vfs, OID_AUTO, tmpfs, CTLFLAG_RW, 0, "tmp > > static long tmpfs_pages_reserved = TMPFS_PAGES_MINRESERVED; > > +static uma_zone_t tmpfs_dirent_pool; > +static uma_zone_t tmpfs_node_pool; > + > static int > +tmpfs_node_ctor(void *mem, int size, void *arg, int flags) > +{ > + struct tmpfs_node *node; > + > + node = mem; > + node->tn_gen++; > + node->tn_size = 0; > + node->tn_status = 0; > + node->tn_flags = 0; > + node->tn_links = 0; > + node->tn_vnode = NULL; > + node->tn_vpstate = 0; > + return (0); > +} > + > +static void > +tmpfs_node_dtor(void *mem, int size, void *arg) > +{ > + struct tmpfs_node *node; > + > + node = mem; > + node->tn_type = VNON; > +} > + > +static int > +tmpfs_node_init(void *mem, int size, int flags) > +{ > + struct tmpfs_node *node; > + > + node = mem; > + node->tn_id = 0; > + mtx_init(&node->tn_interlock, "tmpfsni", NULL, MTX_DEF); > + node->tn_gen = arc4random(); > + return (0); > +} > + > +static void > +tmpfs_node_fini(void *mem, int size) > +{ > + struct tmpfs_node *node; > + > + node = mem; > + mtx_destroy(&node->tn_interlock); > +} > + > +void > +tmpfs_subr_init(void) > +{ > + tmpfs_dirent_pool = uma_zcreate("TMPFS dirent", > + sizeof(struct tmpfs_dirent), NULL, NULL, NULL, NULL, > + UMA_ALIGN_PTR, 0); > + tmpfs_node_pool = uma_zcreate("TMPFS node", > + sizeof(struct tmpfs_node), tmpfs_node_ctor, tmpfs_node_dtor, > + tmpfs_node_init, tmpfs_node_fini, UMA_ALIGN_PTR, 0); > +} > + > +void > +tmpfs_subr_uninit(void) > +{ > + uma_zdestroy(tmpfs_node_pool); > + uma_zdestroy(tmpfs_dirent_pool); > +} > + > +static int > sysctl_mem_reserved(SYSCTL_HANDLER_ARGS) > { > int error; > @@ -219,8 +286,7 @@ tmpfs_alloc_node(struct mount *mp, struct tmpfs_mount > if ((mp->mnt_kern_flag & MNT_RDONLY) != 0) > return (EROFS); > > - nnode = (struct tmpfs_node *)uma_zalloc_arg(tmp->tm_node_pool, tmp, > - M_WAITOK); > + nnode = uma_zalloc_arg(tmpfs_node_pool, tmp, M_WAITOK); > > /* Generic initialization. */ > nnode->tn_type = type; > @@ -367,7 +433,7 @@ tmpfs_free_node_locked(struct tmpfs_mount *tmp, struct > panic("tmpfs_free_node: type %p %d", node, (int)node->tn_type); > } > > - uma_zfree(tmp->tm_node_pool, node); > + uma_zfree(tmpfs_node_pool, node); > TMPFS_LOCK(tmp); > tmpfs_free_tmp(tmp); > return (true); > @@ -434,7 +500,7 @@ tmpfs_alloc_dirent(struct tmpfs_mount *tmp, struct tmp > { > struct tmpfs_dirent *nde; > > - nde = uma_zalloc(tmp->tm_dirent_pool, M_WAITOK); > + nde = uma_zalloc(tmpfs_dirent_pool, M_WAITOK); > nde->td_node = node; > if (name != NULL) { > nde->ud.td_name = malloc(len, M_TMPFSNAME, M_WAITOK); > @@ -470,7 +536,7 @@ tmpfs_free_dirent(struct tmpfs_mount *tmp, struct tmpf > } > if (!tmpfs_dirent_duphead(de) && de->ud.td_name != NULL) > free(de->ud.td_name, M_TMPFSNAME); > - uma_zfree(tmp->tm_dirent_pool, de); > + uma_zfree(tmpfs_dirent_pool, de); > } > > void > > Modified: head/sys/fs/tmpfs/tmpfs_vfsops.c > ============================================================================== > --- head/sys/fs/tmpfs/tmpfs_vfsops.c Wed Dec 4 23:24:40 2019 (r355406) > +++ head/sys/fs/tmpfs/tmpfs_vfsops.c Thu Dec 5 00:03:17 2019 (r355407) > @@ -99,49 +99,6 @@ static const char *tmpfs_updateopts[] = { > "from", "export", "size", NULL > }; > > -static int > -tmpfs_node_ctor(void *mem, int size, void *arg, int flags) > -{ > - struct tmpfs_node *node = (struct tmpfs_node *)mem; > - > - node->tn_gen++; > - node->tn_size = 0; > - node->tn_status = 0; > - node->tn_flags = 0; > - node->tn_links = 0; > - node->tn_vnode = NULL; > - node->tn_vpstate = 0; > - > - return (0); > -} > - > -static void > -tmpfs_node_dtor(void *mem, int size, void *arg) > -{ > - struct tmpfs_node *node = (struct tmpfs_node *)mem; > - node->tn_type = VNON; > -} > - > -static int > -tmpfs_node_init(void *mem, int size, int flags) > -{ > - struct tmpfs_node *node = (struct tmpfs_node *)mem; > - node->tn_id = 0; > - > - mtx_init(&node->tn_interlock, "tmpfs node interlock", NULL, MTX_DEF); > - node->tn_gen = arc4random(); > - > - return (0); > -} > - > -static void > -tmpfs_node_fini(void *mem, int size) > -{ > - struct tmpfs_node *node = (struct tmpfs_node *)mem; > - > - mtx_destroy(&node->tn_interlock); > -} > - > /* > * Handle updates of time from writes to mmaped regions. Use > * MNT_VNODE_FOREACH_ALL instead of MNT_VNODE_FOREACH_ACTIVE, since > @@ -481,12 +438,6 @@ tmpfs_mount(struct mount *mp) > tmp->tm_pages_max = pages; > tmp->tm_pages_used = 0; > new_unrhdr64(&tmp->tm_ino_unr, 2); > - tmp->tm_dirent_pool = uma_zcreate("TMPFS dirent", > - sizeof(struct tmpfs_dirent), NULL, NULL, NULL, NULL, > - UMA_ALIGN_PTR, 0); > - tmp->tm_node_pool = uma_zcreate("TMPFS node", > - sizeof(struct tmpfs_node), tmpfs_node_ctor, tmpfs_node_dtor, > - tmpfs_node_init, tmpfs_node_fini, UMA_ALIGN_PTR, 0); > tmp->tm_ronly = (mp->mnt_flag & MNT_RDONLY) != 0; > tmp->tm_nonc = nonc; > > @@ -495,8 +446,6 @@ tmpfs_mount(struct mount *mp) > root_mode & ALLPERMS, NULL, NULL, VNOVAL, &root); > > if (error != 0 || root == NULL) { > - uma_zdestroy(tmp->tm_node_pool); > - uma_zdestroy(tmp->tm_dirent_pool); > free(tmp, M_TMPFSMNT); > return (error); > } > @@ -590,9 +539,6 @@ tmpfs_free_tmp(struct tmpfs_mount *tmp) > } > TMPFS_UNLOCK(tmp); > > - uma_zdestroy(tmp->tm_dirent_pool); > - uma_zdestroy(tmp->tm_node_pool); > - > mtx_destroy(&tmp->tm_allnode_lock); > MPASS(tmp->tm_pages_used == 0); > MPASS(tmp->tm_nodes_inuse == 0); > @@ -702,10 +648,23 @@ tmpfs_susp_clean(struct mount *mp __unused) > { > } > > +static int > +tmpfs_init(struct vfsconf *conf) > +{ > + tmpfs_subr_init(); > + return (0); > +} > + > +static int > +tmpfs_uninit(struct vfsconf *conf) > +{ > + tmpfs_subr_uninit(); > + return (0); > +} > + > /* > * tmpfs vfs operations. > */ > - > struct vfsops tmpfs_vfsops = { > .vfs_mount = tmpfs_mount, > .vfs_unmount = tmpfs_unmount, > @@ -715,5 +674,7 @@ struct vfsops tmpfs_vfsops = { > .vfs_fhtovp = tmpfs_fhtovp, > .vfs_sync = tmpfs_sync, > .vfs_susp_clean = tmpfs_susp_clean, > + .vfs_init = tmpfs_init, > + .vfs_uninit = tmpfs_uninit, > }; > VFS_SET(tmpfs_vfsops, tmpfs, VFCF_JAIL); > _______________________________________________ > svn-src-head@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/svn-src-head > To unsubscribe, send any mail to "svn-src-head-unsubscribe@freebsd.org" >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?d8217672-6c1c-e4a0-c4e6-7ea4a8a9721c>