Merge branch 'for-4.2/core' of git://git.kernel.dk/linux-block
Pull core block IO update from Jens Axboe:
"Nothing really major in here, mostly a collection of smaller
optimizations and cleanups, mixed with various fixes. In more detail,
this contains:
- Addition of policy specific data to blkcg for block cgroups. From
Arianna Avanzini.
- Various cleanups around command types from Christoph.
- Cleanup of the suspend block I/O path from Christoph.
- Plugging updates from Shaohua and Jeff Moyer, for blk-mq.
- Eliminating atomic inc/dec of both remaining IO count and reference
count in a bio. From me.
- Fixes for SG gap and chunk size support for data-less (discards)
IO, so we can merge these better. From me.
- Small restructuring of blk-mq shared tag support, freeing drivers
from iterating hardware queues. From Keith Busch.
- A few cfq-iosched tweaks, from Tahsin Erdogan and me. Makes the
IOPS mode the default for non-rotational storage"
* 'for-4.2/core' of git://git.kernel.dk/linux-block: (35 commits)
cfq-iosched: fix other locations where blkcg_to_cfqgd() can return NULL
cfq-iosched: fix sysfs oops when attempting to read unconfigured weights
cfq-iosched: move group scheduling functions under ifdef
cfq-iosched: fix the setting of IOPS mode on SSDs
blktrace: Add blktrace.c to BLOCK LAYER in MAINTAINERS file
block, cgroup: implement policy-specific per-blkcg data
block: Make CFQ default to IOPS mode on SSDs
block: add blk_set_queue_dying() to blkdev.h
blk-mq: Shared tag enhancements
block: don't honor chunk sizes for data-less IO
block: only honor SG gap prevention for merges that contain data
block: fix returnvar.cocci warnings
block, dm: don't copy bios for request clones
block: remove management of bi_remaining when restoring original bi_end_io
block: replace trylock with mutex_lock in blkdev_reread_part()
block: export blkdev_reread_part() and __blkdev_reread_part()
suspend: simplify block I/O handling
block: collapse bio bit space
block: remove unused BIO_RW_BLOCK and BIO_EOF flags
block: remove BIO_EOPNOTSUPP
...
This commit is contained in:
commit
bfffa1cc9d
64 changed files with 852 additions and 753 deletions
|
|
@ -290,7 +290,21 @@ static inline unsigned bio_segments(struct bio *bio)
|
|||
* returns. and then bio would be freed memory when if (bio->bi_flags ...)
|
||||
* runs
|
||||
*/
|
||||
#define bio_get(bio) atomic_inc(&(bio)->bi_cnt)
|
||||
static inline void bio_get(struct bio *bio)
|
||||
{
|
||||
bio->bi_flags |= (1 << BIO_REFFED);
|
||||
smp_mb__before_atomic();
|
||||
atomic_inc(&bio->__bi_cnt);
|
||||
}
|
||||
|
||||
static inline void bio_cnt_set(struct bio *bio, unsigned int count)
|
||||
{
|
||||
if (count != 1) {
|
||||
bio->bi_flags |= (1 << BIO_REFFED);
|
||||
smp_mb__before_atomic();
|
||||
}
|
||||
atomic_set(&bio->__bi_cnt, count);
|
||||
}
|
||||
|
||||
enum bip_flags {
|
||||
BIP_BLOCK_INTEGRITY = 1 << 0, /* block layer owns integrity data */
|
||||
|
|
@ -413,7 +427,6 @@ static inline struct bio *bio_clone_kmalloc(struct bio *bio, gfp_t gfp_mask)
|
|||
}
|
||||
|
||||
extern void bio_endio(struct bio *, int);
|
||||
extern void bio_endio_nodec(struct bio *, int);
|
||||
struct request_queue;
|
||||
extern int bio_phys_segments(struct request_queue *, struct bio *);
|
||||
|
||||
|
|
|
|||
|
|
@ -96,6 +96,7 @@ typedef void (exit_request_fn)(void *, struct request *, unsigned int,
|
|||
|
||||
typedef void (busy_iter_fn)(struct blk_mq_hw_ctx *, struct request *, void *,
|
||||
bool);
|
||||
typedef void (busy_tag_iter_fn)(struct request *, void *, bool);
|
||||
|
||||
struct blk_mq_ops {
|
||||
/*
|
||||
|
|
@ -182,6 +183,7 @@ bool blk_mq_can_queue(struct blk_mq_hw_ctx *);
|
|||
struct request *blk_mq_alloc_request(struct request_queue *q, int rw,
|
||||
gfp_t gfp, bool reserved);
|
||||
struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag);
|
||||
struct cpumask *blk_mq_tags_cpumask(struct blk_mq_tags *tags);
|
||||
|
||||
enum {
|
||||
BLK_MQ_UNIQUE_TAG_BITS = 16,
|
||||
|
|
@ -224,6 +226,8 @@ void blk_mq_run_hw_queues(struct request_queue *q, bool async);
|
|||
void blk_mq_delay_queue(struct blk_mq_hw_ctx *hctx, unsigned long msecs);
|
||||
void blk_mq_tag_busy_iter(struct blk_mq_hw_ctx *hctx, busy_iter_fn *fn,
|
||||
void *priv);
|
||||
void blk_mq_all_tag_busy_iter(struct blk_mq_tags *tags, busy_tag_iter_fn *fn,
|
||||
void *priv);
|
||||
void blk_mq_freeze_queue(struct request_queue *q);
|
||||
void blk_mq_unfreeze_queue(struct request_queue *q);
|
||||
void blk_mq_freeze_queue_start(struct request_queue *q);
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ struct bio {
|
|||
unsigned int bi_seg_front_size;
|
||||
unsigned int bi_seg_back_size;
|
||||
|
||||
atomic_t bi_remaining;
|
||||
atomic_t __bi_remaining;
|
||||
|
||||
bio_end_io_t *bi_end_io;
|
||||
|
||||
|
|
@ -92,7 +92,7 @@ struct bio {
|
|||
|
||||
unsigned short bi_max_vecs; /* max bvl_vecs we can hold */
|
||||
|
||||
atomic_t bi_cnt; /* pin count */
|
||||
atomic_t __bi_cnt; /* pin count */
|
||||
|
||||
struct bio_vec *bi_io_vec; /* the actual vec list */
|
||||
|
||||
|
|
@ -112,16 +112,15 @@ struct bio {
|
|||
* bio flags
|
||||
*/
|
||||
#define BIO_UPTODATE 0 /* ok after I/O completion */
|
||||
#define BIO_RW_BLOCK 1 /* RW_AHEAD set, and read/write would block */
|
||||
#define BIO_EOF 2 /* out-out-bounds error */
|
||||
#define BIO_SEG_VALID 3 /* bi_phys_segments valid */
|
||||
#define BIO_CLONED 4 /* doesn't own data */
|
||||
#define BIO_BOUNCED 5 /* bio is a bounce bio */
|
||||
#define BIO_USER_MAPPED 6 /* contains user pages */
|
||||
#define BIO_EOPNOTSUPP 7 /* not supported */
|
||||
#define BIO_NULL_MAPPED 8 /* contains invalid user pages */
|
||||
#define BIO_QUIET 9 /* Make BIO Quiet */
|
||||
#define BIO_SNAP_STABLE 10 /* bio data must be snapshotted during write */
|
||||
#define BIO_SEG_VALID 1 /* bi_phys_segments valid */
|
||||
#define BIO_CLONED 2 /* doesn't own data */
|
||||
#define BIO_BOUNCED 3 /* bio is a bounce bio */
|
||||
#define BIO_USER_MAPPED 4 /* contains user pages */
|
||||
#define BIO_NULL_MAPPED 5 /* contains invalid user pages */
|
||||
#define BIO_QUIET 6 /* Make BIO Quiet */
|
||||
#define BIO_SNAP_STABLE 7 /* bio data must be snapshotted during write */
|
||||
#define BIO_CHAIN 8 /* chained bio, ->bi_remaining in effect */
|
||||
#define BIO_REFFED 9 /* bio has elevated ->bi_cnt */
|
||||
|
||||
/*
|
||||
* Flags starting here get preserved by bio_reset() - this includes
|
||||
|
|
@ -193,6 +192,7 @@ enum rq_flag_bits {
|
|||
__REQ_HASHED, /* on IO scheduler merge hash */
|
||||
__REQ_MQ_INFLIGHT, /* track inflight for MQ */
|
||||
__REQ_NO_TIMEOUT, /* requests may never expire */
|
||||
__REQ_CLONE, /* cloned bios */
|
||||
__REQ_NR_BITS, /* stops here */
|
||||
};
|
||||
|
||||
|
|
@ -247,5 +247,6 @@ enum rq_flag_bits {
|
|||
#define REQ_HASHED (1ULL << __REQ_HASHED)
|
||||
#define REQ_MQ_INFLIGHT (1ULL << __REQ_MQ_INFLIGHT)
|
||||
#define REQ_NO_TIMEOUT (1ULL << __REQ_NO_TIMEOUT)
|
||||
#define REQ_CLONE (1ULL << __REQ_CLONE)
|
||||
|
||||
#endif /* __LINUX_BLK_TYPES_H */
|
||||
|
|
|
|||
|
|
@ -30,7 +30,6 @@ struct scsi_ioctl_command;
|
|||
|
||||
struct request_queue;
|
||||
struct elevator_queue;
|
||||
struct request_pm_state;
|
||||
struct blk_trace;
|
||||
struct request;
|
||||
struct sg_io_hdr;
|
||||
|
|
@ -75,18 +74,7 @@ struct request_list {
|
|||
enum rq_cmd_type_bits {
|
||||
REQ_TYPE_FS = 1, /* fs request */
|
||||
REQ_TYPE_BLOCK_PC, /* scsi command */
|
||||
REQ_TYPE_SENSE, /* sense request */
|
||||
REQ_TYPE_PM_SUSPEND, /* suspend request */
|
||||
REQ_TYPE_PM_RESUME, /* resume request */
|
||||
REQ_TYPE_PM_SHUTDOWN, /* shutdown request */
|
||||
REQ_TYPE_SPECIAL, /* driver defined type */
|
||||
/*
|
||||
* for ATA/ATAPI devices. this really doesn't belong here, ide should
|
||||
* use REQ_TYPE_SPECIAL and use rq->cmd[0] with the range of driver
|
||||
* private REQ_LB opcodes to differentiate what type of request this is
|
||||
*/
|
||||
REQ_TYPE_ATA_TASKFILE,
|
||||
REQ_TYPE_ATA_PC,
|
||||
REQ_TYPE_DRV_PRIV, /* driver defined types from here */
|
||||
};
|
||||
|
||||
#define BLK_MAX_CDB 16
|
||||
|
|
@ -108,7 +96,7 @@ struct request {
|
|||
struct blk_mq_ctx *mq_ctx;
|
||||
|
||||
u64 cmd_flags;
|
||||
enum rq_cmd_type_bits cmd_type;
|
||||
unsigned cmd_type;
|
||||
unsigned long atomic_flags;
|
||||
|
||||
int cpu;
|
||||
|
|
@ -216,19 +204,6 @@ static inline unsigned short req_get_ioprio(struct request *req)
|
|||
return req->ioprio;
|
||||
}
|
||||
|
||||
/*
|
||||
* State information carried for REQ_TYPE_PM_SUSPEND and REQ_TYPE_PM_RESUME
|
||||
* requests. Some step values could eventually be made generic.
|
||||
*/
|
||||
struct request_pm_state
|
||||
{
|
||||
/* PM state machine step value, currently driver specific */
|
||||
int pm_step;
|
||||
/* requested PM state value (S1, S2, S3, S4, ...) */
|
||||
u32 pm_state;
|
||||
void* data; /* for driver use */
|
||||
};
|
||||
|
||||
#include <linux/elevator.h>
|
||||
|
||||
struct blk_queue_ctx;
|
||||
|
|
@ -469,7 +444,7 @@ struct request_queue {
|
|||
struct mutex sysfs_lock;
|
||||
|
||||
int bypass_depth;
|
||||
int mq_freeze_depth;
|
||||
atomic_t mq_freeze_depth;
|
||||
|
||||
#if defined(CONFIG_BLK_DEV_BSG)
|
||||
bsg_job_fn *bsg_job_fn;
|
||||
|
|
@ -610,10 +585,6 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q)
|
|||
(((rq)->cmd_flags & REQ_STARTED) && \
|
||||
((rq)->cmd_type == REQ_TYPE_FS))
|
||||
|
||||
#define blk_pm_request(rq) \
|
||||
((rq)->cmd_type == REQ_TYPE_PM_SUSPEND || \
|
||||
(rq)->cmd_type == REQ_TYPE_PM_RESUME)
|
||||
|
||||
#define blk_rq_cpu_valid(rq) ((rq)->cpu != -1)
|
||||
#define blk_bidi_rq(rq) ((rq)->next_rq != NULL)
|
||||
/* rq->queuelist of dequeued request must be list_empty() */
|
||||
|
|
@ -804,11 +775,7 @@ extern void blk_add_request_payload(struct request *rq, struct page *page,
|
|||
unsigned int len);
|
||||
extern int blk_rq_check_limits(struct request_queue *q, struct request *rq);
|
||||
extern int blk_lld_busy(struct request_queue *q);
|
||||
extern int blk_rq_prep_clone(struct request *rq, struct request *rq_src,
|
||||
struct bio_set *bs, gfp_t gfp_mask,
|
||||
int (*bio_ctr)(struct bio *, struct bio *, void *),
|
||||
void *data);
|
||||
extern void blk_rq_unprep_clone(struct request *rq);
|
||||
extern void blk_rq_prep_clone(struct request *rq, struct request *rq_src);
|
||||
extern int blk_insert_cloned_request(struct request_queue *q,
|
||||
struct request *rq);
|
||||
extern void blk_delay_queue(struct request_queue *, unsigned long);
|
||||
|
|
@ -845,6 +812,7 @@ extern void blk_stop_queue(struct request_queue *q);
|
|||
extern void blk_sync_queue(struct request_queue *q);
|
||||
extern void __blk_stop_queue(struct request_queue *q);
|
||||
extern void __blk_run_queue(struct request_queue *q);
|
||||
extern void __blk_run_queue_uncond(struct request_queue *q);
|
||||
extern void blk_run_queue(struct request_queue *);
|
||||
extern void blk_run_queue_async(struct request_queue *q);
|
||||
extern int blk_rq_map_user(struct request_queue *, struct request *,
|
||||
|
|
@ -933,7 +901,7 @@ static inline unsigned int blk_rq_get_max_sectors(struct request *rq)
|
|||
if (unlikely(rq->cmd_type == REQ_TYPE_BLOCK_PC))
|
||||
return q->limits.max_hw_sectors;
|
||||
|
||||
if (!q->limits.chunk_sectors)
|
||||
if (!q->limits.chunk_sectors || (rq->cmd_flags & REQ_DISCARD))
|
||||
return blk_queue_get_max_sectors(q, rq->cmd_flags);
|
||||
|
||||
return min(blk_max_size_offset(q, blk_rq_pos(rq)),
|
||||
|
|
@ -1054,6 +1022,7 @@ bool __must_check blk_get_queue(struct request_queue *);
|
|||
struct request_queue *blk_alloc_queue(gfp_t);
|
||||
struct request_queue *blk_alloc_queue_node(gfp_t, int);
|
||||
extern void blk_put_queue(struct request_queue *);
|
||||
extern void blk_set_queue_dying(struct request_queue *);
|
||||
|
||||
/*
|
||||
* block layer runtime pm functions
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ typedef void (elevator_deactivate_req_fn) (struct request_queue *, struct reques
|
|||
typedef int (elevator_init_fn) (struct request_queue *,
|
||||
struct elevator_type *e);
|
||||
typedef void (elevator_exit_fn) (struct elevator_queue *);
|
||||
typedef void (elevator_registered_fn) (struct request_queue *);
|
||||
|
||||
struct elevator_ops
|
||||
{
|
||||
|
|
@ -68,6 +69,7 @@ struct elevator_ops
|
|||
|
||||
elevator_init_fn *elevator_init_fn;
|
||||
elevator_exit_fn *elevator_exit_fn;
|
||||
elevator_registered_fn *elevator_registered_fn;
|
||||
};
|
||||
|
||||
#define ELV_NAME_MAX (16)
|
||||
|
|
|
|||
|
|
@ -2280,6 +2280,9 @@ extern struct block_device *blkdev_get_by_path(const char *path, fmode_t mode,
|
|||
extern struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode,
|
||||
void *holder);
|
||||
extern void blkdev_put(struct block_device *bdev, fmode_t mode);
|
||||
extern int __blkdev_reread_part(struct block_device *bdev);
|
||||
extern int blkdev_reread_part(struct block_device *bdev);
|
||||
|
||||
#ifdef CONFIG_SYSFS
|
||||
extern int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk);
|
||||
extern void bd_unlink_disk_holder(struct block_device *bdev,
|
||||
|
|
|
|||
|
|
@ -39,6 +39,19 @@
|
|||
|
||||
struct device;
|
||||
|
||||
/* IDE-specific values for req->cmd_type */
|
||||
enum ata_cmd_type_bits {
|
||||
REQ_TYPE_ATA_TASKFILE = REQ_TYPE_DRV_PRIV + 1,
|
||||
REQ_TYPE_ATA_PC,
|
||||
REQ_TYPE_ATA_SENSE, /* sense request */
|
||||
REQ_TYPE_ATA_PM_SUSPEND,/* suspend request */
|
||||
REQ_TYPE_ATA_PM_RESUME, /* resume request */
|
||||
};
|
||||
|
||||
#define ata_pm_request(rq) \
|
||||
((rq)->cmd_type == REQ_TYPE_ATA_PM_SUSPEND || \
|
||||
(rq)->cmd_type == REQ_TYPE_ATA_PM_RESUME)
|
||||
|
||||
/* Error codes returned in rq->errors to the higher part of the driver. */
|
||||
enum {
|
||||
IDE_DRV_ERROR_GENERAL = 101,
|
||||
|
|
@ -1314,6 +1327,19 @@ struct ide_port_info {
|
|||
u8 udma_mask;
|
||||
};
|
||||
|
||||
/*
|
||||
* State information carried for REQ_TYPE_ATA_PM_SUSPEND and REQ_TYPE_ATA_PM_RESUME
|
||||
* requests.
|
||||
*/
|
||||
struct ide_pm_state {
|
||||
/* PM state machine step value, currently driver specific */
|
||||
int pm_step;
|
||||
/* requested PM state value (S1, S2, S3, S4, ...) */
|
||||
u32 pm_state;
|
||||
void* data; /* for driver use */
|
||||
};
|
||||
|
||||
|
||||
int ide_pci_init_one(struct pci_dev *, const struct ide_port_info *, void *);
|
||||
int ide_pci_init_two(struct pci_dev *, struct pci_dev *,
|
||||
const struct ide_port_info *, void *);
|
||||
|
|
@ -1551,4 +1577,5 @@ static inline void ide_set_drivedata(ide_drive_t *drive, void *data)
|
|||
#define ide_host_for_each_port(i, port, host) \
|
||||
for ((i) = 0; ((port) = (host)->ports[i]) || (i) < MAX_HOST_PORTS; (i)++)
|
||||
|
||||
|
||||
#endif /* _IDE_H */
|
||||
|
|
|
|||
|
|
@ -377,7 +377,6 @@ extern void end_swap_bio_write(struct bio *bio, int err);
|
|||
extern int __swap_writepage(struct page *page, struct writeback_control *wbc,
|
||||
void (*end_write_func)(struct bio *, int));
|
||||
extern int swap_set_page_dirty(struct page *page);
|
||||
extern void end_swap_bio_read(struct bio *bio, int err);
|
||||
|
||||
int add_swap_extent(struct swap_info_struct *sis, unsigned long start_page,
|
||||
unsigned long nr_pages, sector_t start_block);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue