Lines Matching refs:dd

187 	struct deadline_data *dd = q->elevator->elevator_data;
190 struct dd_per_prio *per_prio = &dd->per_prio[prio];
207 struct deadline_data *dd = q->elevator->elevator_data;
211 lockdep_assert_held(&dd->lock);
213 dd->per_prio[prio].stats.merged++;
230 deadline_remove_request(q, &dd->per_prio[prio], next);
246 static u32 dd_queued(struct deadline_data *dd, enum dd_prio prio)
248 const struct io_stats_per_prio *stats = &dd->per_prio[prio].stats;
250 lockdep_assert_held(&dd->lock);
257 * in the FIFO list. Requires !list_empty(&dd->fifo_list[data_dir]).
295 static bool started_after(struct deadline_data *dd, struct request *rq,
300 start_time -= dd->fifo_expire[rq_data_dir(rq)];
305 static struct request *dd_start_request(struct deadline_data *dd,
312 dd->per_prio[prio].latest_pos[data_dir] = blk_rq_pos(rq);
313 dd->per_prio[prio].stats.dispatched++;
322 static struct request *__dd_dispatch_request(struct deadline_data *dd,
329 lockdep_assert_held(&dd->lock);
334 rq = deadline_next_request(per_prio, dd->last_dir);
335 if (rq && dd->batching < dd->fifo_batch) {
350 (dd->starved++ >= dd->writes_starved))
366 dd->starved = 0;
398 dd->last_dir = data_dir;
399 dd->batching = 0;
402 if (started_after(dd, rq, latest_start))
408 dd->batching++;
410 return dd_start_request(dd, data_dir, rq);
417 static struct request *dd_dispatch_prio_aged_requests(struct deadline_data *dd,
424 lockdep_assert_held(&dd->lock);
426 prio_cnt = !!dd_queued(dd, DD_RT_PRIO) + !!dd_queued(dd, DD_BE_PRIO) +
427 !!dd_queued(dd, DD_IDLE_PRIO);
432 rq = __dd_dispatch_request(dd, &dd->per_prio[prio],
433 now - dd->prio_aging_expire);
451 struct deadline_data *dd = hctx->queue->elevator->elevator_data;
456 spin_lock(&dd->lock);
458 if (!list_empty(&dd->dispatch)) {
459 rq = list_first_entry(&dd->dispatch, struct request, queuelist);
461 dd_start_request(dd, rq_data_dir(rq), rq);
465 rq = dd_dispatch_prio_aged_requests(dd, now);
474 rq = __dd_dispatch_request(dd, &dd->per_prio[prio], now);
475 if (rq || dd_queued(dd, prio))
480 spin_unlock(&dd->lock);
499 struct deadline_data *dd = e->elevator_data;
503 struct dd_per_prio *per_prio = &dd->per_prio[prio];
510 spin_lock(&dd->lock);
511 queued = dd_queued(dd, prio);
512 spin_unlock(&dd->lock);
520 kfree(dd);
528 struct deadline_data *dd;
531 dd = kzalloc_node(sizeof(*dd), GFP_KERNEL, q->node);
532 if (!dd)
535 eq->elevator_data = dd;
537 INIT_LIST_HEAD(&dd->dispatch);
539 struct dd_per_prio *per_prio = &dd->per_prio[prio];
546 dd->fifo_expire[DD_READ] = read_expire;
547 dd->fifo_expire[DD_WRITE] = write_expire;
548 dd->writes_starved = writes_starved;
549 dd->front_merges = 1;
550 dd->last_dir = DD_WRITE;
551 dd->fifo_batch = fifo_batch;
552 dd->prio_aging_expire = prio_aging_expire;
553 spin_lock_init(&dd->lock);
571 struct deadline_data *dd = q->elevator->elevator_data;
574 struct dd_per_prio *per_prio = &dd->per_prio[prio];
578 if (!dd->front_merges)
603 struct deadline_data *dd = q->elevator->elevator_data;
607 spin_lock(&dd->lock);
609 spin_unlock(&dd->lock);
624 struct deadline_data *dd = q->elevator->elevator_data;
631 lockdep_assert_held(&dd->lock);
634 per_prio = &dd->per_prio[prio];
645 list_add(&rq->queuelist, &dd->dispatch);
659 rq->fifo_time = jiffies + dd->fifo_expire[data_dir];
672 struct deadline_data *dd = q->elevator->elevator_data;
675 spin_lock(&dd->lock);
683 spin_unlock(&dd->lock);
718 struct deadline_data *dd = hctx->queue->elevator->elevator_data;
721 if (!list_empty_careful(&dd->dispatch))
725 if (dd_has_work_for_prio(&dd->per_prio[prio]))
737 struct deadline_data *dd = e->elevator_data; \
742 SHOW_JIFFIES(deadline_read_expire_show, dd->fifo_expire[DD_READ]);
743 SHOW_JIFFIES(deadline_write_expire_show, dd->fifo_expire[DD_WRITE]);
744 SHOW_JIFFIES(deadline_prio_aging_expire_show, dd->prio_aging_expire);
745 SHOW_INT(deadline_writes_starved_show, dd->writes_starved);
746 SHOW_INT(deadline_front_merges_show, dd->front_merges);
747 SHOW_INT(deadline_fifo_batch_show, dd->fifo_batch);
754 struct deadline_data *dd = e->elevator_data; \
771 STORE_JIFFIES(deadline_read_expire_store, &dd->fifo_expire[DD_READ], 0, INT_MAX);
772 STORE_JIFFIES(deadline_write_expire_store, &dd->fifo_expire[DD_WRITE], 0, INT_MAX);
773 STORE_JIFFIES(deadline_prio_aging_expire_store, &dd->prio_aging_expire, 0, INT_MAX);
774 STORE_INT(deadline_writes_starved_store, &dd->writes_starved, INT_MIN, INT_MAX);
775 STORE_INT(deadline_front_merges_store, &dd->front_merges, 0, 1);
776 STORE_INT(deadline_fifo_batch_store, &dd->fifo_batch, 0, INT_MAX);
805 struct deadline_data *dd = q->elevator->elevator_data; \
806 struct dd_per_prio *per_prio = &dd->per_prio[prio]; \
808 spin_lock(&dd->lock); \
816 struct deadline_data *dd = q->elevator->elevator_data; \
817 struct dd_per_prio *per_prio = &dd->per_prio[prio]; \
826 struct deadline_data *dd = q->elevator->elevator_data; \
828 spin_unlock(&dd->lock); \
842 struct deadline_data *dd = q->elevator->elevator_data; \
843 struct dd_per_prio *per_prio = &dd->per_prio[prio]; \
864 struct deadline_data *dd = q->elevator->elevator_data;
866 seq_printf(m, "%u\n", dd->batching);
873 struct deadline_data *dd = q->elevator->elevator_data;
875 seq_printf(m, "%u\n", dd->starved);
882 struct deadline_data *dd = q->elevator->elevator_data;
885 spin_lock(&dd->lock);
886 rt = dd_queued(dd, DD_RT_PRIO);
887 be = dd_queued(dd, DD_BE_PRIO);
888 idle = dd_queued(dd, DD_IDLE_PRIO);
889 spin_unlock(&dd->lock);
897 static u32 dd_owned_by_driver(struct deadline_data *dd, enum dd_prio prio)
899 const struct io_stats_per_prio *stats = &dd->per_prio[prio].stats;
901 lockdep_assert_held(&dd->lock);
910 struct deadline_data *dd = q->elevator->elevator_data;
913 spin_lock(&dd->lock);
914 rt = dd_owned_by_driver(dd, DD_RT_PRIO);
915 be = dd_owned_by_driver(dd, DD_BE_PRIO);
916 idle = dd_owned_by_driver(dd, DD_IDLE_PRIO);
917 spin_unlock(&dd->lock);
928 struct deadline_data *dd = q->elevator->elevator_data;
930 spin_lock(&dd->lock);
931 return seq_list_start(&dd->dispatch, *pos);
937 struct deadline_data *dd = q->elevator->elevator_data;
939 return seq_list_next(v, &dd->dispatch, pos);
946 struct deadline_data *dd = q->elevator->elevator_data;
948 spin_unlock(&dd->lock);