On Tue 22-03-16 05:27:08, Matthew Wilcox wrote:
On Tue, Mar 22, 2016 at 10:12:32AM +0100, Jan Kara wrote:
> if (unlikely(!page)) // False since
> // RADIX_TREE_INDIRECT_PTR is set
> if (radix_tree_exception(page)) // False - no exeptional bit
Oops, you got confused:
static inline int radix_tree_exception(void *arg)
{
return unlikely((unsigned long)arg &
(RADIX_TREE_INDIRECT_PTR | RADIX_TREE_EXCEPTIONAL_ENTRY));
}
Ah, I've confused radix_tree_exception() and
radix_tree_exceptional_entry(). OK, so your code works AFAICT. But using
RADIX_TREE_RETRY still doesn't make things clearer to me - you still need
to check for INDIRECT bit in the retry logic to catch the
radix_tree_extend() race as well...
As a side note I think we should do away with radix_tree_exception() - it
isn't very useful (doesn't simplify any of its callers) and only creates
possibility for confusion.
Honza
--
Jan Kara <jack(a)suse.com>
SUSE Labs, CR