linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory
@ 2017-11-06 14:39 Marc-André Lureau
  2017-11-06 14:39 ` [PATCH v2 1/9] shmem: unexport shmem_add_seals()/shmem_get_seals() Marc-André Lureau
                   ` (9 more replies)
  0 siblings, 10 replies; 17+ messages in thread
From: Marc-André Lureau @ 2017-11-06 14:39 UTC (permalink / raw)
  To: linux-mm, linux-kernel
  Cc: aarcange, hughd, nyc, mike.kravetz, Marc-André Lureau

Hi,

Recently, Mike Kravetz added hugetlbfs support to memfd. However, he
didn't add sealing support. One of the reasons to use memfd is to have
shared memory sealing when doing IPC or sharing memory with another
process with some extra safety. qemu uses shared memory & hugetables
with vhost-user (used by dpdk), so it is reasonable to use memfd
now instead for convenience and security reasons.

Thanks!

v1->v2: after Mike review,
- add "memfd-hugetlb:" prefix in memfd-test
- run fuse test on hugetlb backend memory
- rename function memfd_file_get_seals() -> memfd_file_seals_ptr()
- update commit messages
- added reviewed-by tags

RFC->v1:
- split rfc patch, after early review feedback
- added patch for memfd-test changes
- fix build with hugetlbfs disabled
- small code and commit messages improvements

Marc-André Lureau (9):
  shmem: unexport shmem_add_seals()/shmem_get_seals()
  shmem: rename functions that are memfd-related
  hugetlb: expose hugetlbfs_inode_info in header
  hugetlbfs: implement memfd sealing
  shmem: add sealing support to hugetlb-backed memfd
  memfd-tests: test hugetlbfs sealing
  memfd-test: add 'memfd-hugetlb:' prefix when testing hugetlbfs
  memfd-test: move common code to a shared unit
  memfd-test: run fuse test on hugetlb backend memory

 fs/fcntl.c                                     |   2 +-
 fs/hugetlbfs/inode.c                           |  39 +++--
 include/linux/hugetlb.h                        |  11 ++
 include/linux/shmem_fs.h                       |   6 +-
 mm/shmem.c                                     |  59 ++++---
 tools/testing/selftests/memfd/Makefile         |   5 +
 tools/testing/selftests/memfd/common.c         |  45 ++++++
 tools/testing/selftests/memfd/common.h         |   9 ++
 tools/testing/selftests/memfd/fuse_test.c      |  36 +++--
 tools/testing/selftests/memfd/memfd_test.c     | 212 ++++---------------------
 tools/testing/selftests/memfd/run_fuse_test.sh |   2 +-
 tools/testing/selftests/memfd/run_tests.sh     |   1 +
 12 files changed, 195 insertions(+), 232 deletions(-)
 create mode 100644 tools/testing/selftests/memfd/common.c
 create mode 100644 tools/testing/selftests/memfd/common.h

-- 
2.15.0.rc0.40.gaefcc5f6f

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v2 1/9] shmem: unexport shmem_add_seals()/shmem_get_seals()
  2017-11-06 14:39 [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory Marc-André Lureau
@ 2017-11-06 14:39 ` Marc-André Lureau
  2017-11-06 14:39 ` [PATCH v2 2/9] shmem: rename functions that are memfd-related Marc-André Lureau
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 17+ messages in thread
From: Marc-André Lureau @ 2017-11-06 14:39 UTC (permalink / raw)
  To: linux-mm, linux-kernel
  Cc: aarcange, hughd, nyc, mike.kravetz, Marc-André Lureau

The functions are called through shmem_fcntl() only.  And no danger in
removing the EXPORTs as the routines only work with shmem file
structs.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
---
 include/linux/shmem_fs.h | 2 --
 mm/shmem.c               | 6 ++----
 2 files changed, 2 insertions(+), 6 deletions(-)

diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h
index ed91ce57c428..1f5bf07cb8be 100644
--- a/include/linux/shmem_fs.h
+++ b/include/linux/shmem_fs.h
@@ -110,8 +110,6 @@ extern void shmem_uncharge(struct inode *inode, long pages);
 
 #ifdef CONFIG_TMPFS
 
-extern int shmem_add_seals(struct file *file, unsigned int seals);
-extern int shmem_get_seals(struct file *file);
 extern long shmem_fcntl(struct file *file, unsigned int cmd, unsigned long arg);
 
 #else
diff --git a/mm/shmem.c b/mm/shmem.c
index 07a1d22807be..37260c5e12fa 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -2722,7 +2722,7 @@ static int shmem_wait_for_pins(struct address_space *mapping)
 		     F_SEAL_GROW | \
 		     F_SEAL_WRITE)
 
-int shmem_add_seals(struct file *file, unsigned int seals)
+static int shmem_add_seals(struct file *file, unsigned int seals)
 {
 	struct inode *inode = file_inode(file);
 	struct shmem_inode_info *info = SHMEM_I(inode);
@@ -2791,16 +2791,14 @@ int shmem_add_seals(struct file *file, unsigned int seals)
 	inode_unlock(inode);
 	return error;
 }
-EXPORT_SYMBOL_GPL(shmem_add_seals);
 
-int shmem_get_seals(struct file *file)
+static int shmem_get_seals(struct file *file)
 {
 	if (file->f_op != &shmem_file_operations)
 		return -EINVAL;
 
 	return SHMEM_I(file_inode(file))->seals;
 }
