new file mode 100644
@@ -0,0 +1,13 @@
+What: /sys/fs/tmpfs/<disk>/acct_errors
+Date: March 2022
+Contact: "Gabriel Krisman Bertazi" <krisman@collabora.com>
+Description:
+ Track the number of IO errors caused by lack of memory to
+ perform the allocation of a tmpfs block.
+
+What: /sys/fs/tmpfs/<disk>/space_errors
+Date: March 2022
+Contact: "Gabriel Krisman Bertazi" <krisman@collabora.com>
+Description:
+ Track the number of IO errors caused by lack of space
+ in the filesystem to perform the allocation of a tmpfs block.
@@ -214,6 +214,7 @@ static inline bool shmem_inode_acct_block(struct inode *inode, long pages)
if (shmem_acct_block(info->flags, pages)) {
sbinfo->acct_errors += 1;
+ sysfs_notify(&sbinfo->kobj, NULL, "acct_errors");
return false;
}
@@ -228,6 +229,7 @@ static inline bool shmem_inode_acct_block(struct inode *inode, long pages)
unacct:
sbinfo->space_errors += 1;
+ sysfs_notify(&sbinfo->kobj, NULL, "space_errors");
shmem_unacct_blocks(info->flags, pages);
return false;
}
@@ -3584,10 +3586,33 @@ static int shmem_show_options(struct seq_file *seq, struct dentry *root)
}
#if defined(CONFIG_SYSFS)
+static ssize_t acct_errors_show(struct kobject *kobj,
+ struct kobj_attribute *attr, char *page)
+{
+ struct shmem_sb_info *sbinfo =
+ container_of(kobj, struct shmem_sb_info, kobj);
+
+ return sysfs_emit(page, "%lu\n", sbinfo->acct_errors);
+}
+
+static ssize_t space_errors_show(struct kobject *kobj,
+ struct kobj_attribute *attr, char *page)
+{
+ struct shmem_sb_info *sbinfo =
+ container_of(kobj, struct shmem_sb_info, kobj);
+
+ return sysfs_emit(page, "%lu\n", sbinfo->space_errors);
+}
+
#define TMPFS_SB_ATTR_RO(name) \
static struct kobj_attribute tmpfs_sb_attr_##name = __ATTR_RO(name)
+TMPFS_SB_ATTR_RO(acct_errors);
+TMPFS_SB_ATTR_RO(space_errors);
+
static struct attribute *tmpfs_attrs[] = {
+ &tmpfs_sb_attr_acct_errors.attr,
+ &tmpfs_sb_attr_space_errors.attr,
NULL
};
ATTRIBUTE_GROUPS(tmpfs);
Exposing these shmem counters through sysfs is particularly useful for container provisioning, to allow administrators to differentiate between insufficiently provisioned fs size vs. running out of memory. Suggested-by: Amir Goldstein <amir73il@gmail.com> Suggested-by: Khazhy Kumykov <khazhy@google.com> Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com> --- Documentation/ABI/testing/sysfs-fs-tmpfs | 13 ++++++++++++ mm/shmem.c | 25 ++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-fs-tmpfs