idr: reorder the fields
authorLai Jiangshan <laijs@cn.fujitsu.com>
Fri, 6 Jun 2014 21:37:15 +0000 (14:37 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 6 Jun 2014 23:08:13 +0000 (16:08 -0700)
idr_layer->layer is always accessed in read path, move it in the front.

idr_layer->bitmap is moved on the bottom.  And rcu_head shares with
bitmap due to they do not be accessed at the same time.

idr->id_free/id_free_cnt/lock are free list fields, and moved to the
bottom.  They will be removed in near future.

Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Cc: Tejun Heo <tj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/idr.h

index 6af3400..013fd9b 100644 (file)
 
 struct idr_layer {
        int                     prefix; /* the ID prefix of this idr_layer */
-       DECLARE_BITMAP(bitmap, IDR_SIZE); /* A zero bit means "space here" */
+       int                     layer;  /* distance from leaf */
        struct idr_layer __rcu  *ary[1<<IDR_BITS];
        int                     count;  /* When zero, we can release it */
-       int                     layer;  /* distance from leaf */
-       struct rcu_head         rcu_head;
+       union {
+               /* A zero bit means "space here" */
+               DECLARE_BITMAP(bitmap, IDR_SIZE);
+               struct rcu_head         rcu_head;
+       };
 };
 
 struct idr {
        struct idr_layer __rcu  *hint;  /* the last layer allocated from */
        struct idr_layer __rcu  *top;
-       struct idr_layer        *id_free;
        int                     layers; /* only valid w/o concurrent changes */
-       int                     id_free_cnt;
        int                     cur;    /* current pos for cyclic allocation */
        spinlock_t              lock;
+       int                     id_free_cnt;
+       struct idr_layer        *id_free;
 };
 
 #define IDR_INIT(name)                                                 \