diff options
author | Shaohua Li <shli@kernel.org> | 2013-10-14 21:05:01 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2013-10-25 06:55:59 -0400 |
commit | e26b53d0b287056646a0dffce8bc6b0f053f3823 (patch) | |
tree | 99f7f824f8123d441de534960fd85dda5d2e5385 /include/linux/percpu_ida.h | |
parent | 098faf5805c80f951ce5e8b4a6842382ad793c38 (diff) |
percpu_ida: make percpu_ida percpu size/batch configurable
Make percpu_ida percpu size/batch configurable. The block-mq-tag will
use it.
After block-mq uses percpu_ida to manage tags, performance is improved.
My test is done in a 2 sockets machine, 12 process cross the 2 sockets.
So if there is lock contention or ipi, should be stressed heavily.
Testing is done for null-blk.
hw_queue_depth nopatch iops patch iops
64 ~800k/s ~1470k/s
2048 ~4470k/s ~4340k/s
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Shaohua Li <shli@fusionio.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'include/linux/percpu_ida.h')
-rw-r--r-- | include/linux/percpu_ida.h | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/include/linux/percpu_ida.h b/include/linux/percpu_ida.h index 0b23edbee309..56c14033e7e7 100644 --- a/include/linux/percpu_ida.h +++ b/include/linux/percpu_ida.h | |||
@@ -16,6 +16,8 @@ struct percpu_ida { | |||
16 | * percpu_ida_init() | 16 | * percpu_ida_init() |
17 | */ | 17 | */ |
18 | unsigned nr_tags; | 18 | unsigned nr_tags; |
19 | unsigned percpu_max_size; | ||
20 | unsigned percpu_batch_size; | ||
19 | 21 | ||
20 | struct percpu_ida_cpu __percpu *tag_cpu; | 22 | struct percpu_ida_cpu __percpu *tag_cpu; |
21 | 23 | ||
@@ -51,10 +53,24 @@ struct percpu_ida { | |||
51 | } ____cacheline_aligned_in_smp; | 53 | } ____cacheline_aligned_in_smp; |
52 | }; | 54 | }; |
53 | 55 | ||
56 | /* | ||
57 | * Number of tags we move between the percpu freelist and the global freelist at | ||
58 | * a time | ||
59 | */ | ||
60 | #define IDA_DEFAULT_PCPU_BATCH_MOVE 32U | ||
61 | /* Max size of percpu freelist, */ | ||
62 | #define IDA_DEFAULT_PCPU_SIZE ((IDA_DEFAULT_PCPU_BATCH_MOVE * 3) / 2) | ||
63 | |||
54 | int percpu_ida_alloc(struct percpu_ida *pool, gfp_t gfp); | 64 | int percpu_ida_alloc(struct percpu_ida *pool, gfp_t gfp); |
55 | void percpu_ida_free(struct percpu_ida *pool, unsigned tag); | 65 | void percpu_ida_free(struct percpu_ida *pool, unsigned tag); |
56 | 66 | ||
57 | void percpu_ida_destroy(struct percpu_ida *pool); | 67 | void percpu_ida_destroy(struct percpu_ida *pool); |
58 | int percpu_ida_init(struct percpu_ida *pool, unsigned long nr_tags); | 68 | int __percpu_ida_init(struct percpu_ida *pool, unsigned long nr_tags, |
69 | unsigned long max_size, unsigned long batch_size); | ||
70 | static inline int percpu_ida_init(struct percpu_ida *pool, unsigned long nr_tags) | ||
71 | { | ||
72 | return __percpu_ida_init(pool, nr_tags, IDA_DEFAULT_PCPU_SIZE, | ||
73 | IDA_DEFAULT_PCPU_BATCH_MOVE); | ||
74 | } | ||
59 | 75 | ||
60 | #endif /* __PERCPU_IDA_H__ */ | 76 | #endif /* __PERCPU_IDA_H__ */ |