Re: dcache shrink list corruption?

From: Al Viro
Date: Sat May 03 2014 - 00:26:21 EST


On Fri, May 02, 2014 at 11:40:22PM +0100, Al Viro wrote:
> On Fri, May 02, 2014 at 02:18:43PM -0700, Linus Torvalds wrote:
> > On Fri, May 2, 2014 at 2:08 PM, Miklos Szeredi <miklos@xxxxxxxxxx> wrote:
> > > There's more of the "delete from shrink list not owned by us" in select parent.
> > > Proposed patch appended.
> >
> > Ahh. Clearly this needs more work before I pull.
>
> *nod*
>
> Besides, I want to put Miklos' "don't bother with RCU in shrink_dentry_list()"
> in there as soon as select_collect() has been dealt with. I don't think
> that the currently posted patch for select_collect() is right, though -
> see my reply to parent posting. Basically, I think we should treat "it's
> on the shrink list already" as "increment data->found and keep going". IOW,
> if (on shrink list) {
> data->found++;
> } else {
> if (on lru list)
> d_lru_del
> if (refcount is zero) {
> d_shrink_add
> data->found++;
> }
> }
> if (data->found)
> ret = need_resched() ? D_WALK_QUIT : D_WALK_NORETRY;

See vfs.git#dentry_kill-3; warning - this is completely untested and I would
really like comments on spinning case there (i.e. the one where select_collect()
finds some stuff already on some other shrink list and nothing with zero
refcount that wouldn't be there). In that case (and it's basically "somebody
else is evicting stuff in our subtree and they'd already picked everything
we want evicted") I just let the loop in check_submounts_and_drop() repeat
(we do have cond_resched() there). Any better suggestions would be welcome...
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/