xfs
[Top] [All Lists]

Re: _pagebuf_lookup_pages() allocation flags

To: Marcelo Tosatti <marcelo@xxxxxxxxxxxxxxxx>
Subject: Re: _pagebuf_lookup_pages() allocation flags
From: Rajagopal Ananthanarayanan <ananth@xxxxxxx>
Date: Fri, 16 Feb 2001 14:47:05 -0800
Cc: linux-xfs@xxxxxxxxxxx
References: <Pine.LNX.4.21.0102161824530.769-100000@xxxxxxxxxxxxxxxxxxxxxx>
Sender: owner-linux-xfs@xxxxxxxxxxx
Marcelo Tosatti wrote:

> 
> some_xfs_operation -> down(&lock) ->
> _pagebuf_lookup_pages(_PBF_ENTER_PAGES) -> alloc_pages(GFP_HIGHUSER) ->
> do_try_to_free_pages() -> try_to_free_pages() -> page_launder() ->
> writepage() -> xfs_writepage() -> down(&lock)
> 
> Is that possible?

The call sequence is certainly possible, but there is no
one global "lock" as you've thought of above. A brief explanation
of xfs locks:

The two primary locks in xfs are per-inode: one is the
ilock and the other is an iolock. Further both are
read-write locks, in the sense, that they can be taken
in SHARED or EXCLUSIVE mode.

Generally, the I/O paths hold the iolock;
the write I/O paths hold the iolock EXCLUSIVE.
Any meta-data related operation will hold the ilock;
bmap allocation would hold the ilock EXCLUSIVE.

Notable exceptions are single page I/O operations, which
don't hold any locks. Example, readpage() & writepage()
don't hold any locks; since these routines are called with
the page locked, the lock on the page acts as a serialization
mechanism.

The final wrinkle is that if writepage() involved a conversion,
then ilock would be taken in EXCLUSIVE mode.

So, there is no single "lock" that satisfies the above deadlock
scenario as far as I can see ...

Cheers,


-- 
--------------------------------------------------------------------------
Rajagopal Ananthanarayanan ("ananth")
Member Technical Staff, SGI.
--------------------------------------------------------------------------

<Prev in Thread] Current Thread [Next in Thread>