diff options
| author | Keith Busch <keith.busch@intel.com> | 2015-08-20 00:24:05 +0300 | 
|---|---|---|
| committer | Jens Axboe <axboe@fb.com> | 2015-08-20 00:26:02 +0300 | 
| commit | 03100aada96f0645bbcb89aea24c01f02d0ef1fa (patch) | |
| tree | ba909d035a188206b101ae633f925e18d749f7cc /include/linux/blkdev.h | |
| parent | d2be537c3ba3568acd79cd178327b842e60d035e (diff) | |
| download | linux-03100aada96f0645bbcb89aea24c01f02d0ef1fa.tar.xz | |
block: Replace SG_GAPS with new queue limits mask
The SG_GAPS queue flag caused checks for bio vector alignment against
PAGE_SIZE, but the device may have different constraints. This patch
adds a queue limits so a driver with such constraints can set to allow
requests that would have been unnecessarily split. The new gaps check
takes the request_queue as a parameter to simplify the logic around
invoking this function.
This new limit makes the queue flag redundant, so removing it and
all usage. Device-mappers will inherit the correct settings through
blk_stack_limits().
Signed-off-by: Keith Busch <keith.busch@intel.com>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'include/linux/blkdev.h')
| -rw-r--r-- | include/linux/blkdev.h | 21 | 
1 files changed, 20 insertions, 1 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index e427debc7008..a622f270f09e 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -250,6 +250,7 @@ struct blk_queue_tag {  struct queue_limits {  	unsigned long		bounce_pfn;  	unsigned long		seg_boundary_mask; +	unsigned long		virt_boundary_mask;  	unsigned int		max_hw_sectors;  	unsigned int		chunk_sectors; @@ -479,7 +480,6 @@ struct request_queue {  #define QUEUE_FLAG_DEAD        19	/* queue tear-down finished */  #define QUEUE_FLAG_INIT_DONE   20	/* queue is initialized */  #define QUEUE_FLAG_NO_SG_MERGE 21	/* don't attempt to merge SG segments*/ -#define QUEUE_FLAG_SG_GAPS     22	/* queue doesn't support SG gaps */  #define QUEUE_FLAG_DEFAULT	((1 << QUEUE_FLAG_IO_STAT) |		\  				 (1 << QUEUE_FLAG_STACKABLE)	|	\ @@ -981,6 +981,7 @@ extern int blk_queue_dma_drain(struct request_queue *q,  			       void *buf, unsigned int size);  extern void blk_queue_lld_busy(struct request_queue *q, lld_busy_fn *fn);  extern void blk_queue_segment_boundary(struct request_queue *, unsigned long); +extern void blk_queue_virt_boundary(struct request_queue *, unsigned long);  extern void blk_queue_prep_rq(struct request_queue *, prep_rq_fn *pfn);  extern void blk_queue_unprep_rq(struct request_queue *, unprep_rq_fn *ufn);  extern void blk_queue_dma_alignment(struct request_queue *, int); @@ -1149,6 +1150,11 @@ static inline unsigned long queue_segment_boundary(struct request_queue *q)  	return q->limits.seg_boundary_mask;  } +static inline unsigned long queue_virt_boundary(struct request_queue *q) +{ +	return q->limits.virt_boundary_mask; +} +  static inline unsigned int queue_max_sectors(struct request_queue *q)  {  	return q->limits.max_sectors; @@ -1349,6 +1355,19 @@ static inline void put_dev_sector(Sector p)  	page_cache_release(p.v);  } +/* + * Check if adding a bio_vec after bprv with offset would create a gap in + * the SG list. Most drivers don't care about this, but some do. + */ +static inline bool bvec_gap_to_prev(struct request_queue *q, +				struct bio_vec *bprv, unsigned int offset) +{ +	if (!queue_virt_boundary(q)) +		return false; +	return offset || +		((bprv->bv_offset + bprv->bv_len) & queue_virt_boundary(q)); +} +  struct work_struct;  int kblockd_schedule_work(struct work_struct *work);  int kblockd_schedule_delayed_work(struct delayed_work *dwork, unsigned long delay);  | 
