80f784098f
Patch series 'squashfs: Add the mount parameter "threads="'. Currently, Squashfs supports multiple decompressor parallel modes. However, this mode can be configured only during kernel building and does not support flexible selection during runtime. In the current patch set, the mount parameter "threads=" is added to allow users to select the parallel decompressor mode and configure the number of decompressors when mounting a file system. "threads=<single|multi|percpu|1|2|3|...>" The upper limit is num_online_cpus() * 2. This patch (of 2): Squashfs supports three decompression concurrency modes: Single-thread mode: concurrent reads are blocked and the memory overhead is small. Multi-thread mode/percpu mode: reduces concurrent read blocking but increases memory overhead. The corresponding schema must be fixed at compile time. During mounting, the concurrent decompression mode cannot be adjusted based on file read blocking. The mount parameter theads=<single|multi|percpu> is added to select the concurrent decompression mode of a single SquashFS file system image. Link: https://lkml.kernel.org/r/20221019030930.130456-1-nixiaoming@huawei.com Link: https://lkml.kernel.org/r/20221019030930.130456-2-nixiaoming@huawei.com Signed-off-by: Xiaoming Ni <nixiaoming@huawei.com> Reviewed-by: Phillip Lougher <phillip@squashfs.org.uk> Cc: Jianguo Chen <chenjianguo3@huawei.com> Cc: Jubin Zhong <zhongjubin@huawei.com> Cc: Zhang Yi <yi.zhang@huawei.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
115 lines
3.8 KiB
C
115 lines
3.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Squashfs - a compressed read only filesystem for Linux
|
|
*
|
|
* Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
|
* Phillip Lougher <phillip@squashfs.org.uk>
|
|
*
|
|
* squashfs.h
|
|
*/
|
|
|
|
#define TRACE(s, args...) pr_debug("SQUASHFS: "s, ## args)
|
|
|
|
#define ERROR(s, args...) pr_err("SQUASHFS error: "s, ## args)
|
|
|
|
#define WARNING(s, args...) pr_warn("SQUASHFS: "s, ## args)
|
|
|
|
/* block.c */
|
|
extern int squashfs_read_data(struct super_block *, u64, int, u64 *,
|
|
struct squashfs_page_actor *);
|
|
|
|
/* cache.c */
|
|
extern struct squashfs_cache *squashfs_cache_init(char *, int, int);
|
|
extern void squashfs_cache_delete(struct squashfs_cache *);
|
|
extern struct squashfs_cache_entry *squashfs_cache_get(struct super_block *,
|
|
struct squashfs_cache *, u64, int);
|
|
extern void squashfs_cache_put(struct squashfs_cache_entry *);
|
|
extern int squashfs_copy_data(void *, struct squashfs_cache_entry *, int, int);
|
|
extern int squashfs_read_metadata(struct super_block *, void *, u64 *,
|
|
int *, int);
|
|
extern struct squashfs_cache_entry *squashfs_get_fragment(struct super_block *,
|
|
u64, int);
|
|
extern struct squashfs_cache_entry *squashfs_get_datablock(struct super_block *,
|
|
u64, int);
|
|
extern void *squashfs_read_table(struct super_block *, u64, int);
|
|
|
|
/* decompressor.c */
|
|
extern const struct squashfs_decompressor *squashfs_lookup_decompressor(int);
|
|
extern void *squashfs_decompressor_setup(struct super_block *, unsigned short);
|
|
|
|
/* decompressor_xxx.c */
|
|
|
|
struct squashfs_decompressor_thread_ops {
|
|
void * (*create)(struct squashfs_sb_info *msblk, void *comp_opts);
|
|
void (*destroy)(struct squashfs_sb_info *msblk);
|
|
int (*decompress)(struct squashfs_sb_info *msblk, struct bio *bio,
|
|
int offset, int length, struct squashfs_page_actor *output);
|
|
int (*max_decompressors)(void);
|
|
};
|
|
|
|
#ifdef CONFIG_SQUASHFS_DECOMP_SINGLE
|
|
extern const struct squashfs_decompressor_thread_ops squashfs_decompressor_single;
|
|
#endif
|
|
#ifdef CONFIG_SQUASHFS_DECOMP_MULTI
|
|
extern const struct squashfs_decompressor_thread_ops squashfs_decompressor_multi;
|
|
#endif
|
|
#ifdef CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU
|
|
extern const struct squashfs_decompressor_thread_ops squashfs_decompressor_percpu;
|
|
#endif
|
|
|
|
/* export.c */
|
|
extern __le64 *squashfs_read_inode_lookup_table(struct super_block *, u64, u64,
|
|
unsigned int);
|
|
|
|
/* fragment.c */
|
|
extern int squashfs_frag_lookup(struct super_block *, unsigned int, u64 *);
|
|
extern __le64 *squashfs_read_fragment_index_table(struct super_block *,
|
|
u64, u64, unsigned int);
|
|
|
|
/* file.c */
|
|
void squashfs_fill_page(struct page *, struct squashfs_cache_entry *, int, int);
|
|
void squashfs_copy_cache(struct page *, struct squashfs_cache_entry *, int,
|
|
int);
|
|
|
|
/* file_xxx.c */
|
|
extern int squashfs_readpage_block(struct page *, u64, int, int);
|
|
|
|
/* id.c */
|
|
extern int squashfs_get_id(struct super_block *, unsigned int, unsigned int *);
|
|
extern __le64 *squashfs_read_id_index_table(struct super_block *, u64, u64,
|
|
unsigned short);
|
|
|
|
/* inode.c */
|
|
extern struct inode *squashfs_iget(struct super_block *, long long,
|
|
unsigned int);
|
|
extern int squashfs_read_inode(struct inode *, long long);
|
|
|
|
/* xattr.c */
|
|
extern ssize_t squashfs_listxattr(struct dentry *, char *, size_t);
|
|
|
|
/*
|
|
* Inodes, files, decompressor and xattr operations
|
|
*/
|
|
|
|
/* dir.c */
|
|
extern const struct file_operations squashfs_dir_ops;
|
|
|
|
/* export.c */
|
|
extern const struct export_operations squashfs_export_ops;
|
|
|
|
/* file.c */
|
|
extern const struct address_space_operations squashfs_aops;
|
|
|
|
/* inode.c */
|
|
extern const struct inode_operations squashfs_inode_ops;
|
|
|
|
/* namei.c */
|
|
extern const struct inode_operations squashfs_dir_inode_ops;
|
|
|
|
/* symlink.c */
|
|
extern const struct address_space_operations squashfs_symlink_aops;
|
|
extern const struct inode_operations squashfs_symlink_inode_ops;
|
|
|
|
/* xattr.c */
|
|
extern const struct xattr_handler *squashfs_xattr_handlers[];
|