subsys/fs/littlefs: allow customization of file system configuration
There's desire to be able to customize parameters on a per-filesystem basis, which means we need a way to override the Kconfig defaults which are global. This also means the littlefs data structure cannot own the cache and lookahead buffers. Switch to using a macro to define the littlefs data structure. The default version uses the Kconfig constants. A custom one takes arguments providing the most likely partition-specific parameters. Finally the user is free to bypass the helper macros and set any parameters desired, though validation is limited and only present when CONFIG_DEBUG is enabled. Extend the test suite with a performance module, which confirms that these settings have an impact proportional to the log of changes to the cache or IO sizes. Signed-off-by: Peter A. Bigot <pab@pabigot.com>
This commit is contained in:
parent
a8b7a21524
commit
167eb53e74
13 changed files with 651 additions and 125 deletions
|
@ -19,19 +19,86 @@ extern "C" {
|
|||
|
||||
/** @brief Filesystem info structure for LittleFS mount */
|
||||
struct fs_littlefs {
|
||||
/* Defaulted in driver, customizable before mount. */
|
||||
struct lfs_config cfg;
|
||||
|
||||
/* Must be cfg.cache_size */
|
||||
u8_t *read_buffer;
|
||||
|
||||
/* Must be cfg.cache_size */
|
||||
u8_t *prog_buffer;
|
||||
|
||||
/* Mustbe cfg.lookahead_size/4 elements, and
|
||||
* cfg.lookahead_size must be a multiple of 8.
|
||||
*/
|
||||
u32_t *lookahead_buffer[CONFIG_FS_LITTLEFS_LOOKAHEAD_SIZE / sizeof(u32_t)];
|
||||
|
||||
/* These structures are filled automatically at mount. */
|
||||
struct lfs lfs;
|
||||
struct lfs_config cfg;
|
||||
const struct flash_area *area;
|
||||
struct k_mutex mutex;
|
||||
|
||||
/* Static buffers */
|
||||
u8_t read_buffer[CONFIG_FS_LITTLEFS_CACHE_SIZE];
|
||||
u8_t prog_buffer[CONFIG_FS_LITTLEFS_CACHE_SIZE];
|
||||
/* Multiple of 8 bytes, but 4-byte aligned (littlefs #239) */
|
||||
u32_t lookahead_buffer[CONFIG_FS_LITTLEFS_LOOKAHEAD_SIZE / sizeof(u32_t)];
|
||||
};
|
||||
|
||||
/** @brief Define a littlefs configuration with customized size
|
||||
* characteristics.
|
||||
*
|
||||
* This defines static arrays required for caches, and initializes the
|
||||
* littlefs configuration structure to use the provided values instead
|
||||
* of the global Kconfig defaults. A pointer to the named object must
|
||||
* be stored in the ``.fs_data`` field of a :c:type:`struct fs_mount`
|
||||
* object.
|
||||
*
|
||||
* To define an instance for the Kconfig defaults, use
|
||||
* :cpp:func:`FS_LITTLEFS_DECLARE_DEFAULT_CONFIG`.
|
||||
*
|
||||
* To completely control file system configuration the application can
|
||||
* directly define and initialize a :c:type:`struct fs_littlefs`
|
||||
* object. The application is responsible for ensuring the configured
|
||||
* values are consistent with littlefs requirements.
|
||||
*
|
||||
* @note If you use a non-default configuration for cache size, you
|
||||
* must also select :option:`CONFIG_FS_LITTLEFS_FC_MEM_POOL` to relax
|
||||
* the size constraints on per-file cache allocations.
|
||||
*
|
||||
* @param name the name for the structure. The defined object has
|
||||
* file scope.
|
||||
* @param read_sz see :option:`CONFIG_FS_LITTLEFS_READ_SIZE`
|
||||
* @param prog_sz see :option:`CONFIG_FS_LITTLEFS_PROG_SIZE`
|
||||
* @param cache_sz see :option:`CONFIG_FS_LITTLEFS_CACHE_SIZE`
|
||||
* @param lookahead_sz see :option:`CONFIG_FS_LITTLEFS_LOOKAHEAD_SIZE`
|
||||
*/
|
||||
#define FS_LITTLEFS_DECLARE_CUSTOM_CONFIG(name, read_sz, prog_sz, cache_sz, lookahead_sz) \
|
||||
static u8_t name ## _read_buffer[cache_sz]; \
|
||||
static u8_t name ## _prog_buffer[cache_sz]; \
|
||||
static u32_t name ## _lookahead_buffer[(lookahead_sz) / sizeof(u32_t)]; \
|
||||
static struct fs_littlefs name = { \
|
||||
.cfg = { \
|
||||
.read_size = (read_sz), \
|
||||
.prog_size = (prog_sz), \
|
||||
.cache_size = (cache_sz), \
|
||||
.lookahead_size = (lookahead_sz), \
|
||||
.read_buffer = name ## _read_buffer, \
|
||||
.prog_buffer = name ## _prog_buffer, \
|
||||
.lookahead_buffer = name ## _lookahead_buffer, \
|
||||
}, \
|
||||
}
|
||||
|
||||
/** @brief Define a littlefs configuration with default characteristics.
|
||||
*
|
||||
* This defines static arrays and initializes the littlefs
|
||||
* configuration structure to use the default size configuration
|
||||
* provided by Kconfig.
|
||||
*
|
||||
* @param name the name for the structure. The defined object has
|
||||
* file scope.
|
||||
*/
|
||||
#define FS_LITTLEFS_DECLARE_DEFAULT_CONFIG(name) \
|
||||
FS_LITTLEFS_DECLARE_CUSTOM_CONFIG(name, \
|
||||
CONFIG_FS_LITTLEFS_READ_SIZE, \
|
||||
CONFIG_FS_LITTLEFS_PROG_SIZE, \
|
||||
CONFIG_FS_LITTLEFS_CACHE_SIZE, \
|
||||
CONFIG_FS_LITTLEFS_LOOKAHEAD_SIZE)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue