diff options
Diffstat (limited to 'include/linux/idr.h')
| -rw-r--r-- | include/linux/idr.h | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/include/linux/idr.h b/include/linux/idr.h index e968db71e33a..13a801f3d028 100644 --- a/include/linux/idr.h +++ b/include/linux/idr.h | |||
| @@ -50,14 +50,14 @@ | |||
| 50 | 50 | ||
| 51 | struct idr_layer { | 51 | struct idr_layer { |
| 52 | unsigned long bitmap; /* A zero bit means "space here" */ | 52 | unsigned long bitmap; /* A zero bit means "space here" */ |
| 53 | struct idr_layer *ary[1<<IDR_BITS]; | 53 | struct idr_layer __rcu *ary[1<<IDR_BITS]; |
| 54 | int count; /* When zero, we can release it */ | 54 | int count; /* When zero, we can release it */ |
| 55 | int layer; /* distance from leaf */ | 55 | int layer; /* distance from leaf */ |
| 56 | struct rcu_head rcu_head; | 56 | struct rcu_head rcu_head; |
| 57 | }; | 57 | }; |
| 58 | 58 | ||
| 59 | struct idr { | 59 | struct idr { |
| 60 | struct idr_layer *top; | 60 | struct idr_layer __rcu *top; |
| 61 | struct idr_layer *id_free; | 61 | struct idr_layer *id_free; |
| 62 | int layers; /* only valid without concurrent changes */ | 62 | int layers; /* only valid without concurrent changes */ |
| 63 | int id_free_cnt; | 63 | int id_free_cnt; |
| @@ -81,6 +81,7 @@ struct idr { | |||
| 81 | #define _idr_rc_to_errno(rc) ((rc) == -1 ? -EAGAIN : -ENOSPC) | 81 | #define _idr_rc_to_errno(rc) ((rc) == -1 ? -EAGAIN : -ENOSPC) |
| 82 | 82 | ||
| 83 | /** | 83 | /** |
| 84 | * DOC: idr sync | ||
| 84 | * idr synchronization (stolen from radix-tree.h) | 85 | * idr synchronization (stolen from radix-tree.h) |
| 85 | * | 86 | * |
| 86 | * idr_find() is able to be called locklessly, using RCU. The caller must | 87 | * idr_find() is able to be called locklessly, using RCU. The caller must |
| @@ -117,10 +118,13 @@ void idr_init(struct idr *idp); | |||
| 117 | /* | 118 | /* |
| 118 | * IDA - IDR based id allocator, use when translation from id to | 119 | * IDA - IDR based id allocator, use when translation from id to |
| 119 | * pointer isn't necessary. | 120 | * pointer isn't necessary. |
| 121 | * | ||
| 122 | * IDA_BITMAP_LONGS is calculated to be one less to accommodate | ||
| 123 | * ida_bitmap->nr_busy so that the whole struct fits in 128 bytes. | ||
| 120 | */ | 124 | */ |
| 121 | #define IDA_CHUNK_SIZE 128 /* 128 bytes per chunk */ | 125 | #define IDA_CHUNK_SIZE 128 /* 128 bytes per chunk */ |
| 122 | #define IDA_BITMAP_LONGS (128 / sizeof(long) - 1) | 126 | #define IDA_BITMAP_LONGS (IDA_CHUNK_SIZE / sizeof(long) - 1) |
| 123 | #define IDA_BITMAP_BITS (IDA_BITMAP_LONGS * sizeof(long) * 8) | 127 | #define IDA_BITMAP_BITS (IDA_BITMAP_LONGS * sizeof(long) * 8) |
| 124 | 128 | ||
| 125 | struct ida_bitmap { | 129 | struct ida_bitmap { |
| 126 | long nr_busy; | 130 | long nr_busy; |
