1# SPDX-License-Identifier: GPL-2.0-only
2config SQUASHFS
3	tristate "SquashFS 4.0 - Squashed file system support"
4	depends on BLOCK
5	help
6	  Saying Y here includes support for SquashFS 4.0 (a Compressed
7	  Read-Only File System).  Squashfs is a highly compressed read-only
8	  filesystem for Linux.  It uses zlib, lzo or xz compression to
9	  compress both files, inodes and directories.  Inodes in the system
10	  are very small and all blocks are packed to minimise data overhead.
11	  Block sizes greater than 4K are supported up to a maximum of 1 Mbytes
12	  (default block size 128K).  SquashFS 4.0 supports 64 bit filesystems
13	  and files (larger than 4GB), full uid/gid information, hard links and
14	  timestamps.
15
16	  Squashfs is intended for general read-only filesystem use, for
17	  archival use (i.e. in cases where a .tar.gz file may be used), and in
18	  embedded systems where low overhead is needed.  Further information
19	  and tools are available from http://squashfs.sourceforge.net.
20
21	  If you want to compile this as a module ( = code which can be
22	  inserted in and removed from the running kernel whenever you want),
23	  say M here.  The module will be called squashfs.  Note that the root
24	  file system (the one containing the directory /) cannot be compiled
25	  as a module.
26
27	  If unsure, say N.
28
29choice
30	prompt "File decompression options"
31	depends on SQUASHFS
32	help
33	  Squashfs now supports two options for decompressing file
34	  data.  Traditionally Squashfs has decompressed into an
35	  intermediate buffer and then memcopied it into the page cache.
36	  Squashfs now supports the ability to decompress directly into
37	  the page cache.
38
39	  If unsure, select "Decompress file data into an intermediate buffer"
40
41config SQUASHFS_FILE_CACHE
42	bool "Decompress file data into an intermediate buffer"
43	help
44	  Decompress file data into an intermediate buffer and then
45	  memcopy it into the page cache.
46
47config SQUASHFS_FILE_DIRECT
48	bool "Decompress files directly into the page cache"
49	help
50	  Directly decompress file data into the page cache.
51	  Doing so can significantly improve performance because
52	  it eliminates a memcpy and it also removes the lock contention
53	  on the single buffer.
54
55endchoice
56
57config SQUASHFS_DECOMP_SINGLE
58	depends on SQUASHFS
59	def_bool n
60
61config SQUASHFS_DECOMP_MULTI
62	depends on SQUASHFS
63	def_bool n
64
65config SQUASHFS_DECOMP_MULTI_PERCPU
66	depends on SQUASHFS
67	def_bool n
68
69config SQUASHFS_CHOICE_DECOMP_BY_MOUNT
70	bool "Select the parallel decompression mode during mount"
71	depends on SQUASHFS
72	default n
73	select SQUASHFS_DECOMP_SINGLE
74	select SQUASHFS_DECOMP_MULTI
75	select SQUASHFS_DECOMP_MULTI_PERCPU
76	select SQUASHFS_MOUNT_DECOMP_THREADS
77	help
78	  Compile all parallel decompression modes and specify the
79	  decompression mode by setting "threads=" during mount.
80	  default Decompressor parallelisation is SQUASHFS_DECOMP_SINGLE
81
82choice
83	prompt "Select decompression parallel mode at compile time"
84	depends on SQUASHFS
85	depends on !SQUASHFS_CHOICE_DECOMP_BY_MOUNT
86	help
87	  Squashfs now supports three parallelisation options for
88	  decompression.  Each one exhibits various trade-offs between
89	  decompression performance and CPU and memory usage.
90
91	  If in doubt, select "Single threaded compression"
92
93config SQUASHFS_COMPILE_DECOMP_SINGLE
94	bool "Single threaded compression"
95	select SQUASHFS_DECOMP_SINGLE
96	help
97	  Traditionally Squashfs has used single-threaded decompression.
98	  Only one block (data or metadata) can be decompressed at any
99	  one time.  This limits CPU and memory usage to a minimum.
100
101config SQUASHFS_COMPILE_DECOMP_MULTI
102	bool "Use multiple decompressors for parallel I/O"
103	select SQUASHFS_DECOMP_MULTI
104	help
105	  By default Squashfs uses a single decompressor but it gives
106	  poor performance on parallel I/O workloads when using multiple CPU
107	  machines due to waiting on decompressor availability.
108
109	  If you have a parallel I/O workload and your system has enough memory,
110	  using this option may improve overall I/O performance.
111
112	  This decompressor implementation uses up to two parallel
113	  decompressors per core.  It dynamically allocates decompressors
114	  on a demand basis.
115
116config SQUASHFS_COMPILE_DECOMP_MULTI_PERCPU
117	bool "Use percpu multiple decompressors for parallel I/O"
118	select SQUASHFS_DECOMP_MULTI_PERCPU
119	help
120	  By default Squashfs uses a single decompressor but it gives
121	  poor performance on parallel I/O workloads when using multiple CPU
122	  machines due to waiting on decompressor availability.
123
124	  This decompressor implementation uses a maximum of one
125	  decompressor per core.  It uses percpu variables to ensure
126	  decompression is load-balanced across the cores.
127endchoice
128
129config SQUASHFS_MOUNT_DECOMP_THREADS
130	bool "Add the mount parameter 'threads=' for squashfs"
131	depends on SQUASHFS
132	depends on SQUASHFS_DECOMP_MULTI
133	default n
134	help
135	  Use threads= to set the decompression parallel mode and the number of threads.
136	  If SQUASHFS_CHOICE_DECOMP_BY_MOUNT=y
137	      threads=<single|multi|percpu|1|2|3|...>
138	  else
139	      threads=<2|3|...>
140	  The upper limit is num_online_cpus() * 2.
141
142config SQUASHFS_XATTR
143	bool "Squashfs XATTR support"
144	depends on SQUASHFS
145	help
146	  Saying Y here includes support for extended attributes (xattrs).
147	  Xattrs are name:value pairs associated with inodes by
148	  the kernel or by users (see the attr(5) manual page).
149
150	  If unsure, say N.
151
152config SQUASHFS_ZLIB
153	bool "Include support for ZLIB compressed file systems"
154	depends on SQUASHFS
155	select ZLIB_INFLATE
156	default y
157	help
158	  ZLIB compression is the standard compression used by Squashfs
159	  file systems.  It offers a good trade-off between compression
160	  achieved and the amount of CPU time and memory necessary to
161	  compress and decompress.
162
163	  If unsure, say Y.
164
165config SQUASHFS_LZ4
166	bool "Include support for LZ4 compressed file systems"
167	depends on SQUASHFS
168	select LZ4_DECOMPRESS
169	help
170	  Saying Y here includes support for reading Squashfs file systems
171	  compressed with LZ4 compression.  LZ4 compression is mainly
172	  aimed at embedded systems with slower CPUs where the overheads
173	  of zlib are too high.
174
175	  LZ4 is not the standard compression used in Squashfs and so most
176	  file systems will be readable without selecting this option.
177
178	  If unsure, say N.
179
180config SQUASHFS_LZO
181	bool "Include support for LZO compressed file systems"
182	depends on SQUASHFS
183	select LZO_DECOMPRESS
184	help
185	  Saying Y here includes support for reading Squashfs file systems
186	  compressed with LZO compression.  LZO compression is mainly
187	  aimed at embedded systems with slower CPUs where the overheads
188	  of zlib are too high.
189
190	  LZO is not the standard compression used in Squashfs and so most
191	  file systems will be readable without selecting this option.
192
193	  If unsure, say N.
194
195config SQUASHFS_XZ
196	bool "Include support for XZ compressed file systems"
197	depends on SQUASHFS
198	select XZ_DEC
199	help
200	  Saying Y here includes support for reading Squashfs file systems
201	  compressed with XZ compression.  XZ gives better compression than
202	  the default zlib compression, at the expense of greater CPU and
203	  memory overhead.
204
205	  XZ is not the standard compression used in Squashfs and so most
206	  file systems will be readable without selecting this option.
207
208	  If unsure, say N.
209
210config SQUASHFS_ZSTD
211	bool "Include support for ZSTD compressed file systems"
212	depends on SQUASHFS
213	select ZSTD_DECOMPRESS
214	help
215	  Saying Y here includes support for reading Squashfs file systems
216	  compressed with ZSTD compression.  ZSTD gives better compression than
217	  the default ZLIB compression, while using less CPU.
218
219	  ZSTD is not the standard compression used in Squashfs and so most
220	  file systems will be readable without selecting this option.
221
222	  If unsure, say N.
223
224config SQUASHFS_4K_DEVBLK_SIZE
225	bool "Use 4K device block size?"
226	depends on SQUASHFS
227	help
228	  By default Squashfs sets the dev block size (sb_min_blocksize)
229	  to 1K or the smallest block size supported by the block device
230	  (if larger).  This, because blocks are packed together and
231	  unaligned in Squashfs, should reduce latency.
232
233	  This, however, gives poor performance on MTD NAND devices where
234	  the optimal I/O size is 4K (even though the devices can support
235	  smaller block sizes).
236
237	  Using a 4K device block size may also improve overall I/O
238	  performance for some file access patterns (e.g. sequential
239	  accesses of files in filesystem order) on all media.
240
241	  Setting this option will force Squashfs to use a 4K device block
242	  size by default.
243
244	  If unsure, say N.
245
246config SQUASHFS_EMBEDDED
247	bool "Additional option for memory-constrained systems"
248	depends on SQUASHFS
249	help
250	  Saying Y here allows you to specify cache size.
251
252	  If unsure, say N.
253
254config SQUASHFS_FRAGMENT_CACHE_SIZE
255	int "Number of fragments cached" if SQUASHFS_EMBEDDED
256	depends on SQUASHFS
257	default "3"
258	help
259	  By default SquashFS caches the last 3 fragments read from
260	  the filesystem.  Increasing this amount may mean SquashFS
261	  has to re-read fragments less often from disk, at the expense
262	  of extra system memory.  Decreasing this amount will mean
263	  SquashFS uses less memory at the expense of extra reads from disk.
264
265	  Note there must be at least one cached fragment.  Anything
266	  much more than three will probably not make much difference.
267