diff options
| author | Matthew Wilcox <willy@infradead.org> | 2018-10-26 14:43:22 -0400 |
|---|---|---|
| committer | Matthew Wilcox <willy@infradead.org> | 2019-02-06 13:13:24 -0500 |
| commit | 3ccaf57a6a63ad171a951dcaddffc453b2414c7b (patch) | |
| tree | fc2202432a5b50ee5507a2e240b439b2993c2c3f /include/linux/xarray.h | |
| parent | fd9dc93e36231fb6d520e0edd467058fad4fd12d (diff) | |
XArray: Add support for 1s-based allocation
A lot of places want to allocate IDs starting at 1 instead of 0.
While the xa_alloc() API supports this, it's not very efficient if lots
of IDs are allocated, due to having to walk down to the bottom of the
tree to see if ID 1 is available, then all the way over to the next
non-allocated ID. This method marks ID 0 as being occupied which wastes
one slot in the XArray, but preserves xa_empty() as working.
Signed-off-by: Matthew Wilcox <willy@infradead.org>
Diffstat (limited to 'include/linux/xarray.h')
| -rw-r--r-- | include/linux/xarray.h | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/include/linux/xarray.h b/include/linux/xarray.h index 57cf35c4d094..99dd0838b4ba 100644 --- a/include/linux/xarray.h +++ b/include/linux/xarray.h | |||
| @@ -220,10 +220,13 @@ enum xa_lock_type { | |||
| 220 | #define XA_FLAGS_LOCK_IRQ ((__force gfp_t)XA_LOCK_IRQ) | 220 | #define XA_FLAGS_LOCK_IRQ ((__force gfp_t)XA_LOCK_IRQ) |
| 221 | #define XA_FLAGS_LOCK_BH ((__force gfp_t)XA_LOCK_BH) | 221 | #define XA_FLAGS_LOCK_BH ((__force gfp_t)XA_LOCK_BH) |
| 222 | #define XA_FLAGS_TRACK_FREE ((__force gfp_t)4U) | 222 | #define XA_FLAGS_TRACK_FREE ((__force gfp_t)4U) |
| 223 | #define XA_FLAGS_ZERO_BUSY ((__force gfp_t)8U) | ||
| 223 | #define XA_FLAGS_MARK(mark) ((__force gfp_t)((1U << __GFP_BITS_SHIFT) << \ | 224 | #define XA_FLAGS_MARK(mark) ((__force gfp_t)((1U << __GFP_BITS_SHIFT) << \ |
| 224 | (__force unsigned)(mark))) | 225 | (__force unsigned)(mark))) |
| 225 | 226 | ||
| 227 | /* ALLOC is for a normal 0-based alloc. ALLOC1 is for an 1-based alloc */ | ||
| 226 | #define XA_FLAGS_ALLOC (XA_FLAGS_TRACK_FREE | XA_FLAGS_MARK(XA_FREE_MARK)) | 228 | #define XA_FLAGS_ALLOC (XA_FLAGS_TRACK_FREE | XA_FLAGS_MARK(XA_FREE_MARK)) |
| 229 | #define XA_FLAGS_ALLOC1 (XA_FLAGS_TRACK_FREE | XA_FLAGS_ZERO_BUSY) | ||
| 227 | 230 | ||
| 228 | /** | 231 | /** |
| 229 | * struct xarray - The anchor of the XArray. | 232 | * struct xarray - The anchor of the XArray. |
| @@ -279,7 +282,7 @@ struct xarray { | |||
| 279 | #define DEFINE_XARRAY(name) DEFINE_XARRAY_FLAGS(name, 0) | 282 | #define DEFINE_XARRAY(name) DEFINE_XARRAY_FLAGS(name, 0) |
| 280 | 283 | ||
| 281 | /** | 284 | /** |
| 282 | * DEFINE_XARRAY_ALLOC() - Define an XArray which can allocate IDs. | 285 | * DEFINE_XARRAY_ALLOC() - Define an XArray which allocates IDs starting at 0. |
| 283 | * @name: A string that names your XArray. | 286 | * @name: A string that names your XArray. |
| 284 | * | 287 | * |
| 285 | * This is intended for file scope definitions of allocating XArrays. | 288 | * This is intended for file scope definitions of allocating XArrays. |
| @@ -287,6 +290,15 @@ struct xarray { | |||
| 287 | */ | 290 | */ |
| 288 | #define DEFINE_XARRAY_ALLOC(name) DEFINE_XARRAY_FLAGS(name, XA_FLAGS_ALLOC) | 291 | #define DEFINE_XARRAY_ALLOC(name) DEFINE_XARRAY_FLAGS(name, XA_FLAGS_ALLOC) |
| 289 | 292 | ||
| 293 | /** | ||
| 294 | * DEFINE_XARRAY_ALLOC1() - Define an XArray which allocates IDs starting at 1. | ||
| 295 | * @name: A string that names your XArray. | ||
| 296 | * | ||
| 297 | * This is intended for file scope definitions of allocating XArrays. | ||
| 298 | * See also DEFINE_XARRAY(). | ||
| 299 | */ | ||
| 300 | #define DEFINE_XARRAY_ALLOC1(name) DEFINE_XARRAY_FLAGS(name, XA_FLAGS_ALLOC1) | ||
| 301 | |||
| 290 | void *xa_load(struct xarray *, unsigned long index); | 302 | void *xa_load(struct xarray *, unsigned long index); |
| 291 | void *xa_store(struct xarray *, unsigned long index, void *entry, gfp_t); | 303 | void *xa_store(struct xarray *, unsigned long index, void *entry, gfp_t); |
| 292 | void *xa_erase(struct xarray *, unsigned long index); | 304 | void *xa_erase(struct xarray *, unsigned long index); |
