diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-25 13:33:36 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-25 13:33:36 -0400 |
| commit | 096a705bbc080a4041636d07514560da8d78acbe (patch) | |
| tree | 38c3c01225709ffa53419083ea6332f8a72610de | |
| parent | fea80311a939a746533a6d7e7c3183729d6a3faf (diff) | |
| parent | 5757a6d76cdf6dda2a492c09b985c015e86779b1 (diff) | |
Merge branch 'for-3.1/core' of git://git.kernel.dk/linux-block
* 'for-3.1/core' of git://git.kernel.dk/linux-block: (24 commits)
block: strict rq_affinity
backing-dev: use synchronize_rcu_expedited instead of synchronize_rcu
block: fix patch import error in max_discard_sectors check
block: reorder request_queue to remove 64 bit alignment padding
CFQ: add think time check for group
CFQ: add think time check for service tree
CFQ: move think time check variables to a separate struct
fixlet: Remove fs_excl from struct task.
cfq: Remove special treatment for metadata rqs.
block: document blk_plug list access
block: avoid building too big plug list
compat_ioctl: fix make headers_check regression
block: eliminate potential for infinite loop in blkdev_issue_discard
compat_ioctl: fix warning caused by qemu
block: flush MEDIA_CHANGE from drivers on close(2)
blk-throttle: Make total_nr_queued unsigned
block: Add __attribute__((format(printf...) and fix fallout
fs/partitions/check.c: make local symbols static
block:remove some spare spaces in genhd.c
block:fix the comment error in blkdev.h
...
| -rw-r--r-- | Documentation/block/queue-sysfs.txt | 10 | ||||
| -rw-r--r-- | block/blk-core.c | 11 | ||||
| -rw-r--r-- | block/blk-ioc.c | 40 | ||||
| -rw-r--r-- | block/blk-lib.c | 5 | ||||
| -rw-r--r-- | block/blk-softirq.c | 11 | ||||
| -rw-r--r-- | block/blk-sysfs.c | 13 | ||||
| -rw-r--r-- | block/blk-throttle.c | 8 | ||||
| -rw-r--r-- | block/cfq-iosched.c | 152 | ||||
| -rw-r--r-- | block/compat_ioctl.c | 14 | ||||
| -rw-r--r-- | block/deadline-iosched.c | 4 | ||||
| -rw-r--r-- | block/elevator.c | 7 | ||||
| -rw-r--r-- | block/genhd.c | 28 | ||||
| -rw-r--r-- | fs/block_dev.c | 23 | ||||
| -rw-r--r-- | fs/compat_ioctl.c | 5 | ||||
| -rw-r--r-- | fs/partitions/check.c | 12 | ||||
| -rw-r--r-- | fs/reiserfs/journal.c | 13 | ||||
| -rw-r--r-- | fs/super.c | 4 | ||||
| -rw-r--r-- | include/linux/blkdev.h | 27 | ||||
| -rw-r--r-- | include/linux/elevator.h | 2 | ||||
| -rw-r--r-- | include/linux/fd.h | 22 | ||||
| -rw-r--r-- | include/linux/fs.h | 4 | ||||
| -rw-r--r-- | include/linux/genhd.h | 2 | ||||
| -rw-r--r-- | include/linux/init_task.h | 1 | ||||
| -rw-r--r-- | include/linux/iocontext.h | 14 | ||||
| -rw-r--r-- | include/linux/sched.h | 1 | ||||
| -rw-r--r-- | kernel/exit.c | 1 | ||||
| -rw-r--r-- | kernel/fork.c | 1 | ||||
| -rw-r--r-- | mm/backing-dev.c | 2 |
28 files changed, 229 insertions, 208 deletions
diff --git a/Documentation/block/queue-sysfs.txt b/Documentation/block/queue-sysfs.txt index f65274081c8d..d8147b336c35 100644 --- a/Documentation/block/queue-sysfs.txt +++ b/Documentation/block/queue-sysfs.txt | |||
| @@ -45,9 +45,13 @@ device. | |||
| 45 | 45 | ||
| 46 | rq_affinity (RW) | 46 | rq_affinity (RW) |
| 47 | ---------------- | 47 | ---------------- |
| 48 | If this option is enabled, the block layer will migrate request completions | 48 | If this option is '1', the block layer will migrate request completions to the |
| 49 | to the CPU that originally submitted the request. For some workloads | 49 | cpu "group" that originally submitted the request. For some workloads this |
| 50 | this provides a significant reduction in CPU cycles due to caching effects. | 50 | provides a significant reduction in CPU cycles due to caching effects. |
| 51 | |||
| 52 | For storage configurations that need to maximize distribution of completion | ||
| 53 | processing setting this option to '2' forces the completion to run on the | ||
| 54 | requesting cpu (bypassing the "group" aggregation logic). | ||
| 51 | 55 | ||
| 52 | scheduler (RW) | 56 | scheduler (RW) |
| 53 | -------------- | 57 | -------------- |
diff --git a/block/blk-core.c b/block/blk-core.c index 1d49e1c7c905..f8cb09951830 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
| @@ -1282,10 +1282,8 @@ get_rq: | |||
| 1282 | init_request_from_bio(req, bio); | 1282 | init_request_from_bio(req, bio); |
| 1283 | 1283 | ||
| 1284 | if (test_bit(QUEUE_FLAG_SAME_COMP, &q->queue_flags) || | 1284 | if (test_bit(QUEUE_FLAG_SAME_COMP, &q->queue_flags) || |
| 1285 | bio_flagged(bio, BIO_CPU_AFFINE)) { | 1285 | bio_flagged(bio, BIO_CPU_AFFINE)) |
| 1286 | req->cpu = blk_cpu_to_group(get_cpu()); | 1286 | req->cpu = smp_processor_id(); |
| 1287 | put_cpu(); | ||
| 1288 | } | ||
| 1289 | 1287 | ||
| 1290 | plug = current->plug; | 1288 | plug = current->plug; |
| 1291 | if (plug) { | 1289 | if (plug) { |
| @@ -1305,7 +1303,10 @@ get_rq: | |||
| 1305 | plug->should_sort = 1; | 1303 | plug->should_sort = 1; |
| 1306 | } | 1304 | } |
| 1307 | list_add_tail(&req->queuelist, &plug->list); | 1305 | list_add_tail(&req->queuelist, &plug->list); |
| 1306 | plug->count++; | ||
| 1308 | drive_stat_acct(req, 1); | 1307 | drive_stat_acct(req, 1); |
| 1308 | if (plug->count >= BLK_MAX_REQUEST_COUNT) | ||
| 1309 | blk_flush_plug_list(plug, false); | ||
| 1309 | } else { | 1310 | } else { |
| 1310 | spin_lock_irq(q->queue_lock); | 1311 | spin_lock_irq(q->queue_lock); |
| 1311 | add_acct_request(q, req, where); | 1312 | add_acct_request(q, req, where); |
| @@ -2629,6 +2630,7 @@ void blk_start_plug(struct blk_plug *plug) | |||
| 2629 | INIT_LIST_HEAD(&plug->list); | 2630 | INIT_LIST_HEAD(&plug->list); |
| 2630 | INIT_LIST_HEAD(&plug->cb_list); | 2631 | INIT_LIST_HEAD(&plug->cb_list); |
| 2631 | plug->should_sort = 0; | 2632 | plug->should_sort = 0; |
| 2633 | plug->count = 0; | ||
| 2632 | 2634 | ||
| 2633 | /* | 2635 | /* |
| 2634 | * If this is a nested plug, don't actually assign it. It will be | 2636 | * If this is a nested plug, don't actually assign it. It will be |
| @@ -2712,6 +2714,7 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) | |||
| 2712 | return; | 2714 | return; |
| 2713 | 2715 | ||
| 2714 | list_splice_init(&plug->list, &list); | 2716 | list_splice_init(&plug->list, &list); |
| 2717 | plug->count = 0; | ||
| 2715 | 2718 | ||
| 2716 | if (plug->should_sort) { | 2719 | if (plug->should_sort) { |
| 2717 | list_sort(NULL, &list, plug_rq_cmp); | 2720 | list_sort(NULL, &list, plug_rq_cmp); |
diff --git a/block/blk-ioc.c b/block/blk-ioc.c index 342eae9b0d3c..6f9bbd978653 100644 --- a/block/blk-ioc.c +++ b/block/blk-ioc.c | |||
| @@ -82,26 +82,26 @@ void exit_io_context(struct task_struct *task) | |||
| 82 | 82 | ||
| 83 | struct io_context *alloc_io_context(gfp_t gfp_flags, int node) | 83 | struct io_context *alloc_io_context(gfp_t gfp_flags, int node) |
| 84 | { | 84 | { |
| 85 | struct io_context *ret; | 85 | struct io_context *ioc; |
| 86 | 86 | ||
| 87 | ret = kmem_cache_alloc_node(iocontext_cachep, gfp_flags, node); | 87 | ioc = kmem_cache_alloc_node(iocontext_cachep, gfp_flags, node); |
| 88 | if (ret) { | 88 | if (ioc) { |
| 89 | atomic_long_set(&ret->refcount, 1); | 89 | atomic_long_set(&ioc->refcount, 1); |
| 90 | atomic_set(&ret->nr_tasks, 1); | 90 | atomic_set(&ioc->nr_tasks, 1); |
| 91 | spin_lock_init(&ret->lock); | 91 | spin_lock_init(&ioc->lock); |
| 92 | ret->ioprio_changed = 0; | 92 | ioc->ioprio_changed = 0; |
| 93 | ret->ioprio = 0; | 93 | ioc->ioprio = 0; |
| 94 | ret->last_waited = 0; /* doesn't matter... */ | 94 | ioc->last_waited = 0; /* doesn't matter... */ |
| 95 | ret->nr_batch_requests = 0; /* because this is 0 */ | 95 | ioc->nr_batch_requests = 0; /* because this is 0 */ |
| 96 | INIT_RADIX_TREE(&ret->radix_root, GFP_ATOMIC | __GFP_HIGH); | 96 | INIT_RADIX_TREE(&ioc->radix_root, GFP_ATOMIC | __GFP_HIGH); |
| 97 | INIT_HLIST_HEAD(&ret->cic_list); | 97 | INIT_HLIST_HEAD(&ioc->cic_list); |
| 98 | ret->ioc_data = NULL; | 98 | ioc->ioc_data = NULL; |
| 99 | #if defined(CONFIG_BLK_CGROUP) || defined(CONFIG_BLK_CGROUP_MODULE) | 99 | #if defined(CONFIG_BLK_CGROUP) || defined(CONFIG_BLK_CGROUP_MODULE) |
| 100 | ret->cgroup_changed = 0; | 100 | ioc->cgroup_changed = 0; |
| 101 | #endif | 101 | #endif |
| 102 | } | 102 | } |
| 103 | 103 | ||
| 104 | return ret; | 104 | return ioc; |
| 105 | } | 105 | } |
| 106 | 106 | ||
| 107 | /* | 107 | /* |
| @@ -139,19 +139,19 @@ struct io_context *current_io_context(gfp_t gfp_flags, int node) | |||
| 139 | */ | 139 | */ |
| 140 | struct io_context *get_io_context(gfp_t gfp_flags, int node) | 140 | struct io_context *get_io_context(gfp_t gfp_flags, int node) |
| 141 | { | 141 | { |
| 142 | struct io_context *ret = NULL; | 142 | struct io_context *ioc = NULL; |
| 143 | 143 | ||
| 144 | /* | 144 | /* |
| 145 | * Check for unlikely race with exiting task. ioc ref count is | 145 | * Check for unlikely race with exiting task. ioc ref count is |
| 146 | * zero when ioc is being detached. | 146 | * zero when ioc is being detached. |
| 147 | */ | 147 | */ |
| 148 | do { | 148 | do { |
| 149 | ret = current_io_context(gfp_flags, node); | 149 | ioc = current_io_context(gfp_flags, node); |
| 150 | if (unlikely(!ret)) | 150 | if (unlikely(!ioc)) |
| 151 | break; | 151 | break; |
| 152 | } while (!atomic_long_inc_not_zero(&ret->refcount)); | 152 | } while (!atomic_long_inc_not_zero(&ioc->refcount)); |
| 153 | 153 | ||
| 154 | return ret; | 154 | return ioc; |
| 155 | } | 155 | } |
| 156 | EXPORT_SYMBOL(get_io_context); | 156 | EXPORT_SYMBOL(get_io_context); |
| 157 | 157 | ||
diff --git a/block/blk-lib.c b/block/blk-lib.c index 78e627e2581d..2b461b496a78 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c | |||
| @@ -59,7 +59,10 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, | |||
| 59 | * granularity | 59 | * granularity |
| 60 | */ | 60 | */ |
