On Mon, Jul 07, 2025 at 07:43:49PM +0200, Max Kellermann wrote: > On Mon, Jul 7, 2025 at 7:29 PM Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote: > > > (It checks for "dead" or "killed" entries, but why aren't you using > > > __lockref_is_dead() here?) > > > > What's the difference? It checks for dentries currently still going through > > ->d_prune()/->d_iput()/->d_release(). > > Just clarity. There exists a function and using it would make clearer > what you're really checking for. > > > What are you using shrink_dcache_parent() for? > > I don't. It's called by Ceph code, i.e. send_mds_reconnect(). A broken > Ceph-MDS connection apparently triggered this busy loop. > > (I'm not a Ceph developer. I just care for the monthly Ceph regression > that breaks all of our web servers on each and every Linux kernel > update. Sad story. However, the Ceph bug I'm really hunting is > unrelated to this dcache busy loop.) Well, it tries to evict all non-busy dentries, along with the ones that are only busy due to (non-busy) children, etc. It's the latter part that gets you into the fun with iput() on children... You'll need to ask ceph folks about what they really want there - I'm not familiar enough with ceph guts to tell it with any confidence.