Maybe just re-set the timestamp every time the cached directory is reopened, that way a hot directory will remain in cache indefinitely but one that is cold will quickly time out and make space for something else to be chaced. On Sat, 2 Sept 2023 at 02:22, Steve French <smfrench@xxxxxxxxx> wrote: > > I lean toward eventually increasing the default to something more > similar to Windows (or at least 5 minutes) to improve some common > scenarios, but it looks like Windows sets it to 10 minutes based on > this link, but first want to make sure we are grabbing leases in all > of the obvious places (and not unnecessarily breaking leases - there > are a few places where we aren't sending the lease key and we also are > missing setting the parent lease key) > > See "DirectoryCacheEntriesMax" iand "DormantDirectoryTimeout" in > LanmanWorkstation config. The description > https://learn.microsoft.com/en-us/windows-server/administration/performance-tuning/role/file-server/is > of some of the related parms was a little vague but presumably > DirectoryCacheEntriesMax is the number of directories (16) that are > cached by default (ie number of directory leases that are held) and > DormantDirectoryTimeout (default 600 seconds) is how long they are > held. > > On Fri, Sep 1, 2023 at 4:04 AM Ralph Boehme <slow@xxxxxxxxx> wrote: > > > > Just wondering: how does a Windows client handle this? Does it use a > > timeout too? Which one? 60 seconds still seem rather short. > > > > -slow > > > > On 8/31/23 05:52, Steve French wrote: > > > updated patch with Barath's suggestion of renaming it from > > > /sys/module/cifs/parameters/max_dir_cache to > > > /sys/module/cifs/parameters/dir_cache_timeout and also changed it so > > > if set to zero we disable > > > directory entry caching. > > > > > > See attached. > > > > > > On Sun, Aug 27, 2023 at 12:12 AM Steve French <smfrench@xxxxxxxxx> wrote: > > >> > > >> Currently with directory leases we cache directory contents for a fixed period > > >> of time (default 30 seconds) but for many workloads this is too short. Allow > > >> configuring the maximum amount of time directory entries are cached when a > > >> directory lease is held on that directory (and set default timeout to > > >> 60 seconds). > > >> Add module load parm "max_dir_cache" > > >> > > >> For example to set the timeout to 10 minutes you would do: > > >> > > >> echo 600 > /sys/module/cifs/parameters/max_dir_cache > > >> > > >> Signed-off-by: Steve French <stfrench@xxxxxxxxxxxxx> > > >> --- > > >> fs/smb/client/cached_dir.c | 2 +- > > >> fs/smb/client/cifsfs.c | 12 ++++++++++++ > > >> fs/smb/client/cifsglob.h | 1 + > > >> 3 files changed, 14 insertions(+), 1 deletion(-) > > >> > > >> diff --git a/fs/smb/client/cached_dir.c b/fs/smb/client/cached_dir.c > > >> index 2d5e9a9d5b8b..e48a902efd52 100644 > > >> --- a/fs/smb/client/cached_dir.c > > >> +++ b/fs/smb/client/cached_dir.c > > >> @@ -582,7 +582,7 @@ cifs_cfids_laundromat_thread(void *p) > > >> return 0; > > >> spin_lock(&cfids->cfid_list_lock); > > >> list_for_each_entry_safe(cfid, q, &cfids->entries, entry) { > > >> - if (time_after(jiffies, cfid->time + HZ * 30)) { > > >> + if (time_after(jiffies, cfid->time + HZ * max_dir_cache)) { > > >> list_del(&cfid->entry); > > >> list_add(&cfid->entry, &entry); > > >> cfids->num_entries--; > > >> diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c > > >> index d49fd2bf71b0..7a89718d2a59 100644 > > >> --- a/fs/smb/client/cifsfs.c > > >> +++ b/fs/smb/client/cifsfs.c > > >> @@ -117,6 +117,10 @@ module_param(cifs_max_pending, uint, 0444); > > >> MODULE_PARM_DESC(cifs_max_pending, "Simultaneous requests to server for " > > >> "CIFS/SMB1 dialect (N/A for SMB3) " > > >> "Default: 32767 Range: 2 to 32767."); > > >> +unsigned int max_dir_cache = 60; > > >> +module_param(max_dir_cache, uint, 0644); > > >> +MODULE_PARM_DESC(max_dir_cache, "Number of seconds to cache directory > > >> contents for which we have a lease. Default: 60 " > > >> + "Range: 1 to 65000 seconds"); > > >> #ifdef CONFIG_CIFS_STATS2 > > >> unsigned int slow_rsp_threshold = 1; > > >> module_param(slow_rsp_threshold, uint, 0644); > > >> @@ -1679,6 +1683,14 @@ init_cifs(void) > > >> CIFS_MAX_REQ); > > >> } > > >> > > >> + if (max_dir_cache < 1) { > > >> + max_dir_cache = 1; > > >> + cifs_dbg(VFS, "max_dir_cache timeout set to min of 1 second\n"); > > >> + } else if (max_dir_cache > 65000) { > > >> + max_dir_cache = 65000; > > >> + cifs_dbg(VFS, "max_dir_cache timeout set to max of 65000 seconds\n"); > > >> + } > > >> + > > >> cifsiod_wq = alloc_workqueue("cifsiod", WQ_FREEZABLE|WQ_MEM_RECLAIM, 0); > > >> if (!cifsiod_wq) { > > >> rc = -ENOMEM; > > >> diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h > > >> index 259e231f8b4f..7aeeaa260cce 100644 > > >> --- a/fs/smb/client/cifsglob.h > > >> +++ b/fs/smb/client/cifsglob.h > > >> @@ -2016,6 +2016,7 @@ extern unsigned int CIFSMaxBufSize; /* max size > > >> not including hdr */ > > >> extern unsigned int cifs_min_rcv; /* min size of big ntwrk buf pool */ > > >> extern unsigned int cifs_min_small; /* min size of small buf pool */ > > >> extern unsigned int cifs_max_pending; /* MAX requests at once to server*/ > > >> +extern unsigned int max_dir_cache; /* max time for directory lease > > >> caching of dir */ > > >> extern bool disable_legacy_dialects; /* forbid vers=1.0 and vers=2.0 mounts */ > > >> extern atomic_t mid_count; > > >> > > >> > > >> -- > > >> Thanks, > > >> > > >> Steve > > > > > > > > > > > > > > -- > Thanks, > > Steve