diff options
| author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-08-17 10:57:56 +0400 | 
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-08-17 11:01:08 +0400 | 
| commit | a22ddff8bedfe33eeb1330bbb7ef1fbe007a42c4 (patch) | |
| tree | 61a2eb7fa62f5af10c2b913ca429e6b068b0eb2d /include/linux/blkdev.h | |
| parent | 20d5a540e55a29daeef12706f9ee73baf5641c16 (diff) | |
| parent | d9875690d9b89a866022ff49e3fcea892345ad92 (diff) | |
| download | linux-a22ddff8bedfe33eeb1330bbb7ef1fbe007a42c4.tar.xz | |
Merge tag 'v3.6-rc2' into drm-intel-next
Backmerge Linux 3.6-rc2 to resolve a few funny conflicts before we put
even more madness on top:
- drivers/gpu/drm/i915/i915_irq.c: Just a spurious WARN removed in
  -fixes, that has been changed in a variable-rename in -next, too.
- drivers/gpu/drm/i915/intel_ringbuffer.c: -next remove scratch_addr
  (since all their users have been extracted in another fucntion),
  -fixes added another user for a hw workaroudn.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'include/linux/blkdev.h')
| -rw-r--r-- | include/linux/blkdev.h | 62 | 
1 files changed, 38 insertions, 24 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index ba43f408baa3..4e72a9d48232 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -46,16 +46,23 @@ struct blkcg_gq;  struct request;  typedef void (rq_end_io_fn)(struct request *, int); +#define BLK_RL_SYNCFULL		(1U << 0) +#define BLK_RL_ASYNCFULL	(1U << 1) +  struct request_list { +	struct request_queue	*q;	/* the queue this rl belongs to */ +#ifdef CONFIG_BLK_CGROUP +	struct blkcg_gq		*blkg;	/* blkg this request pool belongs to */ +#endif  	/*  	 * count[], starved[], and wait[] are indexed by  	 * BLK_RW_SYNC/BLK_RW_ASYNC  	 */ -	int count[2]; -	int starved[2]; -	int elvpriv; -	mempool_t *rq_pool; -	wait_queue_head_t wait[2]; +	int			count[2]; +	int			starved[2]; +	mempool_t		*rq_pool; +	wait_queue_head_t	wait[2]; +	unsigned int		flags;  };  /* @@ -138,6 +145,7 @@ struct request {  	struct hd_struct *part;  	unsigned long start_time;  #ifdef CONFIG_BLK_CGROUP +	struct request_list *rl;		/* rl this rq is alloced from */  	unsigned long long start_time_ns;  	unsigned long long io_start_time_ns;    /* when passed to hardware */  #endif @@ -282,11 +290,16 @@ struct request_queue {  	struct list_head	queue_head;  	struct request		*last_merge;  	struct elevator_queue	*elevator; +	int			nr_rqs[2];	/* # allocated [a]sync rqs */ +	int			nr_rqs_elvpriv;	/* # allocated rqs w/ elvpriv */  	/* -	 * the queue request freelist, one for reads and one for writes +	 * If blkcg is not used, @q->root_rl serves all requests.  If blkcg +	 * is used, root blkg allocates from @q->root_rl and all other +	 * blkgs from their own blkg->rl.  Which one to use should be +	 * determined using bio_request_list().  	 */ -	struct request_list	rq; +	struct request_list	root_rl;  	request_fn_proc		*request_fn;  	make_request_fn		*make_request_fn; @@ -561,27 +574,25 @@ static inline bool rq_is_sync(struct request *rq)  	return rw_is_sync(rq->cmd_flags);  } -static inline int blk_queue_full(struct request_queue *q, int sync) +static inline bool blk_rl_full(struct request_list *rl, bool sync)  { -	if (sync) -		return test_bit(QUEUE_FLAG_SYNCFULL, &q->queue_flags); -	return test_bit(QUEUE_FLAG_ASYNCFULL, &q->queue_flags); +	unsigned int flag = sync ? BLK_RL_SYNCFULL : BLK_RL_ASYNCFULL; + +	return rl->flags & flag;  } -static inline void blk_set_queue_full(struct request_queue *q, int sync) +static inline void blk_set_rl_full(struct request_list *rl, bool sync)  { -	if (sync) -		queue_flag_set(QUEUE_FLAG_SYNCFULL, q); -	else -		queue_flag_set(QUEUE_FLAG_ASYNCFULL, q); +	unsigned int flag = sync ? BLK_RL_SYNCFULL : BLK_RL_ASYNCFULL; + +	rl->flags |= flag;  } -static inline void blk_clear_queue_full(struct request_queue *q, int sync) +static inline void blk_clear_rl_full(struct request_list *rl, bool sync)  { -	if (sync) -		queue_flag_clear(QUEUE_FLAG_SYNCFULL, q); -	else -		queue_flag_clear(QUEUE_FLAG_ASYNCFULL, q); +	unsigned int flag = sync ? BLK_RL_SYNCFULL : BLK_RL_ASYNCFULL; + +	rl->flags &= ~flag;  } @@ -827,7 +838,6 @@ extern bool __blk_end_request_err(struct request *rq, int error);  extern void blk_complete_request(struct request *);  extern void __blk_complete_request(struct request *);  extern void blk_abort_request(struct request *); -extern void blk_abort_queue(struct request_queue *);  extern void blk_unprep_request(struct request *);  /* @@ -912,11 +922,15 @@ struct blk_plug {  };  #define BLK_MAX_REQUEST_COUNT 16 +struct blk_plug_cb; +typedef void (*blk_plug_cb_fn)(struct blk_plug_cb *, bool);  struct blk_plug_cb {  	struct list_head list; -	void (*callback)(struct blk_plug_cb *); +	blk_plug_cb_fn callback; +	void *data;  }; - +extern struct blk_plug_cb *blk_check_plugged(blk_plug_cb_fn unplug, +					     void *data, int size);  extern void blk_start_plug(struct blk_plug *);  extern void blk_finish_plug(struct blk_plug *);  extern void blk_flush_plug_list(struct blk_plug *, bool);  | 
