> On 11 Dec 2016, at 21:01, David Holland <dholland-t...@netbsd.org> wrote:
> 
> On a low-memory machine Nick ran into the following deadlock:
> 
>  (a) rename -> vrele on child -> inactive -> truncate -> getblk ->
>      no memory in buffer pool -> wait for syncer

This prediction seems wrong.  It is not the syncers job to free
memory to buffer pool - it will just update and write buffers
ending up on one of the buffer queues.

To release memory to the buffer pool the pagedaemon calls buf_drain()
when it detects a low memory condition.  Looks like this check from
uvm_pageout() fails:

        bufcnt = uvmexp.freetarg - uvmexp.free;
        if (bufcnt < 0)
                bufcnt = 0; 

>  (b) syncer waiting for locked parent vnode from the rename
> 
> This makes it in general unsafe to vrele while holding a vnode lock.
> 
> In theory we could arrange this, but it's not desirable: the tidy
> locking model for directory operations is: lock parent, call into fs,
> fs handles child, unlock parent on return, so needing to unlock the
> parent before releasing the child would bust up the abstraction
> layer. (Not that we currently have this, but we're ostensibly working
> towards it.)
> 
> Does anyone have any suggestions for a patch to address this problem
> without first rewriting the syncer? While the latter is probably a
> good idea, it's not entirely trivial to do and get right, making it
> e.g. a poor pullup candidate...
> 
> -- 
> David A. Holland
> dholl...@netbsd.org

--
J. Hannken-Illjes - hann...@eis.cs.tu-bs.de - TU Braunschweig (Germany)

Reply via email to