From cd42e992b5972cc011a0ed82a8b50df67972828f Mon Sep 17 00:00:00 2001 From: shodanshok Date: Fri, 16 Aug 2024 22:34:07 +0200 Subject: Enable L2 cache of all (MRU+MFU) metadata but MFU data only `l2arc_mfuonly` was added to avoid wasting L2 ARC on read-once MRU data and metadata. However it can be useful to cache as much metadata as possible while, at the same time, restricting data cache to MFU buffers only. This patch allow for such behavior by setting `l2arc_mfuonly` to 2 (or higher). The list of possible values is the following: 0: cache both MRU and MFU for both data and metadata; 1: cache only MFU for both data and metadata; 2: cache both MRU and MFU for metadata, but only MFU for data. Reviewed-by: Alexander Motin Reviewed-by: Brian Behlendorf Signed-off-by: Gionatan Danti Closes #16343 Closes #16402 --- module/zfs/arc.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'module/zfs/arc.c') diff --git a/module/zfs/arc.c b/module/zfs/arc.c index f25afa312..d7ee9d32a 100644 --- a/module/zfs/arc.c +++ b/module/zfs/arc.c @@ -9055,12 +9055,17 @@ l2arc_write_buffers(spa_t *spa, l2arc_dev_t *dev, uint64_t target_sz) */ for (int pass = 0; pass < L2ARC_FEED_TYPES; pass++) { /* - * If pass == 1 or 3, we cache MRU metadata and data - * respectively. + * pass == 0: MFU meta + * pass == 1: MRU meta + * pass == 2: MFU data + * pass == 3: MRU data */ - if (l2arc_mfuonly) { + if (l2arc_mfuonly == 1) { if (pass == 1 || pass == 3) continue; + } else if (l2arc_mfuonly > 1) { + if (pass == 3) + continue; } uint64_t passed_sz = 0; -- cgit v1.2.3