From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id E9915EB64DD for ; Wed, 9 Aug 2023 13:29:44 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 57CFE6B0071; Wed, 9 Aug 2023 09:29:44 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 52DF16B0072; Wed, 9 Aug 2023 09:29:44 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3F4D06B0075; Wed, 9 Aug 2023 09:29:44 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 2FDE76B0071 for ; Wed, 9 Aug 2023 09:29:44 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 04BEF160ED1 for ; Wed, 9 Aug 2023 13:29:43 +0000 (UTC) X-FDA: 81104648688.24.647B37B Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf19.hostedemail.com (Postfix) with ESMTP id 3267B1A002A for ; Wed, 9 Aug 2023 13:29:41 +0000 (UTC) Authentication-Results: imf19.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=kGge+UN6; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf19.hostedemail.com: domain of cem@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=cem@kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1691587782; a=rsa-sha256; cv=none; b=nIgAx3JLdTgyVO6w246pFzTxyjBvRPKndkpc3wJJY3I02Vk4o+iaR7+KVCenQo3QPLXIg2 0NAs5byyJurvuqw9vLyfF2fl0rKBvN5UJmigi5+TIQsblW4NKcUd351E90leaQBU9gjbZ8 10UDRvmVDEFRav+793gbLV2kcibNy3g= ARC-Authentication-Results: i=1; imf19.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=kGge+UN6; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf19.hostedemail.com: domain of cem@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=cem@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1691587782; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=+LE9/QnOkwjIE/Y55/4QSnZZ1cwBFzPKPUN4QR1ilWE=; b=ZmePAkwp/YLl/vL+yUSSzxcDFDE2qTaKzjWBhj9Zw5GNJvstKUmQ80uF+wMKkXyy2hWhD7 m0R5ocOHmmBJUuMTKdnKa6vuIiuR4B4KkwzIsRrV8tdxv2/3hpCWSrORiqGjpB+oIggOQ4 p6LOguxnMBIizsI4yasze+o7LewnixY= Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 380E863B70; Wed, 9 Aug 2023 13:29:41 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E2207C433A9; Wed, 9 Aug 2023 13:29:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1691587781; bh=3vDPO3VC8nl1p7zidPH1f8uzy9TunhIHjiP8wYl8rag=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=kGge+UN6Zw+usU/FpGiUEgLRhd+v9EHW2Lc8BvNOT6HjwVHKj2+RJSbAD5yyoAD5/ v6wbi8FFyrppDaVEGD+ViYGwPRTXfAauR9cXrfNd2m56mp9ITkPoWxUva4cT5/SRUs yPZs3KCPUDDEilZL2gQtdZd9740NQOhzLzS+ojn6p7YNMAb1lqensC+BkuU4jILgbt pM1ZDug8bMAzfUpKMXuLnxGVJPybPKnEwAAS584/eSVMkomow7hZdwSr+Nca6kmbnh R9Q0r0yg+I78A2R3bW/vHEGM+PQjOIrAIfADhhpGveB7NSCfAcDDX4huGpWRZfvuZW jIWodXO/w14WQ== Date: Wed, 9 Aug 2023 15:29:32 +0200 From: Carlos Maiolino To: Hugh Dickins Cc: Christian Brauner , Andrew Morton , Oleksandr Tymoshenko , Jeff Layton , Chuck Lever , Jan Kara , Miklos Szeredi , Daniel Xu , Chris Down , Tejun Heo , Greg Kroah-Hartman , Matthew Wilcox , Christoph Hellwig , Pete Zaitcev , Helge Deller , Topi Miettinen , Yu Kuai , linux-fsdevel@vger.kernel.org, linux-mm@kvack.org Subject: Re: [PATCH vfs.tmpfs 2/5] tmpfs: track free_ispace instead of free_inodes Message-ID: <20230809132932.qyfvia5pwllvk2sk@andromeda> References: <4fe1739-d9e7-8dfd-5bce-12e7339711da@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4fe1739-d9e7-8dfd-5bce-12e7339711da@google.com> X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 3267B1A002A X-Stat-Signature: hbr5zyrx8fr4doqipdbbo3dukpa7fhm5 X-HE-Tag: 1691587781-48120 X-HE-Meta: U2FsdGVkX1+JcgbAg0TfEiRwOozGOEyMAOh3J0ZVveAnTt5pZb+YFA413ZBSIICqrevqWu13OtLwlBnQNDRpqEPjfFt9dP1y9XvqKlcmseNy5J+ZxFXuW1cZnedFpouuC+nXLO2h5ZEfigod6T/036svpwz4exOeb1cus5a2b9uqcWoHBVPkidIEstx+G9IXPfcSln2SX+c0FyTVluLkxAkBG5/UcL2AsPpx7eENhNmeDCdJRboH9CRLLth+kSqzM8RzfSwDR4OaFOBTZPjzR4P8FKBMlHe0KMOhVxAfYuer9flzPYSOjr0vw3ky5/IzrZm+KYzgnjMhFmwoyYQ+eDV1J4N6zkkyEo4wVeZfurkZhio0TEX+MGa49BYFwj5A0DIhMfQB7zU5P4Uom6TlxrVCcgRWt76+1uxHiaYUX/2XbFHUMxzdPiQ3AST/A1MwiZf85AcbXAMLnUckJxN0xhJj6DkdHGq5hIiZYx6eFyOk9wbfXjU8rZCYJfEDQ8ReQYlBLBNGUVvJy6fYIt94LT/k33pdru+TW/teNLhmnfCzKPye/W/sakbufAxoo25QxdEKLrxSpwEltsy3d81pCUol41Rg67voWGyAQI5wCgGbPxv6rG9N0OM+/TT9VuspAF+jvwrvGc8VAcclAwN2nmiUnRWYAXGfA5FQ5ferLtrIxyLrydzEBOvSKe+PX+G9PQeKggD/SEW04a/ca+dFEk7AokWnPmW5++4ja+Eps9FcdPeKersJWp+BE30ytJikr2RSFVz1XhjbG0cTQL9A5NEc0dRd67PbelD1uaRzTbpJ5jGzhd9sfGk3avDYikwnrKSKe/+G1N0Ifkwsb2JXLmOfAXGtwcLwqBLX58Cm8uclZw++2X1+5gJ5/rGOVPnTcbdgCeScrnFZcVrayllw3nMg11HjQtFOmUKaOkEgU+n485jzeVoTn8mR5zaB4BZ8Dtg75pJ8kRSlYhao12d 4sI4bPNR j9E5aaY7vZe9oAxTHmd/nanC6HgsFEo5ayD8nfqxOVpRFCVIrhAy9IOiWU70vMp7koZW/r3gXwSsEwWv4JYdfXiHA/VK2fdbbwo/psU0p5X7MCLkZ9WJgActBYnViMaE2mQZuLnJiHmVZPc8bpwZ7rILQ8q1TpeDOp49dqF1PxPE31GcvmASAq9xCT4vBi1y4ynYLFlx8R3vTr6VdO2LTsnOaFoq1ab2xxplPKSg5m6cXn/D3g60J0cB9Xuu4BFtHn8cQXI6ywlXUSuqMWK4GeO6N9h4ZSmDKaIwQwv4g8Yxs3w/oQHoq9WlPozAWGoyO3BdPQwElazbHN56jzj9PZl5kfHBPUy+m9acnWk41d1ghXKI4/YkSCwkujAHod7jm/HA382vcDPKpM6jiR2tlFD4LIQtzNABVxEpL X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Tue, Aug 08, 2023 at 09:32:21PM -0700, Hugh Dickins wrote: > In preparation for assigning some inode space to extended attributes, > keep track of free_ispace instead of number of free_inodes: as if one > tmpfs inode (and accompanying dentry) occupies very approximately 1KiB. > > Unsigned long is large enough for free_ispace, on 64-bit and on 32-bit: > but take care to enforce the maximum. And fix the nr_blocks maximum on > 32-bit: S64_MAX would be too big for it there, so say LONG_MAX instead. > > Delete the incorrect limited<->unlimited blocks/inodes comment above > shmem_reconfigure(): leave it to the error messages below to describe. > > Signed-off-by: Hugh Dickins Looks fine, feel free to add: Reviewed-by: Carlos Maiolino > --- > include/linux/shmem_fs.h | 2 +- > mm/shmem.c | 33 +++++++++++++++++---------------- > 2 files changed, 18 insertions(+), 17 deletions(-) > > diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h > index 9b2d2faff1d0..6b0c626620f5 100644 > --- a/include/linux/shmem_fs.h > +++ b/include/linux/shmem_fs.h > @@ -54,7 +54,7 @@ struct shmem_sb_info { > unsigned long max_blocks; /* How many blocks are allowed */ > struct percpu_counter used_blocks; /* How many are allocated */ > unsigned long max_inodes; /* How many inodes are allowed */ > - unsigned long free_inodes; /* How many are left for allocation */ > + unsigned long free_ispace; /* How much ispace left for allocation */ > raw_spinlock_t stat_lock; /* Serialize shmem_sb_info changes */ > umode_t mode; /* Mount mode for root directory */ > unsigned char huge; /* Whether to try for hugepages */ > diff --git a/mm/shmem.c b/mm/shmem.c > index df3cabf54206..c39471384168 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -90,6 +90,9 @@ static struct vfsmount *shm_mnt; > /* Pretend that each entry is of this size in directory's i_size */ > #define BOGO_DIRENT_SIZE 20 > > +/* Pretend that one inode + its dentry occupy this much memory */ > +#define BOGO_INODE_SIZE 1024 > + > /* Symlink up to this size is kmalloc'ed instead of using a swappable page */ > #define SHORT_SYMLINK_LEN 128 > > @@ -137,7 +140,8 @@ static unsigned long shmem_default_max_inodes(void) > { > unsigned long nr_pages = totalram_pages(); > > - return min(nr_pages - totalhigh_pages(), nr_pages / 2); > + return min3(nr_pages - totalhigh_pages(), nr_pages / 2, > + ULONG_MAX / BOGO_INODE_SIZE); > } > #endif > > @@ -331,11 +335,11 @@ static int shmem_reserve_inode(struct super_block *sb, ino_t *inop) > if (!(sb->s_flags & SB_KERNMOUNT)) { > raw_spin_lock(&sbinfo->stat_lock); > if (sbinfo->max_inodes) { > - if (!sbinfo->free_inodes) { > + if (sbinfo->free_ispace < BOGO_INODE_SIZE) { > raw_spin_unlock(&sbinfo->stat_lock); > return -ENOSPC; > } > - sbinfo->free_inodes--; > + sbinfo->free_ispace -= BOGO_INODE_SIZE; > } > if (inop) { > ino = sbinfo->next_ino++; > @@ -394,7 +398,7 @@ static void shmem_free_inode(struct super_block *sb) > struct shmem_sb_info *sbinfo = SHMEM_SB(sb); > if (sbinfo->max_inodes) { > raw_spin_lock(&sbinfo->stat_lock); > - sbinfo->free_inodes++; > + sbinfo->free_ispace += BOGO_INODE_SIZE; > raw_spin_unlock(&sbinfo->stat_lock); > } > } > @@ -3155,7 +3159,7 @@ static int shmem_statfs(struct dentry *dentry, struct kstatfs *buf) > } > if (sbinfo->max_inodes) { > buf->f_files = sbinfo->max_inodes; > - buf->f_ffree = sbinfo->free_inodes; > + buf->f_ffree = sbinfo->free_ispace / BOGO_INODE_SIZE; > } > /* else leave those fields 0 like simple_statfs */ > > @@ -3815,13 +3819,13 @@ static int shmem_parse_one(struct fs_context *fc, struct fs_parameter *param) > break; > case Opt_nr_blocks: > ctx->blocks = memparse(param->string, &rest); > - if (*rest || ctx->blocks > S64_MAX) > + if (*rest || ctx->blocks > LONG_MAX) > goto bad_value; > ctx->seen |= SHMEM_SEEN_BLOCKS; > break; > case Opt_nr_inodes: > ctx->inodes = memparse(param->string, &rest); > - if (*rest) > + if (*rest || ctx->inodes > ULONG_MAX / BOGO_INODE_SIZE) > goto bad_value; > ctx->seen |= SHMEM_SEEN_INODES; > break; > @@ -4002,21 +4006,17 @@ static int shmem_parse_options(struct fs_context *fc, void *data) > > /* > * Reconfigure a shmem filesystem. > - * > - * Note that we disallow change from limited->unlimited blocks/inodes while any > - * are in use; but we must separately disallow unlimited->limited, because in > - * that case we have no record of how much is already in use. > */ > static int shmem_reconfigure(struct fs_context *fc) > { > struct shmem_options *ctx = fc->fs_private; > struct shmem_sb_info *sbinfo = SHMEM_SB(fc->root->d_sb); > - unsigned long inodes; > + unsigned long used_isp; > struct mempolicy *mpol = NULL; > const char *err; > > raw_spin_lock(&sbinfo->stat_lock); > - inodes = sbinfo->max_inodes - sbinfo->free_inodes; > + used_isp = sbinfo->max_inodes * BOGO_INODE_SIZE - sbinfo->free_ispace; > > if ((ctx->seen & SHMEM_SEEN_BLOCKS) && ctx->blocks) { > if (!sbinfo->max_blocks) { > @@ -4034,7 +4034,7 @@ static int shmem_reconfigure(struct fs_context *fc) > err = "Cannot retroactively limit inodes"; > goto out; > } > - if (ctx->inodes < inodes) { > + if (ctx->inodes * BOGO_INODE_SIZE < used_isp) { > err = "Too few inodes for current use"; > goto out; > } > @@ -4080,7 +4080,7 @@ static int shmem_reconfigure(struct fs_context *fc) > sbinfo->max_blocks = ctx->blocks; > if (ctx->seen & SHMEM_SEEN_INODES) { > sbinfo->max_inodes = ctx->inodes; > - sbinfo->free_inodes = ctx->inodes - inodes; > + sbinfo->free_ispace = ctx->inodes * BOGO_INODE_SIZE - used_isp; > } > > /* > @@ -4211,7 +4211,8 @@ static int shmem_fill_super(struct super_block *sb, struct fs_context *fc) > sb->s_flags |= SB_NOUSER; > #endif > sbinfo->max_blocks = ctx->blocks; > - sbinfo->free_inodes = sbinfo->max_inodes = ctx->inodes; > + sbinfo->max_inodes = ctx->inodes; > + sbinfo->free_ispace = sbinfo->max_inodes * BOGO_INODE_SIZE; > if (sb->s_flags & SB_KERNMOUNT) { > sbinfo->ino_batch = alloc_percpu(ino_t); > if (!sbinfo->ino_batch) > -- > 2.35.3 >