diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-18 14:53:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-18 14:53:51 -0400 |
commit | d3dc366bbaf07c125561e90d6da4bb147741101a (patch) | |
tree | 6eb7e79a8ec9df1fa705393c6d15ccea3d104661 /include/linux/blkdev.h | |
parent | 511c41d9e6665a07aca94eb00983cf6d77dd87ff (diff) | |
parent | e19a8a0ad2d255316830ead05b59c5a704434cbb (diff) |
Merge branch 'for-3.18/core' of git://git.kernel.dk/linux-block
Pull core block layer changes from Jens Axboe:
"This is the core block IO pull request for 3.18. Apart from the new
and improved flush machinery for blk-mq, this is all mostly bug fixes
and cleanups.
- blk-mq timeout updates and fixes from Christoph.
- Removal of REQ_END, also from Christoph. We pass it through the
->queue_rq() hook for blk-mq instead, freeing up one of the request
bits. The space was overly tight on 32-bit, so Martin also killed
REQ_KERNEL since it's no longer used.
- blk integrity updates and fixes from Martin and Gu Zheng.
- Update to the flush machinery for blk-mq from Ming Lei. Now we
have a per hardware context flush request, which both cleans up the
code should scale better for flush intensive workloads on blk-mq.
- Improve the error printing, from Rob Elliott.
- Backing device improvements and cleanups from Tejun.
- Fixup of a misplaced rq_complete() tracepoint from Hannes.
- Make blk_get_request() return error pointers, fixing up issues
where we NULL deref when a device goes bad or missing. From Joe
Lawrence.
- Prep work for drastically reducing the memory consumption of dm
devices from Junichi Nomura. This allows creating clone bio sets
without preallocating a lot of memory.
- Fix a blk-mq hang on certain combinations of queue depths and
hardware queues from me.
- Limit memory consumption for blk-mq devices for crash dump
scenarios and drivers that use crazy high depths (certain SCSI
shared tag setups). We now just use a single queue and limited
depth for that"
* 'for-3.18/core' of git://git.kernel.dk/linux-block: (58 commits)
block: Remove REQ_KERNEL
blk-mq: allocate cpumask on the home node
bio-integrity: remove the needless fail handle of bip_slab creating
block: include func name in __get_request prints
block: make blk_update_request print prefix match ratelimited prefix
blk-merge: don't compute bi_phys_segments from bi_vcnt for cloned bio
block: fix alignment_offset math that assumes io_min is a power-of-2
blk-mq: Make bt_clear_tag() easier to read
blk-mq: fix potential hang if rolling wakeup depth is too high
block: add bioset_create_nobvec()
block: use bio_clone_fast() in blk_rq_prep_clone()
block: misplaced rq_complete tracepoint
sd: Honor block layer integrity handling flags
block: Replace strnicmp with strncasecmp
block: Add T10 Protection Information functions
block: Don't merge requests if integrity flags differ
block: Integrity checksum flag
block: Relocate bio integrity flags
block: Add a disk flag to block integrity profile
block: Add prefix to block integrity profile flags
...
Diffstat (limited to 'include/linux/blkdev.h')
-rw-r--r-- | include/linux/blkdev.h | 71 |
1 files changed, 30 insertions, 41 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 87be398166d3..0207a78a8d82 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
@@ -36,6 +36,7 @@ struct request; | |||
36 | struct sg_io_hdr; | 36 | struct sg_io_hdr; |
37 | struct bsg_job; | 37 | struct bsg_job; |
38 | struct blkcg_gq; | 38 | struct blkcg_gq; |
39 | struct blk_flush_queue; | ||
39 | 40 | ||
40 | #define BLKDEV_MIN_RQ 4 | 41 | #define BLKDEV_MIN_RQ 4 |
41 | #define BLKDEV_MAX_RQ 128 /* Default maximum */ | 42 | #define BLKDEV_MAX_RQ 128 /* Default maximum */ |
@@ -455,14 +456,7 @@ struct request_queue { | |||
455 | */ | 456 | */ |
456 | unsigned int flush_flags; | 457 | unsigned int flush_flags; |
457 | unsigned int flush_not_queueable:1; | 458 | unsigned int flush_not_queueable:1; |
458 | unsigned int flush_queue_delayed:1; | 459 | struct blk_flush_queue *fq; |
459 | unsigned int flush_pending_idx:1; | ||
460 | unsigned int flush_running_idx:1; | ||
461 | unsigned long flush_pending_since; | ||
462 | struct list_head flush_queue[2]; | ||
463 | struct list_head flush_data_in_flight; | ||
464 | struct request *flush_rq; | ||
465 | spinlock_t mq_flush_lock; | ||
466 | 460 | ||
467 | struct list_head requeue_list; | 461 | struct list_head requeue_list; |
468 | spinlock_t requeue_lock; | 462 | spinlock_t requeue_lock; |
@@ -865,7 +859,7 @@ extern void blk_execute_rq_nowait(struct request_queue *, struct gendisk *, | |||
865 | 859 | ||
866 | static inline struct request_queue *bdev_get_queue(struct block_device *bdev) | 860 | static inline struct request_queue *bdev_get_queue(struct block_device *bdev) |
867 | { | 861 | { |
868 | return bdev->bd_disk->queue; | 862 | return bdev->bd_disk->queue; /* this is never NULL */ |
869 | } | 863 | } |
870 | 864 | ||
871 | /* | 865 | /* |
@@ -1285,10 +1279,9 @@ static inline int queue_alignment_offset(struct request_queue *q) | |||
1285 | static inline int queue_limit_alignment_offset(struct queue_limits *lim, sector_t sector) | 1279 | static inline int queue_limit_alignment_offset(struct queue_limits *lim, sector_t sector) |
1286 | { | 1280 | { |
1287 | unsigned int granularity = max(lim->physical_block_size, lim->io_min); | 1281 | unsigned int granularity = max(lim->physical_block_size, lim->io_min); |
1288 | unsigned int alignment = (sector << 9) & (granularity - 1); | 1282 | unsigned int alignment = sector_div(sector, granularity >> 9) << 9; |
1289 | 1283 | ||
1290 | return (granularity + lim->alignment_offset - alignment) | 1284 | return (granularity + lim->alignment_offset - alignment) % granularity; |
1291 | & (granularity - 1); | ||
1292 | } | 1285 | } |
1293 | 1286 | ||
1294 | static inline int bdev_alignment_offset(struct block_device *bdev) | 1287 | static inline int bdev_alignment_offset(struct block_device *bdev) |
@@ -1464,32 +1457,31 @@ static inline uint64_t rq_io_start_time_ns(struct request *req) | |||
1464 | 1457 | ||
1465 | #if defined(CONFIG_BLK_DEV_INTEGRITY) | 1458 | #if defined(CONFIG_BLK_DEV_INTEGRITY) |
1466 | 1459 | ||
1467 | #define INTEGRITY_FLAG_READ 2 /* verify data integrity on read */ | 1460 | enum blk_integrity_flags { |
1468 | #define INTEGRITY_FLAG_WRITE 4 /* generate data integrity on write */ | 1461 | BLK_INTEGRITY_VERIFY = 1 << 0, |
1462 | BLK_INTEGRITY_GENERATE = 1 << 1, | ||
1463 | BLK_INTEGRITY_DEVICE_CAPABLE = 1 << 2, | ||
1464 | BLK_INTEGRITY_IP_CHECKSUM = 1 << 3, | ||
1465 | }; | ||
1469 | 1466 | ||
1470 | struct blk_integrity_exchg { | 1467 | struct blk_integrity_iter { |
1471 | void *prot_buf; | 1468 | void *prot_buf; |
1472 | void *data_buf; | 1469 | void *data_buf; |
1473 | sector_t sector; | 1470 | sector_t seed; |
1474 | unsigned int data_size; | 1471 | unsigned int data_size; |
1475 | unsigned short sector_size; | 1472 | unsigned short interval; |
1476 | const char *disk_name; | 1473 | const char *disk_name; |
1477 | }; | 1474 | }; |
1478 | 1475 | ||
1479 | typedef void (integrity_gen_fn) (struct blk_integrity_exchg *); | 1476 | typedef int (integrity_processing_fn) (struct blk_integrity_iter *); |
1480 | typedef int (integrity_vrfy_fn) (struct blk_integrity_exchg *); | ||
1481 | typedef void (integrity_set_tag_fn) (void *, void *, unsigned int); | ||
1482 | typedef void (integrity_get_tag_fn) (void *, void *, unsigned int); | ||
1483 | 1477 | ||
1484 | struct blk_integrity { | 1478 | struct blk_integrity { |
1485 | integrity_gen_fn *generate_fn; | 1479 | integrity_processing_fn *generate_fn; |
1486 | integrity_vrfy_fn *verify_fn; | 1480 | integrity_processing_fn *verify_fn; |
1487 | integrity_set_tag_fn *set_tag_fn; | ||
1488 | integrity_get_tag_fn *get_tag_fn; | ||
1489 | 1481 | ||
1490 | unsigned short flags; | 1482 | unsigned short flags; |
1491 | unsigned short tuple_size; | 1483 | unsigned short tuple_size; |
1492 | unsigned short sector_size; | 1484 | unsigned short interval; |
1493 | unsigned short tag_size; | 1485 | unsigned short tag_size; |
1494 | 1486 | ||
1495 | const char *name; | 1487 | const char *name; |
@@ -1504,10 +1496,10 @@ extern int blk_integrity_compare(struct gendisk *, struct gendisk *); | |||
1504 | extern int blk_rq_map_integrity_sg(struct request_queue *, struct bio *, | 1496 | extern int blk_rq_map_integrity_sg(struct request_queue *, struct bio *, |
1505 | struct scatterlist *); | 1497 | struct scatterlist *); |
1506 | extern int blk_rq_count_integrity_sg(struct request_queue *, struct bio *); | 1498 | extern int blk_rq_count_integrity_sg(struct request_queue *, struct bio *); |
1507 | extern int blk_integrity_merge_rq(struct request_queue *, struct request *, | 1499 | extern bool blk_integrity_merge_rq(struct request_queue *, struct request *, |
1508 | struct request *); | 1500 | struct request *); |
1509 | extern int blk_integrity_merge_bio(struct request_queue *, struct request *, | 1501 | extern bool blk_integrity_merge_bio(struct request_queue *, struct request *, |
1510 | struct bio *); | 1502 | struct bio *); |
1511 | 1503 | ||
1512 | static inline | 1504 | static inline |
1513 | struct blk_integrity *bdev_get_integrity(struct block_device *bdev) | 1505 | struct blk_integrity *bdev_get_integrity(struct block_device *bdev) |
@@ -1520,12 +1512,9 @@ static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk) | |||
1520 | return disk->integrity; | 1512 | return disk->integrity; |
1521 | } | 1513 | } |
1522 | 1514 | ||
1523 | static inline int blk_integrity_rq(struct request *rq) | 1515 | static inline bool blk_integrity_rq(struct request *rq) |
1524 | { | 1516 | { |
1525 | if (rq->bio == NULL) | 1517 | return rq->cmd_flags & REQ_INTEGRITY; |
1526 | return 0; | ||
1527 | |||
1528 | return bio_integrity(rq->bio); | ||
1529 | } | 1518 | } |
1530 | 1519 | ||
1531 | static inline void blk_queue_max_integrity_segments(struct request_queue *q, | 1520 | static inline void blk_queue_max_integrity_segments(struct request_queue *q, |
@@ -1590,15 +1579,15 @@ static inline unsigned short queue_max_integrity_segments(struct request_queue * | |||
1590 | { | 1579 | { |
1591 | return 0; | 1580 | return 0; |
1592 | } | 1581 | } |
1593 | static inline int blk_integrity_merge_rq(struct request_queue *rq, | 1582 | static inline bool blk_integrity_merge_rq(struct request_queue *rq, |
1594 | struct request *r1, | 1583 | struct request *r1, |
1595 | struct request *r2) | 1584 | struct request *r2) |
1596 | { | 1585 | { |
1597 | return 0; | 1586 | return 0; |
1598 | } | 1587 | } |
1599 | static inline int blk_integrity_merge_bio(struct request_queue *rq, | 1588 | static inline bool blk_integrity_merge_bio(struct request_queue *rq, |
1600 | struct request *r, | 1589 | struct request *r, |
1601 | struct bio *b) | 1590 | struct bio *b) |
1602 | { | 1591 | { |
1603 | return 0; | 1592 | return 0; |
1604 | } | 1593 | } |