diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-12 17:13:23 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-12 17:13:23 -0500 |
| commit | 3e12cefbe143b4947171ff92dd50024c4841e291 (patch) | |
| tree | f58ec23a4092576ed08843cca5f5443a32106bd1 /include | |
| parent | 6bec0035286119eefc32a5b1102127e6a4032cb2 (diff) | |
| parent | d427e3c82ef4fc5fbb22c0cef0b040e6767b1028 (diff) | |
Merge branch 'for-3.20/core' of git://git.kernel.dk/linux-block
Pull core block IO changes from Jens Axboe:
"This contains:
- A series from Christoph that cleans up and refactors various parts
of the REQ_BLOCK_PC handling. Contributions in that series from
Dongsu Park and Kent Overstreet as well.
- CFQ:
- A bug fix for cfq for realtime IO scheduling from Jeff Moyer.
- A stable patch fixing a potential crash in CFQ in OOM
situations. From Konstantin Khlebnikov.
- blk-mq:
- Add support for tag allocation policies, from Shaohua. This is
a prep patch enabling libata (and other SCSI parts) to use the
blk-mq tagging, instead of rolling their own.
- Various little tweaks from Keith and Mike, in preparation for
DM blk-mq support.
- Minor little fixes or tweaks from me.
- A double free error fix from Tony Battersby.
- The partition 4k issue fixes from Matthew and Boaz.
- Add support for zero+unprovision for blkdev_issue_zeroout() from
Martin"
* 'for-3.20/core' of git://git.kernel.dk/linux-block: (27 commits)
block: remove unused function blk_bio_map_sg
block: handle the null_mapped flag correctly in blk_rq_map_user_iov
blk-mq: fix double-free in error path
block: prevent request-to-request merging with gaps if not allowed
blk-mq: make blk_mq_run_queues() static
dm: fix multipath regression due to initializing wrong request
cfq-iosched: handle failure of cfq group allocation
block: Quiesce zeroout wrapper
block: rewrite and split __bio_copy_iov()
block: merge __bio_map_user_iov into bio_map_user_iov
block: merge __bio_map_kern into bio_map_kern
block: pass iov_iter to the BLOCK_PC mapping functions
block: add a helper to free bio bounce buffer pages
block: use blk_rq_map_user_iov to implement blk_rq_map_user
block: simplify bio_map_kern
block: mark blk-mq devices as stackable
block: keep established cmd_flags when cloning into a blk-mq request
block: add blk-mq support to blk_insert_cloned_request()
block: require blk_rq_prep_clone() be given an initialized clone request
blk-mq: add tag allocation policy
...
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/bio.h | 12 | ||||
| -rw-r--r-- | include/linux/blk-mq.h | 10 | ||||
| -rw-r--r-- | include/linux/blkdev.h | 25 | ||||
| -rw-r--r-- | include/scsi/scsi_host.h | 3 | ||||
| -rw-r--r-- | include/scsi/scsi_tcq.h | 3 |
5 files changed, 32 insertions, 21 deletions
diff --git a/include/linux/bio.h b/include/linux/bio.h index efead0b532c4..da3a127c9958 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h | |||
| @@ -428,13 +428,9 @@ extern int bio_add_page(struct bio *, struct page *, unsigned int,unsigned int); | |||
| 428 | extern int bio_add_pc_page(struct request_queue *, struct bio *, struct page *, | 428 | extern int bio_add_pc_page(struct request_queue *, struct bio *, struct page *, |
| 429 | unsigned int, unsigned int); | 429 | unsigned int, unsigned int); |
| 430 | extern int bio_get_nr_vecs(struct block_device *); | 430 | extern int bio_get_nr_vecs(struct block_device *); |
| 431 | extern struct bio *bio_map_user(struct request_queue *, struct block_device *, | ||
| 432 | unsigned long, unsigned int, int, gfp_t); | ||
| 433 | struct sg_iovec; | ||
| 434 | struct rq_map_data; | 431 | struct rq_map_data; |
| 435 | extern struct bio *bio_map_user_iov(struct request_queue *, | 432 | extern struct bio *bio_map_user_iov(struct request_queue *, |
| 436 | struct block_device *, | 433 | const struct iov_iter *, gfp_t); |
| 437 | const struct sg_iovec *, int, int, gfp_t); | ||
| 438 | extern void bio_unmap_user(struct bio *); | 434 | extern void bio_unmap_user(struct bio *); |
| 439 | extern struct bio *bio_map_kern(struct request_queue *, void *, unsigned int, | 435 | extern struct bio *bio_map_kern(struct request_queue *, void *, unsigned int, |
| 440 | gfp_t); | 436 | gfp_t); |
| @@ -462,12 +458,10 @@ static inline void bio_flush_dcache_pages(struct bio *bi) | |||
| 462 | extern void bio_copy_data(struct bio *dst, struct bio *src); | 458 | extern void bio_copy_data(struct bio *dst, struct bio *src); |
| 463 | extern int bio_alloc_pages(struct bio *bio, gfp_t gfp); | 459 | extern int bio_alloc_pages(struct bio *bio, gfp_t gfp); |
| 464 | 460 | ||
| 465 | extern struct bio *bio_copy_user(struct request_queue *, struct rq_map_data *, | ||
| 466 | unsigned long, unsigned int, int, gfp_t); | ||
| 467 | extern struct bio *bio_copy_user_iov(struct request_queue *, | 461 | extern struct bio *bio_copy_user_iov(struct request_queue *, |
| 468 | struct rq_map_data *, | 462 | struct rq_map_data *, |
| 469 | const struct sg_iovec *, | 463 | const struct iov_iter *, |
| 470 | int, int, gfp_t); | 464 | gfp_t); |
| 471 | extern int bio_uncopy_user(struct bio *); | 465 | extern int bio_uncopy_user(struct bio *); |
| 472 | void zero_fill_bio(struct bio *bio); | 466 | void zero_fill_bio(struct bio *bio); |
| 473 | extern struct bio_vec *bvec_alloc(gfp_t, int, unsigned long *, mempool_t *); | 467 | extern struct bio_vec *bvec_alloc(gfp_t, int, unsigned long *, mempool_t *); |
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h index 5735e7130d63..7aec86127335 100644 --- a/include/linux/blk-mq.h +++ b/include/linux/blk-mq.h | |||
| @@ -146,6 +146,8 @@ enum { | |||
| 146 | BLK_MQ_F_SG_MERGE = 1 << 2, | 146 | BLK_MQ_F_SG_MERGE = 1 << 2, |
| 147 | BLK_MQ_F_SYSFS_UP = 1 << 3, | 147 | BLK_MQ_F_SYSFS_UP = 1 << 3, |
| 148 | BLK_MQ_F_DEFER_ISSUE = 1 << 4, | 148 | BLK_MQ_F_DEFER_ISSUE = 1 << 4, |
| 149 | BLK_MQ_F_ALLOC_POLICY_START_BIT = 8, | ||
| 150 | BLK_MQ_F_ALLOC_POLICY_BITS = 1, | ||
| 149 | 151 | ||
| 150 | BLK_MQ_S_STOPPED = 0, | 152 | BLK_MQ_S_STOPPED = 0, |
| 151 | BLK_MQ_S_TAG_ACTIVE = 1, | 153 | BLK_MQ_S_TAG_ACTIVE = 1, |
| @@ -154,6 +156,12 @@ enum { | |||
| 154 | 156 | ||
| 155 | BLK_MQ_CPU_WORK_BATCH = 8, | 157 | BLK_MQ_CPU_WORK_BATCH = 8, |
| 156 | }; | 158 | }; |
| 159 | #define BLK_MQ_FLAG_TO_ALLOC_POLICY(flags) \ | ||
| 160 | ((flags >> BLK_MQ_F_ALLOC_POLICY_START_BIT) & \ | ||
| 161 | ((1 << BLK_MQ_F_ALLOC_POLICY_BITS) - 1)) | ||
| 162 | #define BLK_ALLOC_POLICY_TO_MQ_FLAG(policy) \ | ||
| 163 | ((policy & ((1 << BLK_MQ_F_ALLOC_POLICY_BITS) - 1)) \ | ||
| 164 | << BLK_MQ_F_ALLOC_POLICY_START_BIT) | ||
| 157 | 165 | ||
| 158 | struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *); | 166 | struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *); |
| 159 | void blk_mq_finish_init(struct request_queue *q); | 167 | void blk_mq_finish_init(struct request_queue *q); |
| @@ -166,7 +174,6 @@ void blk_mq_free_tag_set(struct blk_mq_tag_set *set); | |||
| 166 | void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule); | 174 | void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule); |
| 167 | 175 | ||
| 168 | void blk_mq_insert_request(struct request *, bool, bool, bool); | 176 | void blk_mq_insert_request(struct request *, bool, bool, bool); |
| 169 | void blk_mq_run_queues(struct request_queue *q, bool async); | ||
| 170 | void blk_mq_free_request(struct request *rq); | 177 | void blk_mq_free_request(struct request *rq); |
| 171 | void blk_mq_free_hctx_request(struct blk_mq_hw_ctx *, struct request *rq); | 178 | void blk_mq_free_hctx_request(struct blk_mq_hw_ctx *, struct request *rq); |
| 172 | bool blk_mq_can_queue(struct blk_mq_hw_ctx *); | 179 | bool blk_mq_can_queue(struct blk_mq_hw_ctx *); |
| @@ -214,6 +221,7 @@ void blk_mq_start_stopped_hw_queues(struct request_queue *q, bool async); | |||
| 214 | void blk_mq_delay_queue(struct blk_mq_hw_ctx *hctx, unsigned long msecs); | 221 | void blk_mq_delay_queue(struct blk_mq_hw_ctx *hctx, unsigned long msecs); |
| 215 | void blk_mq_tag_busy_iter(struct blk_mq_hw_ctx *hctx, busy_iter_fn *fn, | 222 | void blk_mq_tag_busy_iter(struct blk_mq_hw_ctx *hctx, busy_iter_fn *fn, |
| 216 | void *priv); | 223 | void *priv); |
| 224 | void blk_mq_freeze_queue(struct request_queue *q); | ||
| 217 | void blk_mq_unfreeze_queue(struct request_queue *q); | 225 | void blk_mq_unfreeze_queue(struct request_queue *q); |
| 218 | void blk_mq_freeze_queue_start(struct request_queue *q); | 226 | void blk_mq_freeze_queue_start(struct request_queue *q); |
| 219 | 227 | ||
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 92f4b4b288dd..7f9a516f24de 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -272,7 +272,11 @@ struct blk_queue_tag { | |||
| 272 | int max_depth; /* what we will send to device */ | 272 | int max_depth; /* what we will send to device */ |
| 273 | int real_max_depth; /* what the array can hold */ | 273 | int real_max_depth; /* what the array can hold */ |
| 274 | atomic_t refcnt; /* map can be shared */ | 274 | atomic_t refcnt; /* map can be shared */ |
| 275 | int alloc_policy; /* tag allocation policy */ | ||
| 276 | int next_tag; /* next tag */ | ||
| 275 | }; | 277 | }; |
| 278 | #define BLK_TAG_ALLOC_FIFO 0 /* allocate starting from 0 */ | ||
| 279 | #define BLK_TAG_ALLOC_RR 1 /* allocate starting from last allocated tag */ | ||
| 276 | 280 | ||
| 277 | #define BLK_SCSI_MAX_CMDS (256) | 281 | #define BLK_SCSI_MAX_CMDS (256) |
| 278 | #define BLK_SCSI_CMD_PER_LONG (BLK_SCSI_MAX_CMDS / (sizeof(long) * 8)) | 282 | #define BLK_SCSI_CMD_PER_LONG (BLK_SCSI_MAX_CMDS / (sizeof(long) * 8)) |
| @@ -516,6 +520,7 @@ struct request_queue { | |||
| 516 | (1 << QUEUE_FLAG_ADD_RANDOM)) | 520 | (1 << QUEUE_FLAG_ADD_RANDOM)) |
| 517 | 521 | ||
| 518 | #define QUEUE_FLAG_MQ_DEFAULT ((1 << QUEUE_FLAG_IO_STAT) | \ | 522 | #define QUEUE_FLAG_MQ_DEFAULT ((1 << QUEUE_FLAG_IO_STAT) | \ |
| 523 | (1 << QUEUE_FLAG_STACKABLE) | \ | ||
| 519 | (1 << QUEUE_FLAG_SAME_COMP)) | 524 | (1 << QUEUE_FLAG_SAME_COMP)) |
| 520 | 525 | ||
| 521 | static inline void queue_lockdep_assert_held(struct request_queue *q) | 526 | static inline void queue_lockdep_assert_held(struct request_queue *q) |
| @@ -850,8 +855,8 @@ extern int blk_rq_map_user(struct request_queue *, struct request *, | |||
| 850 | extern int blk_rq_unmap_user(struct bio *); | 855 | extern int blk_rq_unmap_user(struct bio *); |
| 851 | extern int blk_rq_map_kern(struct request_queue *, struct request *, void *, unsigned int, gfp_t); | 856 | extern int blk_rq_map_kern(struct request_queue *, struct request *, void *, unsigned int, gfp_t); |
| 852 | extern int blk_rq_map_user_iov(struct request_queue *, struct request *, | 857 | extern int blk_rq_map_user_iov(struct request_queue *, struct request *, |
| 853 | struct rq_map_data *, const struct sg_iovec *, | 858 | struct rq_map_data *, const struct iov_iter *, |
| 854 | int, unsigned int, gfp_t); | 859 | gfp_t); |
| 855 | extern int blk_execute_rq(struct request_queue *, struct gendisk *, | 860 | extern int blk_execute_rq(struct request_queue *, struct gendisk *, |
| 856 | struct request *, int); | 861 | struct request *, int); |
| 857 | extern void blk_execute_rq_nowait(struct request_queue *, struct gendisk *, | 862 | extern void blk_execute_rq_nowait(struct request_queue *, struct gendisk *, |
| @@ -1044,8 +1049,6 @@ extern void blk_queue_flush_queueable(struct request_queue *q, bool queueable); | |||
| 1044 | extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); | 1049 | extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); |
| 1045 | 1050 | ||
| 1046 | extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *); | 1051 | extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *); |
| 1047 | extern int blk_bio_map_sg(struct request_queue *q, struct bio *bio, | ||
| 1048 | struct scatterlist *sglist); | ||
| 1049 | extern void blk_dump_rq_flags(struct request *, char *); | 1052 | extern void blk_dump_rq_flags(struct request *, char *); |
| 1050 | extern long nr_blockdev_pages(void); | 1053 | extern long nr_blockdev_pages(void); |
| 1051 | 1054 | ||
| @@ -1139,11 +1142,11 @@ static inline bool blk_needs_flush_plug(struct task_struct *tsk) | |||
| 1139 | extern int blk_queue_start_tag(struct request_queue *, struct request *); | 1142 | extern int blk_queue_start_tag(struct request_queue *, struct request *); |
| 1140 | extern struct request *blk_queue_find_tag(struct request_queue *, int); | 1143 | extern struct request *blk_queue_find_tag(struct request_queue *, int); |
| 1141 | extern void blk_queue_end_tag(struct request_queue *, struct request *); | 1144 | extern void blk_queue_end_tag(struct request_queue *, struct request *); |
| 1142 | extern int blk_queue_init_tags(struct request_queue *, int, struct blk_queue_tag *); | 1145 | extern int blk_queue_init_tags(struct request_queue *, int, struct blk_queue_tag *, int); |
| 1143 | extern void blk_queue_free_tags(struct request_queue *); | 1146 | extern void blk_queue_free_tags(struct request_queue *); |
| 1144 | extern int blk_queue_resize_tags(struct request_queue *, int); | 1147 | extern int blk_queue_resize_tags(struct request_queue *, int); |
| 1145 | extern void blk_queue_invalidate_tags(struct request_queue *); | 1148 | extern void blk_queue_invalidate_tags(struct request_queue *); |
| 1146 | extern struct blk_queue_tag *blk_init_tags(int); | 1149 | extern struct blk_queue_tag *blk_init_tags(int, int); |
| 1147 | extern void blk_free_tags(struct blk_queue_tag *); | 1150 | extern void blk_free_tags(struct blk_queue_tag *); |
| 1148 | 1151 | ||
| 1149 | static inline struct request *blk_map_queue_find_tag(struct blk_queue_tag *bqt, | 1152 | static inline struct request *blk_map_queue_find_tag(struct blk_queue_tag *bqt, |
| @@ -1162,7 +1165,7 @@ extern int blkdev_issue_discard(struct block_device *bdev, sector_t sector, | |||
| 1162 | extern int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, | 1165 | extern int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, |
| 1163 | sector_t nr_sects, gfp_t gfp_mask, struct page *page); | 1166 | sector_t nr_sects, gfp_t gfp_mask, struct page *page); |
| 1164 | extern int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, | 1167 | extern int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, |
| 1165 | sector_t nr_sects, gfp_t gfp_mask); | 1168 | sector_t nr_sects, gfp_t gfp_mask, bool discard); |
| 1166 | static inline int sb_issue_discard(struct super_block *sb, sector_t block, | 1169 | static inline int sb_issue_discard(struct super_block *sb, sector_t block, |
| 1167 | sector_t nr_blocks, gfp_t gfp_mask, unsigned long flags) | 1170 | sector_t nr_blocks, gfp_t gfp_mask, unsigned long flags) |
| 1168 | { | 1171 | { |
| @@ -1176,7 +1179,7 @@ static inline int sb_issue_zeroout(struct super_block *sb, sector_t block, | |||
| 1176 | return blkdev_issue_zeroout(sb->s_bdev, | 1179 | return blkdev_issue_zeroout(sb->s_bdev, |
| 1177 | block << (sb->s_blocksize_bits - 9), | 1180 | block << (sb->s_blocksize_bits - 9), |
| 1178 | nr_blocks << (sb->s_blocksize_bits - 9), | 1181 | nr_blocks << (sb->s_blocksize_bits - 9), |
| 1179 | gfp_mask); | 1182 | gfp_mask, true); |
| 1180 | } | 1183 | } |
| 1181 | 1184 | ||
| 1182 | extern int blk_verify_command(unsigned char *cmd, fmode_t has_write_perm); | 1185 | extern int blk_verify_command(unsigned char *cmd, fmode_t has_write_perm); |
| @@ -1601,8 +1604,8 @@ struct block_device_operations { | |||
| 1601 | int (*rw_page)(struct block_device *, sector_t, struct page *, int rw); | 1604 | int (*rw_page)(struct block_device *, sector_t, struct page *, int rw); |
| 1602 | int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | 1605 | int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); |
| 1603 | int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | 1606 | int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); |
| 1604 | int (*direct_access) (struct block_device *, sector_t, | 1607 | long (*direct_access)(struct block_device *, sector_t, |
| 1605 | void **, unsigned long *); | 1608 | void **, unsigned long *pfn, long size); |
| 1606 | unsigned int (*check_events) (struct gendisk *disk, | 1609 | unsigned int (*check_events) (struct gendisk *disk, |
| 1607 | unsigned int clearing); | 1610 | unsigned int clearing); |
| 1608 | /* ->media_changed() is DEPRECATED, use ->check_events() instead */ | 1611 | /* ->media_changed() is DEPRECATED, use ->check_events() instead */ |
| @@ -1620,6 +1623,8 @@ extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int, | |||
| 1620 | extern int bdev_read_page(struct block_device *, sector_t, struct page *); | 1623 | extern int bdev_read_page(struct block_device *, sector_t, struct page *); |
| 1621 | extern int bdev_write_page(struct block_device *, sector_t, struct page *, | 1624 | extern int bdev_write_page(struct block_device *, sector_t, struct page *, |
| 1622 | struct writeback_control *); | 1625 | struct writeback_control *); |
| 1626 | extern long bdev_direct_access(struct block_device *, sector_t, void **addr, | ||
| 1627 | unsigned long *pfn, long size); | ||
| 1623 | #else /* CONFIG_BLOCK */ | 1628 | #else /* CONFIG_BLOCK */ |
| 1624 | 1629 | ||
| 1625 | struct block_device; | 1630 | struct block_device; |
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index 019e66858ce6..e113c757d555 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h | |||
| @@ -402,6 +402,9 @@ struct scsi_host_template { | |||
| 402 | */ | 402 | */ |
| 403 | unsigned char present; | 403 | unsigned char present; |
| 404 | 404 | ||
| 405 | /* If use block layer to manage tags, this is tag allocation policy */ | ||
| 406 | int tag_alloc_policy; | ||
| 407 | |||
| 405 | /* | 408 | /* |
| 406 | * Let the block layer assigns tags to all commands. | 409 | * Let the block layer assigns tags to all commands. |
| 407 | */ | 410 | */ |
diff --git a/include/scsi/scsi_tcq.h b/include/scsi/scsi_tcq.h index 9708b28bd2aa..b27977e8aaed 100644 --- a/include/scsi/scsi_tcq.h +++ b/include/scsi/scsi_tcq.h | |||
| @@ -66,7 +66,8 @@ static inline int scsi_init_shared_tag_map(struct Scsi_Host *shost, int depth) | |||
| 66 | * devices on the shared host (for libata) | 66 | * devices on the shared host (for libata) |
| 67 | */ | 67 | */ |
| 68 | if (!shost->bqt) { | 68 | if (!shost->bqt) { |
| 69 | shost->bqt = blk_init_tags(depth); | 69 | shost->bqt = blk_init_tags(depth, |
| 70 | shost->hostt->tag_alloc_policy); | ||
| 70 | if (!shost->bqt) | 71 | if (!shost->bqt) |
| 71 | return -ENOMEM; | 72 | return -ENOMEM; |
| 72 | } | 73 | } |
