mm: Convert truncate to XArray
This is essentially xa_cmpxchg() with the locking handled above us, and it doesn't have to handle replacing a NULL entry. Signed-off-by: Matthew Wilcox <willy@infradead.org>
This commit is contained in:
parent
a97e7904c0
commit
69b6c1319b
|
@ -33,15 +33,12 @@
|
||||||
static inline void __clear_shadow_entry(struct address_space *mapping,
|
static inline void __clear_shadow_entry(struct address_space *mapping,
|
||||||
pgoff_t index, void *entry)
|
pgoff_t index, void *entry)
|
||||||
{
|
{
|
||||||
struct radix_tree_node *node;
|
XA_STATE(xas, &mapping->i_pages, index);
|
||||||
void **slot;
|
|
||||||
|
|
||||||
if (!__radix_tree_lookup(&mapping->i_pages, index, &node, &slot))
|
xas_set_update(&xas, workingset_update_node);
|
||||||
|
if (xas_load(&xas) != entry)
|
||||||
return;
|
return;
|
||||||
if (*slot != entry)
|
xas_store(&xas, NULL);
|
||||||
return;
|
|
||||||
__radix_tree_replace(&mapping->i_pages, node, slot, NULL,
|
|
||||||
workingset_update_node);
|
|
||||||
mapping->nrexceptional--;
|
mapping->nrexceptional--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -738,10 +735,10 @@ int invalidate_inode_pages2_range(struct address_space *mapping,
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* For DAX we invalidate page tables after invalidating radix tree. We
|
* For DAX we invalidate page tables after invalidating page cache. We
|
||||||
* could invalidate page tables while invalidating each entry however
|
* could invalidate page tables while invalidating each entry however
|
||||||
* that would be expensive. And doing range unmapping before doesn't
|
* that would be expensive. And doing range unmapping before doesn't
|
||||||
* work as we have no cheap way to find whether radix tree entry didn't
|
* work as we have no cheap way to find whether page cache entry didn't
|
||||||
* get remapped later.
|
* get remapped later.
|
||||||
*/
|
*/
|
||||||
if (dax_mapping(mapping)) {
|
if (dax_mapping(mapping)) {
|
||||||
|
|
Loading…
Reference in New Issue