Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 14 Jan 2017 06:20:36 +0000 (UTC)
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r312124 - head/sys/fs/tmpfs
Message-ID:  <201701140620.v0E6Kada098447@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mjg
Date: Sat Jan 14 06:20:36 2017
New Revision: 312124
URL: https://svnweb.freebsd.org/changeset/base/312124

Log:
  tmpfs: manage tm_pages_used with atomics
  
  Reviewed by:	kib (previous version)

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	Sat Jan 14 06:18:54 2017	(r312123)
+++ head/sys/fs/tmpfs/tmpfs.h	Sat Jan 14 06:20:36 2017	(r312124)
@@ -312,12 +312,12 @@ struct tmpfs_mount {
 	/* Maximum number of memory pages available for use by the file
 	 * system, set during mount time.  This variable must never be
 	 * used directly as it may be bigger than the current amount of
-	 * free memory; in the extreme case, it will hold the SIZE_MAX
+	 * free memory; in the extreme case, it will hold the ULONG_MAX
 	 * value. */
-	size_t			tm_pages_max;
+	u_long			tm_pages_max;
 
 	/* Number of pages in use by the file system. */
-	size_t			tm_pages_used;
+	u_long			tm_pages_used;
 
 	/* Pointer to the node representing the root directory of this
 	 * file system. */

Modified: head/sys/fs/tmpfs/tmpfs_subr.c
==============================================================================
--- head/sys/fs/tmpfs/tmpfs_subr.c	Sat Jan 14 06:18:54 2017	(r312123)
+++ head/sys/fs/tmpfs/tmpfs_subr.c	Sat Jan 14 06:20:36 2017	(r312124)
@@ -129,7 +129,7 @@ tmpfs_pages_check_avail(struct tmpfs_mou
 	if (tmpfs_mem_avail() < req_pages)
 		return (0);
 
-	if (tmp->tm_pages_max != SIZE_MAX &&
+	if (tmp->tm_pages_max != ULONG_MAX &&
 	    tmp->tm_pages_max < req_pages + tmpfs_pages_used(tmp))
 			return (0);
 
@@ -327,9 +327,7 @@ tmpfs_free_node(struct tmpfs_mount *tmp,
 	case VREG:
 		uobj = node->tn_reg.tn_aobj;
 		if (uobj != NULL) {
-			TMPFS_LOCK(tmp);
-			tmp->tm_pages_used -= uobj->size;
-			TMPFS_UNLOCK(tmp);
+			atomic_subtract_long(&tmp->tm_pages_used, uobj->size);
 			KASSERT((uobj->flags & OBJ_TMPFS) == 0,
 			    ("leaked OBJ_TMPFS node %p vm_obj %p", node, uobj));
 			vm_object_deallocate(uobj);
@@ -1417,9 +1415,7 @@ retry:
 	uobj->size = newpages;
 	VM_OBJECT_WUNLOCK(uobj);
 
-	TMPFS_LOCK(tmp);
-	tmp->tm_pages_used += (newpages - oldpages);
-	TMPFS_UNLOCK(tmp);
+	atomic_add_long(&tmp->tm_pages_used, newpages - oldpages);
 
 	node->tn_size = newsize;
 	return (0);

Modified: head/sys/fs/tmpfs/tmpfs_vfsops.c
==============================================================================
--- head/sys/fs/tmpfs/tmpfs_vfsops.c	Sat Jan 14 06:18:54 2017	(r312123)
+++ head/sys/fs/tmpfs/tmpfs_vfsops.c	Sat Jan 14 06:20:36 2017	(r312124)
@@ -397,7 +397,7 @@ tmpfs_statfs(struct mount *mp, struct st
 	sbp->f_bsize = PAGE_SIZE;
 
 	used = tmpfs_pages_used(tmp);
-	if (tmp->tm_pages_max != SIZE_MAX)
+	if (tmp->tm_pages_max != ULONG_MAX)
 		 sbp->f_blocks = tmp->tm_pages_max;
 	else
 		 sbp->f_blocks = used + tmpfs_mem_avail();



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201701140620.v0E6Kada098447>