Re: explicit dcache <-> user-space cache coherency, sys_mark_dir_clean(), O_CLEAN

Ingo Molnar
2004-02-20T17:03:52Z

* Linus Torvalds <torvalds@osdl.org> wrote:

> Your version is also not multi-threaded: you can never allow more than
> one thread doing the "sys_mark_dir_clean()". That was the reason for
> having two bits: so that anybody can do a lookup in parallell, and
> only the "filldir" part needs to be serialized.
>
> So I do believe you'd want two bits anyway.

hm, right. So for the lookup to be lockless, it would have to be managed
via a syscall variant similar in mechanism to the two-bit approach you
suggested:

ret = sys_manage_dir_cache(fd, op);

where the following cache states are defined:

(invalid, refill_in_progress, valid)

the following type of cache ops are defined:

(lookup, cache_filled)

the semantics of the sys_manage_dir_cache() syscall are the following:

- op is 'lookup': the syscall returns 'valid' if state is valid. If the
state is 'refill_in_progress' then lookup returns refill_in_progress.
If the state is 'invalid', then the state goes to 'refill_in_progress'
and 'invalid' is returned.

- op is 'cache_filled': the syscall moves the state to 'valid' if state
is still 'refill_in_progress'. It goes to 'refill_in_progress' if the
state was 'invalid'.

the kernel does the valid->invalid and refill_in_progress->invalid
transitions automatically, when relevant VFS events occur. All dentries
start out in state invalid.

there's another class of problems: is it an issue that directory renames
that move this directory (higher up in the directory hierarchy of this
directory) do not invalidate the cache? In that case there's no dnotify
event either.

Ingo