On setups with many disks, we spend a considerable amount of time looking up the process-disk mapping on each queue of io. Testing with a NULL based block driver, this costs 40-50% reduction in throughput for 1000 disks.
Showing the changes to include/linux/blkdev.h (1 of 3 files). Show all
Unified · Split
| @@ -55,13 +55,11 @@ struct as_io_context { · 54 unmodified lines | ||
| 55 | 55 | |
| 56 | 56 | struct cfq_queue; |
| 57 | 57 | struct cfq_io_context { |
| 58 | − /* | |
| 59 | − * circular list of cfq_io_contexts belonging to a process io context | |
| 60 | − */ | |
| 61 | − struct list_head list; | |
| 62 | − struct cfq_queue *cfqq[2]; | |
| 58 | + struct rb_node rb_node; | |
| 63 | 59 | void *key; |
| 64 | 60 | |
| 61 | + struct cfq_queue *cfqq[2]; | |
| 62 | + | |
| 65 | 63 | struct io_context *ioc; |
| 66 | 64 | |
| 67 | 65 | unsigned long last_end_request; |
| @@ -72,8 +70,8 @@ struct cfq_io_context { · 4 unmodified lines | ||
| 72 | 70 | |
| 73 | 71 | struct list_head queue_list; |
| 74 | 72 | |
| 75 | − void (*dtor)(struct cfq_io_context *); | |
| 76 | − void (*exit)(struct cfq_io_context *); | |
| 73 | + void (*dtor)(struct io_context *); /* destructor */ | |
| 74 | + void (*exit)(struct io_context *); /* called on task exit */ | |
| 77 | 75 | }; |
| 78 | 76 | |
| 79 | 77 | /* |
| @@ -94,7 +92,7 @@ struct io_context { · 14 unmodified lines | ||
| 94 | 92 | int nr_batch_requests; /* Number of requests left in the batch */ |
| 95 | 93 | |
| 96 | 94 | struct as_io_context *aic; |
| 97 | − struct cfq_io_context *cic; | |
| 95 | + struct rb_root cic_root; | |
| 98 | 96 | }; |
| 99 | 97 | |
| 100 | 98 | void put_io_context(struct io_context *ioc); |