diff options
| author | Jens Axboe <axboe@suse.de> | 2002-05-02 01:53:47 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-05-02 01:53:47 -0700 |
| commit | 2c66783a99c5622d38e7cc8f5fefb6c1f14905f8 (patch) | |
| tree | cae54064e3269853150e80070cb0ec0b5374facf /include/linux/blkdev.h | |
| parent | 5da3d2cab99c15a03b4efb578d298f39427de98d (diff) | |
[PATCH] bio tagged command support
Add support for request tagging of the block queue.
Diffstat (limited to 'include/linux/blkdev.h')
| -rw-r--r-- | include/linux/blkdev.h | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 372af31e3706..d8175ccc104c 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -56,6 +56,7 @@ struct request { unsigned int current_nr_sectors; unsigned int hard_cur_sectors; + int tag; void *special; char *buffer; struct completion *waiting; @@ -75,6 +76,7 @@ enum rq_flag_bits { __REQ_NOMERGE, /* don't touch this for merging */ __REQ_STARTED, /* drive already may have started this one */ __REQ_DONTPREP, /* don't call prep for this one */ + __REQ_QUEUED, /* uses queueing */ /* * for ATA/ATAPI devices */ @@ -97,6 +99,7 @@ enum rq_flag_bits { #define REQ_NOMERGE (1 << __REQ_NOMERGE) #define REQ_STARTED (1 << __REQ_STARTED) #define REQ_DONTPREP (1 << __REQ_DONTPREP) +#define REQ_QUEUED (1 << __REQ_QUEUED) #define REQ_DRIVE_CMD (1 << __REQ_DRIVE_CMD) #define REQ_DRIVE_ACB (1 << __REQ_DRIVE_ACB) #define REQ_PC (1 << __REQ_PC) @@ -121,6 +124,17 @@ enum blk_queue_state { Queue_up, }; +#define BLK_TAGS_PER_LONG (sizeof(unsigned long) * 8) +#define BLK_TAGS_MASK (BLK_TAGS_PER_LONG - 1) + +struct blk_queue_tag { + struct request **tag_index; /* map of busy tags */ + unsigned long *tag_map; /* bit map of free/busy tags */ + struct list_head busy_list; /* fifo list of busy tags */ + int busy; /* current depth */ + int max_depth; +}; + /* * Default nr free requests per queue, ll_rw_blk will scale it down * according to available RAM at init time @@ -193,6 +207,8 @@ struct request_queue unsigned long seg_boundary_mask; wait_queue_head_t queue_wait; + + struct blk_queue_tag *queue_tags; }; #define RQ_INACTIVE (-1) @@ -203,9 +219,11 @@ struct request_queue #define QUEUE_FLAG_PLUGGED 0 /* queue is plugged */ #define QUEUE_FLAG_CLUSTER 1 /* cluster several segments into 1 */ +#define QUEUE_FLAG_QUEUED 2 /* uses generic tag queueing */ #define blk_queue_plugged(q) test_bit(QUEUE_FLAG_PLUGGED, &(q)->queue_flags) #define blk_mark_plugged(q) set_bit(QUEUE_FLAG_PLUGGED, &(q)->queue_flags) +#define blk_queue_tagged(q) test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags) #define blk_queue_empty(q) elv_queue_empty(q) #define list_entry_rq(ptr) list_entry((ptr), struct request, queuelist) @@ -316,6 +334,19 @@ extern int blk_rq_map_sg(request_queue_t *, struct request *, struct scatterlist extern void blk_dump_rq_flags(struct request *, char *); extern void generic_unplug_device(void *); +/* + * tag stuff + */ +#define blk_queue_tag_request(q, tag) ((q)->queue_tags->tag_index[(tag)]) +#define blk_queue_tag_depth(q) ((q)->queue_tags->busy) +#define blk_queue_tag_queue(q) ((q)->queue_tags->busy < (q)->queue_tags->max_depth) +#define blk_rq_tagged(rq) ((rq)->flags & REQ_QUEUED) +extern int blk_queue_start_tag(request_queue_t *, struct request *); +extern void blk_queue_end_tag(request_queue_t *, struct request *); +extern int blk_queue_init_tags(request_queue_t *, int); +extern void blk_queue_free_tags(request_queue_t *); +extern void blk_queue_invalidate_tags(request_queue_t *); + extern int * blk_size[MAX_BLKDEV]; /* in units of 1024 bytes */ #define MAX_PHYS_SEGMENTS 128 |
