projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[PATCH] gfp_t: block layer core
[firefly-linux-kernel-4.4.55.git]
/
drivers
/
block
/
cfq-iosched.c
diff --git
a/drivers/block/cfq-iosched.c
b/drivers/block/cfq-iosched.c
index 2435a7c99b2b6cd20300a78b15eb35b54e786eee..d3bfe8cfb0397023fcee75237b3350f0eba0a705 100644
(file)
--- a/
drivers/block/cfq-iosched.c
+++ b/
drivers/block/cfq-iosched.c
@@
-47,7
+47,7
@@
static int cfq_slice_idle = HZ / 100;
/*
* disable queueing at the driver/hardware level
*/
/*
* disable queueing at the driver/hardware level
*/
-static int cfq_max_depth =
1
;
+static int cfq_max_depth =
2
;
/*
* for the hash of cfqq inside the cfqd
/*
* for the hash of cfqq inside the cfqd
@@
-385,9
+385,15
@@
cfq_choose_req(struct cfq_data *cfqd, struct cfq_rq *crq1, struct cfq_rq *crq2)
return crq2;
if (crq2 == NULL)
return crq1;
return crq2;
if (crq2 == NULL)
return crq1;
- if (cfq_crq_requeued(crq1))
+
+ if (cfq_crq_requeued(crq1) && !cfq_crq_requeued(crq2))
return crq1;
return crq1;
- if (cfq_crq_requeued(crq2))
+ else if (cfq_crq_requeued(crq2) && !cfq_crq_requeued(crq1))
+ return crq2;
+
+ if (cfq_crq_is_sync(crq1) && !cfq_crq_is_sync(crq2))
+ return crq1;
+ else if (cfq_crq_is_sync(crq2) && !cfq_crq_is_sync(crq1))
return crq2;
s1 = crq1->request->sector;
return crq2;
s1 = crq1->request->sector;
@@
-1416,7
+1422,7
@@
static void cfq_exit_io_context(struct cfq_io_context *cic)
}
static struct cfq_io_context *
}
static struct cfq_io_context *
-cfq_alloc_io_context(struct cfq_data *cfqd,
in
t gfp_mask)
+cfq_alloc_io_context(struct cfq_data *cfqd,
gfp_
t gfp_mask)
{
struct cfq_io_context *cic = kmem_cache_alloc(cfq_ioc_pool, gfp_mask);
{
struct cfq_io_context *cic = kmem_cache_alloc(cfq_ioc_pool, gfp_mask);
@@
-1511,7
+1517,7
@@
static int cfq_ioc_set_ioprio(struct io_context *ioc, unsigned int ioprio)
static struct cfq_queue *
cfq_get_queue(struct cfq_data *cfqd, unsigned int key, unsigned short ioprio,
static struct cfq_queue *
cfq_get_queue(struct cfq_data *cfqd, unsigned int key, unsigned short ioprio,
-
in
t gfp_mask)
+
gfp_
t gfp_mask)
{
const int hashval = hash_long(key, CFQ_QHASH_SHIFT);
struct cfq_queue *cfqq, *new_cfqq = NULL;
{
const int hashval = hash_long(key, CFQ_QHASH_SHIFT);
struct cfq_queue *cfqq, *new_cfqq = NULL;
@@
-1572,7
+1578,7
@@
out:
* cfqq, so we don't need to worry about it disappearing
*/
static struct cfq_io_context *
* cfqq, so we don't need to worry about it disappearing
*/
static struct cfq_io_context *
-cfq_get_io_context(struct cfq_data *cfqd, pid_t pid,
in
t gfp_mask)
+cfq_get_io_context(struct cfq_data *cfqd, pid_t pid,
gfp_
t gfp_mask)
{
struct io_context *ioc = NULL;
struct cfq_io_context *cic;
{
struct io_context *ioc = NULL;
struct cfq_io_context *cic;
@@
-1769,18
+1775,23
@@
static void
cfq_crq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
struct cfq_rq *crq)
{
cfq_crq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
struct cfq_rq *crq)
{
-
const int sync = cfq_crq_is_sync(crq)
;
+
struct cfq_io_context *cic
;
cfqq->next_crq = cfq_choose_req(cfqd, cfqq->next_crq, crq);
cfqq->next_crq = cfq_choose_req(cfqd, cfqq->next_crq, crq);
- if (sync) {
- struct cfq_io_context *cic = crq->io_context;
+ /*
+ * we never wait for an async request and we don't allow preemption
+ * of an async request. so just return early
+ */
+ if (!cfq_crq_is_sync(crq))
+ return;
- cfq_update_io_thinktime(cfqd, cic);
- cfq_update_idle_window(cfqd, cfqq, cic);
+ cic = crq->io_context;
- cic->last_queue = jiffies;
- }
+ cfq_update_io_thinktime(cfqd, cic);
+ cfq_update_idle_window(cfqd, cfqq, cic);
+
+ cic->last_queue = jiffies;
if (cfqq == cfqd->active_queue) {
/*
if (cfqq == cfqd->active_queue) {
/*
@@
-2064,7
+2075,7
@@
static void cfq_put_request(request_queue_t *q, struct request *rq)
*/
static int
cfq_set_request(request_queue_t *q, struct request *rq, struct bio *bio,
*/
static int
cfq_set_request(request_queue_t *q, struct request *rq, struct bio *bio,
-
in
t gfp_mask)
+
gfp_
t gfp_mask)
{
struct cfq_data *cfqd = q->elevator->elevator_data;
struct task_struct *tsk = current;
{
struct cfq_data *cfqd = q->elevator->elevator_data;
struct task_struct *tsk = current;