Skip to content

Commit ccadc8a

Browse files
Mikulas PatockaMike Snitzer
authored andcommitted
dm-delay: avoid duplicate logic
This is small refactoring of dm-delay - we avoid duplicate logic in flush_delayed_bios and flush_delayed_bios_fast and join these two functions into one. We also add cond_resched() to flush_delayed_bios because the list may have unbounded number of entries. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Mike Snitzer <snitzer@kernel.org>
1 parent 38cfff5 commit ccadc8a

File tree

1 file changed

+21
-44
lines changed

1 file changed

+21
-44
lines changed

drivers/md/dm-delay.c

Lines changed: 21 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -85,24 +85,40 @@ static void flush_bios(struct bio *bio)
8585
}
8686
}
8787

88-
static void flush_delayed_bios_fast(struct delay_c *dc, bool flush_all)
88+
static void flush_delayed_bios(struct delay_c *dc, bool flush_all)
8989
{
9090
struct dm_delay_info *delayed, *next;
9191
struct bio_list flush_bio_list;
92+
unsigned long next_expires = 0;
93+
bool start_timer = false;
9294
bio_list_init(&flush_bio_list);
9395

9496
mutex_lock(&delayed_bios_lock);
9597
list_for_each_entry_safe(delayed, next, &dc->delayed_bios, list) {
98+
cond_resched();
9699
if (flush_all || time_after_eq(jiffies, delayed->expires)) {
97100
struct bio *bio = dm_bio_from_per_bio_data(delayed,
98101
sizeof(struct dm_delay_info));
99102
list_del(&delayed->list);
100103
bio_list_add(&flush_bio_list, bio);
101104
delayed->class->ops--;
105+
continue;
106+
}
107+
108+
if (!delay_is_fast(dc)) {
109+
if (!start_timer) {
110+
start_timer = true;
111+
next_expires = delayed->expires;
112+
} else {
113+
next_expires = min(next_expires, delayed->expires);
114+
}
102115
}
103116
}
104117
mutex_unlock(&delayed_bios_lock);
105118

119+
if (start_timer)
120+
queue_timeout(dc, next_expires);
121+
106122
flush_bios(bio_list_get(&flush_bio_list));
107123
}
108124

@@ -111,7 +127,7 @@ static int flush_worker_fn(void *data)
111127
struct delay_c *dc = data;
112128

113129
while (!kthread_should_stop()) {
114-
flush_delayed_bios_fast(dc, false);
130+
flush_delayed_bios(dc, false);
115131
mutex_lock(&delayed_bios_lock);
116132
if (unlikely(list_empty(&dc->delayed_bios))) {
117133
set_current_state(TASK_INTERRUPTIBLE);
@@ -126,48 +142,12 @@ static int flush_worker_fn(void *data)
126142
return 0;
127143
}
128144

129-
static void flush_delayed_bios(struct delay_c *dc, bool flush_all)
130-
{
131-
struct dm_delay_info *delayed, *next;
132-
unsigned long next_expires = 0;
133-
unsigned long start_timer = 0;
134-
struct bio_list flush_bio_list;
135-
bio_list_init(&flush_bio_list);
136-
137-
mutex_lock(&delayed_bios_lock);
138-
list_for_each_entry_safe(delayed, next, &dc->delayed_bios, list) {
139-
if (flush_all || time_after_eq(jiffies, delayed->expires)) {
140-
struct bio *bio = dm_bio_from_per_bio_data(delayed,
141-
sizeof(struct dm_delay_info));
142-
list_del(&delayed->list);
143-
bio_list_add(&flush_bio_list, bio);
144-
delayed->class->ops--;
145-
continue;
146-
}
147-
148-
if (!start_timer) {
149-
start_timer = 1;
150-
next_expires = delayed->expires;
151-
} else
152-
next_expires = min(next_expires, delayed->expires);
153-
}
154-
mutex_unlock(&delayed_bios_lock);
155-
156-
if (start_timer)
157-
queue_timeout(dc, next_expires);
158-
159-
flush_bios(bio_list_get(&flush_bio_list));
160-
}
161-
162145
static void flush_expired_bios(struct work_struct *work)
163146
{
164147
struct delay_c *dc;
165148

166149
dc = container_of(work, struct delay_c, flush_expired_bios);
167-
if (delay_is_fast(dc))
168-
flush_delayed_bios_fast(dc, false);
169-
else
170-
flush_delayed_bios(dc, false);
150+
flush_delayed_bios(dc, false);
171151
}
172152

173153
static void delay_dtr(struct dm_target *ti)
@@ -354,12 +334,9 @@ static void delay_presuspend(struct dm_target *ti)
354334
dc->may_delay = false;
355335
mutex_unlock(&delayed_bios_lock);
356336

357-
if (delay_is_fast(dc)) {
358-
flush_delayed_bios_fast(dc, true);
359-
} else {
337+
if (!delay_is_fast(dc))
360338
del_timer_sync(&dc->delay_timer);
361-
flush_delayed_bios(dc, true);
362-
}
339+
flush_delayed_bios(dc, true);
363340
}
364341

365342
static void delay_resume(struct dm_target *ti)

0 commit comments

Comments
 (0)