diff --git a/mm/shmem.c b/mm/shmem.c
index 3531ebb3494e12e2bd1abadd59ae6b8272822111..1a6263f54adaf7c87dad8d1614b75a68ce00eaf2 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -3582,6 +3582,10 @@ static int shmem_parse_one(struct fs_context *fc, struct fs_parameter *param)
 		ctx->seen |= SHMEM_SEEN_INUMS;
 		break;
 	case Opt_noswap:
+		if ((fc->user_ns != &init_user_ns) || !capable(CAP_SYS_ADMIN)) {
+			return invalfc(fc,
+				       "Turning off swap in unprivileged tmpfs mounts unsupported");
+		}
 		ctx->noswap = true;
 		ctx->seen |= SHMEM_SEEN_NOSWAP;
 		break;