Lines Matching +full:in +full:- +full:flight

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2004-2005 IBM Corp. All Rights Reserved.
4 * Copyright (C) 2006-2009 NEC Corporation.
6 * dm-queue-length.c
13 * queue-length path selector - choose a path with the least number of
14 * in-flight I/Os.
18 #include "dm-path-selector.h"
26 #define DM_MSG_PREFIX "multipath queue-length"
40 atomic_t qlen; /* the number of in-flight I/Os */
48 INIT_LIST_HEAD(&s->valid_paths); in alloc_selector()
49 INIT_LIST_HEAD(&s->failed_paths); in alloc_selector()
50 spin_lock_init(&s->lock); in alloc_selector()
61 return -ENOMEM; in ql_create()
63 ps->context = s; in ql_create()
72 list_del(&pi->list); in ql_free_paths()
79 struct selector *s = ps->context; in ql_destroy()
81 ql_free_paths(&s->valid_paths); in ql_destroy()
82 ql_free_paths(&s->failed_paths); in ql_destroy()
84 ps->context = NULL; in ql_destroy()
97 pi = path->pscontext; in ql_status()
101 DMEMIT("%d ", atomic_read(&pi->qlen)); in ql_status()
104 DMEMIT("%u ", pi->repeat_count); in ql_status()
118 struct selector *s = ps->context; in ql_add_path()
130 *error = "queue-length ps: incorrect number of arguments"; in ql_add_path()
131 return -EINVAL; in ql_add_path()
135 *error = "queue-length ps: invalid repeat count"; in ql_add_path()
136 return -EINVAL; in ql_add_path()
147 *error = "queue-length ps: Error allocating path information"; in ql_add_path()
148 return -ENOMEM; in ql_add_path()
151 pi->path = path; in ql_add_path()
152 pi->repeat_count = repeat_count; in ql_add_path()
153 atomic_set(&pi->qlen, 0); in ql_add_path()
155 path->pscontext = pi; in ql_add_path()
157 spin_lock_irqsave(&s->lock, flags); in ql_add_path()
158 list_add_tail(&pi->list, &s->valid_paths); in ql_add_path()
159 spin_unlock_irqrestore(&s->lock, flags); in ql_add_path()
166 struct selector *s = ps->context; in ql_fail_path()
167 struct path_info *pi = path->pscontext; in ql_fail_path()
170 spin_lock_irqsave(&s->lock, flags); in ql_fail_path()
171 list_move(&pi->list, &s->failed_paths); in ql_fail_path()
172 spin_unlock_irqrestore(&s->lock, flags); in ql_fail_path()
177 struct selector *s = ps->context; in ql_reinstate_path()
178 struct path_info *pi = path->pscontext; in ql_reinstate_path()
181 spin_lock_irqsave(&s->lock, flags); in ql_reinstate_path()
182 list_move_tail(&pi->list, &s->valid_paths); in ql_reinstate_path()
183 spin_unlock_irqrestore(&s->lock, flags); in ql_reinstate_path()
189 * Select a path having the minimum number of in-flight I/Os
193 struct selector *s = ps->context; in ql_select_path()
198 spin_lock_irqsave(&s->lock, flags); in ql_select_path()
199 if (list_empty(&s->valid_paths)) in ql_select_path()
202 list_for_each_entry(pi, &s->valid_paths, list) { in ql_select_path()
204 (atomic_read(&pi->qlen) < atomic_read(&best->qlen))) in ql_select_path()
207 if (!atomic_read(&best->qlen)) in ql_select_path()
215 list_move_tail(&best->list, &s->valid_paths); in ql_select_path()
217 ret = best->path; in ql_select_path()
219 spin_unlock_irqrestore(&s->lock, flags); in ql_select_path()
226 struct path_info *pi = path->pscontext; in ql_start_io()
228 atomic_inc(&pi->qlen); in ql_start_io()
236 struct path_info *pi = path->pscontext; in ql_end_io()
238 atomic_dec(&pi->qlen); in ql_end_io()
244 .name = "queue-length",
285 DM_NAME " path selector to balance the number of in-flight I/Os"