xarray: Add definition of struct xarray
This is a direct replacement for struct radix_tree_root. Some of the struct members have changed name; convert those, and use a #define so that radix_tree users continue to work without change. Signed-off-by: Matthew Wilcox <willy@infradead.org> Reviewed-by: Josef Bacik <jbacik@fb.com>
This commit is contained in:
@@ -30,6 +30,9 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/xarray.h>
|
||||
|
||||
/* Keep unconverted code working */
|
||||
#define radix_tree_root xarray
|
||||
|
||||
/*
|
||||
* The bottom two bits of the slot determine how the remaining bits in the
|
||||
* slot are interpreted:
|
||||
@@ -92,36 +95,21 @@ struct radix_tree_node {
|
||||
unsigned long tags[RADIX_TREE_MAX_TAGS][RADIX_TREE_TAG_LONGS];
|
||||
};
|
||||
|
||||
/* The IDR tag is stored in the low bits of the GFP flags */
|
||||
/* The IDR tag is stored in the low bits of xa_flags */
|
||||
#define ROOT_IS_IDR ((__force gfp_t)4)
|
||||
/* The top bits of gfp_mask are used to store the root tags */
|
||||
/* The top bits of xa_flags are used to store the root tags */
|
||||
#define ROOT_TAG_SHIFT (__GFP_BITS_SHIFT)
|
||||
|
||||
struct radix_tree_root {
|
||||
spinlock_t xa_lock;
|
||||
gfp_t gfp_mask;
|
||||
struct radix_tree_node __rcu *rnode;
|
||||
};
|
||||
|
||||
#define RADIX_TREE_INIT(name, mask) { \
|
||||
.xa_lock = __SPIN_LOCK_UNLOCKED(name.xa_lock), \
|
||||
.gfp_mask = (mask), \
|
||||
.rnode = NULL, \
|
||||
}
|
||||
#define RADIX_TREE_INIT(name, mask) XARRAY_INIT(name, mask)
|
||||
|
||||
#define RADIX_TREE(name, mask) \
|
||||
struct radix_tree_root name = RADIX_TREE_INIT(name, mask)
|
||||
|
||||
#define INIT_RADIX_TREE(root, mask) \
|
||||
do { \
|
||||
spin_lock_init(&(root)->xa_lock); \
|
||||
(root)->gfp_mask = (mask); \
|
||||
(root)->rnode = NULL; \
|
||||
} while (0)
|
||||
#define INIT_RADIX_TREE(root, mask) xa_init_flags(root, mask)
|
||||
|
||||
static inline bool radix_tree_empty(const struct radix_tree_root *root)
|
||||
{
|
||||
return root->rnode == NULL;
|
||||
return root->xa_head == NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -10,6 +10,8 @@
|
||||
*/
|
||||
|
||||
#include <linux/bug.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/kconfig.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
@@ -153,6 +155,74 @@ static inline bool xa_is_internal(const void *entry)
|
||||
return ((unsigned long)entry & 3) == 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* struct xarray - The anchor of the XArray.
|
||||
* @xa_lock: Lock that protects the contents of the XArray.
|
||||
*
|
||||
* To use the xarray, define it statically or embed it in your data structure.
|
||||
* It is a very small data structure, so it does not usually make sense to
|
||||
* allocate it separately and keep a pointer to it in your data structure.
|
||||
*
|
||||
* You may use the xa_lock to protect your own data structures as well.
|
||||
*/
|
||||
/*
|
||||
* If all of the entries in the array are NULL, @xa_head is a NULL pointer.
|
||||
* If the only non-NULL entry in the array is at index 0, @xa_head is that
|
||||
* entry. If any other entry in the array is non-NULL, @xa_head points
|
||||
* to an @xa_node.
|
||||
*/
|
||||
struct xarray {
|
||||
spinlock_t xa_lock;
|
||||
/* private: The rest of the data structure is not to be used directly. */
|
||||
gfp_t xa_flags;
|
||||
void __rcu * xa_head;
|
||||
};
|
||||
|
||||
#define XARRAY_INIT(name, flags) { \
|
||||
.xa_lock = __SPIN_LOCK_UNLOCKED(name.xa_lock), \
|
||||
.xa_flags = flags, \
|
||||
.xa_head = NULL, \
|
||||
}
|
||||
|
||||
/**
|
||||
* DEFINE_XARRAY_FLAGS() - Define an XArray with custom flags.
|
||||
* @name: A string that names your XArray.
|
||||
* @flags: XA_FLAG values.
|
||||
*
|
||||
* This is intended for file scope definitions of XArrays. It declares
|
||||
* and initialises an empty XArray with the chosen name and flags. It is
|
||||
* equivalent to calling xa_init_flags() on the array, but it does the
|
||||
* initialisation at compiletime instead of runtime.
|
||||
*/
|
||||
#define DEFINE_XARRAY_FLAGS(name, flags) \
|
||||
struct xarray name = XARRAY_INIT(name, flags)
|
||||
|
||||
/**
|
||||
* DEFINE_XARRAY() - Define an XArray.
|
||||
* @name: A string that names your XArray.
|
||||
*
|
||||
* This is intended for file scope definitions of XArrays. It declares
|
||||
* and initialises an empty XArray with the chosen name. It is equivalent
|
||||
* to calling xa_init() on the array, but it does the initialisation at
|
||||
* compiletime instead of runtime.
|
||||
*/
|
||||
#define DEFINE_XARRAY(name) DEFINE_XARRAY_FLAGS(name, 0)
|
||||
|
||||
void xa_init_flags(struct xarray *, gfp_t flags);
|
||||
|
||||
/**
|
||||
* xa_init() - Initialise an empty XArray.
|
||||
* @xa: XArray.
|
||||
*
|
||||
* An empty XArray is full of NULL entries.
|
||||
*
|
||||
* Context: Any context.
|
||||
*/
|
||||
static inline void xa_init(struct xarray *xa)
|
||||
{
|
||||
xa_init_flags(xa, 0);
|
||||
}
|
||||
|
||||
#define xa_trylock(xa) spin_trylock(&(xa)->xa_lock)
|
||||
#define xa_lock(xa) spin_lock(&(xa)->xa_lock)
|
||||
#define xa_unlock(xa) spin_unlock(&(xa)->xa_lock)
|
||||
|
Reference in New Issue
Block a user