diff options
author | наб <[email protected]> | 2021-12-17 01:43:10 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2021-12-16 16:43:10 -0800 |
commit | eb51a9d74742bd2dc4e31c1806532149593101df (patch) | |
tree | d3ec2ed57a9a8e573f5304f6ca401160fe4ed3a9 /include | |
parent | 8fdc6f618cf19e1894f5a803e043e80e762a86b1 (diff) |
zcommon: pre-iterate over sysfs instead of statting every feature
If sufficient memory (<2K, realistically) is available, libzfs_init()
can be significantly shorted by iterating over the correct sysfs
directory before registrations, we can turn 168 stats into 15/18
syscalls (3 opens (6 if built in), 3 fstats, 6 getdentses, and 3
closes), a tenfoldish reduction; this is probably a bit faster, too.
The list is always optional, and registration functions (and one-off
users) can simply pass NULL, which will fall back to the previous
mechanism
Also, don't allocate in zfs_mod_supported_impl, and use use access()
instead of stat(), since existence is really what we care about
Also, fix pre-prop-checking compat in fallback for built-in ZFS
Reviewed-by: Brian Behlendorf <[email protected]>
Reviewed-by: Tony Nguyen <[email protected]>
Signed-off-by: Ahelenia Ziemiańska <[email protected]>
Closes #12089
Diffstat (limited to 'include')
-rw-r--r-- | include/sys/zfs_sysfs.h | 7 | ||||
-rw-r--r-- | include/zfs_prop.h | 15 |
2 files changed, 16 insertions, 6 deletions
diff --git a/include/sys/zfs_sysfs.h b/include/sys/zfs_sysfs.h index 912ef234f..d1cb2ef43 100644 --- a/include/sys/zfs_sysfs.h +++ b/include/sys/zfs_sysfs.h @@ -25,6 +25,10 @@ #ifndef _SYS_ZFS_SYSFS_H #define _SYS_ZFS_SYSFS_H extern __attribute__((visibility("default"))) +struct zfs_mod_supported_features; +struct zfs_mod_supported_features *zfs_mod_list_supported(const char *scope); +void zfs_mod_list_supported_free(struct zfs_mod_supported_features *); + #ifdef _KERNEL void zfs_sysfs_init(void); @@ -35,7 +39,8 @@ void zfs_sysfs_fini(void); #define zfs_sysfs_init() #define zfs_sysfs_fini() -_SYS_ZFS_SYSFS_H boolean_t zfs_mod_supported(const char *, const char *); +_SYS_ZFS_SYSFS_H boolean_t zfs_mod_supported(const char *, const char *, + const struct zfs_mod_supported_features *); #endif #define ZFS_SYSFS_POOL_PROPERTIES "properties.pool" diff --git a/include/zfs_prop.h b/include/zfs_prop.h index 8014c757a..c7363f701 100644 --- a/include/zfs_prop.h +++ b/include/zfs_prop.h @@ -28,6 +28,7 @@ #include <sys/fs/zfs.h> #include <sys/types.h> +#include <sys/zfs_sysfs.h> #ifdef __cplusplus extern "C" { @@ -111,15 +112,19 @@ _ZFS_PROP_H zprop_desc_t *vdev_prop_get_table(void); */ _ZFS_PROP_H void zprop_register_impl(int, const char *, zprop_type_t, uint64_t, const char *, zprop_attr_t, int, const char *, const char *, - boolean_t, boolean_t, const zprop_index_t *); + boolean_t, boolean_t, const zprop_index_t *, + const struct zfs_mod_supported_features *); _ZFS_PROP_H void zprop_register_string(int, const char *, const char *, - zprop_attr_t attr, int, const char *, const char *); + zprop_attr_t attr, int, const char *, const char *, + const struct zfs_mod_supported_features *); _ZFS_PROP_H void zprop_register_number(int, const char *, uint64_t, - zprop_attr_t, int, const char *, const char *); + zprop_attr_t, int, const char *, const char *, + const struct zfs_mod_supported_features *); _ZFS_PROP_H void zprop_register_index(int, const char *, uint64_t, zprop_attr_t, - int, const char *, const char *, const zprop_index_t *); + int, const char *, const char *, const zprop_index_t *, + const struct zfs_mod_supported_features *); _ZFS_PROP_H void zprop_register_hidden(int, const char *, zprop_type_t, - zprop_attr_t, int, const char *); + zprop_attr_t, int, const char *, const struct zfs_mod_supported_features *); /* * Common routines for zfs and zpool property management |