dm-delay.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2005-2007 Red Hat GmbH
  4. *
  5. * A target that delays reads and/or writes and can send
  6. * them to different devices.
  7. *
  8. * This file is released under the GPL.
  9. */
  10. #include <linux/module.h>
  11. #include <linux/init.h>
  12. #include <linux/blkdev.h>
  13. #include <linux/bio.h>
  14. #include <linux/slab.h>
  15. #include <linux/kthread.h>
  16. #include <linux/device-mapper.h>
  17. #define DM_MSG_PREFIX "delay"
  18. struct delay_class {
  19. struct dm_dev *dev;
  20. sector_t start;
  21. unsigned int delay;
  22. unsigned int ops;
  23. };
  24. struct delay_c {
  25. struct timer_list delay_timer;
  26. struct mutex process_bios_lock; /* hold while removing bios to be processed from list */
  27. spinlock_t delayed_bios_lock; /* hold on all accesses to delayed_bios list */
  28. struct workqueue_struct *kdelayd_wq;
  29. struct work_struct flush_expired_bios;
  30. struct list_head delayed_bios;
  31. struct task_struct *worker;
  32. bool may_delay;
  33. struct delay_class read;
  34. struct delay_class write;
  35. struct delay_class flush;
  36. int argc;
  37. };
  38. struct dm_delay_info {
  39. struct delay_c *context;
  40. struct delay_class *class;
  41. struct list_head list;
  42. unsigned long expires;
  43. };
  44. static void handle_delayed_timer(struct timer_list *t)
  45. {
  46. struct delay_c *dc = from_timer(dc, t, delay_timer);
  47. queue_work(dc->kdelayd_wq, &dc->flush_expired_bios);
  48. }
  49. static void queue_timeout(struct delay_c *dc, unsigned long expires)
  50. {
  51. timer_reduce(&dc->delay_timer, expires);
  52. }
  53. static inline bool delay_is_fast(struct delay_c *dc)
  54. {
  55. return !!dc->worker;
  56. }
  57. static void flush_bios(struct bio *bio)
  58. {
  59. struct bio *n;
  60. while (bio) {
  61. n = bio->bi_next;
  62. bio->bi_next = NULL;
  63. dm_submit_bio_remap(bio, NULL);
  64. bio = n;
  65. }
  66. }
  67. static void flush_delayed_bios(struct delay_c *dc, bool flush_all)
  68. {
  69. struct dm_delay_info *delayed, *next;
  70. struct bio_list flush_bio_list;
  71. LIST_HEAD(local_list);
  72. unsigned long next_expires = 0;
  73. bool start_timer = false;
  74. bio_list_init(&flush_bio_list);
  75. mutex_lock(&dc->process_bios_lock);
  76. spin_lock(&dc->delayed_bios_lock);
  77. list_replace_init(&dc->delayed_bios, &local_list);
  78. spin_unlock(&dc->delayed_bios_lock);
  79. list_for_each_entry_safe(delayed, next, &local_list, list) {
  80. cond_resched();
  81. if (flush_all || time_after_eq(jiffies, delayed->expires)) {
  82. struct bio *bio = dm_bio_from_per_bio_data(delayed,
  83. sizeof(struct dm_delay_info));
  84. list_del(&delayed->list);
  85. bio_list_add(&flush_bio_list, bio);
  86. delayed->class->ops--;
  87. continue;
  88. }
  89. if (!delay_is_fast(dc)) {
  90. if (!start_timer) {
  91. start_timer = true;
  92. next_expires = delayed->expires;
  93. } else {
  94. next_expires = min(next_expires, delayed->expires);
  95. }
  96. }
  97. }
  98. spin_lock(&dc->delayed_bios_lock);
  99. list_splice(&local_list, &dc->delayed_bios);
  100. spin_unlock(&dc->delayed_bios_lock);
  101. mutex_unlock(&dc->process_bios_lock);
  102. if (start_timer)
  103. queue_timeout(dc, next_expires);
  104. flush_bios(bio_list_get(&flush_bio_list));
  105. }
  106. static int flush_worker_fn(void *data)
  107. {
  108. struct delay_c *dc = data;
  109. while (!kthread_should_stop()) {
  110. flush_delayed_bios(dc, false);
  111. spin_lock(&dc->delayed_bios_lock);
  112. if (unlikely(list_empty(&dc->delayed_bios))) {
  113. set_current_state(TASK_INTERRUPTIBLE);
  114. spin_unlock(&dc->delayed_bios_lock);
  115. schedule();
  116. } else {
  117. spin_unlock(&dc->delayed_bios_lock);
  118. cond_resched();
  119. }
  120. }
  121. return 0;
  122. }
  123. static void flush_expired_bios(struct work_struct *work)
  124. {
  125. struct delay_c *dc;
  126. dc = container_of(work, struct delay_c, flush_expired_bios);
  127. flush_delayed_bios(dc, false);
  128. }
  129. static void delay_dtr(struct dm_target *ti)
  130. {
  131. struct delay_c *dc = ti->private;
  132. if (dc->kdelayd_wq) {
  133. timer_shutdown_sync(&dc->delay_timer);
  134. destroy_workqueue(dc->kdelayd_wq);
  135. }
  136. if (dc->read.dev)
  137. dm_put_device(ti, dc->read.dev);
  138. if (dc->write.dev)
  139. dm_put_device(ti, dc->write.dev);
  140. if (dc->flush.dev)
  141. dm_put_device(ti, dc->flush.dev);
  142. if (dc->worker)
  143. kthread_stop(dc->worker);
  144. mutex_destroy(&dc->process_bios_lock);
  145. kfree(dc);
  146. }
  147. static int delay_class_ctr(struct dm_target *ti, struct delay_class *c, char **argv)
  148. {
  149. int ret;
  150. unsigned long long tmpll;
  151. char dummy;
  152. if (sscanf(argv[1], "%llu%c", &tmpll, &dummy) != 1 || tmpll != (sector_t)tmpll) {
  153. ti->error = "Invalid device sector";
  154. return -EINVAL;
  155. }
  156. c->start = tmpll;
  157. if (sscanf(argv[2], "%u%c", &c->delay, &dummy) != 1) {
  158. ti->error = "Invalid delay";
  159. return -EINVAL;
  160. }
  161. ret = dm_get_device(ti, argv[0], dm_table_get_mode(ti->table), &c->dev);
  162. if (ret) {
  163. ti->error = "Device lookup failed";
  164. return ret;
  165. }
  166. return 0;
  167. }
  168. /*
  169. * Mapping parameters:
  170. * <device> <offset> <delay> [<write_device> <write_offset> <write_delay>]
  171. *
  172. * With separate write parameters, the first set is only used for reads.
  173. * Offsets are specified in sectors.
  174. * Delays are specified in milliseconds.
  175. */
  176. static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv)
  177. {
  178. struct delay_c *dc;
  179. int ret;
  180. unsigned int max_delay;
  181. if (argc != 3 && argc != 6 && argc != 9) {
  182. ti->error = "Requires exactly 3, 6 or 9 arguments";
  183. return -EINVAL;
  184. }
  185. dc = kzalloc(sizeof(*dc), GFP_KERNEL);
  186. if (!dc) {
  187. ti->error = "Cannot allocate context";
  188. return -ENOMEM;
  189. }
  190. ti->private = dc;
  191. INIT_LIST_HEAD(&dc->delayed_bios);
  192. mutex_init(&dc->process_bios_lock);
  193. spin_lock_init(&dc->delayed_bios_lock);
  194. dc->may_delay = true;
  195. dc->argc = argc;
  196. ret = delay_class_ctr(ti, &dc->read, argv);
  197. if (ret)
  198. goto bad;
  199. max_delay = dc->read.delay;
  200. if (argc == 3) {
  201. ret = delay_class_ctr(ti, &dc->write, argv);
  202. if (ret)
  203. goto bad;
  204. ret = delay_class_ctr(ti, &dc->flush, argv);
  205. if (ret)
  206. goto bad;
  207. goto out;
  208. }
  209. ret = delay_class_ctr(ti, &dc->write, argv + 3);
  210. if (ret)
  211. goto bad;
  212. max_delay = max(max_delay, dc->write.delay);
  213. if (argc == 6) {
  214. ret = delay_class_ctr(ti, &dc->flush, argv + 3);
  215. if (ret)
  216. goto bad;
  217. goto out;
  218. }
  219. ret = delay_class_ctr(ti, &dc->flush, argv + 6);
  220. if (ret)
  221. goto bad;
  222. max_delay = max(max_delay, dc->flush.delay);
  223. out:
  224. if (max_delay < 50) {
  225. /*
  226. * In case of small requested delays, use kthread instead of
  227. * timers and workqueue to achieve better latency.
  228. */
  229. dc->worker = kthread_run(&flush_worker_fn, dc, "dm-delay-flush-worker");
  230. if (IS_ERR(dc->worker)) {
  231. ret = PTR_ERR(dc->worker);
  232. dc->worker = NULL;
  233. goto bad;
  234. }
  235. } else {
  236. timer_setup(&dc->delay_timer, handle_delayed_timer, 0);
  237. INIT_WORK(&dc->flush_expired_bios, flush_expired_bios);
  238. dc->kdelayd_wq = alloc_workqueue("kdelayd", WQ_MEM_RECLAIM, 0);
  239. if (!dc->kdelayd_wq) {
  240. ret = -EINVAL;
  241. DMERR("Couldn't start kdelayd");
  242. goto bad;
  243. }
  244. }
  245. ti->num_flush_bios = 1;
  246. ti->num_discard_bios = 1;
  247. ti->accounts_remapped_io = true;
  248. ti->per_io_data_size = sizeof(struct dm_delay_info);
  249. return 0;
  250. bad:
  251. delay_dtr(ti);
  252. return ret;
  253. }
  254. static int delay_bio(struct delay_c *dc, struct delay_class *c, struct bio *bio)
  255. {
  256. struct dm_delay_info *delayed;
  257. unsigned long expires = 0;
  258. if (!c->delay)
  259. return DM_MAPIO_REMAPPED;
  260. delayed = dm_per_bio_data(bio, sizeof(struct dm_delay_info));
  261. delayed->context = dc;
  262. delayed->expires = expires = jiffies + msecs_to_jiffies(c->delay);
  263. spin_lock(&dc->delayed_bios_lock);
  264. if (unlikely(!dc->may_delay)) {
  265. spin_unlock(&dc->delayed_bios_lock);
  266. return DM_MAPIO_REMAPPED;
  267. }
  268. c->ops++;
  269. list_add_tail(&delayed->list, &dc->delayed_bios);
  270. spin_unlock(&dc->delayed_bios_lock);
  271. if (delay_is_fast(dc))
  272. wake_up_process(dc->worker);
  273. else
  274. queue_timeout(dc, expires);
  275. return DM_MAPIO_SUBMITTED;
  276. }
  277. static void delay_presuspend(struct dm_target *ti)
  278. {
  279. struct delay_c *dc = ti->private;
  280. spin_lock(&dc->delayed_bios_lock);
  281. dc->may_delay = false;
  282. spin_unlock(&dc->delayed_bios_lock);
  283. if (!delay_is_fast(dc))
  284. timer_delete(&dc->delay_timer);
  285. flush_delayed_bios(dc, true);
  286. }
  287. static void delay_resume(struct dm_target *ti)
  288. {
  289. struct delay_c *dc = ti->private;
  290. dc->may_delay = true;
  291. }
  292. static int delay_map(struct dm_target *ti, struct bio *bio)
  293. {
  294. struct delay_c *dc = ti->private;
  295. struct delay_class *c;
  296. struct dm_delay_info *delayed = dm_per_bio_data(bio, sizeof(struct dm_delay_info));
  297. if (bio_data_dir(bio) == WRITE) {
  298. if (unlikely(bio->bi_opf & REQ_PREFLUSH))
  299. c = &dc->flush;
  300. else
  301. c = &dc->write;
  302. } else {
  303. c = &dc->read;
  304. }
  305. delayed->class = c;
  306. bio_set_dev(bio, c->dev->bdev);
  307. bio->bi_iter.bi_sector = c->start + dm_target_offset(ti, bio->bi_iter.bi_sector);
  308. return delay_bio(dc, c, bio);
  309. }
  310. #define DMEMIT_DELAY_CLASS(c) \
  311. DMEMIT("%s %llu %u", (c)->dev->name, (unsigned long long)(c)->start, (c)->delay)
  312. static void delay_status(struct dm_target *ti, status_type_t type,
  313. unsigned int status_flags, char *result, unsigned int maxlen)
  314. {
  315. struct delay_c *dc = ti->private;
  316. int sz = 0;
  317. switch (type) {
  318. case STATUSTYPE_INFO:
  319. DMEMIT("%u %u %u", dc->read.ops, dc->write.ops, dc->flush.ops);
  320. break;
  321. case STATUSTYPE_TABLE:
  322. DMEMIT_DELAY_CLASS(&dc->read);
  323. if (dc->argc >= 6) {
  324. DMEMIT(" ");
  325. DMEMIT_DELAY_CLASS(&dc->write);
  326. }
  327. if (dc->argc >= 9) {
  328. DMEMIT(" ");
  329. DMEMIT_DELAY_CLASS(&dc->flush);
  330. }
  331. break;
  332. case STATUSTYPE_IMA:
  333. *result = '\0';
  334. break;
  335. }
  336. }
  337. static int delay_iterate_devices(struct dm_target *ti,
  338. iterate_devices_callout_fn fn, void *data)
  339. {
  340. struct delay_c *dc = ti->private;
  341. int ret = 0;
  342. ret = fn(ti, dc->read.dev, dc->read.start, ti->len, data);
  343. if (ret)
  344. goto out;
  345. ret = fn(ti, dc->write.dev, dc->write.start, ti->len, data);
  346. if (ret)
  347. goto out;
  348. ret = fn(ti, dc->flush.dev, dc->flush.start, ti->len, data);
  349. if (ret)
  350. goto out;
  351. out:
  352. return ret;
  353. }
  354. static struct target_type delay_target = {
  355. .name = "delay",
  356. .version = {1, 4, 0},
  357. .features = DM_TARGET_PASSES_INTEGRITY,
  358. .module = THIS_MODULE,
  359. .ctr = delay_ctr,
  360. .dtr = delay_dtr,
  361. .map = delay_map,
  362. .presuspend = delay_presuspend,
  363. .resume = delay_resume,
  364. .status = delay_status,
  365. .iterate_devices = delay_iterate_devices,
  366. };
  367. module_dm(delay);
  368. MODULE_DESCRIPTION(DM_NAME " delay target");
  369. MODULE_AUTHOR("Heinz Mauelshagen <mauelshagen@redhat.com>");
  370. MODULE_LICENSE("GPL");