-EXPORT_SYMBOL_GPL(shmem_get_seals);
 
 long shmem_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
 {
-- 
2.15.0.rc0.40.gaefcc5f6f

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 2/9] shmem: rename functions that are memfd-related
  2017-11-06 14:39 [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory Marc-André Lureau
  2017-11-06 14:39 ` [PATCH v2 1/9] shmem: unexport shmem_add_seals()/shmem_get_seals() Marc-André Lureau
@ 2017-11-06 14:39 ` Marc-André Lureau
  2017-11-06 14:39 ` [PATCH v2 3/9] hugetlb: expose hugetlbfs_inode_info in header Marc-André Lureau
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 17+ messages in thread
From: Marc-André Lureau @ 2017-11-06 14:39 UTC (permalink / raw)
  To: linux-mm, linux-kernel
  Cc: aarcange, hughd, nyc, mike.kravetz, Marc-André Lureau

Those functions are called for memfd files, backed by shmem or
hugetlb (the next patches will handle hugetlb).

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
---
 fs/fcntl.c               |  2 +-
 include/linux/shmem_fs.h |  4 ++--
 mm/shmem.c               | 10 +++++-----
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/fs/fcntl.c b/fs/fcntl.c
index 8d78ffd7b399..ad7995c64370 100644
--- a/fs/fcntl.c
+++ b/fs/fcntl.c
@@ -418,7 +418,7 @@ static long do_fcntl(int fd, unsigned int cmd, unsigned long arg,
 		break;
 	case F_ADD_SEALS:
 	case F_GET_SEALS:
-		err = shmem_fcntl(filp, cmd, arg);
+		err = memfd_fcntl(filp, cmd, arg);
 		break;
 	case F_GET_RW_HINT:
 	case F_SET_RW_HINT:
diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h
index 1f5bf07cb8be..33b659f62c2b 100644
--- a/include/linux/shmem_fs.h
+++ b/include/linux/shmem_fs.h
@@ -110,11 +110,11 @@ extern void shmem_uncharge(struct inode *inode, long pages);
 
 #ifdef CONFIG_TMPFS
 
-extern long shmem_fcntl(struct file *file, unsigned int cmd, unsigned long arg);
+extern long memfd_fcntl(struct file *file, unsigned int cmd, unsigned long arg);
 
 #else
 
-static inline long shmem_fcntl(struct file *f, unsigned int c, unsigned long a)
+static inline long memfd_fcntl(struct file *f, unsigned int c, unsigned long a)
 {
 	return -EINVAL;
 }
diff --git a/mm/shmem.c b/mm/shmem.c
index 37260c5e12fa..b7811979611f 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -2722,7 +2722,7 @@ static int shmem_wait_for_pins(struct address_space *mapping)
 		     F_SEAL_GROW | \
 		     F_SEAL_WRITE)
 
-static int shmem_add_seals(struct file *file, unsigned int seals)
+static int memfd_add_seals(struct file *file, unsigned int seals)
 {
 	struct inode *inode = file_inode(file);
 	struct shmem_inode_info *info = SHMEM_I(inode);
@@ -2792,7 +2792,7 @@ static int shmem_add_seals(struct file *file, unsigned int seals)
 	return error;
 }
 
-static int shmem_get_seals(struct file *file)
+static int memfd_get_seals(struct file *file)
 {
 	if (file->f_op != &shmem_file_operations)
 		return -EINVAL;
@@ -2800,7 +2800,7 @@ static int shmem_get_seals(struct file *file)
 	return SHMEM_I(file_inode(file))->seals;
 }
 
-long shmem_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
+long memfd_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
 {
 	long error;
 
@@ -2810,10 +2810,10 @@ long shmem_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
 		if (arg > UINT_MAX)
 			return -EINVAL;
 
-		error = shmem_add_seals(file, arg);
+		error = memfd_add_seals(file, arg);
 		break;
 	case F_GET_SEALS:
-		error = shmem_get_seals(file);
+		error = memfd_get_seals(file);
 		break;
 	default:
 		error = -EINVAL;
-- 
2.15.0.rc0.40.gaefcc5f6f

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 3/9] hugetlb: expose hugetlbfs_inode_info in header
  2017-11-06 14:39 [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory Marc-André Lureau
  2017-11-06 14:39 ` [PATCH v2 1/9] shmem: unexport shmem_add_seals()/shmem_get_seals() Marc-André Lureau
  2017-11-06 14:39 ` [PATCH v2 2/9] shmem: rename functions that are memfd-related Marc-André Lureau
@ 2017-11-06 14:39 ` Marc-André Lureau
  2017-11-06 14:39 ` [PATCH v2 4/9] hugetlbfs: implement memfd sealing Marc-André Lureau
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 17+ messages in thread
From: Marc-André Lureau @ 2017-11-06 14:39 UTC (permalink / raw)
  To: linux-mm, linux-kernel
  Cc: aarcange, hughd, nyc, mike.kravetz, Marc-André Lureau

hugetlbfs inode information will need to be accessed by code in mm/shmem.c
for file sealing operations.  Move inode information definition from .c
file to header for needed access.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
---
 fs/hugetlbfs/inode.c    | 10 ----------
 include/linux/hugetlb.h | 10 ++++++++++
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index ed113ea17aff..f57aab929e41 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -55,16 +55,6 @@ struct hugetlbfs_config {
 	umode_t			mode;
 };
 
-struct hugetlbfs_inode_info {
-	struct shared_policy policy;
-	struct inode vfs_inode;
-};
-
-static inline struct hugetlbfs_inode_info *HUGETLBFS_I(struct inode *inode)
-{
-	return container_of(inode, struct hugetlbfs_inode_info, vfs_inode);
-}
-
 int sysctl_hugetlb_shm_group;
 
 enum {
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index fbf5b31d47ee..590a77433a14 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -279,6 +279,16 @@ static inline struct hugetlbfs_sb_info *HUGETLBFS_SB(struct super_block *sb)
 	return sb->s_fs_info;
 }
 
+struct hugetlbfs_inode_info {
+	struct shared_policy policy;
+	struct inode vfs_inode;
+};
+
+static inline struct hugetlbfs_inode_info *HUGETLBFS_I(struct inode *inode)
+{
+	return container_of(inode, struct hugetlbfs_inode_info, vfs_inode);
+}
+
 extern const struct file_operations hugetlbfs_file_operations;
 extern const struct vm_operations_struct hugetlb_vm_ops;
 struct file *hugetlb_file_setup(const char *name, size_t size, vm_flags_t acct,
-- 
2.15.0.rc0.40.gaefcc5f6f

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 4/9] hugetlbfs: implement memfd sealing
  2017-11-06 14:39 [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory Marc-André Lureau
                   ` (2 preceding siblings ...)
  2017-11-06 14:39 ` [PATCH v2 3/9] hugetlb: expose hugetlbfs_inode_info in header Marc-André Lureau
@ 2017-11-06 14:39 ` Marc-André Lureau
  2017-11-06 14:39 ` [PATCH v2 5/9] shmem: add sealing support to hugetlb-backed memfd Marc-André Lureau
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 17+ messages in thread
From: Marc-André Lureau @ 2017-11-06 14:39 UTC (permalink / raw)
  To: linux-mm, linux-kernel
  Cc: aarcange, hughd, nyc, mike.kravetz, Marc-André Lureau

Implements memfd sealing, similar to shmem:
- WRITE: deny fallocate(PUNCH_HOLE). mmap() write is denied in
  memfd_add_seals(). write() doesn't exist for hugetlbfs.
- SHRINK: added similar check as shmem_setattr()
- GROW: added similar check as shmem_setattr() & shmem_fallocate()

Except write() operation that doesn't exist with hugetlbfs, that
should make sealing as close as it can be to shmem support.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
---
 fs/hugetlbfs/inode.c    | 29 +++++++++++++++++++++++++++--
 include/linux/hugetlb.h |  1 +
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index f57aab929e41..01f5aa6ea57a 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -510,8 +510,16 @@ static long hugetlbfs_punch_hole(struct inode *inode, loff_t offset, loff_t len)
 
 	if (hole_end > hole_start) {
 		struct address_space *mapping = inode->i_mapping;
+		struct hugetlbfs_inode_info *info = HUGETLBFS_I(inode);
 
 		inode_lock(inode);
+
+		/* protected by i_mutex */
+		if (info->seals & F_SEAL_WRITE) {
+			inode_unlock(inode);
+			return -EPERM;
+		}
+
 		i_mmap_lock_write(mapping);
 		if (!RB_EMPTY_ROOT(&mapping->i_mmap.rb_root))
 			hugetlb_vmdelete_list(&mapping->i_mmap,
@@ -529,6 +537,7 @@ static long hugetlbfs_fallocate(struct file *file, int mode, loff_t offset,
 				loff_t len)
 {
 	struct inode *inode = file_inode(file);
+	struct hugetlbfs_inode_info *info = HUGETLBFS_I(inode);
 	struct address_space *mapping = inode->i_mapping;
 	struct hstate *h = hstate_inode(inode);
 	struct vm_area_struct pseudo_vma;
@@ -560,6 +569,11 @@ static long hugetlbfs_fallocate(struct file *file, int mode, loff_t offset,
 	if (error)
 		goto out;
 
+	if ((info->seals & F_SEAL_GROW) && offset + len > inode->i_size) {
+		error = -EPERM;
+		goto out;
+	}
+
 	/*
 	 * Initialize a pseudo vma as this is required by the huge page
 	 * allocation routines.  If NUMA is configured, use page index
@@ -650,6 +664,7 @@ static int hugetlbfs_setattr(struct dentry *dentry, struct iattr *attr)
 	struct hstate *h = hstate_inode(inode);
 	int error;
 	unsigned int ia_valid = attr->ia_valid;
+	struct hugetlbfs_inode_info *info = HUGETLBFS_I(inode);
 
 	BUG_ON(!inode);
 
@@ -658,10 +673,17 @@ static int hugetlbfs_setattr(struct dentry *dentry, struct iattr *attr)
 		return error;
 
 	if (ia_valid & ATTR_SIZE) {
+		loff_t oldsize = inode->i_size;
+		loff_t newsize = attr->ia_size;
+
 		error = -EINVAL;
-		if (attr->ia_size & ~huge_page_mask(h))
+		if (newsize & ~huge_page_mask(h))
 			return -EINVAL;
-		error = hugetlb_vmtruncate(inode, attr->ia_size);
+		/* protected by i_mutex */
+		if ((newsize < oldsize && (info->seals & F_SEAL_SHRINK)) ||
+		    (newsize > oldsize && (info->seals & F_SEAL_GROW)))
+			return -EPERM;
+		error = hugetlb_vmtruncate(inode, newsize);
 		if (error)
 			return error;
 	}
@@ -713,6 +735,8 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb,
 
 	inode = new_inode(sb);
 	if (inode) {
+		struct hugetlbfs_inode_info *info = HUGETLBFS_I(inode);
+
 		inode->i_ino = get_next_ino();
 		inode_init_owner(inode, dir, mode);
 		lockdep_set_class(&inode->i_mapping->i_mmap_rwsem,
@@ -720,6 +744,7 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb,
 		inode->i_mapping->a_ops = &hugetlbfs_aops;
 		inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
 		inode->i_mapping->private_data = resv_map;
+		info->seals = F_SEAL_SEAL;
 		switch (mode & S_IFMT) {
 		default:
 			init_special_inode(inode, mode, dev);
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index 590a77433a14..2a21c59a9952 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -282,6 +282,7 @@ static inline struct hugetlbfs_sb_info *HUGETLBFS_SB(struct super_block *sb)
 struct hugetlbfs_inode_info {
 	struct shared_policy policy;
 	struct inode vfs_inode;
+	unsigned int seals;
 };
 
 static inline struct hugetlbfs_inode_info *HUGETLBFS_I(struct inode *inode)
-- 
2.15.0.rc0.40.gaefcc5f6f

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 5/9] shmem: add sealing support to hugetlb-backed memfd
  2017-11-06 14:39 [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory Marc-André Lureau
                   ` (3 preceding siblings ...)
  2017-11-06 14:39 ` [PATCH v2 4/9] hugetlbfs: implement memfd sealing Marc-André Lureau
@ 2017-11-06 14:39 ` Marc-André Lureau
  2017-11-06 23:56   ` Mike Kravetz
  2017-11-06 14:39 ` [PATCH v2 6/9] memfd-tests: test hugetlbfs sealing Marc-André Lureau
                   ` (4 subsequent siblings)
  9 siblings, 1 reply; 17+ messages in thread
From: Marc-André Lureau @ 2017-11-06 14:39 UTC (permalink / raw)
  To: linux-mm, linux-kernel
  Cc: aarcange, hughd, nyc, mike.kravetz, Marc-André Lureau

Adapt add_seals()/get_seals() to work with hugetbfs-backed memory.

Teach memfd_create() to allow sealing operations on MFD_HUGETLB.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 mm/shmem.c | 47 ++++++++++++++++++++++++++++-------------------
 1 file changed, 28 insertions(+), 19 deletions(-)

diff --git a/mm/shmem.c b/mm/shmem.c
index b7811979611f..b08ba5d84d84 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -2717,6 +2717,19 @@ static int shmem_wait_for_pins(struct address_space *mapping)
 	return error;
 }
 
+static unsigned int *memfd_file_seals_ptr(struct file *file)
+{
+	if (file->f_op == &shmem_file_operations)
+		return &SHMEM_I(file_inode(file))->seals;
+
+#ifdef CONFIG_HUGETLBFS
+	if (file->f_op == &hugetlbfs_file_operations)
+		return &HUGETLBFS_I(file_inode(file))->seals;
+#endif
+
+	return NULL;
+}
+
 #define F_ALL_SEALS (F_SEAL_SEAL | \
 		     F_SEAL_SHRINK | \
 		     F_SEAL_GROW | \
@@ -2725,7 +2738,7 @@ static int shmem_wait_for_pins(struct address_space *mapping)
 static int memfd_add_seals(struct file *file, unsigned int seals)
 {
 	struct inode *inode = file_inode(file);
-	struct shmem_inode_info *info = SHMEM_I(inode);
+	unsigned int *file_seals;
 	int error;
 
 	/*
@@ -2758,8 +2771,6 @@ static int memfd_add_seals(struct file *file, unsigned int seals)
 	 * other file types.
 	 */
 
-	if (file->f_op != &shmem_file_operations)
-		return -EINVAL;
 	if (!(file->f_mode & FMODE_WRITE))
 		return -EPERM;
 	if (seals & ~(unsigned int)F_ALL_SEALS)
@@ -2767,12 +2778,18 @@ static int memfd_add_seals(struct file *file, unsigned int seals)
 
 	inode_lock(inode);
 
-	if (info->seals & F_SEAL_SEAL) {
+	file_seals = memfd_file_seals_ptr(file);
+	if (!file_seals) {
+		error = -EINVAL;
+		goto unlock;
+	}
+
+	if (*file_seals & F_SEAL_SEAL) {
 		error = -EPERM;
 		goto unlock;
 	}
 
-	if ((seals & F_SEAL_WRITE) && !(info->seals & F_SEAL_WRITE)) {
+	if ((seals & F_SEAL_WRITE) && !(*file_seals & F_SEAL_WRITE)) {
 		error = mapping_deny_writable(file->f_mapping);
 		if (error)
 			goto unlock;
@@ -2784,7 +2801,7 @@ static int memfd_add_seals(struct file *file, unsigned int seals)
 		}
 	}
 
-	info->seals |= seals;
+	*file_seals |= seals;
 	error = 0;
 
 unlock:
@@ -2794,10 +2811,9 @@ static int memfd_add_seals(struct file *file, unsigned int seals)
 
 static int memfd_get_seals(struct file *file)
 {
-	if (file->f_op != &shmem_file_operations)
-		return -EINVAL;
+	unsigned int *seals = memfd_file_seals_ptr(file);
 
-	return SHMEM_I(file_inode(file))->seals;
+	return seals ? *seals : -EINVAL;
 }
 
 long memfd_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
@@ -3657,7 +3673,7 @@ SYSCALL_DEFINE2(memfd_create,
 		const char __user *, uname,
 		unsigned int, flags)
 {
-	struct shmem_inode_info *info;
+	unsigned int *file_seals;
 	struct file *file;
 	int fd, error;
 	char *name;
@@ -3667,9 +3683,6 @@ SYSCALL_DEFINE2(memfd_create,
 		if (flags & ~(unsigned int)MFD_ALL_FLAGS)
 			return -EINVAL;
 	} else {
-		/* Sealing not supported in hugetlbfs (MFD_HUGETLB) */
-		if (flags & MFD_ALLOW_SEALING)
-			return -EINVAL;
 		/* Allow huge page size encoding in flags. */
 		if (flags & ~(unsigned int)(MFD_ALL_FLAGS |
 				(MFD_HUGE_MASK << MFD_HUGE_SHIFT)))
@@ -3722,12 +3735,8 @@ SYSCALL_DEFINE2(memfd_create,
 	file->f_flags |= O_RDWR | O_LARGEFILE;
 
 	if (flags & MFD_ALLOW_SEALING) {
-		/*
-		 * flags check at beginning of function ensures
-		 * this is not a hugetlbfs (MFD_HUGETLB) file.
-		 */
-		info = SHMEM_I(file_inode(file));
-		info->seals &= ~F_SEAL_SEAL;
+		file_seals = memfd_file_seals_ptr(file);
+		*file_seals &= ~F_SEAL_SEAL;
 	}
 
 	fd_install(fd, file);
-- 
2.15.0.rc0.40.gaefcc5f6f

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 6/9] memfd-tests: test hugetlbfs sealing
  2017-11-06 14:39 [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory Marc-André Lureau
                   ` (4 preceding siblings ...)
  2017-11-06 14:39 ` [PATCH v2 5/9] shmem: add sealing support to hugetlb-backed memfd Marc-André Lureau
@ 2017-11-06 14:39 ` Marc-André Lureau
  2017-11-07  1:30   ` Mike Kravetz
  2017-11-06 14:39 ` [PATCH v2 7/9] memfd-test: add 'memfd-hugetlb:' prefix when testing hugetlbfs Marc-André Lureau
                   ` (3 subsequent siblings)
  9 siblings, 1 reply; 17+ messages in thread
From: Marc-André Lureau @ 2017-11-06 14:39 UTC (permalink / raw)
  To: linux-mm, linux-kernel
  Cc: aarcange, hughd, nyc, mike.kravetz, Marc-André Lureau

Remove most of the special-casing of hugetlbfs now that sealing
is supported.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 tools/testing/selftests/memfd/memfd_test.c | 150 +++--------------------------
 1 file changed, 15 insertions(+), 135 deletions(-)

diff --git a/tools/testing/selftests/memfd/memfd_test.c b/tools/testing/selftests/memfd/memfd_test.c
index 845e5f67b6f0..cca957a06525 100644
--- a/tools/testing/selftests/memfd/memfd_test.c
+++ b/tools/testing/selftests/memfd/memfd_test.c
@@ -513,6 +513,10 @@ static void mfd_assert_grow_write(int fd)
 	static char *buf;
 	ssize_t l;
 
+	/* hugetlbfs does not support write */
+	if (hugetlbfs_test)
+		return;
+
 	buf = malloc(mfd_def_size * 8);
 	if (!buf) {
 		printf("malloc(%d) failed: %m\n", mfd_def_size * 8);
@@ -533,6 +537,10 @@ static void mfd_fail_grow_write(int fd)
 	static char *buf;
 	ssize_t l;
 
+	/* hugetlbfs does not support write */
+	if (hugetlbfs_test)
+		return;
+
 	buf = malloc(mfd_def_size * 8);
 	if (!buf) {
 		printf("malloc(%d) failed: %m\n", mfd_def_size * 8);
@@ -627,18 +635,13 @@ static void test_create(void)
 	fd = mfd_assert_new("", 0, MFD_CLOEXEC);
 	close(fd);
 
-	if (!hugetlbfs_test) {
-		/* verify MFD_ALLOW_SEALING is allowed */
-		fd = mfd_assert_new("", 0, MFD_ALLOW_SEALING);
-		close(fd);
-
-		/* verify MFD_ALLOW_SEALING | MFD_CLOEXEC is allowed */
-		fd = mfd_assert_new("", 0, MFD_ALLOW_SEALING | MFD_CLOEXEC);
-		close(fd);
-	} else {
-		/* sealing is not supported on hugetlbfs */
-		mfd_fail_new("", MFD_ALLOW_SEALING);
-	}
+	/* verify MFD_ALLOW_SEALING is allowed */
+	fd = mfd_assert_new("", 0, MFD_ALLOW_SEALING);
+	close(fd);
+
+	/* verify MFD_ALLOW_SEALING | MFD_CLOEXEC is allowed */
+	fd = mfd_assert_new("", 0, MFD_ALLOW_SEALING | MFD_CLOEXEC);
+	close(fd);
 }
 
 /*
@@ -649,10 +652,6 @@ static void test_basic(void)
 {
 	int fd;
 
-	/* hugetlbfs does not contain sealing support */
-	if (hugetlbfs_test)
-		return;
-
 	printf("%s BASIC\n", MEMFD_STR);
 
 	fd = mfd_assert_new("kern_memfd_basic",
@@ -697,28 +696,6 @@ static void test_basic(void)
 	close(fd);
 }
 
-/*
- * hugetlbfs doesn't support seals or write, so just verify grow and shrink
- * on a hugetlbfs file created via memfd_create.
- */
-static void test_hugetlbfs_grow_shrink(void)
-{
-	int fd;
-
-	printf("%s HUGETLBFS-GROW-SHRINK\n", MEMFD_STR);
-
-	fd = mfd_assert_new("kern_memfd_seal_write",
-			    mfd_def_size,
-			    MFD_CLOEXEC);
-
-	mfd_assert_read(fd);
-	mfd_assert_write(fd);
-	mfd_assert_shrink(fd);
-	mfd_assert_grow(fd);
-
-	close(fd);
-}
-
 /*
  * Test SEAL_WRITE
  * Test whether SEAL_WRITE actually prevents modifications.
@@ -727,13 +704,6 @@ static void test_seal_write(void)
 {
 	int fd;
 
-	/*
-	 * hugetlbfs does not contain sealing or write support.  Just test
-	 * basic grow and shrink via test_hugetlbfs_grow_shrink.
-	 */
-	if (hugetlbfs_test)
-		return test_hugetlbfs_grow_shrink();
-
 	printf("%s SEAL-WRITE\n", MEMFD_STR);
 
 	fd = mfd_assert_new("kern_memfd_seal_write",
@@ -760,10 +730,6 @@ static void test_seal_shrink(void)
 {
 	int fd;
 
-	/* hugetlbfs does not contain sealing support */
-	if (hugetlbfs_test)
-		return;
-
 	printf("%s SEAL-SHRINK\n", MEMFD_STR);
 
 	fd = mfd_assert_new("kern_memfd_seal_shrink",
@@ -790,10 +756,6 @@ static void test_seal_grow(void)
 {
 	int fd;
 
-	/* hugetlbfs does not contain sealing support */
-	if (hugetlbfs_test)
-		return;
-
 	printf("%s SEAL-GROW\n", MEMFD_STR);
 
 	fd = mfd_assert_new("kern_memfd_seal_grow",
@@ -820,10 +782,6 @@ static void test_seal_resize(void)
 {
 	int fd;
 
-	/* hugetlbfs does not contain sealing support */
-	if (hugetlbfs_test)
-		return;
-
 	printf("%s SEAL-RESIZE\n", MEMFD_STR);
 
 	fd = mfd_assert_new("kern_memfd_seal_resize",
@@ -842,32 +800,6 @@ static void test_seal_resize(void)
 	close(fd);
 }
 
-/*
- * hugetlbfs does not support seals.  Basic test to dup the memfd created
- * fd and perform some basic operations on it.
- */
-static void hugetlbfs_dup(char *b_suffix)
-{
-	int fd, fd2;
-
-	printf("%s HUGETLBFS-DUP %s\n", MEMFD_STR, b_suffix);
-
-	fd = mfd_assert_new("kern_memfd_share_dup",
-			    mfd_def_size,
-			    MFD_CLOEXEC);
-
-	fd2 = mfd_assert_dup(fd);
-
-	mfd_assert_read(fd);
-	mfd_assert_write(fd);
-
-	mfd_assert_shrink(fd2);
-	mfd_assert_grow(fd2);
-
-	close(fd2);
-	close(fd);
-}
-
 /*
  * Test sharing via dup()
  * Test that seals are shared between dupped FDs and they're all equal.
@@ -876,15 +808,6 @@ static void test_share_dup(char *banner, char *b_suffix)
 {
 	int fd, fd2;
 
-	/*
-	 * hugetlbfs does not contain sealing support.  Perform some
-	 * basic testing on dup'ed fd instead via hugetlbfs_dup.
-	 */
-	if (hugetlbfs_test) {
-		hugetlbfs_dup(b_suffix);
-		return;
-	}
-
 	printf("%s %s %s\n", MEMFD_STR, banner, b_suffix);
 
 	fd = mfd_assert_new("kern_memfd_share_dup",
@@ -927,10 +850,6 @@ static void test_share_mmap(char *banner, char *b_suffix)
 	int fd;
 	void *p;
 
-	/* hugetlbfs does not contain sealing support */
-	if (hugetlbfs_test)
-		return;
-
 	printf("%s %s %s\n", MEMFD_STR,  banner, b_suffix);
 
 	fd = mfd_assert_new("kern_memfd_share_mmap",
@@ -955,32 +874,6 @@ static void test_share_mmap(char *banner, char *b_suffix)
 	close(fd);
 }
 
-/*
- * Basic test to make sure we can open the hugetlbfs fd via /proc and
- * perform some simple operations on it.
- */
-static void hugetlbfs_proc_open(char *b_suffix)
-{
-	int fd, fd2;
-
-	printf("%s HUGETLBFS-PROC-OPEN %s\n", MEMFD_STR, b_suffix);
-
-	fd = mfd_assert_new("kern_memfd_share_open",
-			    mfd_def_size,
-			    MFD_CLOEXEC);
-
-	fd2 = mfd_assert_open(fd, O_RDWR, 0);
-
-	mfd_assert_read(fd);
-	mfd_assert_write(fd);
-
-	mfd_assert_shrink(fd2);
-	mfd_assert_grow(fd2);
-
-	close(fd2);
-	close(fd);
-}
-
 /*
  * Test sealing with open(/proc/self/fd/%d)
  * Via /proc we can get access to a separate file-context for the same memfd.
@@ -991,15 +884,6 @@ static void test_share_open(char *banner, char *b_suffix)
 {
 	int fd, fd2;
 
-	/*
-	 * hugetlbfs does not contain sealing support.  So test basic
-	 * functionality of using /proc fd via hugetlbfs_proc_open
-	 */
-	if (hugetlbfs_test) {
-		hugetlbfs_proc_open(b_suffix);
-		return;
-	}
-
 	printf("%s %s %s\n", MEMFD_STR, banner, b_suffix);
 
 	fd = mfd_assert_new("kern_memfd_share_open",
@@ -1043,10 +927,6 @@ static void test_share_fork(char *banner, char *b_suffix)
 	int fd;
 	pid_t pid;
 
-	/* hugetlbfs does not contain sealing support */
-	if (hugetlbfs_test)
-		return;
-
 	printf("%s %s %s\n", MEMFD_STR, banner, b_suffix);
 
 	fd = mfd_assert_new("kern_memfd_share_fork",
-- 
2.15.0.rc0.40.gaefcc5f6f

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 7/9] memfd-test: add 'memfd-hugetlb:' prefix when testing hugetlbfs
  2017-11-06 14:39 [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory Marc-André Lureau
                   ` (5 preceding siblings ...)
  2017-11-06 14:39 ` [PATCH v2 6/9] memfd-tests: test hugetlbfs sealing Marc-André Lureau
@ 2017-11-06 14:39 ` Marc-André Lureau
  2017-11-07  1:31   ` Mike Kravetz
  2017-11-06 14:39 ` [PATCH v2 8/9] memfd-test: move common code to a shared unit Marc-André Lureau
                   ` (2 subsequent siblings)
  9 siblings, 1 reply; 17+ messages in thread
From: Marc-André Lureau @ 2017-11-06 14:39 UTC (permalink / raw)
  To: linux-mm, linux-kernel
  Cc: aarcange, hughd, nyc, mike.kravetz, Marc-André Lureau

Suggested-by: Mike Kravetz <mike.kravetz@oracle.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 tools/testing/selftests/memfd/memfd_test.c | 26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/tools/testing/selftests/memfd/memfd_test.c b/tools/testing/selftests/memfd/memfd_test.c
index cca957a06525..955d09ee16ca 100644
--- a/tools/testing/selftests/memfd/memfd_test.c
+++ b/tools/testing/selftests/memfd/memfd_test.c
@@ -20,6 +20,7 @@
 #include <unistd.h>
 
 #define MEMFD_STR	"memfd:"
+#define MEMFD_HUGE_STR	"memfd-hugetlb:"
 #define SHARED_FT_STR	"(shared file-table)"
 
 #define MFD_DEF_SIZE 8192
@@ -30,6 +31,7 @@
  */
 static int hugetlbfs_test;
 static size_t mfd_def_size = MFD_DEF_SIZE;
+static const char *memfd_str = MEMFD_STR;
 
 /*
  * Copied from mlock2-tests.c
@@ -606,7 +608,7 @@ static void test_create(void)
 	char buf[2048];
 	int fd;
 
-	printf("%s CREATE\n", MEMFD_STR);
+	printf("%s CREATE\n", memfd_str);
 
 	/* test NULL name */
 	mfd_fail_new(NULL, 0);
@@ -652,7 +654,7 @@ static void test_basic(void)
 {
 	int fd;
 
-	printf("%s BASIC\n", MEMFD_STR);
+	printf("%s BASIC\n", memfd_str);
 
 	fd = mfd_assert_new("kern_memfd_basic",
 			    mfd_def_size,
@@ -704,7 +706,7 @@ static void test_seal_write(void)
 {
 	int fd;
 
-	printf("%s SEAL-WRITE\n", MEMFD_STR);
+	printf("%s SEAL-WRITE\n", memfd_str);
 
 	fd = mfd_assert_new("kern_memfd_seal_write",
 			    mfd_def_size,
@@ -730,7 +732,7 @@ static void test_seal_shrink(void)
 {
 	int fd;
 
-	printf("%s SEAL-SHRINK\n", MEMFD_STR);
+	printf("%s SEAL-SHRINK\n", memfd_str);
 
 	fd = mfd_assert_new("kern_memfd_seal_shrink",
 			    mfd_def_size,
@@ -756,7 +758,7 @@ static void test_seal_grow(void)
 {
 	int fd;
 
-	printf("%s SEAL-GROW\n", MEMFD_STR);
+	printf("%s SEAL-GROW\n", memfd_str);
 
 	fd = mfd_assert_new("kern_memfd_seal_grow",
 			    mfd_def_size,
@@ -782,7 +784,7 @@ static void test_seal_resize(void)
 {
 	int fd;
 
-	printf("%s SEAL-RESIZE\n", MEMFD_STR);
+	printf("%s SEAL-RESIZE\n", memfd_str);
 
 	fd = mfd_assert_new("kern_memfd_seal_resize",
 			    mfd_def_size,
@@ -808,7 +810,7 @@ static void test_share_dup(char *banner, char *b_suffix)
 {
 	int fd, fd2;
 
-	printf("%s %s %s\n", MEMFD_STR, banner, b_suffix);
+	printf("%s %s %s\n", memfd_str, banner, b_suffix);
 
 	fd = mfd_assert_new("kern_memfd_share_dup",
 			    mfd_def_size,
@@ -850,7 +852,7 @@ static void test_share_mmap(char *banner, char *b_suffix)
 	int fd;
 	void *p;
 
-	printf("%s %s %s\n", MEMFD_STR,  banner, b_suffix);
+	printf("%s %s %s\n", memfd_str,  banner, b_suffix);
 
 	fd = mfd_assert_new("kern_memfd_share_mmap",
 			    mfd_def_size,
@@ -884,7 +886,7 @@ static void test_share_open(char *banner, char *b_suffix)
 {
 	int fd, fd2;
 
-	printf("%s %s %s\n", MEMFD_STR, banner, b_suffix);
+	printf("%s %s %s\n", memfd_str, banner, b_suffix);
 
 	fd = mfd_assert_new("kern_memfd_share_open",
 			    mfd_def_size,
@@ -927,7 +929,7 @@ static void test_share_fork(char *banner, char *b_suffix)
 	int fd;
 	pid_t pid;
 
-	printf("%s %s %s\n", MEMFD_STR, banner, b_suffix);
+	printf("%s %s %s\n", memfd_str, banner, b_suffix);
 
 	fd = mfd_assert_new("kern_memfd_share_fork",
 			    mfd_def_size,
@@ -963,7 +965,11 @@ int main(int argc, char **argv)
 			}
 
 			hugetlbfs_test = 1;
+			memfd_str = MEMFD_HUGE_STR;
 			mfd_def_size = hpage_size * 2;
+		} else {
+			printf("Unknown option: %s\n", argv[1]);
+			abort();
 		}
 	}
 
-- 
2.15.0.rc0.40.gaefcc5f6f

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 8/9] memfd-test: move common code to a shared unit
  2017-11-06 14:39 [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory Marc-André Lureau
                   ` (6 preceding siblings ...)
  2017-11-06 14:39 ` [PATCH v2 7/9] memfd-test: add 'memfd-hugetlb:' prefix when testing hugetlbfs Marc-André Lureau
@ 2017-11-06 14:39 ` Marc-André Lureau
  2017-11-07  1:32   ` Mike Kravetz
  2017-11-06 14:39 ` [PATCH v2 9/9] memfd-test: run fuse test on hugetlb backend memory Marc-André Lureau
  2017-11-07  1:47 ` [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory Mike Kravetz
  9 siblings, 1 reply; 17+ messages in thread
From: Marc-André Lureau @ 2017-11-06 14:39 UTC (permalink / raw)
  To: linux-mm, linux-kernel
  Cc: aarcange, hughd, nyc, mike.kravetz, Marc-André Lureau

The memfd & fuse tests will share more common code in the following
commits to test hugetlb support.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 tools/testing/selftests/memfd/Makefile     |  5 ++++
 tools/testing/selftests/memfd/common.c     | 45 ++++++++++++++++++++++++++++++
 tools/testing/selftests/memfd/common.h     |  9 ++++++
 tools/testing/selftests/memfd/fuse_test.c  |  8 ++----
 tools/testing/selftests/memfd/memfd_test.c | 36 ++----------------------
 5 files changed, 63 insertions(+), 40 deletions(-)
 create mode 100644 tools/testing/selftests/memfd/common.c
 create mode 100644 tools/testing/selftests/memfd/common.h

diff --git a/tools/testing/selftests/memfd/Makefile b/tools/testing/selftests/memfd/Makefile
index 3926a0409dda..a5276a91dfbf 100644
--- a/tools/testing/selftests/memfd/Makefile
+++ b/tools/testing/selftests/memfd/Makefile
@@ -12,3 +12,8 @@ fuse_mnt.o: CFLAGS += $(shell pkg-config fuse --cflags)
 include ../lib.mk
 
 $(OUTPUT)/fuse_mnt: LDLIBS += $(shell pkg-config fuse --libs)
+
+$(OUTPUT)/memfd_test: memfd_test.c common.o
+$(OUTPUT)/fuse_test: fuse_test.c common.o
+
+EXTRA_CLEAN = common.o
diff --git a/tools/testing/selftests/memfd/common.c b/tools/testing/selftests/memfd/common.c
new file mode 100644
index 000000000000..7ed269cd3abb
--- /dev/null
+++ b/tools/testing/selftests/memfd/common.c
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: GPL-2.0
+#define _GNU_SOURCE
+#define __EXPORTED_HEADERS__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <linux/fcntl.h>
+#include <linux/memfd.h>
+#include <sys/syscall.h>
+
+#include "common.h"
+
+int hugetlbfs_test = 0;
+
+/*
+ * Copied from mlock2-tests.c
+ */
+unsigned long default_huge_page_size(void)
+{
+	unsigned long hps = 0;
+	char *line = NULL;
+	size_t linelen = 0;
+	FILE *f = fopen("/proc/meminfo", "r");
+
+	if (!f)
+		return 0;
+	while (getline(&line, &linelen, f) > 0) {
+		if (sscanf(line, "Hugepagesize:       %lu kB", &hps) == 1) {
+			hps <<= 10;
+			break;
+		}
+	}
+
+	free(line);
+	fclose(f);
+	return hps;
+}
+
+int sys_memfd_create(const char *name, unsigned int flags)
+{
+	if (hugetlbfs_test)
+		flags |= MFD_HUGETLB;
+
+	return syscall(__NR_memfd_create, name, flags);
+}
diff --git a/tools/testing/selftests/memfd/common.h b/tools/testing/selftests/memfd/common.h
new file mode 100644
index 000000000000..522d2c630bd8
--- /dev/null
+++ b/tools/testing/selftests/memfd/common.h
@@ -0,0 +1,9 @@
+#ifndef COMMON_H_
+#define COMMON_H_
+
+extern int hugetlbfs_test;
+
+unsigned long default_huge_page_size(void);
+int sys_memfd_create(const char *name, unsigned int flags);
+
+#endif
diff --git a/tools/testing/selftests/memfd/fuse_test.c b/tools/testing/selftests/memfd/fuse_test.c
index 1ccb7a3eb14b..795a25ba8521 100644
--- a/tools/testing/selftests/memfd/fuse_test.c
+++ b/tools/testing/selftests/memfd/fuse_test.c
@@ -33,15 +33,11 @@
 #include <sys/wait.h>
 #include <unistd.h>
 
+#include "common.h"
+
 #define MFD_DEF_SIZE 8192
 #define STACK_SIZE 65536
 
-static int sys_memfd_create(const char *name,
-			    unsigned int flags)
-{
-	return syscall(__NR_memfd_create, name, flags);
-}
-
 static int mfd_assert_new(const char *name, loff_t sz, unsigned int flags)
 {
 	int r, fd;
diff --git a/tools/testing/selftests/memfd/memfd_test.c b/tools/testing/selftests/memfd/memfd_test.c
index 955d09ee16ca..4c049b6b6985 100644
--- a/tools/testing/selftests/memfd/memfd_test.c
+++ b/tools/testing/selftests/memfd/memfd_test.c
@@ -19,6 +19,8 @@
 #include <sys/wait.h>
 #include <unistd.h>
 
+#include "common.h"
+
 #define MEMFD_STR	"memfd:"
 #define MEMFD_HUGE_STR	"memfd-hugetlb:"
 #define SHARED_FT_STR	"(shared file-table)"
@@ -29,43 +31,9 @@
 /*
  * Default is not to test hugetlbfs
  */
-static int hugetlbfs_test;
 static size_t mfd_def_size = MFD_DEF_SIZE;
 static const char *memfd_str = MEMFD_STR;
 
-/*
- * Copied from mlock2-tests.c
- */
-static unsigned long default_huge_page_size(void)
-{
-	unsigned long hps = 0;
-	char *line = NULL;
-	size_t linelen = 0;
-	FILE *f = fopen("/proc/meminfo", "r");
-
-	if (!f)
-		return 0;
-	while (getline(&line, &linelen, f) > 0) {
-		if (sscanf(line, "Hugepagesize:       %lu kB", &hps) == 1) {
-			hps <<= 10;
-			break;
-		}
-	}
-
-	free(line);
-	fclose(f);
-	return hps;
-}
-
-static int sys_memfd_create(const char *name,
-			    unsigned int flags)
-{
-	if (hugetlbfs_test)
-		flags |= MFD_HUGETLB;
-
-	return syscall(__NR_memfd_create, name, flags);
-}
-
 static int mfd_assert_new(const char *name, loff_t sz, unsigned int flags)
 {
 	int r, fd;
-- 
2.15.0.rc0.40.gaefcc5f6f

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 9/9] memfd-test: run fuse test on hugetlb backend memory
  2017-11-06 14:39 [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory Marc-André Lureau
                   ` (7 preceding siblings ...)
  2017-11-06 14:39 ` [PATCH v2 8/9] memfd-test: move common code to a shared unit Marc-André Lureau
@ 2017-11-06 14:39 ` Marc-André Lureau
  2017-11-07  1:41   ` Mike Kravetz
  2017-11-07  1:47 ` [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory Mike Kravetz
  9 siblings, 1 reply; 17+ messages in thread
From: Marc-André Lureau @ 2017-11-06 14:39 UTC (permalink / raw)
  To: linux-mm, linux-kernel
  Cc: aarcange, hughd, nyc, mike.kravetz, Marc-André Lureau

Suggested-by: Mike Kravetz <mike.kravetz@oracle.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 tools/testing/selftests/memfd/fuse_test.c      | 30 ++++++++++++++++++++++----
 tools/testing/selftests/memfd/run_fuse_test.sh |  2 +-
 tools/testing/selftests/memfd/run_tests.sh     |  1 +
 3 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/tools/testing/selftests/memfd/fuse_test.c b/tools/testing/selftests/memfd/fuse_test.c
index 795a25ba8521..0a85b34929e1 100644
--- a/tools/testing/selftests/memfd/fuse_test.c
+++ b/tools/testing/selftests/memfd/fuse_test.c
@@ -38,6 +38,8 @@
 #define MFD_DEF_SIZE 8192
 #define STACK_SIZE 65536
 
+static size_t mfd_def_size = MFD_DEF_SIZE;
+
 static int mfd_assert_new(const char *name, loff_t sz, unsigned int flags)
 {
 	int r, fd;
@@ -123,7 +125,7 @@ static void *mfd_assert_mmap_shared(int fd)
 	void *p;
 
 	p = mmap(NULL,
-		 MFD_DEF_SIZE,
+		 mfd_def_size,
 		 PROT_READ | PROT_WRITE,
 		 MAP_SHARED,
 		 fd,
@@ -141,7 +143,7 @@ static void *mfd_assert_mmap_private(int fd)
 	void *p;
 
 	p = mmap(NULL,
-		 MFD_DEF_SIZE,
+		 mfd_def_size,
 		 PROT_READ | PROT_WRITE,
 		 MAP_PRIVATE,
 		 fd,
@@ -174,7 +176,7 @@ static int sealing_thread_fn(void *arg)
 	usleep(200000);
 
 	/* unmount mapping before sealing to avoid i_mmap_writable failures */
-	munmap(global_p, MFD_DEF_SIZE);
+	munmap(global_p, mfd_def_size);
 
 	/* Try sealing the global file; expect EBUSY or success. Current
 	 * kernels will never succeed, but in the future, kernels might
@@ -224,7 +226,7 @@ static void join_sealing_thread(pid_t pid)
 
 int main(int argc, char **argv)
 {
-	static const char zero[MFD_DEF_SIZE];
+	char *zero;
 	int fd, mfd, r;
 	void *p;
 	int was_sealed;
@@ -235,6 +237,25 @@ int main(int argc, char **argv)
 		abort();
 	}
 
+	if (argc >= 3) {
+		if (!strcmp(argv[2], "hugetlbfs")) {
+			unsigned long hpage_size = default_huge_page_size();
+
+			if (!hpage_size) {
+				printf("Unable to determine huge page size\n");
+				abort();
+			}
+
+			hugetlbfs_test = 1;
+			mfd_def_size = hpage_size * 2;
+		} else {
+			printf("Unknown option: %s\n", argv[2]);
+			abort();
+		}
+	}
+
+	zero = calloc(sizeof(*zero), mfd_def_size);
+
 	/* open FUSE memfd file for GUP testing */
 	printf("opening: %s\n", argv[1]);
 	fd = open(argv[1], O_RDONLY | O_CLOEXEC);
@@ -303,6 +324,7 @@ int main(int argc, char **argv)
 	close(fd);
 
 	printf("fuse: DONE\n");
+	free(zero);
 
 	return 0;
 }
diff --git a/tools/testing/selftests/memfd/run_fuse_test.sh b/tools/testing/selftests/memfd/run_fuse_test.sh
index 407df68dfe27..22e572e2d66a 100755
--- a/tools/testing/selftests/memfd/run_fuse_test.sh
+++ b/tools/testing/selftests/memfd/run_fuse_test.sh
@@ -10,6 +10,6 @@ set -e
 
 mkdir mnt
 ./fuse_mnt ./mnt
-./fuse_test ./mnt/memfd
+./fuse_test ./mnt/memfd $@
 fusermount -u ./mnt
 rmdir ./mnt
diff --git a/tools/testing/selftests/memfd/run_tests.sh b/tools/testing/selftests/memfd/run_tests.sh
index daabb350697c..c2d41ed81b24 100755
--- a/tools/testing/selftests/memfd/run_tests.sh
+++ b/tools/testing/selftests/memfd/run_tests.sh
@@ -60,6 +60,7 @@ fi
 # Run the hugetlbfs test
 #
 ./memfd_test hugetlbfs
+./run_fuse_test.sh hugetlbfs
 
 #
 # Give back any huge pages allocated for the test
-- 
2.15.0.rc0.40.gaefcc5f6f

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 5/9] shmem: add sealing support to hugetlb-backed memfd
  2017-11-06 14:39 ` [PATCH v2 5/9] shmem: add sealing support to hugetlb-backed memfd Marc-André Lureau
@ 2017-11-06 23:56   ` Mike Kravetz
  0 siblings, 0 replies; 17+ messages in thread
From: Mike Kravetz @ 2017-11-06 23:56 UTC (permalink / raw)
  To: Marc-André Lureau, linux-mm, linux-kernel; +Cc: aarcange, hughd, nyc

On 11/06/2017 06:39 AM, Marc-André Lureau wrote:
> Adapt add_seals()/get_seals() to work with hugetbfs-backed memory.
> 
> Teach memfd_create() to allow sealing operations on MFD_HUGETLB.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Looks fine to me,

Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>

-- 
Mike Kravetz

> ---
>  mm/shmem.c | 47 ++++++++++++++++++++++++++++-------------------
>  1 file changed, 28 insertions(+), 19 deletions(-)
> 
> diff --git a/mm/shmem.c b/mm/shmem.c
> index b7811979611f..b08ba5d84d84 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -2717,6 +2717,19 @@ static int shmem_wait_for_pins(struct address_space *mapping)
>  	return error;
>  }
>  
> +static unsigned int *memfd_file_seals_ptr(struct file *file)
> +{
> +	if (file->f_op == &shmem_file_operations)
> +		return &SHMEM_I(file_inode(file))->seals;
> +
> +#ifdef CONFIG_HUGETLBFS
> +	if (file->f_op == &hugetlbfs_file_operations)
> +		return &HUGETLBFS_I(file_inode(file))->seals;
> +#endif
> +
> +	return NULL;
> +}
> +
>  #define F_ALL_SEALS (F_SEAL_SEAL | \
>  		     F_SEAL_SHRINK | \
>  		     F_SEAL_GROW | \
> @@ -2725,7 +2738,7 @@ static int shmem_wait_for_pins(struct address_space *mapping)
>  static int memfd_add_seals(struct file *file, unsigned int seals)
>  {
>  	struct inode *inode = file_inode(file);
> -	struct shmem_inode_info *info = SHMEM_I(inode);
> +	unsigned int *file_seals;
>  	int error;
>  
>  	/*
> @@ -2758,8 +2771,6 @@ static int memfd_add_seals(struct file *file, unsigned int seals)
>  	 * other file types.
>  	 */
>  
> -	if (file->f_op != &shmem_file_operations)
> -		return -EINVAL;
>  	if (!(file->f_mode & FMODE_WRITE))
>  		return -EPERM;
>  	if (seals & ~(unsigned int)F_ALL_SEALS)
> @@ -2767,12 +2778,18 @@ static int memfd_add_seals(struct file *file, unsigned int seals)
>  
>  	inode_lock(inode);
>  
> -	if (info->seals & F_SEAL_SEAL) {
> +	file_seals = memfd_file_seals_ptr(file);
> +	if (!file_seals) {
> +		error = -EINVAL;
> +		goto unlock;
> +	}
> +
> +	if (*file_seals & F_SEAL_SEAL) {
>  		error = -EPERM;
>  		goto unlock;
>  	}
>  
> -	if ((seals & F_SEAL_WRITE) && !(info->seals & F_SEAL_WRITE)) {
> +	if ((seals & F_SEAL_WRITE) && !(*file_seals & F_SEAL_WRITE)) {
>  		error = mapping_deny_writable(file->f_mapping);
>  		if (error)
>  			goto unlock;
> @@ -2784,7 +2801,7 @@ static int memfd_add_seals(struct file *file, unsigned int seals)
>  		}
>  	}
>  
> -	info->seals |= seals;
> +	*file_seals |= seals;
>  	error = 0;
>  
>  unlock:
> @@ -2794,10 +2811,9 @@ static int memfd_add_seals(struct file *file, unsigned int seals)
>  
>  static int memfd_get_seals(struct file *file)
>  {
> -	if (file->f_op != &shmem_file_operations)
> -		return -EINVAL;
> +	unsigned int *seals = memfd_file_seals_ptr(file);
>  
> -	return SHMEM_I(file_inode(file))->seals;
> +	return seals ? *seals : -EINVAL;
>  }
>  
>  long memfd_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
> @@ -3657,7 +3673,7 @@ SYSCALL_DEFINE2(memfd_create,
>  		const char __user *, uname,
>  		unsigned int, flags)
>  {
> -	struct shmem_inode_info *info;
> +	unsigned int *file_seals;
>  	struct file *file;
>  	int fd, error;
>  	char *name;
> @@ -3667,9 +3683,6 @@ SYSCALL_DEFINE2(memfd_create,
>  		if (flags & ~(unsigned int)MFD_ALL_FLAGS)
>  			return -EINVAL;
>  	} else {
> -		/* Sealing not supported in hugetlbfs (MFD_HUGETLB) */
> -		if (flags & MFD_ALLOW_SEALING)
> -			return -EINVAL;
>  		/* Allow huge page size encoding in flags. */
>  		if (flags & ~(unsigned int)(MFD_ALL_FLAGS |
>  				(MFD_HUGE_MASK << MFD_HUGE_SHIFT)))
> @@ -3722,12 +3735,8 @@ SYSCALL_DEFINE2(memfd_create,
>  	file->f_flags |= O_RDWR | O_LARGEFILE;
>  
>  	if (flags & MFD_ALLOW_SEALING) {
> -		/*
> -		 * flags check at beginning of function ensures
> -		 * this is not a hugetlbfs (MFD_HUGETLB) file.
> -		 */
> -		info = SHMEM_I(file_inode(file));
> -		info->seals &= ~F_SEAL_SEAL;
> +		file_seals = memfd_file_seals_ptr(file);
> +		*file_seals &= ~F_SEAL_SEAL;
>  	}
>  
>  	fd_install(fd, file);
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 6/9] memfd-tests: test hugetlbfs sealing
  2017-11-06 14:39 ` [PATCH v2 6/9] memfd-tests: test hugetlbfs sealing Marc-André Lureau
@ 2017-11-07  1:30   ` Mike Kravetz
  0 siblings, 0 replies; 17+ messages in thread
From: Mike Kravetz @ 2017-11-07  1:30 UTC (permalink / raw)
  To: Marc-André Lureau, linux-mm, linux-kernel; +Cc: aarcange, hughd, nyc

On 11/06/2017 06:39 AM, Marc-André Lureau wrote:
> Remove most of the special-casing of hugetlbfs now that sealing
> is supported.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>

-- 
Mike Kravetz

> ---
>  tools/testing/selftests/memfd/memfd_test.c | 150 +++--------------------------
>  1 file changed, 15 insertions(+), 135 deletions(-)
> 
> diff --git a/tools/testing/selftests/memfd/memfd_test.c b/tools/testing/selftests/memfd/memfd_test.c
> index 845e5f67b6f0..cca957a06525 100644
> --- a/tools/testing/selftests/memfd/memfd_test.c
> +++ b/tools/testing/selftests/memfd/memfd_test.c
> @@ -513,6 +513,10 @@ static void mfd_assert_grow_write(int fd)
>  	static char *buf;
>  	ssize_t l;
>  
> +	/* hugetlbfs does not support write */
> +	if (hugetlbfs_test)
> +		return;
> +
>  	buf = malloc(mfd_def_size * 8);
>  	if (!buf) {
>  		printf("malloc(%d) failed: %m\n", mfd_def_size * 8);
> @@ -533,6 +537,10 @@ static void mfd_fail_grow_write(int fd)
>  	static char *buf;
>  	ssize_t l;
>  
> +	/* hugetlbfs does not support write */
> +	if (hugetlbfs_test)
> +		return;
> +
>  	buf = malloc(mfd_def_size * 8);
>  	if (!buf) {
>  		printf("malloc(%d) failed: %m\n", mfd_def_size * 8);
> @@ -627,18 +635,13 @@ static void test_create(void)
>  	fd = mfd_assert_new("", 0, MFD_CLOEXEC);
>  	close(fd);
>  
> -	if (!hugetlbfs_test) {
> -		/* verify MFD_ALLOW_SEALING is allowed */
> -		fd = mfd_assert_new("", 0, MFD_ALLOW_SEALING);
> -		close(fd);
> -
> -		/* verify MFD_ALLOW_SEALING | MFD_CLOEXEC is allowed */
> -		fd = mfd_assert_new("", 0, MFD_ALLOW_SEALING | MFD_CLOEXEC);
> -		close(fd);
> -	} else {
> -		/* sealing is not supported on hugetlbfs */
> -		mfd_fail_new("", MFD_ALLOW_SEALING);
> -	}
> +	/* verify MFD_ALLOW_SEALING is allowed */
> +	fd = mfd_assert_new("", 0, MFD_ALLOW_SEALING);
> +	close(fd);
> +
> +	/* verify MFD_ALLOW_SEALING | MFD_CLOEXEC is allowed */
> +	fd = mfd_assert_new("", 0, MFD_ALLOW_SEALING | MFD_CLOEXEC);
> +	close(fd);
>  }
>  
>  /*
> @@ -649,10 +652,6 @@ static void test_basic(void)
>  {
>  	int fd;
>  
> -	/* hugetlbfs does not contain sealing support */
> -	if (hugetlbfs_test)
> -		return;
> -
>  	printf("%s BASIC\n", MEMFD_STR);
>  
>  	fd = mfd_assert_new("kern_memfd_basic",
> @@ -697,28 +696,6 @@ static void test_basic(void)
>  	close(fd);
>  }
>  
> -/*
> - * hugetlbfs doesn't support seals or write, so just verify grow and shrink
> - * on a hugetlbfs file created via memfd_create.
> - */
> -static void test_hugetlbfs_grow_shrink(void)
> -{
> -	int fd;
> -
> -	printf("%s HUGETLBFS-GROW-SHRINK\n", MEMFD_STR);
> -
> -	fd = mfd_assert_new("kern_memfd_seal_write",
> -			    mfd_def_size,
> -			    MFD_CLOEXEC);
> -
> -	mfd_assert_read(fd);
> -	mfd_assert_write(fd);
> -	mfd_assert_shrink(fd);
> -	mfd_assert_grow(fd);
> -
> -	close(fd);
> -}
> -
>  /*
>   * Test SEAL_WRITE
>   * Test whether SEAL_WRITE actually prevents modifications.
> @@ -727,13 +704,6 @@ static void test_seal_write(void)
>  {
>  	int fd;
>  
> -	/*
> -	 * hugetlbfs does not contain sealing or write support.  Just test
> -	 * basic grow and shrink via test_hugetlbfs_grow_shrink.
> -	 */
> -	if (hugetlbfs_test)
> -		return test_hugetlbfs_grow_shrink();
> -
>  	printf("%s SEAL-WRITE\n", MEMFD_STR);
>  
>  	fd = mfd_assert_new("kern_memfd_seal_write",
> @@ -760,10 +730,6 @@ static void test_seal_shrink(void)
>  {
>  	int fd;
>  
> -	/* hugetlbfs does not contain sealing support */
> -	if (hugetlbfs_test)
> -		return;
> -
>  	printf("%s SEAL-SHRINK\n", MEMFD_STR);
>  
>  	fd = mfd_assert_new("kern_memfd_seal_shrink",
> @@ -790,10 +756,6 @@ static void test_seal_grow(void)
>  {
>  	int fd;
>  
> -	/* hugetlbfs does not contain sealing support */
> -	if (hugetlbfs_test)
> -		return;
> -
>  	printf("%s SEAL-GROW\n", MEMFD_STR);
>  
>  	fd = mfd_assert_new("kern_memfd_seal_grow",
> @@ -820,10 +782,6 @@ static void test_seal_resize(void)
>  {
>  	int fd;
>  
> -	/* hugetlbfs does not contain sealing support */
> -	if (hugetlbfs_test)
> -		return;
> -
>  	printf("%s SEAL-RESIZE\n", MEMFD_STR);
>  
>  	fd = mfd_assert_new("kern_memfd_seal_resize",
> @@ -842,32 +800,6 @@ static void test_seal_resize(void)
>  	close(fd);
>  }
>  
> -/*
> - * hugetlbfs does not support seals.  Basic test to dup the memfd created
> - * fd and perform some basic operations on it.
> - */
> -static void hugetlbfs_dup(char *b_suffix)
> -{
> -	int fd, fd2;
> -
> -	printf("%s HUGETLBFS-DUP %s\n", MEMFD_STR, b_suffix);
> -
> -	fd = mfd_assert_new("kern_memfd_share_dup",
> -			    mfd_def_size,
> -			    MFD_CLOEXEC);
> -
> -	fd2 = mfd_assert_dup(fd);
> -
> -	mfd_assert_read(fd);
> -	mfd_assert_write(fd);
> -
> -	mfd_assert_shrink(fd2);
> -	mfd_assert_grow(fd2);
> -
> -	close(fd2);
> -	close(fd);
> -}
> -
>  /*
>   * Test sharing via dup()
>   * Test that seals are shared between dupped FDs and they're all equal.
> @@ -876,15 +808,6 @@ static void test_share_dup(char *banner, char *b_suffix)
>  {
>  	int fd, fd2;
>  
> -	/*
> -	 * hugetlbfs does not contain sealing support.  Perform some
> -	 * basic testing on dup'ed fd instead via hugetlbfs_dup.
> -	 */
> -	if (hugetlbfs_test) {
> -		hugetlbfs_dup(b_suffix);
> -		return;
> -	}
> -
>  	printf("%s %s %s\n", MEMFD_STR, banner, b_suffix);
>  
>  	fd = mfd_assert_new("kern_memfd_share_dup",
> @@ -927,10 +850,6 @@ static void test_share_mmap(char *banner, char *b_suffix)
>  	int fd;
>  	void *p;
>  
> -	/* hugetlbfs does not contain sealing support */
> -	if (hugetlbfs_test)
> -		return;
> -
>  	printf("%s %s %s\n", MEMFD_STR,  banner, b_suffix);
>  
>  	fd = mfd_assert_new("kern_memfd_share_mmap",
> @@ -955,32 +874,6 @@ static void test_share_mmap(char *banner, char *b_suffix)
>  	close(fd);
>  }
>  
> -/*
> - * Basic test to make sure we can open the hugetlbfs fd via /proc and
> - * perform some simple operations on it.
> - */
> -static void hugetlbfs_proc_open(char *b_suffix)
> -{
> -	int fd, fd2;
> -
> -	printf("%s HUGETLBFS-PROC-OPEN %s\n", MEMFD_STR, b_suffix);
> -
> -	fd = mfd_assert_new("kern_memfd_share_open",
> -			    mfd_def_size,
> -			    MFD_CLOEXEC);
> -
> -	fd2 = mfd_assert_open(fd, O_RDWR, 0);
> -
> -	mfd_assert_read(fd);
> -	mfd_assert_write(fd);
> -
> -	mfd_assert_shrink(fd2);
> -	mfd_assert_grow(fd2);
> -
> -	close(fd2);
> -	close(fd);
> -}
> -
>  /*
>   * Test sealing with open(/proc/self/fd/%d)
>   * Via /proc we can get access to a separate file-context for the same memfd.
> @@ -991,15 +884,6 @@ static void test_share_open(char *banner, char *b_suffix)
>  {
>  	int fd, fd2;
>  
> -	/*
> -	 * hugetlbfs does not contain sealing support.  So test basic
> -	 * functionality of using /proc fd via hugetlbfs_proc_open
> -	 */
> -	if (hugetlbfs_test) {
> -		hugetlbfs_proc_open(b_suffix);
> -		return;
> -	}
> -
>  	printf("%s %s %s\n", MEMFD_STR, banner, b_suffix);
>  
>  	fd = mfd_assert_new("kern_memfd_share_open",
> @@ -1043,10 +927,6 @@ static void test_share_fork(char *banner, char *b_suffix)
>  	int fd;
>  	pid_t pid;
>  
> -	/* hugetlbfs does not contain sealing support */
> -	if (hugetlbfs_test)
> -		return;
> -
>  	printf("%s %s %s\n", MEMFD_STR, banner, b_suffix);
>  
>  	fd = mfd_assert_new("kern_memfd_share_fork",
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 7/9] memfd-test: add 'memfd-hugetlb:' prefix when testing hugetlbfs
  2017-11-06 14:39 ` [PATCH v2 7/9] memfd-test: add 'memfd-hugetlb:' prefix when testing hugetlbfs Marc-André Lureau
@ 2017-11-07  1:31   ` Mike Kravetz
  0 siblings, 0 replies; 17+ messages in thread
From: Mike Kravetz @ 2017-11-07  1:31 UTC (permalink / raw)
  To: Marc-André Lureau, linux-mm, linux-kernel; +Cc: aarcange, hughd, nyc

On 11/06/2017 06:39 AM, Marc-André Lureau wrote:
> Suggested-by: Mike Kravetz <mike.kravetz@oracle.com>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>

-- 
Mike Kravetz

> ---
>  tools/testing/selftests/memfd/memfd_test.c | 26 ++++++++++++++++----------
>  1 file changed, 16 insertions(+), 10 deletions(-)
> 
> diff --git a/tools/testing/selftests/memfd/memfd_test.c b/tools/testing/selftests/memfd/memfd_test.c
> index cca957a06525..955d09ee16ca 100644
> --- a/tools/testing/selftests/memfd/memfd_test.c
> +++ b/tools/testing/selftests/memfd/memfd_test.c
> @@ -20,6 +20,7 @@
>  #include <unistd.h>
>  
>  #define MEMFD_STR	"memfd:"
> +#define MEMFD_HUGE_STR	"memfd-hugetlb:"
>  #define SHARED_FT_STR	"(shared file-table)"
>  
>  #define MFD_DEF_SIZE 8192
> @@ -30,6 +31,7 @@
>   */
>  static int hugetlbfs_test;
>  static size_t mfd_def_size = MFD_DEF_SIZE;
> +static const char *memfd_str = MEMFD_STR;
>  
>  /*
>   * Copied from mlock2-tests.c
> @@ -606,7 +608,7 @@ static void test_create(void)
>  	char buf[2048];
>  	int fd;
>  
> -	printf("%s CREATE\n", MEMFD_STR);
> +	printf("%s CREATE\n", memfd_str);
>  
>  	/* test NULL name */
>  	mfd_fail_new(NULL, 0);
> @@ -652,7 +654,7 @@ static void test_basic(void)
>  {
>  	int fd;
>  
> -	printf("%s BASIC\n", MEMFD_STR);
> +	printf("%s BASIC\n", memfd_str);
>  
>  	fd = mfd_assert_new("kern_memfd_basic",
>  			    mfd_def_size,
> @@ -704,7 +706,7 @@ static void test_seal_write(void)
>  {
>  	int fd;
>  
> -	printf("%s SEAL-WRITE\n", MEMFD_STR);
> +	printf("%s SEAL-WRITE\n", memfd_str);
>  
>  	fd = mfd_assert_new("kern_memfd_seal_write",
>  			    mfd_def_size,
> @@ -730,7 +732,7 @@ static void test_seal_shrink(void)
>  {
>  	int fd;
>  
> -	printf("%s SEAL-SHRINK\n", MEMFD_STR);
> +	printf("%s SEAL-SHRINK\n", memfd_str);
>  
>  	fd = mfd_assert_new("kern_memfd_seal_shrink",
>  			    mfd_def_size,
> @@ -756,7 +758,7 @@ static void test_seal_grow(void)
>  {
>  	int fd;
>  
> -	printf("%s SEAL-GROW\n", MEMFD_STR);
> +	printf("%s SEAL-GROW\n", memfd_str);
>  
>  	fd = mfd_assert_new("kern_memfd_seal_grow",
>  			    mfd_def_size,
> @@ -782,7 +784,7 @@ static void test_seal_resize(void)
>  {
>  	int fd;
>  
> -	printf("%s SEAL-RESIZE\n", MEMFD_STR);
> +	printf("%s SEAL-RESIZE\n", memfd_str);
>  
>  	fd = mfd_assert_new("kern_memfd_seal_resize",
>  			    mfd_def_size,
> @@ -808,7 +810,7 @@ static void test_share_dup(char *banner, char *b_suffix)
>  {
>  	int fd, fd2;
>  
> -	printf("%s %s %s\n", MEMFD_STR, banner, b_suffix);
> +	printf("%s %s %s\n", memfd_str, banner, b_suffix);
>  
>  	fd = mfd_assert_new("kern_memfd_share_dup",
>  			    mfd_def_size,
> @@ -850,7 +852,7 @@ static void test_share_mmap(char *banner, char *b_suffix)
>  	int fd;
>  	void *p;
>  
> -	printf("%s %s %s\n", MEMFD_STR,  banner, b_suffix);
> +	printf("%s %s %s\n", memfd_str,  banner, b_suffix);
>  
>  	fd = mfd_assert_new("kern_memfd_share_mmap",
>  			    mfd_def_size,
> @@ -884,7 +886,7 @@ static void test_share_open(char *banner, char *b_suffix)
>  {
>  	int fd, fd2;
>  
> -	printf("%s %s %s\n", MEMFD_STR, banner, b_suffix);
> +	printf("%s %s %s\n", memfd_str, banner, b_suffix);
>  
>  	fd = mfd_assert_new("kern_memfd_share_open",
>  			    mfd_def_size,
> @@ -927,7 +929,7 @@ static void test_share_fork(char *banner, char *b_suffix)
>  	int fd;
>  	pid_t pid;
>  
> -	printf("%s %s %s\n", MEMFD_STR, banner, b_suffix);
> +	printf("%s %s %s\n", memfd_str, banner, b_suffix);
>  
>  	fd = mfd_assert_new("kern_memfd_share_fork",
>  			    mfd_def_size,
> @@ -963,7 +965,11 @@ int main(int argc, char **argv)
>  			}
>  
>  			hugetlbfs_test = 1;
> +			memfd_str = MEMFD_HUGE_STR;
>  			mfd_def_size = hpage_size * 2;
> +		} else {
> +			printf("Unknown option: %s\n", argv[1]);
> +			abort();
>  		}
>  	}
>  
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 8/9] memfd-test: move common code to a shared unit
  2017-11-06 14:39 ` [PATCH v2 8/9] memfd-test: move common code to a shared unit Marc-André Lureau
@ 2017-11-07  1:32   ` Mike Kravetz
  0 siblings, 0 replies; 17+ messages in thread
From: Mike Kravetz @ 2017-11-07  1:32 UTC (permalink / raw)
  To: Marc-André Lureau, linux-mm, linux-kernel; +Cc: aarcange, hughd, nyc

On 11/06/2017 06:39 AM, Marc-André Lureau wrote:
> The memfd & fuse tests will share more common code in the following
> commits to test hugetlb support.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>

-- 
Mike Kravetz

> ---
>  tools/testing/selftests/memfd/Makefile     |  5 ++++
>  tools/testing/selftests/memfd/common.c     | 45 ++++++++++++++++++++++++++++++
>  tools/testing/selftests/memfd/common.h     |  9 ++++++
>  tools/testing/selftests/memfd/fuse_test.c  |  8 ++----
>  tools/testing/selftests/memfd/memfd_test.c | 36 ++----------------------
>  5 files changed, 63 insertions(+), 40 deletions(-)
>  create mode 100644 tools/testing/selftests/memfd/common.c
>  create mode 100644 tools/testing/selftests/memfd/common.h
> 
> diff --git a/tools/testing/selftests/memfd/Makefile b/tools/testing/selftests/memfd/Makefile
> index 3926a0409dda..a5276a91dfbf 100644
> --- a/tools/testing/selftests/memfd/Makefile
> +++ b/tools/testing/selftests/memfd/Makefile
> @@ -12,3 +12,8 @@ fuse_mnt.o: CFLAGS += $(shell pkg-config fuse --cflags)
>  include ../lib.mk
>  
>  $(OUTPUT)/fuse_mnt: LDLIBS += $(shell pkg-config fuse --libs)
> +
> +$(OUTPUT)/memfd_test: memfd_test.c common.o
> +$(OUTPUT)/fuse_test: fuse_test.c common.o
> +
> +EXTRA_CLEAN = common.o
> diff --git a/tools/testing/selftests/memfd/common.c b/tools/testing/selftests/memfd/common.c
> new file mode 100644
> index 000000000000..7ed269cd3abb
> --- /dev/null
> +++ b/tools/testing/selftests/memfd/common.c
> @@ -0,0 +1,45 @@
> +// SPDX-License-Identifier: GPL-2.0
> +#define _GNU_SOURCE
> +#define __EXPORTED_HEADERS__
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <linux/fcntl.h>
> +#include <linux/memfd.h>
> +#include <sys/syscall.h>
> +
> +#include "common.h"
> +
> +int hugetlbfs_test = 0;
> +
> +/*
> + * Copied from mlock2-tests.c
> + */
> +unsigned long default_huge_page_size(void)
> +{
> +	unsigned long hps = 0;
> +	char *line = NULL;
> +	size_t linelen = 0;
> +	FILE *f = fopen("/proc/meminfo", "r");
> +
> +	if (!f)
> +		return 0;
> +	while (getline(&line, &linelen, f) > 0) {
> +		if (sscanf(line, "Hugepagesize:       %lu kB", &hps) == 1) {
> +			hps <<= 10;
> +			break;
> +		}
> +	}
> +
> +	free(line);
> +	fclose(f);
> +	return hps;
> +}
> +
> +int sys_memfd_create(const char *name, unsigned int flags)
> +{
> +	if (hugetlbfs_test)
> +		flags |= MFD_HUGETLB;
> +
> +	return syscall(__NR_memfd_create, name, flags);
> +}
> diff --git a/tools/testing/selftests/memfd/common.h b/tools/testing/selftests/memfd/common.h
> new file mode 100644
> index 000000000000..522d2c630bd8
> --- /dev/null
> +++ b/tools/testing/selftests/memfd/common.h
> @@ -0,0 +1,9 @@
> +#ifndef COMMON_H_
> +#define COMMON_H_
> +
> +extern int hugetlbfs_test;
> +
> +unsigned long default_huge_page_size(void);
> +int sys_memfd_create(const char *name, unsigned int flags);
> +
> +#endif
> diff --git a/tools/testing/selftests/memfd/fuse_test.c b/tools/testing/selftests/memfd/fuse_test.c
> index 1ccb7a3eb14b..795a25ba8521 100644
> --- a/tools/testing/selftests/memfd/fuse_test.c
> +++ b/tools/testing/selftests/memfd/fuse_test.c
> @@ -33,15 +33,11 @@
>  #include <sys/wait.h>
>  #include <unistd.h>
>  
> +#include "common.h"
> +
>  #define MFD_DEF_SIZE 8192
>  #define STACK_SIZE 65536
>  
> -static int sys_memfd_create(const char *name,
> -			    unsigned int flags)
> -{
> -	return syscall(__NR_memfd_create, name, flags);
> -}
> -
>  static int mfd_assert_new(const char *name, loff_t sz, unsigned int flags)
>  {
>  	int r, fd;
> diff --git a/tools/testing/selftests/memfd/memfd_test.c b/tools/testing/selftests/memfd/memfd_test.c
> index 955d09ee16ca..4c049b6b6985 100644
> --- a/tools/testing/selftests/memfd/memfd_test.c
> +++ b/tools/testing/selftests/memfd/memfd_test.c
> @@ -19,6 +19,8 @@
>  #include <sys/wait.h>
>  #include <unistd.h>
>  
> +#include "common.h"
> +
>  #define MEMFD_STR	"memfd:"
>  #define MEMFD_HUGE_STR	"memfd-hugetlb:"
>  #define SHARED_FT_STR	"(shared file-table)"
> @@ -29,43 +31,9 @@
>  /*
>   * Default is not to test hugetlbfs
>   */
> -static int hugetlbfs_test;
>  static size_t mfd_def_size = MFD_DEF_SIZE;
>  static const char *memfd_str = MEMFD_STR;
>  
> -/*
> - * Copied from mlock2-tests.c
> - */
> -static unsigned long default_huge_page_size(void)
> -{
> -	unsigned long hps = 0;
> -	char *line = NULL;
> -	size_t linelen = 0;
> -	FILE *f = fopen("/proc/meminfo", "r");
> -
> -	if (!f)
> -		return 0;
> -	while (getline(&line, &linelen, f) > 0) {
> -		if (sscanf(line, "Hugepagesize:       %lu kB", &hps) == 1) {
> -			hps <<= 10;
> -			break;
> -		}
> -	}
> -
> -	free(line);
> -	fclose(f);
> -	return hps;
> -}
> -
> -static int sys_memfd_create(const char *name,
> -			    unsigned int flags)
> -{
> -	if (hugetlbfs_test)
> -		flags |= MFD_HUGETLB;
> -
> -	return syscall(__NR_memfd_create, name, flags);
> -}
> -
>  static int mfd_assert_new(const char *name, loff_t sz, unsigned int flags)
>  {
>  	int r, fd;
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 9/9] memfd-test: run fuse test on hugetlb backend memory
  2017-11-06 14:39 ` [PATCH v2 9/9] memfd-test: run fuse test on hugetlb backend memory Marc-André Lureau
@ 2017-11-07  1:41   ` Mike Kravetz
  2017-11-07 12:12     ` Marc-André Lureau
  0 siblings, 1 reply; 17+ messages in thread
From: Mike Kravetz @ 2017-11-07  1:41 UTC (permalink / raw)
  To: Marc-André Lureau, linux-mm, linux-kernel; +Cc: aarcange, hughd, nyc

On 11/06/2017 06:39 AM, Marc-André Lureau wrote:
> Suggested-by: Mike Kravetz <mike.kravetz@oracle.com>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  tools/testing/selftests/memfd/fuse_test.c      | 30 ++++++++++++++++++++++----
>  tools/testing/selftests/memfd/run_fuse_test.sh |  2 +-
>  tools/testing/selftests/memfd/run_tests.sh     |  1 +
>  3 files changed, 28 insertions(+), 5 deletions(-)
> 
> diff --git a/tools/testing/selftests/memfd/fuse_test.c b/tools/testing/selftests/memfd/fuse_test.c
> index 795a25ba8521..0a85b34929e1 100644
> --- a/tools/testing/selftests/memfd/fuse_test.c
> +++ b/tools/testing/selftests/memfd/fuse_test.c
> @@ -38,6 +38,8 @@
>  #define MFD_DEF_SIZE 8192
>  #define STACK_SIZE 65536
>  
> +static size_t mfd_def_size = MFD_DEF_SIZE;
> +
>  static int mfd_assert_new(const char *name, loff_t sz, unsigned int flags)
>  {
>  	int r, fd;
> @@ -123,7 +125,7 @@ static void *mfd_assert_mmap_shared(int fd)
>  	void *p;
>  
>  	p = mmap(NULL,
> -		 MFD_DEF_SIZE,
> +		 mfd_def_size,
>  		 PROT_READ | PROT_WRITE,
>  		 MAP_SHARED,
>  		 fd,
> @@ -141,7 +143,7 @@ static void *mfd_assert_mmap_private(int fd)
>  	void *p;
>  
>  	p = mmap(NULL,
> -		 MFD_DEF_SIZE,
> +		 mfd_def_size,
>  		 PROT_READ | PROT_WRITE,
>  		 MAP_PRIVATE,
>  		 fd,
> @@ -174,7 +176,7 @@ static int sealing_thread_fn(void *arg)
>  	usleep(200000);
>  
>  	/* unmount mapping before sealing to avoid i_mmap_writable failures */
> -	munmap(global_p, MFD_DEF_SIZE);
> +	munmap(global_p, mfd_def_size);
>  
>  	/* Try sealing the global file; expect EBUSY or success. Current
>  	 * kernels will never succeed, but in the future, kernels might
> @@ -224,7 +226,7 @@ static void join_sealing_thread(pid_t pid)
>  
>  int main(int argc, char **argv)
>  {
> -	static const char zero[MFD_DEF_SIZE];
> +	char *zero;
>  	int fd, mfd, r;
>  	void *p;
>  	int was_sealed;
> @@ -235,6 +237,25 @@ int main(int argc, char **argv)
>  		abort();
>  	}
>  
> +	if (argc >= 3) {
> +		if (!strcmp(argv[2], "hugetlbfs")) {
> +			unsigned long hpage_size = default_huge_page_size();
> +
> +			if (!hpage_size) {
> +				printf("Unable to determine huge page size\n");
> +				abort();
> +			}
> +
> +			hugetlbfs_test = 1;
> +			mfd_def_size = hpage_size * 2;
> +		} else {
> +			printf("Unknown option: %s\n", argv[2]);
> +			abort();
> +		}
> +	}
> +
> +	zero = calloc(sizeof(*zero), mfd_def_size);
> +
>  	/* open FUSE memfd file for GUP testing */
>  	printf("opening: %s\n", argv[1]);
>  	fd = open(argv[1], O_RDONLY | O_CLOEXEC);

When ftruncate'ing the newly created file, you need to make sure length is
a multiple of huge page size for hugetlbfs files.  So, you will want to
do something like:

--- a/tools/testing/selftests/memfd/fuse_test.c
+++ b/tools/testing/selftests/memfd/fuse_test.c
@@ -265,7 +265,7 @@ int main(int argc, char **argv)
 
        /* create new memfd-object */
        mfd = mfd_assert_new("kern_memfd_fuse",
-                            MFD_DEF_SIZE,
+                            mfd_def_size,
                             MFD_CLOEXEC | MFD_ALLOW_SEALING);
 
        /* mmap memfd-object for writing */

Leaving MFD_DEF_SIZE for the size of reads and writes should be fine.

-- 
Mike Kravetz

> @@ -303,6 +324,7 @@ int main(int argc, char **argv)
>  	close(fd);
>  
>  	printf("fuse: DONE\n");
> +	free(zero);
>  
>  	return 0;
>  }
> diff --git a/tools/testing/selftests/memfd/run_fuse_test.sh b/tools/testing/selftests/memfd/run_fuse_test.sh
> index 407df68dfe27..22e572e2d66a 100755
> --- a/tools/testing/selftests/memfd/run_fuse_test.sh
> +++ b/tools/testing/selftests/memfd/run_fuse_test.sh
> @@ -10,6 +10,6 @@ set -e
>  
>  mkdir mnt
>  ./fuse_mnt ./mnt
> -./fuse_test ./mnt/memfd
> +./fuse_test ./mnt/memfd $@
>  fusermount -u ./mnt
>  rmdir ./mnt
> diff --git a/tools/testing/selftests/memfd/run_tests.sh b/tools/testing/selftests/memfd/run_tests.sh
> index daabb350697c..c2d41ed81b24 100755
> --- a/tools/testing/selftests/memfd/run_tests.sh
> +++ b/tools/testing/selftests/memfd/run_tests.sh
> @@ -60,6 +60,7 @@ fi
>  # Run the hugetlbfs test
>  #
>  ./memfd_test hugetlbfs
> +./run_fuse_test.sh hugetlbfs
>  
>  #
>  # Give back any huge pages allocated for the test
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory
  2017-11-06 14:39 [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory Marc-André Lureau
                   ` (8 preceding siblings ...)
  2017-11-06 14:39 ` [PATCH v2 9/9] memfd-test: run fuse test on hugetlb backend memory Marc-André Lureau
@ 2017-11-07  1:47 ` Mike Kravetz
  9 siblings, 0 replies; 17+ messages in thread
From: Mike Kravetz @ 2017-11-07  1:47 UTC (permalink / raw)
  To: Marc-André Lureau, linux-mm, linux-kernel
  Cc: aarcange, hughd, nyc, David Herrmann

On 11/06/2017 06:39 AM, Marc-André Lureau wrote:
> Hi,
> 
> Recently, Mike Kravetz added hugetlbfs support to memfd. However, he
> didn't add sealing support. One of the reasons to use memfd is to have
> shared memory sealing when doing IPC or sharing memory with another
> process with some extra safety. qemu uses shared memory & hugetables
> with vhost-user (used by dpdk), so it is reasonable to use memfd
> now instead for convenience and security reasons.

Thanks for doing this.

I will create a patch to restructure the code such that memfd_create (and
file sealing) is split out and will depend on CONFIG_TMPFS -or-
CONFIG_HUGETLBFS.  I think this can wait to go in until after this patch
series.  Unless, someone prefers that it go in first?

-- 
Mike Kravetz


> 
> Thanks!
> 
> v1->v2: after Mike review,
> - add "memfd-hugetlb:" prefix in memfd-test
> - run fuse test on hugetlb backend memory
> - rename function memfd_file_get_seals() -> memfd_file_seals_ptr()
> - update commit messages
> - added reviewed-by tags
> 
> RFC->v1:
> - split rfc patch, after early review feedback
> - added patch for memfd-test changes
> - fix build with hugetlbfs disabled
> - small code and commit messages improvements
> 
> Marc-André Lureau (9):
>   shmem: unexport shmem_add_seals()/shmem_get_seals()
>   shmem: rename functions that are memfd-related
>   hugetlb: expose hugetlbfs_inode_info in header
>   hugetlbfs: implement memfd sealing
>   shmem: add sealing support to hugetlb-backed memfd
>   memfd-tests: test hugetlbfs sealing
>   memfd-test: add 'memfd-hugetlb:' prefix when testing hugetlbfs
>   memfd-test: move common code to a shared unit
>   memfd-test: run fuse test on hugetlb backend memory
> 
>  fs/fcntl.c                                     |   2 +-
>  fs/hugetlbfs/inode.c                           |  39 +++--
>  include/linux/hugetlb.h                        |  11 ++
>  include/linux/shmem_fs.h                       |   6 +-
>  mm/shmem.c                                     |  59 ++++---
>  tools/testing/selftests/memfd/Makefile         |   5 +
>  tools/testing/selftests/memfd/common.c         |  45 ++++++
>  tools/testing/selftests/memfd/common.h         |   9 ++
>  tools/testing/selftests/memfd/fuse_test.c      |  36 +++--
>  tools/testing/selftests/memfd/memfd_test.c     | 212 ++++---------------------
>  tools/testing/selftests/memfd/run_fuse_test.sh |   2 +-
>  tools/testing/selftests/memfd/run_tests.sh     |   1 +
>  12 files changed, 195 insertions(+), 232 deletions(-)
>  create mode 100644 tools/testing/selftests/memfd/common.c
>  create mode 100644 tools/testing/selftests/memfd/common.h
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 9/9] memfd-test: run fuse test on hugetlb backend memory
  2017-11-07  1:41   ` Mike Kravetz
@ 2017-11-07 12:12     ` Marc-André Lureau
  0 siblings, 0 replies; 17+ messages in thread
From: Marc-André Lureau @ 2017-11-07 12:12 UTC (permalink / raw)
  To: Mike Kravetz; +Cc: linux-mm, linux-kernel, aarcange, hughd, nyc

Hi

----- Original Message -----
> On 11/06/2017 06:39 AM, Marc-André Lureau wrote:
> > Suggested-by: Mike Kravetz <mike.kravetz@oracle.com>
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >  tools/testing/selftests/memfd/fuse_test.c      | 30
> >  ++++++++++++++++++++++----
> >  tools/testing/selftests/memfd/run_fuse_test.sh |  2 +-
> >  tools/testing/selftests/memfd/run_tests.sh     |  1 +
> >  3 files changed, 28 insertions(+), 5 deletions(-)
> > 
> > diff --git a/tools/testing/selftests/memfd/fuse_test.c
> > b/tools/testing/selftests/memfd/fuse_test.c
> > index 795a25ba8521..0a85b34929e1 100644
> > --- a/tools/testing/selftests/memfd/fuse_test.c
> > +++ b/tools/testing/selftests/memfd/fuse_test.c
> > @@ -38,6 +38,8 @@
> >  #define MFD_DEF_SIZE 8192
> >  #define STACK_SIZE 65536
> >  
> > +static size_t mfd_def_size = MFD_DEF_SIZE;
> > +
> >  static int mfd_assert_new(const char *name, loff_t sz, unsigned int flags)
> >  {
> >  	int r, fd;
> > @@ -123,7 +125,7 @@ static void *mfd_assert_mmap_shared(int fd)
> >  	void *p;
> >  
> >  	p = mmap(NULL,
> > -		 MFD_DEF_SIZE,
> > +		 mfd_def_size,
> >  		 PROT_READ | PROT_WRITE,
> >  		 MAP_SHARED,
> >  		 fd,
> > @@ -141,7 +143,7 @@ static void *mfd_assert_mmap_private(int fd)
> >  	void *p;
> >  
> >  	p = mmap(NULL,
> > -		 MFD_DEF_SIZE,
> > +		 mfd_def_size,
> >  		 PROT_READ | PROT_WRITE,
> >  		 MAP_PRIVATE,
> >  		 fd,
> > @@ -174,7 +176,7 @@ static int sealing_thread_fn(void *arg)
> >  	usleep(200000);
> >  
> >  	/* unmount mapping before sealing to avoid i_mmap_writable failures */
> > -	munmap(global_p, MFD_DEF_SIZE);
> > +	munmap(global_p, mfd_def_size);
> >  
> >  	/* Try sealing the global file; expect EBUSY or success. Current
> >  	 * kernels will never succeed, but in the future, kernels might
> > @@ -224,7 +226,7 @@ static void join_sealing_thread(pid_t pid)
> >  
> >  int main(int argc, char **argv)
> >  {
> > -	static const char zero[MFD_DEF_SIZE];
> > +	char *zero;
> >  	int fd, mfd, r;
> >  	void *p;
> >  	int was_sealed;
> > @@ -235,6 +237,25 @@ int main(int argc, char **argv)
> >  		abort();
> >  	}
> >  
> > +	if (argc >= 3) {
> > +		if (!strcmp(argv[2], "hugetlbfs")) {
> > +			unsigned long hpage_size = default_huge_page_size();
> > +
> > +			if (!hpage_size) {
> > +				printf("Unable to determine huge page size\n");
> > +				abort();
> > +			}
> > +
> > +			hugetlbfs_test = 1;
> > +			mfd_def_size = hpage_size * 2;
> > +		} else {
> > +			printf("Unknown option: %s\n", argv[2]);
> > +			abort();
> > +		}
> > +	}
> > +
> > +	zero = calloc(sizeof(*zero), mfd_def_size);
> > +
> >  	/* open FUSE memfd file for GUP testing */
> >  	printf("opening: %s\n", argv[1]);
> >  	fd = open(argv[1], O_RDONLY | O_CLOEXEC);
> 
> When ftruncate'ing the newly created file, you need to make sure length is
> a multiple of huge page size for hugetlbfs files.  So, you will want to
> do something like:
> 
> --- a/tools/testing/selftests/memfd/fuse_test.c
> +++ b/tools/testing/selftests/memfd/fuse_test.c
> @@ -265,7 +265,7 @@ int main(int argc, char **argv)
>  
>         /* create new memfd-object */
>         mfd = mfd_assert_new("kern_memfd_fuse",
> -                            MFD_DEF_SIZE,
> +                            mfd_def_size,
>                              MFD_CLOEXEC | MFD_ALLOW_SEALING);
>  
>         /* mmap memfd-object for writing */
> 
> Leaving MFD_DEF_SIZE for the size of reads and writes should be fine.

I actually intended to replace all MFD_DEF_SIZE with mfd_def_size. Should be fine too. Resending updated series.

> 
> --
> Mike Kravetz
> 
> > @@ -303,6 +324,7 @@ int main(int argc, char **argv)
> >  	close(fd);
> >  
> >  	printf("fuse: DONE\n");
> > +	free(zero);
> >  
> >  	return 0;
> >  }
> > diff --git a/tools/testing/selftests/memfd/run_fuse_test.sh
> > b/tools/testing/selftests/memfd/run_fuse_test.sh
> > index 407df68dfe27..22e572e2d66a 100755
> > --- a/tools/testing/selftests/memfd/run_fuse_test.sh
> > +++ b/tools/testing/selftests/memfd/run_fuse_test.sh
> > @@ -10,6 +10,6 @@ set -e
> >  
> >  mkdir mnt
> >  ./fuse_mnt ./mnt
> > -./fuse_test ./mnt/memfd
> > +./fuse_test ./mnt/memfd $@
> >  fusermount -u ./mnt
> >  rmdir ./mnt
> > diff --git a/tools/testing/selftests/memfd/run_tests.sh
> > b/tools/testing/selftests/memfd/run_tests.sh
> > index daabb350697c..c2d41ed81b24 100755
> > --- a/tools/testing/selftests/memfd/run_tests.sh
> > +++ b/tools/testing/selftests/memfd/run_tests.sh
> > @@ -60,6 +60,7 @@ fi
> >  # Run the hugetlbfs test
> >  #
> >  ./memfd_test hugetlbfs
> > +./run_fuse_test.sh hugetlbfs
> >  
> >  #
> >  # Give back any huge pages allocated for the test
> > 
> 
> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to majordomo@kvack.org.  For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2017-11-07 12:12 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-06 14:39 [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory Marc-André Lureau
2017-11-06 14:39 ` [PATCH v2 1/9] shmem: unexport shmem_add_seals()/shmem_get_seals() Marc-André Lureau
2017-11-06 14:39 ` [PATCH v2 2/9] shmem: rename functions that are memfd-related Marc-André Lureau
2017-11-06 14:39 ` [PATCH v2 3/9] hugetlb: expose hugetlbfs_inode_info in header Marc-André Lureau
2017-11-06 14:39 ` [PATCH v2 4/9] hugetlbfs: implement memfd sealing Marc-André Lureau
2017-11-06 14:39 ` [PATCH v2 5/9] shmem: add sealing support to hugetlb-backed memfd Marc-André Lureau
2017-11-06 23:56   ` Mike Kravetz
2017-11-06 14:39 ` [PATCH v2 6/9] memfd-tests: test hugetlbfs sealing Marc-André Lureau
2017-11-07  1:30   ` Mike Kravetz
2017-11-06 14:39 ` [PATCH v2 7/9] memfd-test: add 'memfd-hugetlb:' prefix when testing hugetlbfs Marc-André Lureau
2017-11-07  1:31   ` Mike Kravetz
2017-11-06 14:39 ` [PATCH v2 8/9] memfd-test: move common code to a shared unit Marc-André Lureau
2017-11-07  1:32   ` Mike Kravetz
2017-11-06 14:39 ` [PATCH v2 9/9] memfd-test: run fuse test on hugetlb backend memory Marc-André Lureau
2017-11-07  1:41   ` Mike Kravetz
2017-11-07 12:12     ` Marc-André Lureau
2017-11-07  1:47 ` [PATCH v2 0/9] memfd: add sealing to hugetlb-backed memory Mike Kravetz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).